Re[59]: Опять С++ vs С#
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.04 19:50
Оценка: :)
Здравствуйте, Павел Кузнецов, Вы писали:

Неплохо было бы аргументировать этот набор ничем не обоснованных заявлений.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[54]: Опять С++ vs С#
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.11.04 20:16
Оценка: 1 (1) +2 -2
Здравствуйте, Дарней, Вы писали:

ГВ>>Я бы не стал называть это поиском проблем. Скорее уж, попыткой избавиться от каких-то неприятностей, свойственных традиционным решениям.

Д>Просто я прекрасно могу представить, какое количество проблем они приобретут взамен. И еще не факт, что применение C++ избавит их от старых.
Д>C++ очень опасно применять для кода, который регулярно будет изменяться, особенно — если это серверный код.

Опасно реализовывать непродуманные и поспешные решения. Вот это — в самом деле опасно. А на каком языке — да какая разница! Если научился писать багоустойчивый код на C++, то большой разницы между кодированием сервера и "клиента" уже нет. А если нет, то...
... << RSDN@Home 1.1.3 stable >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[60]: Опять С++ vs С#
От: Павел Кузнецов  
Дата: 26.11.04 02:30
Оценка: +2
VladD2,

> Неплохо было бы аргументировать этот набор ничем не обоснованных заявлений.


Гм... Читать умеем? Аргументация и/или примеры присутствуют. Если какие-то из аргументов полагаешь недостаточными, приводи контрпримеры, опровергай и т.п. Если есть какие-то конкретные положения, для которых аргументация отсутствует, указывай конкретно.
Posted via RSDN NNTP Server 1.9 delta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[61]: Опять С++ vs С#
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.11.04 02:35
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>VladD2,


>> Неплохо было бы аргументировать этот набор ничем не обоснованных заявлений.


ПК>Гм... Читать умеем?


Умеем. Остается выяснить умеем ли мы аргументировать.

ПК> Аргументация и/или примеры присутствуют. Если какие-то из аргументов полагаешь недостаточными, приводи контрпримеры, опровергай и т.п. Если есть какие-то конкретные положения, для которых аргументация отсутствует, указывай конкретно.


Довольно глупо переписывать половину твоих реплик.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[62]: Опять С++ vs С#
От: Павел Кузнецов  
Дата: 26.11.04 03:45
Оценка: +2
VladD2,

> ПК> Аргументация и/или примеры присутствуют. Если какие-то из аргументов полагаешь недостаточными, приводи контрпримеры, опровергай и т.п. Если есть какие-то конкретные положения, для которых аргументация отсутствует, указывай конкретно.


> Довольно глупо переписывать половину твоих реплик.


Ну, тогда остаемся в текущей ситуации. Я высказал ряд тезисов с некоторой аргументацией. Опровержения приведенных аргументов или хотя бы иллюстрации их недостаточности не последовало. Снабжать все подряд дополнительной аргументацией, без указанных действий с твоей стороны, я, естественно, не буду.
Posted via RSDN NNTP Server 1.9 delta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[61]: Опять С++ vs С#
От: Дарней Россия  
Дата: 26.11.04 05:17
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Что-то я не очень понимаю, как unsafe поможет в достижении перечисленных выше моментов...


Просто для всего, что ты перечисил, в C# есть аналог или что-то на замену. (ну за исключением генериков, которые еще недоступны для большинства)
А вот для тех (редких) случаев, когда производительности C# не хватает — для них и нужен unsafe
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[63]: ToString()
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 26.11.04 14:54
Оценка: -1
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Ну, тогда остаемся в текущей ситуации. Я высказал ряд тезисов с некоторой аргументацией. Опровержения приведенных аргументов или хотя бы иллюстрации их недостаточности не последовало. Снабжать все подряд дополнительной аргументацией, без указанных действий с твоей стороны, я, естественно, не буду.


Так, я чувствую мои просьбы ушли в пустоту. Ну сколько можно? Заканчивайте здесь разборки.
... << RSDN@Home 1.1.4 beta 3 rev. 235>>
AVK Blog
Re[44]: Опять С++ vs С#
От: LSL  
Дата: 26.11.04 17:12
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Какой DX по счету будет полностью на дотнете писан?


Неужели новый API WGF, который будет заменой DirectX и который появится в первой бете Лонгхорна будет построен по COM-модели ?

Windows Graphics Foundation [WinHEC 2004; 622 KB]
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[62]: ToString()
От: Павел Кузнецов  
Дата: 26.11.04 19:19
Оценка: 1 (1) +2 -1
Дарней,

> ПК>Что-то я не очень понимаю, как unsafe поможет в достижении перечисленных выше моментов...


> Просто для всего, что ты перечисил, в C# есть аналог или что-то на замену.


Имхо, есть существенные отличия у предлагаемых "альтернатив"...

> шаблоны, позволяющие контролировать часть семантических ограничений во время компиляции, (generics не в счет)


"generics не в счет" не из-за того, что они "еще недоступны для большинства", а из-за их ограниченности
Автор: Павел Кузнецов
Дата: 20.11.04
. Считать это положительным или отрицательным моментом — дело вкуса. Однако для тех, кому нужна функциональность "полных" шаблонов C++, generics адекватной заменой не являются.

> размещение объектов в стеке + деструкторы, что позволяет автоматизировать освобождение ресурсов


Снова-таки, "аналог" не вполне аналогичен. using решает проблему вызова освобождения ресурсов в случае исключений, но (!) перекладывает обязанность по слежению за этим на пользователей класса. Плюс, если в классе, ранее не требовавшем "специального" освобождения ресурсов, эти ресурсы таки появятся, старый код сломается. В случае использования деструкторов разработчик класса контролирует эти моменты прозрачно для пользователя. В общем, снова-таки, using кого-то, может, и устраивает, но полагать это адекватной заменой для всех пользователей...

> "свободные" функции


Этого вообще нет.

> А вот для тех (редких) случаев, когда производительности C# не хватает — для них и нужен unsafe


Производительность, конечно, иногда очень важна (и она тоже далеко не всегда достигается через unsafe, т.к. целый ряд вещей, связанных с производительностью, в C++ решается через шаблоны), но в данном случае для меня намного существеннее именно возможности языка, которые в случае C#, имхо, сильно ограничивают выразительные средства, доступные разработчикам библиотек.
Posted via RSDN NNTP Server 1.9 delta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[63]: ToString()
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 26.11.04 22:24
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Снова-таки, "аналог" не вполне аналогичен. using решает проблему вызова освобождения ресурсов в случае исключений, но (!) перекладывает обязанность по слежению за этим на пользователей класса. Плюс, если в классе, ранее не требовавшем "специального" освобождения ресурсов, эти ресурсы таки появятся, старый код сломается. В случае использования деструкторов разработчик класса контролирует эти моменты прозрачно для пользователя. В общем, снова-таки, using кого-то, может, и устраивает, но полагать это адекватной заменой для всех пользователей...


В текущем проекте, который уже 2 года живет, не было ни одного случая потери ресурсов из-за забытого using. Веришь?
... << RSDN@Home 1.1.4 beta 3 rev. 236>>
AVK Blog
Re[63]: Опять С++ vs С#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.11.04 04:31
Оценка: -5
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Ну, тогда остаемся в текущей ситуации. Я высказал ряд тезисов с некоторой аргументацией.


Я бы сказал: кучу и без аргументации.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[63]: ToString()
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.11.04 04:31
Оценка: -2 :)
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Производительность, конечно, иногда очень важна (и она тоже далеко не всегда достигается через unsafe, т.к. целый ряд вещей, связанных с производительностью, в C++ решается через шаблоны), но в данном случае для меня намного существеннее именно возможности языка, которые в случае C#, имхо, сильно ограничивают выразительные средства, доступные разработчикам библиотек.


Уж простит мнея АВК (как модератор), но отвечать "по делу" на этот набор поверхноссных суждений и догм нельзя. Паша мужик молодой, мы тоже не совсем старики. Поглядим что он запоет через 10 лет. А пока этот спор с теоритиками устрицаедения надо завязать.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[64]: ToString()
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.11.04 04:31
Оценка: -8
Здравствуйте, AndrewVK, Вы писали:

AVK>В текущем проекте, который уже 2 года живет, не было ни одного случая потери ресурсов из-за забытого using. Веришь?


Да плевать ему на практику тысяч человек. Его теори незыблемы. Пробовать на практике ему в лом. Мне кажется все эти разговоры бессмысленны. Это упертость принципиальна. Надо завершать этот бессмысленный разговор.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[40]: Опять С++ vs С#
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.11.04 00:03
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Вот еще достаточно интересное мнение по поводу некоторых трудностей при использовании языков со сборкой мусора для разработки игр.


Для не верующих Фом...

Вот ссылка на сравнение двух 3D-движков. Ogre — исходный движек писанный на С++. Axiom — C#-порт Ogre.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[40]: Опять С++ vs С#
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.11.04 00:09
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Вот еще достаточно интересное мнение по поводу некоторых трудностей при использовании языков со сборкой мусора для разработки игр.


Вот еще ссылочка http://axiomengine.sourceforge.net/modules.php?name=Forums&amp;file=viewtopic&amp;p=926
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[63]: ToString()
От: Дарней Россия  
Дата: 29.11.04 05:59
Оценка: 18 (1)
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>"generics не в счет" не из-за того, что они "еще недоступны для большинства", а из-за их ограниченности
Автор: Павел Кузнецов
Дата: 20.11.04
. Считать это положительным или отрицательным моментом — дело вкуса. Однако для тех, кому нужна функциональность "полных" шаблонов C++, generics адекватной заменой не являются.


Я в курсе.. увы, C++ шаблоны — это инструмент "не для всех". Большинство кодеров при виде заворота в стиле Александреску приходит в тихий ужас и норовит забиться куда-нибудь в уголок. Невразумительные сообщения об ошибках в пару кб текста длиной — это тоже далеко не плюс. Я уж не говорю про проблемы с компиляторами и поддержкой стандарта языка.
надеюсь, R# эту проблему в конце концов решит :-D

ПК>Снова-таки, "аналог" не вполне аналогичен. using решает проблему вызова освобождения ресурсов в случае исключений, но (!) перекладывает обязанность по слежению за этим на пользователей класса. Плюс, если в классе, ранее не требовавшем "специального" освобождения ресурсов, эти ресурсы таки появятся, старый код сломается. В случае использования деструкторов разработчик класса контролирует эти моменты прозрачно для пользователя. В общем, снова-таки, using кого-то, может, и устраивает, но полагать это адекватной заменой для всех пользователей...


Можно рассматривать это и как плюс. Большое количество скрытой активности в деструкторах часто очень осложняет жизнь. Кстати говоря, выброс исключения из Dispose не может обрушить прогу — в отличие от C++

>> "свободные" функции

ПК>Этого вообще нет.

Никто не мешает использовать вместо них статические функции-члены.

ПК>Производительность, конечно, иногда очень важна (и она тоже далеко не всегда достигается через unsafe, т.к. целый ряд вещей, связанных с производительностью, в C++ решается через шаблоны), но в данном случае для меня намного существеннее именно возможности языка, которые в случае C#, имхо, сильно ограничивают выразительные средства, доступные разработчикам библиотек.


Если так уж сильно приспичит, то можно написать наиболее критичную часть проги на MSIL или MC++
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[64]: ToString()
От: alexeiz  
Дата: 29.11.04 07:52
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>Здравствуйте, Павел Кузнецов, Вы писали:


ПК>>Снова-таки, "аналог" не вполне аналогичен. using решает проблему вызова освобождения ресурсов в случае исключений, но (!) перекладывает обязанность по слежению за этим на пользователей класса. Плюс, если в классе, ранее не требовавшем "специального" освобождения ресурсов, эти ресурсы таки появятся, старый код сломается. В случае использования деструкторов разработчик класса контролирует эти моменты прозрачно для пользователя. В общем, снова-таки, using кого-то, может, и устраивает, но полагать это адекватной заменой для всех пользователей...


Д>Можно рассматривать это и как плюс. Большое количество скрытой активности в деструкторах часто очень осложняет жизнь. Кстати говоря, выброс исключения из Dispose не может обрушить прогу — в отличие от C++


Зато исключение в Dispose может оставить программу в неопределенном состоянии, и это явно хуже, чем "обрушить прогу". И кстати, не "обрушить", а вызвать terminate(), в котором ты волен произвести необходимые действия перед завершением (послать crash dump разработчику, например).
Re[65]: ToString()
От: Дарней Россия  
Дата: 29.11.04 08:29
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>Зато исключение в Dispose может оставить программу в неопределенном состоянии, и это явно хуже, чем "обрушить прогу"


А почему "в неопределенном состоянии"? Даже если один или несколько Dispose в пределах блока выбросит исключение, все остальные Dispose все равно будут вызваны. К сожалению, я не нашел данных, какое из этих исключений будет обработано
Или ты что-то другое имел в виду?

A>И кстати, не "обрушить", а вызвать terminate(), в котором ты волен произвести необходимые действия перед завершением (послать crash dump разработчику, например).


Программа перестанет работать, не сохранив своих данных, не завершив сеанс работы и т.п. Крэш дамп конечно поможет разработчикам, но юзеру от этого легче не станет
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[66]: ToString()
От: alexeiz  
Дата: 29.11.04 11:36
Оценка: 3 (1) -3 :))
Здравствуйте, Дарней, Вы писали:

Д>Здравствуйте, alexeiz, Вы писали:


A>>Зато исключение в Dispose может оставить программу в неопределенном состоянии, и это явно хуже, чем "обрушить прогу"


Д>А почему "в неопределенном состоянии"? Даже если один или несколько Dispose в пределах блока выбросит исключение, все остальные Dispose все равно будут вызваны. К сожалению, я не нашел данных, какое из этих исключений будет обработано

Д>Или ты что-то другое имел в виду?

A>>И кстати, не "обрушить", а вызвать terminate(), в котором ты волен произвести необходимые действия перед завершением (послать crash dump разработчику, например).


Д>Программа перестанет работать, не сохранив своих данных, не завершив сеанс работы и т.п. Крэш дамп конечно поможет разработчикам, но юзеру от этого легче не станет


Твоё недоумение скорее всего вызвано непониманием причин, по которым C++ обязывает программу аварийно завершиться при выбросе исключения при обработке другого исключения (скорее всего, когда деструктор выбрасывает). Почитай об этом в clc++.moderated или comp.std.c++. Здесь я, так как у меня нет времени это досконально разъяснять, скажу лишь, что проблеммы при выбросе исключений из деструкторов и из Dispose имеют один и тот же характер. Одна из таких проблем — это выброс исключения при обработке другого исключения, и она может случится, как с выбрасывающими десрукторами, так и с выбрасывающими Dispose. Эта проблемма не имеет удовлетворительного разрешения в том смысле, что невозможно обработать такую ситуацию и продолжить выполнение программы нормальным образом. Что-нибудь обязательно будет сломано в состоянии программы, ты на это можешь наткнуться и сразу вылететь, а можешь совсем не заметить, а можешь и произвести какие-нибудь деструктивные действия (вроде разрушения файлов пользователя при попытке сохранить его данные, эдак подложив пользователю своеобразную свинью).

Далее, тот факт, что .NET в этом случае позволяет тебе продолжить выполниние программы как ни в чём не бывало, является лишь непризнанием данной проблеммы как таковой дизайнерами .NET'а. Параллели между Dispose и деструкторами C++ очевидны. C++/CLI даже ставит их во взаимно однозначное соответствие. Почему дизайнеры .NET'а ничего криминального не увидели в продолжении выполнения программы в этом случае, для меня загадка. Скорее всего это было технически возможно сделать, и они решили "почему бы и нет?" Ведь в .NET программа не упадет при обращении к памяти с нуленым адресом, не перезапишет за пределы массива, т.е не сделает ничего такого, на что вполне способен в такой ситуации "wicked" C++. Поэтому они решили сделать .NET "более надёжным" и в данном случае. Но они не увидели принципиального недетерминированного поведения, access violation и buffer overrun всего лишь частные случаи которого.
Re[67]: ToString()
От: Дарней Россия  
Дата: 29.11.04 12:13
Оценка:
Здравствуйте, alexeiz, Вы писали:

Параллели между Dispose() и деструкторами С++ очевидны, но это все-таки не одна и та же вещь.
Я не сомневаюсь, что в случае C++ выброс исключения во время раскрутки стека приводит к неопределенному поведению. Но приведет ли к неопределенному поведению в .NET — это еще не факт. Я не сомневаюсь, что архитекторами эта проблема обдумывалась (в отличие от некоторых других ) — судить можно хотя бы по приведенному выше факту. Как показал тест — сначала завершаются вызовы Dispose для всех объектов текущего блока, и только затем продолжается раскрутка стека. Происходит это независимо от того, было ли выброшено исключение одним из вызванных методов, или нет.
Единственная неопределенность в данном случае — это вопрос о том, какое из исключений будет обрабатываться далее — то, которое изначально привело к раскрутке стека, или одно из тех, которые возникли во время процесса раскрутки. Судя по результатам эксперимента — обрабатываться будет то, которое было выброшено последним. Это действительно не очень хорошо, т.к. информация о предыдущих исключениях теряется. Однако, неопределенного поведения здесь все-таки нет.

Поэтому мне хотелось бы получить или детальные пояснения, или точные ссылки на оные. Потому что перекапывать целый раздел Юзнета в поисках неких туманных подтверждений твоей правоты — на это времени у меня уж совершенно нет.
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.