Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 05.06.05 18:18
Оценка: 93 (8) +3 -1
Здравствуйте, AVC, Вы писали:

AVC>Весь смысл высокоуровневости — позволить компилятору гарантировать определенные свойства программ, например — безопасность типов (type safety).

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

Что-то в этой ветке часто упоминается, что есть языки, в которых выход за пределы массива четко и точно отлавливается в run-time. И говорится, что это круто, и что из-за отсутствия таковой возможности C/C++ must die! При этом хотелось бы напомнить, что эта возможность Oberon/Java/C# хороша только при отладке. Если такая ошибка возникает во время эксплуатации, последствия от нее что в C/С++, что в Oberon/Java/C# будут КАТАСТРОФИЧЕСКИМИ.

В качестве примера -- катастрофа Ариан 5 при старте, тогда из-за ошибок программистов не было перехвачено исключение и софт просто вырубился, как на основной, так и на резервной системе контроля. И что толку, что софт был написан на Ada, а не на C++? Поэтому то, что Oberon/Java/C# сгенерирует out of bound exception в run-time, имхо, ничем не поможет программе, в которой это исключение совершенно не ожидалось. А ведь в подавляющем большинстве случаев оно не ожидается
... << RSDN@Home 1.1.4 beta 7 rev. 447>>

21.06.05 18:36: Ветка выделена из темы Почему настоящие программисты избегают C++
Автор: d Bratik
Дата: 17.02.05
— Odi$$ey
21.06.05 18:37: Перенесено модератором из 'Священные войны' — Odi$$ey


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[17]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 07.06.05 10:26
Оценка: 22 (2) +1 -11 :))) :)
Здравствуйте, eao197, Вы писали:

AVC>>Весь смысл высокоуровневости — позволить компилятору гарантировать определенные свойства программ, например — безопасность типов (type safety).

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

E>Что-то в этой ветке часто упоминается, что есть языки, в которых выход за пределы массива четко и точно отлавливается в run-time. И говорится, что это круто, и что из-за отсутствия таковой возможности C/C++ must die!


Я не думаю, что C++ must die! Это Вы меня прямо оклеветали.
Я думаю, что C++ is dead.
Говорят, что если петуху отрубить голову, он еще может носиться по двору. Вот C++ и носится... А потом бряк — и уже вверх ногами!

E>При этом хотелось бы напомнить, что эта возможность Oberon/Java/C# хороша только при отладке. Если такая ошибка возникает во время эксплуатации, последствия от нее что в C/С++, что в Oberon/Java/C# будут КАТАСТРОФИЧЕСКИМИ.


Я так и думал, что программисты, предпочитающие Си++, просто не знают, для чего пишутся программы.
А неверные вычисления и их КАТАСТРОФИЧЕСКИЕ РЕЗУЛЬТАТЫ Вас не пугают?
"Не упасть" — не единственная цель программы. Надо еще и требуемые вычисления выполнить, причем без ошибок.
Впрочем, понятно, что Си++программист всегда в страхе: КАК БЫ ЧЕГО НЕ УПАЛО!

E>В качестве примера -- катастрофа Ариан 5 при старте, тогда из-за ошибок программистов не было перехвачено исключение и софт просто вырубился, как на основной, так и на резервной системе контроля. И что толку, что софт был написан на Ada, а не на C++? Поэтому то, что Oberon/Java/C# сгенерирует out of bound exception в run-time, имхо, ничем не поможет программе, в которой это исключение совершенно не ожидалось. А ведь в подавляющем большинстве случаев оно не ожидается


У меня иные сведения о катастрофе Ариана.

История постоянно подтверждает правоту Н.Вирта. Например, взрыв в 1996 г. ракеты-носителя Ариан-5 стоимостью около 500 миллионов долларов через 40 секунд после старта произошел, как выяснилось, из-за сбоя программного обеспечения: одна из вспомогательных подпрограмм пыталась преобразовать длинное целое значение в короткое без проверки величины значения. Компиляторы Оберона по умолчанию отказываются компилировать такие программы, считая их ошибочными, тем самым "тыкая носом" проектировщика в точки потенциальных сбоев.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[18]: Что толку в Ада если Ариан 5 все равно упал
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 07.06.05 10:31
Оценка:
Здравствуйте, AVC, Вы писали:

E>>В качестве примера -- катастрофа Ариан 5 при старте, тогда из-за ошибок программистов не было перехвачено исключение и софт просто вырубился, как на основной, так и на резервной системе контроля. И что толку, что софт был написан на Ada, а не на C++? Поэтому то, что Oberon/Java/C# сгенерирует out of bound exception в run-time, имхо, ничем не поможет программе, в которой это исключение совершенно не ожидалось. А ведь в подавляющем большинстве случаев оно не ожидается


AVC>У меня иные сведения о катастрофе Ариана.

AVC>

AVC>История постоянно подтверждает правоту Н.Вирта. Например, взрыв в 1996 г. ракеты-носителя Ариан-5 стоимостью около 500 миллионов долларов через 40 секунд после старта произошел, как выяснилось, из-за сбоя программного обеспечения: одна из вспомогательных подпрограмм пыталась преобразовать длинное целое значение в короткое без проверки величины значения. Компиляторы Оберона по умолчанию отказываются компилировать такие программы, считая их ошибочными, тем самым "тыкая носом" проектировщика в точки потенциальных сбоев.


Ой мама, куда вас занесло... Вы ещё вспомните старую историю об ошибке в программе на Фортране, когда программист перепутал ',' и '.' и вместо цикла получил объявление вещественной переменной, которое превосходно скомпилировалось, но только потом ракета мимо марса промазала...
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[18]: Что толку в Ада если Ариан 5 все равно упал
От: Cyberax Марс  
Дата: 07.06.05 10:46
Оценка: 22 (5) +4
AVC wrote:

> E>Что-то в этой ветке часто упоминается, что есть языки, в которых

> выход за пределы массива четко и точно отлавливается в run-time. И
> говорится, что это круто, и что из-за отсутствия таковой возможности
> C/C++ must die!
> Я не думаю, что C++ must die! Это Вы меня прямо оклеветали.
> Я думаю, что C++ *is* dead.

Угу, как и 5 миллионов программистов на нем. Причем С++ активно
развивается (читайте c.l.c++.moderated, списки рассылоки от boost'а), в
отличие от уже дохлого Оберона и умирающей Дельфи.

> У меня иные сведения о катастрофе Ариана.


http://www.cs.unibo.it/~laneve/papers/ariane5rep.html "ARIANE 5 Failure
— Full Report"

> История постоянно подтверждает правоту Н.Вирта. Например, взрыв в 1996

> г. ракеты-носителя Ариан-5 стоимостью около 500 миллионов долларов
> через 40 секунд после старта произошел, как выяснилось, из-за сбоя
> программного обеспечения: одна из вспомогательных подпрограмм пыталась
> преобразовать длинное целое значение в короткое без проверки величины
> значения. Компиляторы Оберона по умолчанию отказываются компилировать
> такие программы, считая их ошибочными, тем самым "тыкая носом"
> проектировщика в точки потенциальных сбоев.

Было преобразование (причем контролируемое!) между 64-битной переменной
и знаковой 16-битной. Диапазона значений 16-битный переменной хватало
для оригинального датчика, но не для измененного. Из-за переполнения
вылетело исключение, которое весело распечаталось в поток управления
(узнаю адски-паскалевские решения).

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[18]: Что толку в Ада если Ариан 5 все равно упал
От: Владик Россия  
Дата: 07.06.05 10:53
Оценка: +2 :)
Здравствуйте, AVC, Вы писали:

AVC>У меня иные сведения о катастрофе Ариана.

AVC>

AVC>История постоянно подтверждает правоту Н.Вирта.


Это называется "притянуть Вирта за уши"

AVC>

вспомогательных подпрограмм пыталась преобразовать длинное целое значение в короткое без проверки величины значения. Компиляторы Оберона по умолчанию отказываются компилировать такие программы, считая их ошибочными, тем самым "тыкая носом" проектировщика в точки потенциальных сбоев.


Свежо предание... Что ты будешь делать на Обероне, если при преобразовании длинного целого в короткое возникнет ошибка? Очевидно, что традиционные языки с их кодами возврата и исключениями не способны отловить такие ошибки на этапе компиляции (хотя вот джава заставит таки это исключение хоть как-то хоть где-то обработать, но это все равно не дает 100% гарантии, что обработано оно будет правильно). Что такое революционное предлагает Оберон? Код в студию! (с)
Как все запущенно...
Re[19]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 07.06.05 11:49
Оценка:
Здравствуйте, Mr. None, Вы писали:

MN>Ой мама, куда вас занесло... Вы ещё вспомните старую историю об ошибке в программе на Фортране, когда программист перепутал ',' и '.' и вместо цикла получил объявление вещественной переменной, которое превосходно скомпилировалось, но только потом ракета мимо марса промазала...


Что же, весьма характерная история.
Их существует множество.
Могу, например, рассказать о том, как все известные компиляторы Си++, не моргнув глазом, привели bool к float.

Кажется, Вас не слишком удручает, что "ракета промазала"?
Интересно, почему? Потому что не из Вашего кармана, или просто — "ха-ха, как смешно"?
А если бы программа управляла ядерным реактором, Вы бы так же иронизировали?

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[18]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 07.06.05 12:33
Оценка: +2
Здравствуйте, AVC, Вы писали:

AVC>Я не думаю, что C++ must die! Это Вы меня прямо оклеветали.

AVC>Я думаю, что C++ is dead.

Остается процитировать классиков: "Слухи о моей смерти сильно преувеличены"

AVC>Говорят, что если петуху отрубить голову, он еще может носиться по двору. Вот C++ и носится... А потом бряк — и уже вверх ногами!


К этому высказыванию не мешало бы добавить жирное ИМХО.

E>>При этом хотелось бы напомнить, что эта возможность Oberon/Java/C# хороша только при отладке. Если такая ошибка возникает во время эксплуатации, последствия от нее что в C/С++, что в Oberon/Java/C# будут КАТАСТРОФИЧЕСКИМИ.


AVC>Я так и думал, что программисты, предпочитающие Си++, просто не знают, для чего пишутся программы.


Ба! Я всегда думал, что программы пишут либо для удовольствия, либо для заработка. И при чем здесь С++?

AVC>А неверные вычисления и их КАТАСТРОФИЧЕСКИЕ РЕЗУЛЬТАТЫ Вас не пугают?


Нет. Я вычислениями не занимаюсь. Кстати, я говорил именно об ошибке выхода за пределы границы массива.

AVC>"Не упасть" — не единственная цель программы. Надо еще и требуемые вычисления выполнить, причем без ошибок.

AVC>Впрочем, понятно, что Си++программист всегда в страхе: КАК БЫ ЧЕГО НЕ УПАЛО!

Сколько нового про себя в Священных Воинах узнаешь, просто ужас. Я и не знал, чего боялся все это время.

E>>В качестве примера -- катастрофа Ариан 5 при старте, тогда из-за ошибок программистов не было перехвачено исключение и софт просто вырубился, как на основной, так и на резервной системе контроля. И что толку, что софт был написан на Ada, а не на C++? Поэтому то, что Oberon/Java/C# сгенерирует out of bound exception в run-time, имхо, ничем не поможет программе, в которой это исключение совершенно не ожидалось. А ведь в подавляющем большинстве случаев оно не ожидается


AVC>У меня иные сведения о катастрофе Ариана.

AVC>

AVC>История постоянно подтверждает правоту Н.Вирта. Например, взрыв в 1996 г. ракеты-носителя Ариан-5 стоимостью около 500 миллионов долларов через 40 секунд после старта произошел, как выяснилось, из-за сбоя программного обеспечения: одна из вспомогательных подпрограмм пыталась преобразовать длинное целое значение в короткое без проверки величины значения. Компиляторы Оберона по умолчанию отказываются компилировать такие программы, считая их ошибочными, тем самым "тыкая носом" проектировщика в точки потенциальных сбоев.


Теперь объясни мне, где же я ошибся в определении причины катастрофы? Главное, что исключение возникло там, где его не ждали.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[19]: Что толку в Ада если Ариан 5 все равно упал
От: Kh_Oleg  
Дата: 07.06.05 12:58
Оценка:
Здравствуйте, eao197, Вы писали:

AVC>>У меня иные сведения о катастрофе Ариана.

AVC>>

AVC>>История постоянно подтверждает правоту Н.Вирта. Например, взрыв в 1996 г. ракеты-носителя Ариан-5 стоимостью около 500 миллионов долларов через 40 секунд после старта произошел, как выяснилось, из-за сбоя программного обеспечения: одна из вспомогательных подпрограмм пыталась преобразовать длинное целое значение в короткое без проверки величины значения. Компиляторы Оберона по умолчанию отказываются компилировать такие программы, считая их ошибочными, тем самым "тыкая носом" проектировщика в точки потенциальных сбоев.


E>Теперь объясни мне, где же я ошибся в определении причины катастрофы? Главное, что исключение возникло там, где его не ждали.


А мне кажется, что главное, что исключение возникло. Потому что софт содержал ошибку.
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: Владик Россия  
Дата: 07.06.05 13:11
Оценка:
Здравствуйте, AVC, Вы писали:

AVC>Могу, например, рассказать о том, как все известные компиляторы Си++, не моргнув глазом, привели bool к float.


Какие-то детские придирки. На уровне {} vs begin/end. В языке С++ bool может быть неявно приведен к float. Фича такая. В определенных ситуациях это корректно и удобно, в других — нет. Программист на С++ знает об этой фиче и не будет тип, приведение которого к float есть явная ошибка, обозначать как bool.
Как все запущенно...
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: AlexEagle Украина http://www.vik.oil
Дата: 07.06.05 13:22
Оценка:
Здравствуйте, Kh_Oleg, Вы писали:

E>>Теперь объясни мне, где же я ошибся в определении причины катастрофы? Главное, что исключение возникло там, где его не ждали.


K_O>А мне кажется, что главное, что исключение возникло. Потому что софт содержал ошибку.


Категорически не согласен... В делфе легко можно получить исключение сфокусирован невидимый контрол средствами VCL... Бред... Причем апи тоже ругается, но тихо и свою работу все же выполняет...

Из-за этого я избегаю VCL-ных функций, так как они создают проблемы на пустом месте своими дебильнымим исключениями
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 07.06.05 14:21
Оценка: +2
Здравствуйте, Kh_Oleg, Вы писали:

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


AVC>>>У меня иные сведения о катастрофе Ариана.

AVC>>>

AVC>>>История постоянно подтверждает правоту Н.Вирта. Например, взрыв в 1996 г. ракеты-носителя Ариан-5 стоимостью около 500 миллионов долларов через 40 секунд после старта произошел, как выяснилось, из-за сбоя программного обеспечения: одна из вспомогательных подпрограмм пыталась преобразовать длинное целое значение в короткое без проверки величины значения. Компиляторы Оберона по умолчанию отказываются компилировать такие программы, считая их ошибочными, тем самым "тыкая носом" проектировщика в точки потенциальных сбоев.


E>>Теперь объясни мне, где же я ошибся в определении причины катастрофы? Главное, что исключение возникло там, где его не ждали.


K_O>А мне кажется, что главное, что исключение возникло. Потому что софт содержал ошибку.


Нет, я не согласен. Возникновение исключения -- это еще не проблема. Поскольку сам механизм исключений был придуман для того, чтобы порожденные исключения перехватывать. А вот то, что порожденное исключение должным образом не было обработано, вот это уже проблема.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[19]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 07.06.05 15:04
Оценка: 7 (2)
Здравствуйте, Cyberax, Вы писали:

>> E>Что-то в этой ветке часто упоминается, что есть языки, в которых

>> выход за пределы массива четко и точно отлавливается в run-time. И
>> говорится, что это круто, и что из-за отсутствия таковой возможности
>> C/C++ must die!
>> Я не думаю, что C++ must die! Это Вы меня прямо оклеветали.
>> Я думаю, что C++ *is* dead.

C>Угу, как и 5 миллионов программистов на нем. Причем С++ активно

C>развивается (читайте c.l.c++.moderated, списки рассылоки от boost'а), в
C>отличие от уже дохлого Оберона и умирающей Дельфи.

Ну, знаете, тараканов еще больше. И что из того?

>> У меня иные сведения о катастрофе Ариана.


C>http://www.cs.unibo.it/~laneve/papers/ariane5rep.html "ARIANE 5 Failure

C>- Full Report"

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

It has been stated to the Board that not all the conversions
were protected because a maximum workload target of 80% had been set
for the SRI computer.

Несомненно, это важная фраза, т.к. явно указана прямая причина того,
почему не все преобразования были защищены. А ведь незащищенность одного
из преобразований и вызвала "цепную реакцию"!
Ясно, что речь идет о недостаточности ресурсов.
Почему-то я не вижу, где эта интересная тема получила хотя бы какое-то развитие.

Но давайте рассмотрим факты.
Основная часть ПО Ариан-5 была унаследована от ПО Ариан-4.
Траектория полета Ариан-5 отличалась от траектории полета Ариан-4.
Горизонтальная скорость Ариан-5 была значительно выше, чем у Ариан-4.
Именно поэтому 64-битное число с плавающей точкой (double?) оказалось
невозможным привести к 16-битному знаковому целому без потерь.
Это и вызвало исключение.
Данная переменная была незащищена (unprotected) от подобного исключения.
Ясно сказано, что решение не защищать данную переменную от исключения
было принято сознательно.
По-видимому, чтобы не превосходить указанный лимит ресурсов в 80%.
Дальше много говорится об "анализе, котрый проделали, перед тем как принять
такое решение" и прочей безответственной чуши. Пожалуйста, вот Вам цена
всех этих "верификаций"!
Что значит — переменная незащищена? Значит ли это, соответствующее исключение
было аппаратным (вроде исключения при делении на нуль)?
В Обероне, если присвоение значения переменной может привести к потере информации,
требуется явно указать допустимость этой потери информации, иначе
компилятор не пропустит данный оператор присвоения.
Если же программист явно указывает допустимость такой ситуации,
то, конечно, никакого исключения сгенерировано не будет (или оно обязательно
будет перехвачено, если имеет аппаратное происхождение).
Именно об этом говорилось в приведенной мной цитате.
Так мысль, высказанная в ней, верна: Оберон не допустил бы такой ситуации.
А здесь — и присвоение разрешено, и защиты от аппаратного прерывания не создано.
Просто красота!
Дальше — больше.
Оказывается, любое исключение в бортовом компьютере считается имеющим
аппаратное происхождение и вызывает shut-down компьютера!
Итак, резюме происшедшего:
1) тот факт, что траектория Ариан-5 отличалась от траектории Ариан-4,
не был должным образом осознан и отображен в ПО;
2) ресурсы бортового компьютера были недостаточны, вследствие чего
было принято решение не защищать некоторые переменные от
(аппаратных) исключений (в данном случае — переполнения);
3) любое исключение понимается как аппатратный сбой и вызывает shut-down
компьютера.
Ясно, что пункт 2 полностью противоречит принципам Оберона: людям свойственно
ошибаться, поэтому нельзя отказываться от защиты типов, что как раз
и имело место в данном случае.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: Cyberax Марс  
Дата: 07.06.05 15:14
Оценка:
AVC wrote:

> C>Угу, как и 5 миллионов программистов на нем. Причем С++ активно

> C>развивается (читайте c.l.c++.moderated, списки рассылоки от boost'а), в
> C>отличие от уже дохлого Оберона и умирающей Дельфи.
>
> Ну, знаете, тараканов еще больше. И что из того?
>

> Некоторые фразы трудно "переварить". Причем иногда это фразы,

> имеющие большое значение для оценки всего происшедшего в целом.
> Вот пример:
> It has been stated to the Board that not all the conversions
> were protected because a maximum workload target of 80% had been set
> for the SRI computer.

В Аде есть типы, для которых компилятор четко следит за выходом за
диапазон. То есть если тип Type1 имеет границы [1,2], то компилятор
будет везде проверять возможность выхода за границы.

> Так мысль, высказанная в ней, верна: *Оберон не допустил бы такой

> ситуации*.

В Обероне что, совсем НЕТ кастов? Тогда его как язык можно в утиль
отправить. В Аде нельзя неявно кастовать числа, нужно ставить оператор
каста.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: Владик Россия  
Дата: 07.06.05 15:22
Оценка:
Здравствуйте, AVC, Вы писали:

AVC>Если же программист явно указывает допустимость такой ситуации,


Ну и кто мешает на Обероне явно указать допустимость "такой ситуации" и получить в случае "недопустимости" все ту же исключительную ситуацию, которая и приведет (например) к отключению компа? Касты в Обероне никто не отменял, как я понял. Каждый каст может оказаться недопустимым.

AVC>то, конечно, никакого исключения сгенерировано не будет (или оно обязательно

AVC>будет перехвачено, если имеет аппаратное происхождение).

Подробнее, pls. Чего Оберон делает с аппаратными исключениями, на основании чего и зачем.

AVC>Именно об этом говорилось в приведенной мной цитате.

AVC>Так мысль, высказанная в ней, верна: Оберон не допустил бы такой ситуации.

Так я увижу этот волшебный код или нет?
Как все запущенно...
Re[19]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 07.06.05 19:12
Оценка:
Здравствуйте, eao197, Вы писали:

AVC>>Я не думаю, что C++ must die! Это Вы меня прямо оклеветали.

AVC>>Я думаю, что C++ is dead.
E>Остается процитировать классиков: "Слухи о моей смерти сильно преувеличены"


Какое счастье — все классики живы!

AVC>>Говорят, что если петуху отрубить голову, он еще может носиться по двору. Вот C++ и носится... А потом бряк — и уже вверх ногами!

E>К этому высказыванию не мешало бы добавить жирное ИМХО.

Согласен.
Но ведь я так и написал: "я думаю, что..."
Поэтому и аргумент Cyberax'а о 5 миллионах Си++программистов — это не более, чем "перепись населения"
в каких-то диких странах.
Две тысячи лет назад большинство людей полагало, что Земля плоская, хотя задолго до того Эратосфен (тот самый, чье
"решето" для простых чисел) весьма точно вычислил ее размер.
Точно так же сейчас многие еще пишут на Си++, но будущее за модульными языками, обеспечивающими безопасность типов.
Собственно, я защищаю Оберон за то, что это первый в мире язык программирования, обеспечивающий безопасность типов. При этом, в отличие от Java и C#, это эффективный язык, на котором пишут операционные системы.

E>>>При этом хотелось бы напомнить, что эта возможность Oberon/Java/C# хороша только при отладке. Если такая ошибка возникает во время эксплуатации, последствия от нее что в C/С++, что в Oberon/Java/C# будут КАТАСТРОФИЧЕСКИМИ.


AVC>>Я так и думал, что программисты, предпочитающие Си++, просто не знают, для чего пишутся программы.

E>Ба! Я всегда думал, что программы пишут либо для удовольствия, либо для заработка. И при чем здесь С++?



AVC>>А неверные вычисления и их КАТАСТРОФИЧЕСКИЕ РЕЗУЛЬТАТЫ Вас не пугают?

E>Нет. Я вычислениями не занимаюсь. Кстати, я говорил именно об ошибке выхода за пределы границы массива.

Вот как? Вы не занимаетесь вычислениями?
Кажется, Вы полагаете, что вычисления — это только "численные методы"?
Впрочем, хорошо Вам! Раз Вы не занимаетесь вычислениями, то и ошибок в Ваших программах не бывает...

AVC>>"Не упасть" — не единственная цель программы. Надо еще и требуемые вычисления выполнить, причем без ошибок.

AVC>>Впрочем, понятно, что Си++программист всегда в страхе: КАК БЫ ЧЕГО НЕ УПАЛО!
E>Сколько нового про себя в Священных Воинах узнаешь, просто ужас. Я и не знал, чего боялся все это время.

Хотите об этом поговорить?

E>Теперь объясни мне, где же я ошибся в определении причины катастрофы? Главное, что исключение возникло там, где его не ждали.


Главное — что сняли защиту.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[21]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 07.06.05 20:51
Оценка: 10 (1)
Здравствуйте, Владик, Вы писали:

В>Так я увижу этот волшебный код или нет?


Какой код, Владик? ПО для Ариана-5 на Обероне?
Так ведь ПО для Ариана-5 было написано на Аде.

Если же Вас действительно интересует Оберон, то информации в Интернете и открытого кода предостаточно.
Лучше всего начать с описания языка:
http://www.uni-vologda.ac.ru/oberon/o2rus.htm
Чтобы не толочь воду в ступе, вот, сжато, что я думаю об Обероне и Си++:
http://alexcheremkhin.boom.ru/oberon.htm
К сожалению, нет особой возможности "развивать тему" — времени не хватает.
Но, зато, я там привел достаточное количество ссылок на обероновские сайты.
К этому списку я бы добавил сайт фирмы Oberon Microsystems:
http://www.oberon.ch
У них есть достаточно интересный продукт BlackBox.
Я сначала его не оценил, а сейчас использую в работе.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: Владик Россия  
Дата: 07.06.05 21:11
Оценка: +3
Здравствуйте, AVC, Вы писали:

В>>Так я увижу этот волшебный код или нет?

AVC>Какой код, Владик?

Код явного небезопасного преобразования из одного типа в другой, который не пропустит компилятор Оберона (на этапе компиляции), но пропустит компилятор Ады или С++. Ты ведь об этом говорил?

P.S. За ссылки спасибо, но по той информации, которую я почерпнул из обсуждений на RSDN, мне этот язык для более глубоко изучения пока неинтересен.

P.S.S. На самом деле на код я не надеюсь. Просто корректнее надо быть в высказываниях. Приведеная тобой цитата про то, что компилятор Оберона чего-то там не пропустит и "ткнет носом", может иметь смысл только применительно к плюсовым неявным преобразованиям POD-типов (и то, нормальный компилятор С++ выдаст варнинг при преобразовании int64 в int16). В случае с Адой и спутником, где такое преобразование было сделано явно, реальных преимуществ Оберона я так и не увидел.
Как все запущенно...
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 08.06.05 11:03
Оценка: 10 (1) +5
Здравствуйте, AVC, Вы писали:

AVC>>>Говорят, что если петуху отрубить голову, он еще может носиться по двору. Вот C++ и носится... А потом бряк — и уже вверх ногами!

E>>К этому высказыванию не мешало бы добавить жирное ИМХО.

AVC>Согласен.

AVC>Но ведь я так и написал: "я думаю, что..."

Здесь хочется придраться к словам
Сначала было сказано:

Я думаю, что C++ is dead.

И здесь было понятно, что это твое личное мнение. Но уже затем, отдельной строкой:

Говорят, что если петуху отрубить голову, он еще может носиться по двору. Вот C++ и носится... А потом бряк — и уже вверх ногами!

Вот во второй строке ИМХО бы совершенно не помешал.

AVC>Поэтому и аргумент Cyberax'а о 5 миллионах Си++программистов — это не более, чем "перепись населения"

AVC>в каких-то диких странах.
AVC>Две тысячи лет назад большинство людей полагало, что Земля плоская, хотя задолго до того Эратосфен (тот самый, чье
AVC>"решето" для простых чисел) весьма точно вычислил ее размер.
AVC>Точно так же сейчас многие еще пишут на Си++, но будущее за модульными языками, обеспечивающими безопасность типов.

По этому поводу хочу привести две цитаты Страуструпа отсюда:

As ever, it is hard to estimate the number of C++ programmers, but in 2003, the IDC reported well over three million full-time C++ programmers (compared to my estimate of 400,000 in 1991; §D&E7.1), and that’s not an implausible number. I’m not in a position to accurately count, but all the indicators I have, show a steady increase in the use of C++ over the last decade (1995-2004) after the explosive growth of C++’s first decade (1985-1994). I never experienced a year without growth.


So what do all of those C++ programmers actually do? What kind of applications do they write and what kind of programming styles do they employ? I don’t know; nobody knows. In the same way as there are too many C++ programmers to count, there are too many different application areas and too many programming styles for any one person to grasp. It is common to hear generalizations along the line “C++ is used like this”. Such statements are typically wishful thinking based on very limited experience. We are playing “blind men and the elephant” with a very large creature. There are people who have read more than a million lines of C++ code, written hundred of thousands of lines of C++, read all the articles in C-vu, C/C++ Users Journal, etc., read all the good C++ books and dozens of the bad ones, read all the academic papers relating to C++, and “lived” on the C++ newsgroups for years. There are not many such people, and even they have only scratched the surface. Such people are usually the last to utter simple generalizations. In fact, I hear the most succinct and confident generalizations (both positive and negative) about C++ from people who have hardly any experience with C++. Ignorance is bliss.


Лично меня последняя цитата поразила -- имея более чем тринадцатилетний опыт программирования на C++ для разных платформ я думал, что я могу представить, в каких областях C++ применяется. Но, оказалось, что я даже не представляю себе вершину этого айсберга. Многообразие приложений, которые создавались, создаются, эксплуатируются сейчас и будут разрабатываться в будущем просто невозможно себе представить.

Поэтому я не думаю, что ты являешься человеком, обладающим достаточными представлениями о текущем состоянии C++ для того, чтобы предсказывать что-либо про будущее С++. Ничего личного.

AVC>>>А неверные вычисления и их КАТАСТРОФИЧЕСКИЕ РЕЗУЛЬТАТЫ Вас не пугают?

E>>Нет. Я вычислениями не занимаюсь. Кстати, я говорил именно об ошибке выхода за пределы границы массива.

AVC>Вот как? Вы не занимаетесь вычислениями?

AVC>Кажется, Вы полагаете, что вычисления — это только "численные методы"?

Да, в моем понимании вычисления -- это "численные методы" и есть. Во время учебы я специализировался на кафедре Вычислительной Математики и Программирования, поэтому я себе представляю, чем отличается, скажем, расчет ленточных фундаментов методом конечных элементов или распределения температуры по поверхности методом граничных элементов от real-time взаимодействия спецвычислителей радиолокационных станций или формирования подписанного XML. Причем, C/С++ успешно справляется со всеми этими задачами.

E>>Теперь объясни мне, где же я ошибся в определении причины катастрофы? Главное, что исключение возникло там, где его не ждали.


AVC>Главное — что сняли защиту.


Нет, имхо, проблема была в проектировании, в том что было решено использовать оригинальные модули от Ариан 4 в Ариан 5. А уже то, что где-то был выполнен явный каст -- это уже следствие.

Собственно, поэтому мне и не нравятся аргументы типа: "C++ позволяет неявный каст, что плохо. С++ не контролирует выходы за пределы массивов, что плохо. С++ то, С++ се". Все это граничные условия, которые нужно учитывать, используя C++ для решения конкретных задач. Если какое-то из условий не было учтено, то, вероятно, это была ошибка проектирования. А ошибки проектирования страшны для любых языков.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: Cyberax Марс  
Дата: 08.06.05 11:34
Оценка:
AVC wrote:

> AVC>>Говорят, что если петуху отрубить голову, он еще может носиться

> по двору. Вот C++ и носится... А потом бряк — и уже вверх ногами!
> E>К этому высказыванию не мешало бы добавить жирное ИМХО.
> Согласен.
> Но ведь я так и написал: "*я думаю, что*..."
> Поэтому и аргумент Cyberax'а о 5 миллионах Си++программистов — это не
> более, чем "перепись населения"
> в каких-то диких странах.

Тут уже ссылку привели.

> Точно так же сейчас многие еще пишут на Си++, но будущее за модульными

> языками, обеспечивающими безопасность типов.
> Собственно, я защищаю Оберон за то, что это *первый в мире язык
> программирования, обеспечивающий безопасность типов*.

Вранье. Причем наглое. До Оберона была Ада, в которой намного больше
средств контроля за типами, была типизированная scheme, была еще куча
языков, был даже ML.

Оберон появился в конце 80-х, а Ада была еще в 70-х годах. Ее
предшественники — еще раньше.

> При этом, в отличие от Java и C#, это эффективный язык, на котором

> пишут операционные системы.

На Яве тоже пишут операционные системы (причем распространенные больше,
чем BlueBottle).

А уж с ОСами написанными на С лучше BlueBottle даже не сравнивать.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[21]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 08.06.05 22:32
Оценка: 6 (1) :))
Здравствуйте, eao197, Вы писали:

AVC>>>>Говорят, что если петуху отрубить голову, он еще может носиться по двору. Вот C++ и носится... А потом бряк — и уже вверх ногами!

E>>>К этому высказыванию не мешало бы добавить жирное ИМХО.
AVC>>Согласен.
AVC>>Но ведь я так и написал: "я думаю, что..."
E>Здесь хочется придраться к словам
Сначала было сказано:
E>

E>Я думаю, что C++ is dead.

E>И здесь было понятно, что это твое личное мнение. Но уже затем, отдельной строкой:
E>

E>Говорят, что если петуху отрубить голову, он еще может носиться по двору. Вот C++ и носится... А потом бряк — и уже вверх ногами!

E>Вот во второй строке ИМХО бы совершенно не помешал.

В принципе, пассаж про петуха "был задуман" просто как пояснение к предыдущей фразе.
Ведь ясно, что сейчас Си++программистов много. Но вряд ли так будет долго.
Я только хотел сказать, что иногда в действительности не все так, как кажется.
Впрочем, хорошо. Пожалуйста:

ИМХО, если петуху отрубить голову, он еще может, ИМХО, носиться по двору. Вот, ИМХО, C++ и носится... А потом, ИМХО, бряк — и уже вверх ногами!



AVC>>Точно так же сейчас многие еще пишут на Си++, но будущее за модульными языками, обеспечивающими безопасность типов.

E>По этому поводу хочу привести две цитаты Страуструпа отсюда:

E>

E>As ever, it is hard to estimate the number of C++ programmers, but in 2003, the IDC reported well over three million full-time C++ programmers (compared to my estimate of 400,000 in 1991; §D&E7.1), and that’s not an implausible number. I’m not in a position to accurately count, but all the indicators I have, show a steady increase in the use of C++ over the last decade (1995-2004) after the explosive growth of C++’s first decade (1985-1994). I never experienced a year without growth.


E>

E>So what do all of those C++ programmers actually do? What kind of applications do they write and what kind of programming styles do they employ? I don’t know; nobody knows. In the same way as there are too many C++ programmers to count, there are too many different application areas and too many programming styles for any one person to grasp. It is common to hear generalizations along the line “C++ is used like this”. Such statements are typically wishful thinking based on very limited experience. We are playing “blind men and the elephant” with a very large creature. There are people who have read more than a million lines of C++ code, written hundred of thousands of lines of C++, read all the articles in C-vu, C/C++ Users Journal, etc., read all the good C++ books and dozens of the bad ones, read all the academic papers relating to C++, and “lived” on the C++ newsgroups for years. There are not many such people, and even they have only scratched the surface. Such people are usually the last to utter simple generalizations. In fact, I hear the most succinct and confident generalizations (both positive and negative) about C++ from people who have hardly any experience with C++. Ignorance is bliss.


E>Лично меня последняя цитата поразила -- имея более чем тринадцатилетний опыт программирования на C++ для разных платформ я думал, что я могу представить, в каких областях C++ применяется. Но, оказалось, что я даже не представляю себе вершину этого айсберга. Многообразие приложений, которые создавались, создаются, эксплуатируются сейчас и будут разрабатываться в будущем просто невозможно себе представить.

E>Поэтому я не думаю, что ты являешься человеком, обладающим достаточными представлениями о текущем состоянии C++ для того, чтобы предсказывать что-либо про будущее С++. Ничего личного.

Мне нравится фраза о том, что цитата Вас "поразила".
По крайней мере, мне знакомо подобное состояние: когда внезапно что-нибудь по настоящему осознаешь.
Правда, я в этой фразе Страуструпа не увидел ничего особо примечательного.
Чтобы поддержать Ваш торжественный зачин , отвечу примерно так.
Имея почти двадцатилетний опыт программирования на Си и тринадцатилетний (с гаком) опыт программирования на Си++,
опыт создания приложений в самых разных прикладных областях (от вычислительной математики до русского языка),
опыт создания программ, работающих в жестком реальном времени времени, участвуя в создании систем безопасности,
имея теперь уже немалый опыт создания ассемблеров, компиляторов (Си), отладчиков, вообще — систем программирования для новых процессоров, для некоторых из которых я был и первым программистом, не вижу в этой фразе Стауструпа ничего заслуживающего внимания.
Уф!
Напротив, каждый день я вижу, как мучаются эти программисты, многомиллионым количеством которых здесь принято громко хвастаться.
Ведь за консультацией по Си/Си++ они часто приходят ко мне.
Так что вижу я типового программиста на Си++, можно сказать, "без штанов", прямо как специалист по венерическим заболеваниям.
Когда ко мне последний раз пришли с проблемой? Правильно — сегодня!
Толковый парень, решает сложную математическую задачу. Понадобился трехмерный массив заранее не определенной размерности.
Для Оберона это вообще не проблема. И для Java, и для C#. А вот в Си++ (сколько раз я уже об этом повторил на форуме?) нет нормальных массивов.
Может быть, скажете, что надо использовать STL, "зачем изобретать велосипед"?
Да не годится vector STL в качестве велосипеда!
Не дай Бог, забудешь, что вот здесь надо использовать не reserve, а resize, или еще одну из кучи таких же столь любимых "знатоками" "тонкостей". Да, и не забудьте, что писать >> здесь надо через пробел: > >.
И загружать голову огромным количеством подобной фигни для того, чтобы воспользоваться этим "сокровенным" знанием один-два раза в жизни? Абсурд!
И все равно придется писать свой вспомогательный код!
Какой же это велосипед? Это просто цепи на ногах.

AVC>>>>А неверные вычисления и их КАТАСТРОФИЧЕСКИЕ РЕЗУЛЬТАТЫ Вас не пугают?

E>>>Нет. Я вычислениями не занимаюсь. Кстати, я говорил именно об ошибке выхода за пределы границы массива.
AVC>>Вот как? Вы не занимаетесь вычислениями?
AVC>>Кажется, Вы полагаете, что вычисления — это только "численные методы"?
E>Да, в моем понимании вычисления -- это "численные методы" и есть. Во время учебы я специализировался на кафедре Вычислительной Математики и Программирования, поэтому я себе представляю, чем отличается, скажем, расчет ленточных фундаментов методом конечных элементов или распределения температуры по поверхности методом граничных элементов от real-time взаимодействия спецвычислителей радиолокационных станций или формирования подписанного XML. Причем, C/С++ успешно справляется со всеми этими задачами.

Ну, а я закончил факультет Вычислительной Математики и Кибернетики. Кафедра алгоритмических языков.
А насчет вычислений: никуда Вам от них не деться. Даже индекс в массиве Вам приходится вычислять.
А там где вычисления — там и потенциальные ошибки.
Си++ не помогает с ними бороться. Скорее — наоборот.

E>>>Теперь объясни мне, где же я ошибся в определении причины катастрофы? Главное, что исключение возникло там, где его не ждали.

AVC>>Главное — что сняли защиту.
E>Нет, имхо, проблема была в проектировании, в том что было решено использовать оригинальные модули от Ариан 4 в Ариан 5. А уже то, что где-то был выполнен явный каст -- это уже следствие.

Из отчета, ссылку на который дал Cyberax (за что ему отдельное спасибо, хотя не помню, чтобы мы хоть раз совпали во мнениях ), очевидно, что первопричина — в недостаточности вычислительных ресурсов. Соответствующую цитату из отчета я уже приводил.
Если бы с ресурсами было все в порядке, вычисления производились бы с использованием соответствующего типа, а не 16-битного знакового целого; и все преобразования, если бы они потребовались, были бы защищены от подобных исключений.
А так программисты вынуждены были искать, где пожертвовать надежностью.
Ну и нашли...
Кстати, интересно, кто-нибудь задумался, чтобы случилось, если бы вследствие этого выхода за границы диапазона исключения бы не было? Имеем: ракету рядом с земной поверхностью, "руководствующуюся" совершенно неверными данными.

E>Собственно, поэтому мне и не нравятся аргументы типа: "C++ позволяет неявный каст, что плохо. С++ не контролирует выходы за пределы массивов, что плохо. С++ то, С++ се". Все это граничные условия, которые нужно учитывать, используя C++ для решения конкретных задач. Если какое-то из условий не было учтено, то, вероятно, это была ошибка проектирования. А ошибки проектирования страшны для любых языков.


Что верно, то верно.
Но когда я из переменной некоего класса получаю float неявным преобразованием через bool(), что уже само по себе абсурдно, а потом меня еще начинают поучать, что, дескать, это такая "фича" языка, и все просто OK, это — дурдом.
Чтобы там не провещал Страуструп, я еще не разучился различать черное и белое.

Ну вот, я уже почти и не сердит...

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: Cyberax Марс  
Дата: 09.06.05 05:28
Оценка:
AVC wrote:

> Когда ко мне последний раз пришли с проблемой? Правильно — сегодня!

> Толковый парень, решает сложную математическую задачу.

Если он толковый, то почему пользоваться Гуглом не умеет? По фразе
"multidimensional array C++" выдается достаточно ссылок.

> Понадобился трехмерный массив заранее не определенной размерности.

> Для Оберона это вообще не проблема. И для Java, и для C#. А вот в Си++
> (сколько раз я уже об этом повторил на форуме?) *нет* нормальных массивов.

ЕСТЬ! Только не в языке, а в библиотеках.

> Может быть, скажете, что надо использовать STL, "зачем изобретать

> велосипед"?
> Да не годится vector STL в качестве велосипеда!
> Не дай Бог, забудешь, что вот здесь надо использовать не reserve, а
> resize, или еще одну из кучи таких же столь любимых "знатоками"
> "тонкостей".

Вот такой ошибки я не встречал _ни_ _разу_. Кстати, в C#/Java будут те
же проблемы с ихними resize/reserve в их библиотеках коллекций.

Ну да, а в Обероне нормальных коллекций нет, так что можно не беспокоиться.

> Да, и не забудьте, что писать >> здесь надо через пробел: > >.


Будет пофикшено в новом стандарте. Да и не создает это проблемы после
того, как в первый раз на это наткнешься.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 09.06.05 08:27
Оценка: 38 (7) +1
Здравствуйте, AVC, Вы писали:

AVC>

AVC>ИМХО, если петуху отрубить голову, он еще может, ИМХО, носиться по двору. Вот, ИМХО, C++ и носится... А потом, ИМХО, бряк — и уже вверх ногами!

AVC>

Ну вот, совсем другое дело


AVC>Имея почти двадцатилетний опыт программирования на Си и тринадцатилетний (с гаком) опыт программирования на Си++,

AVC>опыт создания приложений в самых разных прикладных областях (от вычислительной математики до русского языка),
AVC>опыт создания программ, работающих в жестком реальном времени времени, участвуя в создании систем безопасности,
AVC>имея теперь уже немалый опыт создания ассемблеров, компиляторов (Си), отладчиков, вообще — систем программирования для новых процессоров, для некоторых из которых я был и первым программистом, не вижу в этой фразе Стауструпа ничего заслуживающего внимания.
AVC>Уф!

Да, опыт внушает.
Но, имхо, как раз фраза Страуструпа к тебе и относится, т.к. твой большой опыт не позволяет тебе увидеть, что он (опыт) всего лишь маленькая капля в море.

AVC>Напротив, каждый день я вижу, как мучаются эти программисты, многомиллионым количеством которых здесь принято громко хвастаться.

AVC>Ведь за консультацией по Си/Си++ они часто приходят ко мне.

Если перейти на личности, то я представляю себе, с каким отношением к C++ эти программисты затем уходят от тебя
Есть такое понятие, как unix way. Аналогично, есть понятие C++ way (хотя об этом книг и не написано). Так вот любая проблемма, которая тривиальным образом решается в каком-то языке программирования, но не имеет очевидного решения в другом языке просто говорит о том, что для этого (якобы ущербного) языка пытаются использовать чужой подход. Ниже я поясню это на примере.

AVC>Толковый парень, решает сложную математическую задачу. Понадобился трехмерный массив заранее не определенной размерности.

AVC>Для Оберона это вообще не проблема. И для Java, и для C#. А вот в Си++ (сколько раз я уже об этом повторил на форуме?) нет нормальных массивов.
AVC>Может быть, скажете, что надо использовать STL, "зачем изобретать велосипед"?
<...>
AVC>И все равно придется писать свой вспомогательный код!
AVC>Какой же это велосипед? Это просто цепи на ногах.

Привожу реальный пример, в котором отсутствие массивов в C++ позволило существенно сократить трудозатраты за счет изобретения велосипеда. В методе конечных элементов необходимо решать СЛАУ большой размерности, в которой матрица обладает двумя важными свойствами:
— отличные от нуля значения находится в узкой ленте вдоль главной диагонали;
— матрица симметрическая.
Из-за этих особенностей выгодно хранить только верхнюю полуленту матрицы. Но, если выделить массив, который хранит только полуленту, то к элементам такой "виртуальной" матрицы уже нельзя будет обращаться по простым индексам [i,j] -- нужно делать их преобразования. Т.е., везде, где можно было бы записать:
a[i][j] = b[j][i];

пришлось бы делать что-то вроде:
a[ get_i(i, j) ][ get_j(i, j) ] = b[ get_i(j, i) ][ get_j(j, i) ];

Лично для меня второй способ был бы гораздо печальнее, т.к. ошибиться в нем гораздо проще. Поэтому, используя возможности C++, был сделан класс виртуальной матрицы, в котором обращение вида:
a[i][j]

неявным для прикладного программиста образом преобразовывалось в:
a[ get_i(i, j) ][ get_j(i, j) ]


Вот так, благодоря тому, что в C++ нет таких, казалось бы, основопологающих вещей, как матрицы, удалось получить простое, красивое и эффективное решение сложной задачи. И было сделано это где-то в 94-м году, когда и шаблонов-то в C++ я еще и не видел. А сейчас, на шаблонах, можно делать с матрицами еще более эффективные вещи. Правда, я этими вещами не занимаюсь, поэтому не могу дальше развить эту мысль.

AVC>А насчет вычислений: никуда Вам от них не деться. Даже индекс в массиве Вам приходится вычислять.

AVC>А там где вычисления — там и потенциальные ошибки.

Никогда не сталкивался с потерей точности или ошибками вычислений при вычислении целочисленных индексов из целочисленных же значений.

AVC>Си++ не помогает с ними бороться. Скорее — наоборот.


Имхо, C++ позволяет достаточно удобно записывать то, что ты хочешь получить. Если при этом ты сам записал что-то не то, то C++ здесь не при чем. Не имеет смысла менять безопасную бритву на опасную, если не умеешь пользоваться последней.

E>>>>Теперь объясни мне, где же я ошибся в определении причины катастрофы? Главное, что исключение возникло там, где его не ждали.

AVC>>>Главное — что сняли защиту.
E>>Нет, имхо, проблема была в проектировании, в том что было решено использовать оригинальные модули от Ариан 4 в Ариан 5. А уже то, что где-то был выполнен явный каст -- это уже следствие.

AVC>Из отчета, ссылку на который дал Cyberax (за что ему отдельное спасибо, хотя не помню, чтобы мы хоть раз совпали во мнениях ), очевидно, что первопричина — в недостаточности вычислительных ресурсов. Соответствующую цитату из отчета я уже приводил.

AVC>Если бы с ресурсами было все в порядке, вычисления производились бы с использованием соответствующего типа, а не 16-битного знакового целого; и все преобразования, если бы они потребовались, были бы защищены от подобных исключений.
AVC>А так программисты вынуждены были искать, где пожертвовать надежностью.

Так ведь это обычные условия. В реальной жизни всегда чего-нибудь не хватает.

E>>Собственно, поэтому мне и не нравятся аргументы типа: "C++ позволяет неявный каст, что плохо. С++ не контролирует выходы за пределы массивов, что плохо. С++ то, С++ се". Все это граничные условия, которые нужно учитывать, используя C++ для решения конкретных задач. Если какое-то из условий не было учтено, то, вероятно, это была ошибка проектирования. А ошибки проектирования страшны для любых языков.


AVC>Что верно, то верно.

AVC>Но когда я из переменной некоего класса получаю float неявным преобразованием через bool(), что уже само по себе абсурдно, а потом меня еще начинают поучать, что, дескать, это такая "фича" языка, и все просто OK, это — дурдом.

Это не дурдом, это особенность. Точно такая же, как необходимость объявлять переменные в Pascal-е в специальной секции var, а не в том блоке, где она необходима.

AVC>Чтобы там не провещал Страуструп, я еще не разучился различать черное и белое.


Имхо, мир гораздо богаче оттенками, чем только черное и белоее. Развивая эту мысль хотел бы провести такую аналогию: программирование на паскале-подобных языках -- это рисование фломастерами, нужный оттенок можно получить, только если он есть в наличии (ну, или если есть очень большой опыт и везение, скажем зеленый цвет можно получить проведя синим фломастером по следу желтого). Но даже рисование простым карандашом (что-то похожее на C) дает гораздо больше выразительных возможностей. C++ -- это уже масляная живопись -- много мудоты, краски долго сохнут, свежий слой можно класть либо на свежий еще слой, либо на полностью просохший слой. Писать можно только на специально прогрунтованных поверхностях (картоне, досках, холстах, стенах, на простом ватмане уже не получится). Зато какой результат в умелых руках получается! А Java/C# -- это темпера (хотя сам не пробовал, только читал) -- вроде почти тоже, что и масло, но ярче и сохнет быстрее, разводится простой водой, менее требовательна к поверхности. Но вот с полутонами и полупрозрачными слоями там беда, до масла далеко.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[21]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 16.06.05 20:01
Оценка:
Прошу прощения за задержку.

>> Собственно, я защищаю Оберон за то, что это *первый в мире язык

>> программирования, обеспечивающий безопасность типов*.

C>Вранье. Причем наглое. До Оберона была Ада, в которой намного больше

C>средств контроля за типами, была типизированная scheme, была еще куча
C>языков, был даже ML.

Я чувствую некоторое смущение.
По крайней мере, об Аде я просто забыл в момент написания поста.
Причина понятна, хотя, может быть, и не извинительна: я никогда не рассаматривал Аду как реальный язык программирования для PC или каких-нибудь используемых мной в работе микропроцессоров.
В этот момент я думал в основном о цепочках C/C++ и Oberon/Java/C#.
Пока что я не готов возражать по безопасности типов в Аде (несмотря на то, что в "мое" время на ВМиК лекции Кауфмана иллюстрировались именно этим языком), поэтому свое слишком сильное утверждение (временно?) снимаю.
Конечно, "причина любви" к Оберону этим никак не устраняется, т.к. перешел я к нему от C++, а не от Ады.
А за напоминание об Аде — спасибо!
Что касается ML, то это вообще "другая песня". Функциональные или специализированные языки я здесь не обсуждаю за отсутствием собственного практического опыта в этой области (о чем искренне сожалею).

C>Оберон появился в конце 80-х, а Ада была еще в 70-х годах. Ее

C>предшественники — еще раньше.

Как бы то ни было, основным предшественником Ады был Паскаль.
Именно его (а не Алгол-68 или PL/1) выбрали в качестве отправной точки все четыре рабочие группы.
Кроме того, вряд ли стоит так упирать на то, что Ада появилась раньше Оберона.
Оберон — это некоторая переработка (в основном — упрощение, избавление от "лишних" конструкций) Модулы-2.
В 1979 году, когда уже активно использовался компилятор Модулы-2, компилятором Ады и "не пахло".

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[23]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 16.06.05 20:02
Оценка: -3 :)
Здравствуйте, Cyberax, Вы писали:

>> Когда ко мне последний раз пришли с проблемой? Правильно — сегодня!

>> Толковый парень, решает сложную математическую задачу.

C>Если он толковый, то почему пользоваться Гуглом не умеет? По фразе

C>"multidimensional array C++" выдается достаточно ссылок.

Ну да, конечно. "Если вы такие умные, то почему строем не ходите?"
Ваши программистские потребности возросли. Раньше Вы обходились boost'ом.
Теперь Вам для писания на Си++ нужен еще Google.
То ли еще будет!

>> Понадобился трехмерный массив заранее не определенной размерности.

>> Для Оберона это вообще не проблема. И для Java, и для C#. А вот в Си++
>> (сколько раз я уже об этом повторил на форуме?) *нет* нормальных массивов.
C>ЕСТЬ! Только не в языке, а в библиотеках.

Так я и говорю, что в языке нет.

>> Может быть, скажете, что надо использовать STL, "зачем изобретать

>> велосипед"?
>> Да не годится vector STL в качестве велосипеда!
>> Не дай Бог, забудешь, что вот здесь надо использовать не reserve, а
>> resize, или еще одну из кучи таких же столь любимых "знатоками"
>> "тонкостей".

C>Вот такой ошибки я не встречал _ни_ _разу_. Кстати, в C#/Java будут те

C>же проблемы с ихними resize/reserve в их библиотеках коллекций.

Логично.
Что-то вроде:
— Во-первых, я вашего горшка не брала. Во-вторых, когда я его вам вернула, он был целый. В-третьих, когда я его у вас брала, он уже был треснутый.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[23]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 17.06.05 00:12
Оценка: -2
Прошу прощения за задержку с ответом: обстоятельства.

AVC>>Имея почти двадцатилетний опыт программирования на Си и тринадцатилетний (с гаком) опыт программирования на Си++,

AVC>>опыт создания приложений в самых разных прикладных областях (от вычислительной математики до русского языка),
AVC>>опыт создания программ, работающих в жестком реальном времени времени, участвуя в создании систем безопасности,
AVC>>имея теперь уже немалый опыт создания ассемблеров, компиляторов (Си), отладчиков, вообще — систем программирования для новых процессоров, для некоторых из которых я был и первым программистом, не вижу в этой фразе Стауструпа ничего заслуживающего внимания.
AVC>>Уф!

E>Да, опыт внушает.

E>Но, имхо, как раз фраза Страуструпа к тебе и относится, т.к. твой большой опыт не позволяет тебе увидеть, что он (опыт) всего лишь маленькая капля в море.

(голосом кота Матроскина) Я еще и СУБД писал...

AVC>>Напротив, каждый день я вижу, как мучаются эти программисты, многомиллионым количеством которых здесь принято громко хвастаться.

AVC>>Ведь за консультацией по Си/Си++ они часто приходят ко мне.
E>Если перейти на личности, то я представляю себе, с каким отношением к C++ эти программисты затем уходят от тебя

Ну, не надо преувеличивать мои заслуги...
Все они взрослые люди, со своими (и неглупыми!) головами на плечах.
Одними словами их не проймешь. (К тому же, я ведь еще и помогаю сформулировать их идеи на Си++. Что бы это была за помощь, если бы я только повторял: "сами теперь видите, что Си++ — дерьмо". От этого большой Си++ный проект в одночасье не станет обероновским.)

E>Есть такое понятие, как unix way. Аналогично, есть понятие C++ way (хотя об этом книг и не написано). Так вот любая проблемма, которая тривиальным образом решается в каком-то языке программирования, но не имеет очевидного решения в другом языке просто говорит о том, что для этого (якобы ущербного) языка пытаются использовать чужой подход. Ниже я поясню это на примере.

E>Привожу реальный пример, в котором отсутствие массивов в C++ позволило существенно сократить трудозатраты за счет изобретения велосипеда. В методе конечных элементов необходимо решать СЛАУ большой размерности, в которой матрица обладает двумя важными свойствами:
E>- отличные от нуля значения находится в узкой ленте вдоль главной диагонали;
E>- матрица симметрическая.
E>Из-за этих особенностей выгодно хранить только верхнюю полуленту матрицы. Но, если выделить массив, который хранит только полуленту, то к элементам такой "виртуальной" матрицы уже нельзя будет обращаться по простым индексам [i,j] -- нужно делать их преобразования. Т.е., везде, где можно было бы записать:
E>
E>a[i][j] = b[j][i];
E>

E>пришлось бы делать что-то вроде:
E>
E>a[ get_i(i, j) ][ get_j(i, j) ] = b[ get_i(j, i) ][ get_j(j, i) ];
E>

E>Лично для меня второй способ был бы гораздо печальнее, т.к. ошибиться в нем гораздо проще. Поэтому, используя возможности C++, был сделан класс виртуальной матрицы, в котором обращение вида:
E>
E>a[i][j]
E>

E>неявным для прикладного программиста образом преобразовывалось в:
E>
E>a[ get_i(i, j) ][ get_j(i, j) ]
E>


E>Вот так, благодоря тому, что в C++ нет таких, казалось бы, основопологающих вещей, как матрицы, удалось получить простое, красивое и эффективное решение сложной задачи. И было сделано это где-то в 94-м году, когда и шаблонов-то в C++ я еще и не видел. А сейчас, на шаблонах, можно делать с матрицами еще более эффективные вещи. Правда, я этими вещами не занимаюсь, поэтому не могу дальше развить эту мысль.


ИМХО, никакой иной "пользы", кроме того, что это все это проделано неявно для программиста, не видно.
Такая "неявность" скорее вредна, чем полезна (пример с неявным (!) преобразованием во float через bool я уже приводил).
Чем хуже тривиальное get(a, i, j)? Только тем, что несколько иначе выглядит? Так ведь это и хорошо!
В противном случае программист может быть просто обманут, думая, что и правда имеет дело с массивом.

AVC>>А насчет вычислений: никуда Вам от них не деться. Даже индекс в массиве Вам приходится вычислять.

AVC>>А там где вычисления — там и потенциальные ошибки.
E>Никогда не сталкивался с потерей точности или ошибками вычислений при вычислении целочисленных индексов из целочисленных же значений.

И за границы массива никогда не выходили?!

AVC>>Си++ не помогает с ними бороться. Скорее — наоборот.

E>Имхо, C++ позволяет достаточно удобно записывать то, что ты хочешь получить. Если при этом ты сам записал что-то не то, то C++ здесь не при чем. Не имеет смысла менять безопасную бритву на опасную, если не умеешь пользоваться последней.

E>>>>>Теперь объясни мне, где же я ошибся в определении причины катастрофы? Главное, что исключение возникло там, где его не ждали.

AVC>>>>Главное — что сняли защиту.
E>>>Нет, имхо, проблема была в проектировании, в том что было решено использовать оригинальные модули от Ариан 4 в Ариан 5. А уже то, что где-то был выполнен явный каст -- это уже следствие.
AVC>>Из отчета, ссылку на который дал Cyberax (за что ему отдельное спасибо, хотя не помню, чтобы мы хоть раз совпали во мнениях ), очевидно, что первопричина — в недостаточности вычислительных ресурсов. Соответствующую цитату из отчета я уже приводил.
AVC>>Если бы с ресурсами было все в порядке, вычисления производились бы с использованием соответствующего типа, а не 16-битного знакового целого; и все преобразования, если бы они потребовались, были бы защищены от подобных исключений.
AVC>>А так программисты вынуждены были искать, где пожертвовать надежностью.
E>Так ведь это обычные условия. В реальной жизни всегда чего-нибудь не хватает.

Одно дело, когда "чего-нибудь не хватает" в офисном приложении.
Другое дело — в аэрокосмической, ядерной или военной областях.
Я бы на Вашем месте не был настроен столь философски.
В главной же Вашей мысли, что это не столько ошибка кодирования, сколько большая проектная ошибка, я с Вами согласен. В свободное время япытался представить себе, что именно я бы сделал на месте программистов Ариана-5 в тех условиях. Ничего утешительного не придумал...
Но, кажется, отсюда мы с Вами делаем разные выводы. Вы говорите, что так было, так есть, так будет (или нет?). А я говорю, что, если не хватает ресурсов для нормального (защищенного и типо-безопасного) программирования, лучше вообще не браться за подобные проекты.

E>Это не дурдом, это особенность.


Я, наверное, эту Вашу фразу на стенку повешу.
Насколько здесь выразительнее сформулирована старая мысль "это не баг, это фича".

E>Точно такая же, как необходимость объявлять переменные в Pascal-е в специальной секции var, а не в том блоке, где она необходима.


Вообще-то, в Паскале, Модуле и Обероне переменная объявляется именно там, где нужна.
Просто некоторые Си++программисты не в курсе, как именно это делается.
Допустим, я хочу провести поиск какого-нибудь значения в массиве.
Ясно, что для этого мне потребуются дополнительные переменные, которые может быть больше в данной процедуре нигде не нужны.
Я просто выношу поиск во вложенную процедуру:
PROCEDURE GlobalProc(v: INTEGER);
  CONST size = 1024;
  VAR a: ARRAY size OF INTEGER;
  PROCEDURE LocalSearch(x: INTEGER): INTEGER;
    VAR i: INTEGER; (* здесь могут быть объявлены и другие вспомогательные переменные *)
  BEGIN
    FOR i := 0 TO size-1 DO
      IF a[i] = x THEN RETURN i END
    END;
    RETURN -1
  END LocalSearch;
BEGIN
  (* ... море кода, где переменная i не нужна *)
  IF Local(v) >= 0 THEN (* ура, значение найдено! :)  *)
  ELSE (* увы, не найдено... :(  *)
  END;
  (* ... еще море кода, где переменная i не нужна *)
END GlobalProc;

А теперь важное замечание. Если нет рекурсии, и программист не запрещает, то компилятор сделает вложенную процедуру подставляемой (inline). Так что нет ни потери ясности, ни потери эффективности.
А вот в Си++ сидишь и гадаешь, как изволит компилятор отнестись к конструкции
for (int i = 0; i < size; i++) ;

Будет ли переменная i "жива" и после цикла, как в Visual C++ 6.0, или нет, как полагается по стандарту?

AVC>>Чтобы там не провещал Страуструп, я еще не разучился различать черное и белое.

E>Имхо, мир гораздо богаче оттенками, чем только черное и белоее. Развивая эту мысль хотел бы провести такую аналогию: программирование на паскале-подобных языках -- это рисование фломастерами, нужный оттенок можно получить, только если он есть в наличии (ну, или если есть очень большой опыт и везение, скажем зеленый цвет можно получить проведя синим фломастером по следу желтого). Но даже рисование простым карандашом (что-то похожее на C) дает гораздо больше выразительных возможностей. C++ -- это уже масляная живопись -- много мудоты, краски долго сохнут, свежий слой можно класть либо на свежий еще слой, либо на полностью просохший слой. Писать можно только на специально прогрунтованных поверхностях (картоне, досках, холстах, стенах, на простом ватмане уже не получится). Зато какой результат в умелых руках получается! А Java/C# -- это темпера (хотя сам не пробовал, только читал) -- вроде почти тоже, что и масло, но ярче и сохнет быстрее, разводится простой водой, менее требовательна к поверхности. Но вот с полутонами и полупрозрачными слоями там беда, до масла далеко.

Очень интересная параллель!
Знаете, это достаточно забавно, но среди Си++программистов достаточно много людей с художественными (но, к сожалению, не математическими) наклонностями!
Один мой добрый знакомый — действительно гениальный Си++программист (по крайней мере, второго такого я не встречал) — пытался как-то мне объяснить процесс своего мышления над программой. Сначала он немного помычал для внушительности, затем стал решительно тыкать пальцем в закатное небо и перечислять, какие оттенки и особенности он там видит. Сознаюсь — я мало что понял, но зато запомнил эту картину закатного неба на всю жизнь!
Я мог быть развить эту тему разных стилей программистского мышления, с их плюсами и минусами, но пусть лучше остается все как есть — в виде яркого воспоминания.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[24]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 17.06.05 04:25
Оценка: +3
Здравствуйте, AVC, Вы писали:

E>>Да, опыт внушает.

E>>Но, имхо, как раз фраза Страуструпа к тебе и относится, т.к. твой большой опыт не позволяет тебе увидеть, что он (опыт) всего лишь маленькая капля в море.

AVC>(голосом кота Матроскина) Я еще и СУБД писал...


Я тоже. И сейчас пишу.
И еще раз, еще более уверенно в своей правоте, повторю, что слова Страуструпа к тебе и относятся.

E>>Привожу реальный пример, в котором отсутствие массивов в C++ позволило существенно сократить трудозатраты за счет изобретения велосипеда. В методе конечных элементов необходимо решать СЛАУ большой размерности, в которой матрица обладает двумя важными свойствами:

E>>- отличные от нуля значения находится в узкой ленте вдоль главной диагонали;
E>>- матрица симметрическая.
E>>Из-за этих особенностей выгодно хранить только верхнюю полуленту матрицы. Но, если выделить массив, который хранит только полуленту, то к элементам такой "виртуальной" матрицы уже нельзя будет обращаться по простым индексам [i,j] -- нужно делать их преобразования. Т.е., везде, где можно было бы записать:
E>>
E>>a[i][j] = b[j][i];
E>>

E>>пришлось бы делать что-то вроде:
E>>
E>>a[ get_i(i, j) ][ get_j(i, j) ] = b[ get_i(j, i) ][ get_j(j, i) ];
E>>

E>>Лично для меня второй способ был бы гораздо печальнее, т.к. ошибиться в нем гораздо проще. Поэтому, используя возможности C++, был сделан класс виртуальной матрицы, в котором обращение вида:
E>>
E>>a[i][j]
E>>

E>>неявным для прикладного программиста образом преобразовывалось в:
E>>
E>>a[ get_i(i, j) ][ get_j(i, j) ]
E>>


AVC>ИМХО, никакой иной "пользы", кроме того, что это все это проделано неявно для программиста, не видно.


Именно в этом задача и состояла -- нужно было повысить уровень абстракции.

AVC>Такая "неявность" скорее вредна, чем полезна (пример с неявным (!) преобразованием во float через bool я уже приводил).

AVC>Чем хуже тривиальное get(a, i, j)? Только тем, что несколько иначе выглядит? Так ведь это и хорошо!

Нет, это плохо. Такая запись гораздо длинее и черевата ошибками (как, например, заметить, где i и j случайно поменяли местами). А в получившемся варианте использовалась стандартная математическая запись.

И именно эта запись позволила корректно и быстро записать выражения аппроксимации (треугольниками и прямоугольниками) при вычислении начального значения матрицы (этим занимался не я, но те, кто это делал сказали мне спасибо), а формулы там трехэтажные были. А мне такая запись позволила легко реализовать три или четыре метода решения СЛАУ в поисках того метода, который бы давал решение за приемлимое время (вообще в этой задаче метод итераций сходился медлено, методы Гауса и квадратного корня нельзя было применять из-за особенности матрицы, пришлось использовать метод Халецкого).

AVC>В противном случае программист может быть просто обманут, думая, что и правда имеет дело с массивом.


Прикладной программист не был обманут -- он работал именно с теми понятиями, с которыми должен был работать. А задача системного программиста (т.е. меня) была в том, чтобы позволить программисту делать это в условиях органиченных ресурсов.

Или ты считаешь, что операционнки с виртуальной памятью тебя обманывают, неявно вытесняя старые страницы на диск и подкачивая их по необходимости?

AVC>>>А насчет вычислений: никуда Вам от них не деться. Даже индекс в массиве Вам приходится вычислять.

AVC>>>А там где вычисления — там и потенциальные ошибки.
E>>Никогда не сталкивался с потерей точности или ошибками вычислений при вычислении целочисленных индексов из целочисленных же значений.

AVC>И за границы массива никогда не выходили?!


Выход за границы массива и потеря точности при вычислениях -- это совершенно разные вещи. В первом случае я получаю абсолютно точное значение, просто из-за моей ошибки оно оказывается не в том диапазоне. А реальная потеря точности, это когда в правильном выражении получается неправильный результат из-за ограничений платформы. Например: c/(a-b). Если a != b, то это выражение корректно и в математическом смысле всегда дает корректный результат. Но, если a и b являются вещественными числами, то корректность выражения начнет зависеть от величины (a-b). Если это довольно близкие значения, то их разность окажется слишком маленьким числом из-за чего c/(a-b) не сможет быть представлена.
Еще один пример неявной потрери точности обсуждался в форуме по C++.

AVC>>>А так программисты вынуждены были искать, где пожертвовать надежностью.

E>>Так ведь это обычные условия. В реальной жизни всегда чего-нибудь не хватает.

AVC>Одно дело, когда "чего-нибудь не хватает" в офисном приложении.

AVC>Другое дело — в аэрокосмической, ядерной или военной областях.
AVC>Я бы на Вашем месте не был настроен столь философски.

А мне давелось чуть-чуть попрограммировать для военной области (в радиолокации). Смею тебя уверить, там такие вычислительные задачи и такое жесткое реальное время, для которых ресурсов компьютеров не будет хватать еще очень долго. И достигается там приемлимая производительность именно за счет огрубления расчетов, т.е. не на уровне программирования, а на уровне проектирования.

AVC>Но, кажется, отсюда мы с Вами делаем разные выводы. Вы говорите, что так было, так есть, так будет (или нет?). А я говорю, что, если не хватает ресурсов для нормального (защищенного и типо-безопасного) программирования, лучше вообще не браться за подобные проекты.


В любой проблеме скрыта возможность ((С) американская поговорка).
Так может тогда прогресс вообще остановить?
А как же Билл Гейтс, который с Полом Аленом (или я ошибаюсь) втиснули Бейсик в 4K, чего до них никто не делал?

E>>Это не дурдом, это особенность.


AVC>Я, наверное, эту Вашу фразу на стенку повешу.

AVC>Насколько здесь выразительнее сформулирована старая мысль "это не баг, это фича".

Буду рад. Только авторство укажи
На самом деле "в каждом закуточке свои заморочки". Глупо утверждать, что С++ -- это идеальный язык программирования. Но он реальный язык, с реальными возможностями и проблемами. И здесь можно либо просто оказаться от использования C++ (тогда не понятно, зачем на него наезжать), либо учитывать его особенности в работе и получать предсказуемые результаты, либо занять позицию страуса, а потом громко кричать: "Настоящие программисты на C++ не программируют!".
Конечно не программируют, они на нем думают, а потом просто свои мысли записывают. И все.

E>>Точно такая же, как необходимость объявлять переменные в Pascal-е в специальной секции var, а не в том блоке, где она необходима.


AVC>Вообще-то, в Паскале, Модуле и Обероне переменная объявляется именно там, где нужна.


Т.е., если переменная нужна в какой-то функции, то она должна быть объявлена в общей секции var этой функции Так ведь я об этом и говорил. А вот в C++, если переменная нужна в каком-то блоке функции, то она там и объявляется.

AVC>Просто некоторые Си++программисты не в курсе, как именно это делается.


Да, а твой пример наглядно показал, насколько нужно больше написать, чтобы сделать то, что в C++ вообще не занимает времени. Более того, твой код LocalSearch во-первых, жестко привязан к типу массива и искомого элемента и, во-вторых, жестко привязан к внутренностям GlobalProc. Поэтому тебе придется переписывать LocalSearch для GlobalProcReal (там где будут использоваться вещественные значения) и придется переписывать, если в GlobalProc нужно будет сделать поиск по еще одному массивчику b другой размерности.

А теперь сравни это все с std::find_if

AVC>А вот в Си++ сидишь и гадаешь, как изволит компилятор отнестись к конструкции

AVC>
AVC>for (int i = 0; i < size; i++) ;
AVC>

AVC>Будет ли переменная i "жива" и после цикла, как в Visual C++ 6.0, или нет, как полагается по стандарту?

Если компилятор соответствует стандарту C++, то не будет. А ведь Visual C++ 6.0 стандарту не соответствует.

Кстати, есть ли для Modula и Oberon стандарт? ANSI или ISO?

AVC>Знаете, это достаточно забавно, но среди Си++программистов достаточно много людей с художественными (но, к сожалению, не математическими) наклонностями!


Так может это и хорошо? Например, я часто видел, что у людей с ярковыраженным математическим мышлением довольно плохо с неординарными идеями.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 17.06.05 05:37
Оценка:
Здравствуйте, AVC, Вы писали:

AVC>Из отчета, ссылку на который дал Cyberax (за что ему отдельное спасибо, хотя не помню, чтобы мы хоть раз совпали во мнениях ), очевидно, что первопричина — в недостаточности вычислительных ресурсов. Соответствующую цитату из отчета я уже приводил.


Нет, первопричина — в пресловутом кодреюзе.
Re[23]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 17.06.05 22:52
Оценка:
Здравствуйте, Трурль, Вы писали:

AVC>>Из отчета, ссылку на который дал Cyberax (за что ему отдельное спасибо, хотя не помню, чтобы мы хоть раз совпали во мнениях ), очевидно, что первопричина — в недостаточности вычислительных ресурсов. Соответствующую цитату из отчета я уже приводил.


Т>Нет, первопричина — в пресловутом кодреюзе.


Наверное, Вы имеете в виду, что код во многом унаследован от Ариана-4 (если не раньше)?
Вырисовывается такая картина: код во многом остался прежним, а вот траектория полета изменилась.
Можно подумать, что в этом и есть причина катастрофы.
Но мне так не кажется.
Если бы код, унаследованный от Ариана-4, был действительно корректным, то и с Арианом-5 беды бы не случилось.
Возможно, мое мнение покажется Вам спорным.
Все упирается в понятие ошибки; вопрос почти философский.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[25]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 18.06.05 01:12
Оценка: -1
Здравствуйте, eao197, Вы писали:

E>>>Да, опыт внушает.

E>>>Но, имхо, как раз фраза Страуструпа к тебе и относится, т.к. твой большой опыт не позволяет тебе увидеть, что он (опыт) всего лишь маленькая капля в море.
AVC>>(голосом кота Матроскина) Я еще и СУБД писал...
E>Я тоже. И сейчас пишу.
E>И еще раз, еще более уверенно в своей правоте, повторю, что слова Страуструпа к тебе и относятся.

Спасибо за ссылки — интересно.
Что же касается "капли в море", я с этим не спорю.
Но чтобы выяснить химический состав воды (H2O), нет нужды вычерпать всю воду из океана.

AVC>>ИМХО, никакой иной "пользы", кроме того, что это все это проделано неявно для программиста, не видно.


E>Именно в этом задача и состояла -- нужно было повысить уровень абстракции.


AVC>>Такая "неявность" скорее вредна, чем полезна (пример с неявным (!) преобразованием во float через bool я уже приводил).

AVC>>Чем хуже тривиальное get(a, i, j)? Только тем, что несколько иначе выглядит? Так ведь это и хорошо!

E>Нет, это плохо. Такая запись гораздо длинее и черевата ошибками (как, например, заметить, где i и j случайно поменяли местами). А в получившемся варианте использовалась стандартная математическая запись.


Интересно, а что помешает поменять местами i и j, например, в выражении
a[j][i]

?

E>И именно эта запись позволила корректно и быстро записать выражения аппроксимации (треугольниками и прямоугольниками) при вычислении начального значения матрицы (этим занимался не я, но те, кто это делал сказали мне спасибо), а формулы там трехэтажные были. А мне такая запись позволила легко реализовать три или четыре метода решения СЛАУ в поисках того метода, который бы давал решение за приемлимое время (вообще в этой задаче метод итераций сходился медлено, методы Гауса и квадратного корня нельзя было применять из-за особенности матрицы, пришлось использовать метод Халецкого).


AVC>>В противном случае программист может быть просто обманут, думая, что и правда имеет дело с массивом.


E>Прикладной программист не был обманут -- он работал именно с теми понятиями, с которыми должен был работать. А задача системного программиста (т.е. меня) была в том, чтобы позволить программисту делать это в условиях органиченных ресурсов.


E>Или ты считаешь, что операционнки с виртуальной памятью тебя обманывают, неявно вытесняя старые страницы на диск и подкачивая их по необходимости?


Когда все это тормозит (что обыкновенно), то я и правда начинаю сердиться.

AVC>>>>А насчет вычислений: никуда Вам от них не деться. Даже индекс в массиве Вам приходится вычислять.

AVC>>>>А там где вычисления — там и потенциальные ошибки.
E>>>Никогда не сталкивался с потерей точности или ошибками вычислений при вычислении целочисленных индексов из целочисленных же значений.
AVC>>И за границы массива никогда не выходили?!
E>Выход за границы массива и потеря точности при вычислениях -- это совершенно разные вещи. В первом случае я получаю абсолютно точное значение, просто из-за моей ошибки оно оказывается не в том диапазоне. А реальная потеря точности, это когда в правильном выражении получается неправильный результат из-за ограничений платформы. Например: c/(a-b). Если a != b, то это выражение корректно и в математическом смысле всегда дает корректный результат. Но, если a и b являются вещественными числами, то корректность выражения начнет зависеть от величины (a-b). Если это довольно близкие значения, то их разность окажется слишком маленьким числом из-за чего c/(a-b) не сможет быть представлена.
E>Еще один пример неявной потрери точности обсуждался в форуме по C++.

Обратите внимание: я говорил об ошибках в вычислениях, а Вы — о потере точности.
ИМХО, Вы слишком сузили тему.

AVC>>>>А так программисты вынуждены были искать, где пожертвовать надежностью.

E>>>Так ведь это обычные условия. В реальной жизни всегда чего-нибудь не хватает.

AVC>>Одно дело, когда "чего-нибудь не хватает" в офисном приложении.

AVC>>Другое дело — в аэрокосмической, ядерной или военной областях.
AVC>>Я бы на Вашем месте не был настроен столь философски.

E>А мне давелось чуть-чуть попрограммировать для военной области (в радиолокации). Смею тебя уверить, там такие вычислительные задачи и такое жесткое реальное время, для которых ресурсов компьютеров не будет хватать еще очень долго. И достигается там приемлимая производительность именно за счет огрубления расчетов, т.е. не на уровне программирования, а на уровне проектирования.


AVC>>Но, кажется, отсюда мы с Вами делаем разные выводы. Вы говорите, что так было, так есть, так будет (или нет?). А я говорю, что, если не хватает ресурсов для нормального (защищенного и типо-безопасного) программирования, лучше вообще не браться за подобные проекты.


E>В любой проблеме скрыта возможность ((С) американская поговорка).


Угу. Особенно для американцев. И особенно — в чужих проблемах.

E>Так может тогда прогресс вообще остановить?


А что такое прогресс?

E>>>Это не дурдом, это особенность.

AVC>>Я, наверное, эту Вашу фразу на стенку повешу.
AVC>>Насколько здесь выразительнее сформулирована старая мысль "это не баг, это фича".
E>Буду рад. Только авторство укажи

Обязательно!

E>На самом деле "в каждом закуточке свои заморочки". Глупо утверждать, что С++ -- это идеальный язык программирования. Но он реальный язык, с реальными возможностями и проблемами. И здесь можно либо просто оказаться от использования C++ (тогда не понятно, зачем на него наезжать), либо учитывать его особенности в работе и получать предсказуемые результаты, либо занять позицию страуса, а потом громко кричать: "Настоящие программисты на C++ не программируют!".

E>Конечно не программируют, они на нем думают, а потом просто свои мысли записывают. И все.

E>Да, а твой пример наглядно показал, насколько нужно больше написать, чтобы сделать то, что в C++ вообще не занимает времени. Более того, твой код LocalSearch во-первых, жестко привязан к типу массива и искомого элемента и, во-вторых, жестко привязан к внутренностям GlobalProc. Поэтому тебе придется переписывать LocalSearch для GlobalProcReal (там где будут использоваться вещественные значения) и придется переписывать, если в GlobalProc нужно будет сделать поиск по еще одному массивчику b другой размерности.

E>А теперь сравни это все с std::find_if

В данном случае Ваша критика несправедлива.
Вложенная процедура играет здесь ту же роль, что и блок в Си++ (собственно, и является блоком), только более выразительно.
Что касается зависимости LocalSearch от типа.
Во-первых, в данном частном случае я мог не использовать параметр (x: INTEGER), тогда в теле LocalSearch не было бы упоминания о типе. Я сделал это только для наглядности, чтобы проиллюстрировать прием.
Во-вторых, в Си++ зависимость от типа никак не меньше.
Говоря о find_if, Вы запамятовали упомянуть о некоторых деталях.
Во-первых, использование find_if предполагает использование итератора, причем привязанного как к типу элемента, так и к типу контейнера. Что-то вроде:
list<elem_type>::iterator i = find_if(l.begin(), l.end(), cond(v));
if (i != l.end()) { ... }

Во-вторых, Вы почему-то ничего не сказали о таких мелочах, как написании класса предиката, наследовании от unary_function или binary_function и т.д.
В-третьих, сколько всей этой ерунды надо помнить...

E>Кстати, есть ли для Modula и Oberon стандарт? ANSI или ISO?


Для Модулы-2 есть стандарт ISO (уже давно).
Именно поэтому в аэрокосмической сфере применяются в основном Ада и Модула-2 — языки, имеющие стандарты ISO.

AVC>>Знаете, это достаточно забавно, но среди Си++программистов достаточно много людей с художественными (но, к сожалению, не математическими) наклонностями!

E>Так может это и хорошо? Например, я часто видел, что у людей с ярковыраженным математическим мышлением довольно плохо с неординарными идеями.

О художественных способностях Си++программистов я упомянул с симпатией.
Мне нравится в них это качество. Другие их качества ине нравятся гораздо меньше.
И вообще... Про нас, математиков, все говорят, что мы сухари (х/ф "17 мгновений весны").
Вся математика — просто скукотища какая-то... Ни одной неординарной идеи!
А, впрочем, может — сверим неординарность мышления?
Вот у меня на RSDN ник AVC. Все просто и ординарно — это инициалы: имя, отчество и фамилия.
А как насчет eao? Ну, наверное, — ничего похожего...

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[26]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 18.06.05 07:24
Оценка:
Здравствуйте, AVC, Вы писали:

AVC>>>(голосом кота Матроскина) Я еще и СУБД писал...

E>>Я тоже. И сейчас пишу.
E>>И еще раз, еще более уверенно в своей правоте, повторю, что слова Страуструпа к тебе и относятся.

AVC>Спасибо за ссылки — интересно.


Да не за что
Ну нужно же себя как-то рекламировать

Алексей, может на "ты" перейдем? А то мне как-то неудобно, я здесь в форуме ко всем на "ты", а мне в ответах "вы", да еще с большой буквы.

AVC>>>ИМХО, никакой иной "пользы", кроме того, что это все это проделано неявно для программиста, не видно.


E>>Именно в этом задача и состояла -- нужно было повысить уровень абстракции.


AVC>>>Такая "неявность" скорее вредна, чем полезна (пример с неявным (!) преобразованием во float через bool я уже приводил).

AVC>>>Чем хуже тривиальное get(a, i, j)? Только тем, что несколько иначе выглядит? Так ведь это и хорошо!

E>>Нет, это плохо. Такая запись гораздо длинее и черевата ошибками (как, например, заметить, где i и j случайно поменяли местами). А в получившемся варианте использовалась стандартная математическая запись.


AVC>Интересно, а что помешает поменять местами i и j, например, в выражении

AVC>
AVC>a[j][i]
AVC>

AVC>?

Ну, если более высокий уровень абстракции мы не рассматриваем, а говорим о вероятности ошибок, то в выражении:
get_i( a, i, j )

Гораздо проще поменять местами i и j, можно ведь даже get_j написать, вместо get_i.

E>>Выход за границы массива и потеря точности при вычислениях -- это совершенно разные вещи. В первом случае я получаю абсолютно точное значение, просто из-за моей ошибки оно оказывается не в том диапазоне. А реальная потеря точности, это когда в правильном выражении получается неправильный результат из-за ограничений платформы. Например: c/(a-b). Если a != b, то это выражение корректно и в математическом смысле всегда дает корректный результат. Но, если a и b являются вещественными числами, то корректность выражения начнет зависеть от величины (a-b). Если это довольно близкие значения, то их разность окажется слишком маленьким числом из-за чего c/(a-b) не сможет быть представлена.

E>>Еще один пример неявной потрери точности обсуждался в форуме по C++.

AVC>Обратите внимание: я говорил об ошибках в вычислениях, а Вы — о потере точности.

AVC>ИМХО, Вы слишком сузили тему.

May be. Но выход за пределы массива, это явная ошибка, избежать которую позволяет даже минимальный уровень знаний. Более того, не нужно иметь серьезную математическую подготовку, чтобы найти ее. А вот с потерей точности дело гораздо сложнее. Во время учебы я сам сталкивался с тем, что не знание тонкостей применяемого вычислительного метода сложно получить работоспособную реализацию именно из-за органичений в представлении вещественных чисел.

E>>В любой проблеме скрыта возможность ((С) американская поговорка).


AVC>Угу. Особенно для американцев. И особенно — в чужих проблемах.


Ну можно к американцам по разному относиться, но то что, сейчас они остались единственной сверхдержавой, это факт. А вот мы все такие умные, что... Но это уже офтопик.

E>>Так может тогда прогресс вообще остановить?


AVC>А что такое прогресс?


Ну хотя бы создание того, что еще совсем недавно казалось невозможным.

E>>>>Это не дурдом, это особенность.

AVC>>>Я, наверное, эту Вашу фразу на стенку повешу.
AVC>>>Насколько здесь выразительнее сформулирована старая мысль "это не баг, это фича".
E>>Буду рад. Только авторство укажи

AVC>Обязательно!




E>>А теперь сравни это все с std::find_if


AVC>В данном случае Ваша критика несправедлива.

AVC>Вложенная процедура играет здесь ту же роль, что и блок в Си++ (собственно, и является блоком), только более выразительно.
AVC>Что касается зависимости LocalSearch от типа.
AVC>Во-первых, в данном частном случае я мог не использовать параметр (x: INTEGER), тогда в теле LocalSearch не было бы упоминания о типе. Я сделал это только для наглядности, чтобы проиллюстрировать прием.
AVC>Во-вторых, в Си++ зависимость от типа никак не меньше.

Но ведь в C++ мне не нужно писать LocalSearch для разных случаях, он уже написан.

AVC>Говоря о find_if, Вы запамятовали упомянуть о некоторых деталях.

AVC>Во-первых, использование find_if предполагает использование итератора, причем привязанного как к типу элемента, так и к типу контейнера. Что-то вроде:
AVC>
AVC>list<elem_type>::iterator i = find_if(l.begin(), l.end(), cond(v));
AVC>if (i != l.end()) { ... }
AVC>


Ну и что? В случае с контейнерами итераторы уже реализованы. Но find_if можно использовать и с векторами:
int a[ 20 ];
int * pos = find_if( a, a + sizeof(a)/sizeof(a[0]), v );
if( pos != a + sizeof(a)/sizeof(a[0]) ) { ... }


AVC>Во-вторых, Вы почему-то ничего не сказали о таких мелочах, как написании класса предиката, наследовании от unary_function или binary_function и т.д.


Для многих стандартных алгоритмов, в том числе и для find_if, это не обязательно.

AVC>В-третьих, сколько всей этой ерунды надо помнить...


Да, вот с этим сложно спорить.

E>>Кстати, есть ли для Modula и Oberon стандарт? ANSI или ISO?


AVC>Для Модулы-2 есть стандарт ISO (уже давно).

AVC>Именно поэтому в аэрокосмической сфере применяются в основном Ада и Модула-2 — языки, имеющие стандарты ISO.

По существование ISO стандартов для Модулы и Ада не знал, спасибо.
Хотя, думаю, причина использования в этих областях Ада и Модула-2 не в этом.
Да и Ада применяется только на Западе

AVC>Вот у меня на RSDN ник AVC. Все просто и ординарно — это инициалы: имя, отчество и фамилия.

AVC>А как насчет eao? Ну, наверное, — ничего похожего...

Ну почему же? Все именно так, только еще рост в сантиметрах добавлен Причем именно такой ник получился из за ошибки: когда я себе делал первый почтовый ящик, то попросил администратора сделать логин eao195 (точное значение ), но он ошибся и сделал eao197. А потом уже менять не хотелось, чтобы почта не терялась
И не нужно меня обвинять в "сухости" и прагматизме -- я ведь не художник, а программист
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[27]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 18.06.05 14:12
Оценка:
Здравствуйте, eao197, Вы писали:

E>Алексей, может на "ты" перейдем? А то мне как-то неудобно, я здесь в форуме ко всем на "ты", а мне в ответах "вы", да еще с большой буквы.


OK!
Давай... те.
Надо сказать, что наше общение не прошло для меня бесследно.
В связи с бедным Арианом, я задумался над тем, что такое ошибка в программе.
После чего совсем погрустнел. Даже кушаю плохо...

AVC>>>>ИМХО, никакой иной "пользы", кроме того, что это все это проделано неявно для программиста, не видно.

E>>>Именно в этом задача и состояла -- нужно было повысить уровень абстракции.

Это интересная тема.
Как-нибудь наберусь времени рассмотреть ее подробнее.
Скажу только, что раньше полностью разделял твою точку зрения (что и претворял на практике; и что забавно — именно в матричных вычислениях).
А сейчас — с оговорками.

E>>>Выход за границы массива и потеря точности при вычислениях -- это совершенно разные вещи. В первом случае я получаю абсолютно точное значение, просто из-за моей ошибки оно оказывается не в том диапазоне. А реальная потеря точности, это когда в правильном выражении получается неправильный результат из-за ограничений платформы. Например: c/(a-b). Если a != b, то это выражение корректно и в математическом смысле всегда дает корректный результат. Но, если a и b являются вещественными числами, то корректность выражения начнет зависеть от величины (a-b). Если это довольно близкие значения, то их разность окажется слишком маленьким числом из-за чего c/(a-b) не сможет быть представлена.

E>>>Еще один пример неявной потрери точности обсуждался в форуме по C++.
AVC>>Обратите внимание: я говорил об ошибках в вычислениях, а Вы — о потере точности.
AVC>>ИМХО, Вы слишком сузили тему.
E>May be. Но выход за пределы массива, это явная ошибка, избежать которую позволяет даже минимальный уровень знаний. Более того, не нужно иметь серьезную математическую подготовку, чтобы найти ее. А вот с потерей точности дело гораздо сложнее. Во время учебы я сам сталкивался с тем, что не знание тонкостей применяемого вычислительного метода сложно получить работоспособную реализацию именно из-за органичений в представлении вещественных чисел.

Совершенно согласен.
Более того, поднятые тобой вопросы управления точностью вычислений с плавающей точкой мне интересны гораздо больше выходов за пределы массива. Просто я с туповатым педантизмом зафиксировал небольшое отклонение от намеченного курса, примерно так, как судья в теннисе кричит "Аут!" без всякой задней мысли.

E>>>В любой проблеме скрыта возможность ((С) американская поговорка).

AVC>>Угу. Особенно для американцев. И особенно — в чужих проблемах.
E>Ну можно к американцам по разному относиться, но то что, сейчас они остались единственной сверхдержавой, это факт. А вот мы все такие умные, что... Но это уже офтопик.

На самом деле, я уважаю американцев за некоторые их качества: упорство, инициативность, изобретательность. И др.
Некоторые американцы у меня вызывают искреннее восхищение. Например, Бенджамен Франклин. (Не за то, что он изображен на купюре. )
Претензии же у меня к США почти исключительно нравственного характера, но серьезные.
Ведут они себя как римляне в античные времена, следуя принципу divide et impera и зачастуя разжигая в людях рознь.
О ядерных бомбардировках, напалме, химическом оружии и т.д. я уже не говорю.
Впрочем, это уже и правда офтоп для программистского форума.

E>>>Так может тогда прогресс вообще остановить?

AVC>>А что такое прогресс?
E>Ну хотя бы создание того, что еще совсем недавно казалось невозможным.

По ряду пунктов мы как бы скатываемся в офтопик.
Правда, я уверен, что при обсуждении некоторых проблем это практически неизбежно и даже правильно.
Некоторые вещи можно понять только в связи с другими, вместе с которыми они составляют систему.
В противном случае, мы, прямо как узники платоновской пещеры, обречены видеть только мелькание теней на стене.
Конечн, при расширении темы важно не потерять из виду основной цели обсуждения и не сбиться на треп.
Что касается именно прогресса, то (ИМХО) не следует забывать, что приобретая что-то новое, мы также что-то и утрачиваем. И я не вижу никаких гарантий, что утраченное не окажется более ценным.
Например, в пору моего детства продукты в продовольственных магазинах не отличались большим разнообразием. Это, наверное, плохо и "непрогрессивно". Но практически все они были натуральными. А это хорошо. Что важнее? В последнее время мне бросается в глаза, что дети в массе стали болезненней, чем прежде. (Я уже не говорю о том, что и самих детей стало меньше.)
В отношении языков программирования наблюдается тенденция пренебрегать надежностью. Возможно, в пользу производительности, хотя подтверждающих это данных у меня нет. Наверное, пока мы остаемся в рамках офисных приложений, это экономически оправдано, т.к. цена ошибок и сбоев сравнительно невысока, а рост производительности может быть значительным (хотя это зависит и от организационных факторов).
Часто такой подход иллюстрируют таким примером: хотя автомобиль делает жизнь немного более опасной, люди пренебрегают этим риском ради дополнительных удобств (экономия времени, свобода передвижения и т.д.)
Но (ИМХО) было бы ошибочно переносить такой подход на все сферы жизни. Существует ряд отраслей (ядерная, военная и т.д.), чреватых глобальными катастрофами. Здесь приоритет следует отдать надежности, в том числе — надежности ПО. А надежность ПО включает в себя много составляющих, среди которых строгий контроль типов, простота языка и основанная на этом корректность компилятора играют далеко не последнюю роль.
Создание такого простого языка — трудная задача. На мой взгляд, Вирт с ней справился лучше и раньше других.
Что касается Ады, справедливо упомянутой Cyberax'ом, то, при многих достоинствах, она слишком сложна и тяжеловесна.
В своей тьюринговской лекции Хоар просил не доверять такому сложному языку. (Я не случайно упоминаю Хоара. Он не только изобретатель быстрой сортировки, исследователь в области параллельного программирования, автор языка Оккам и ряда привычных уже нам конструкций языков программирования, вроде case ... of (он же switch). Его влияние на Вирта в области языков программирования было так велико, что его можно назвать "крестным отцом" Паскаля и последующих языков Вирта. )
Что касается Си++, то когда-то мне нравился этот язык. Пока в него не решили запихнуть все-все-все и еще чуть-чуть, а фундамент оставили прежним. К языку Си у меня больших претензий нет. Как "высокоуровневый ассемблер" он вполне хорош. А вот распространение Си++ во все области ПО (которое упомянуто у Страуструпа и поразило тебя) меня откровенно пугает. Представь себе, что над тобой нависает покосившийся небоскреб, практически лишенный фундамента.

E>Но ведь в C++ мне не нужно писать LocalSearch для разных случаях, он уже написан.


Иногда написание "обвески" для его вызова съедает больше...
Но главная моя претензия в данном случае все же состоит в том, что язык разбухает. Требуется знать все больше и больше (о все меньшем и меньшем ).
Уже и тривиальный цикл написать нельзя. Говорят: используйте стандартные алгоритмы. Т.е. их все надо помнить...

AVC>>Говоря о find_if, Вы запамятовали упомянуть о некоторых деталях.

AVC>>Во-первых, использование find_if предполагает использование итератора, причем привязанного как к типу элемента, так и к типу контейнера. Что-то вроде:
AVC>>
AVC>>list<elem_type>::iterator i = find_if(l.begin(), l.end(), cond(v));
AVC>>if (i != l.end()) { ... }
AVC>>

E>Ну и что? В случае с контейнерами итераторы уже реализованы. Но find_if можно использовать и с векторами:
E>
E>int a[ 20 ];
E>int * pos = find_if( a, a + sizeof(a)/sizeof(a[0]), v );
E>if( pos != a + sizeof(a)/sizeof(a[0]) ) { ... }
E>


Наверное, здесь имелся в виду find, а не find_if?
Думается, простой код
for (int i = 0; i < sizeof a / sizeof a[0]; ++i)
    if (v == a[i]) {  ... }

проще и понятнее.
Но если уж начал применять STL, то, конечно, надо применять его везде — для выработки автоматизма.

AVC>>Во-вторых, Вы почему-то ничего не сказали о таких мелочах, как написании класса предиката, наследовании от unary_function или binary_function и т.д.

E>Для многих стандартных алгоритмов, в том числе и для find_if, это не обязательно.

Это мелочь, но и здесь можно немного поспорить.
Все алгоритмы, чье имя заканчивается на _if, предполагают получить в качестве параметра предикат.
Рассмотрим в качестве примера одно из определений find_if (для компилятора GNU C++):
template <class _InputIter, class _Predicate>
inline _InputIter find_if(_InputIter __first, _InputIter __last,
                          _Predicate __pred,
                          input_iterator_tag)
{
  while (__first != __last && !__pred(*__first))
    ++__first;
  return __first;
}

Предикатом может быть как булевская функция, так и соответствующий класс. По ряду причин, рекомендуют второе.
Может быть, ты имел в виду простой find?
(Или, чем черт не шутит, я уже совсем забыл стандартную библиотеку? Впрочем, она и правда могла у меня "атрофироваться" за ненадобностью.)

AVC>>В-третьих, сколько всей этой ерунды надо помнить...

E>Да, вот с этим сложно спорить.

Ага, ага, я победил...

E>>>Кстати, есть ли для Modula и Oberon стандарт? ANSI или ISO?


AVC>>Для Модулы-2 есть стандарт ISO (уже давно).

AVC>>Именно поэтому в аэрокосмической сфере применяются в основном Ада и Модула-2 — языки, имеющие стандарты ISO.

E>По существование ISO стандартов для Модулы и Ада не знал, спасибо.

E>Хотя, думаю, причина использования в этих областях Ада и Модула-2 не в этом.
E>Да и Ада применяется только на Западе

Да, у нас пишут на Модуле-2.

AVC>>Вот у меня на RSDN ник AVC. Все просто и ординарно — это инициалы: имя, отчество и фамилия.

AVC>>А как насчет eao? Ну, наверное, — ничего похожего...
E>Ну почему же? Все именно так, только еще рост в сантиметрах добавлен Причем именно такой ник получился из за ошибки: когда я себе делал первый почтовый ящик, то попросил администратора сделать логин eao195 (точное значение ), но он ошибся и сделал eao197. А потом уже менять не хотелось, чтобы почта не терялась
E>И не нужно меня обвинять в "сухости" и прагматизме -- я ведь не художник, а программист

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[28]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 18.06.05 19:10
Оценка:
Здравствуйте, AVC, Вы писали:

AVC>Надо сказать, что наше общение не прошло для меня бесследно.



Ну да, одна надпись на стене чего стоит

AVC>В связи с бедным Арианом, я задумался над тем, что такое ошибка в программе.

AVC>После чего совсем погрустнел. Даже кушаю плохо...

Мн-да. На самом деле тема серьезная. Мне проще, я не пишу софт, от которого зависит чья-нибудь жизнь.

E>>>>Именно в этом задача и состояла -- нужно было повысить уровень абстракции.

AVC>Скажу только, что раньше полностью разделял твою точку зрения (что и претворял на практике; и что забавно — именно в матричных вычислениях).
AVC>А сейчас — с оговорками.

А с какими?

E>>>>Так может тогда прогресс вообще остановить?

AVC>>>А что такое прогресс?
E>>Ну хотя бы создание того, что еще совсем недавно казалось невозможным.

AVC>Что касается именно прогресса, то (ИМХО) не следует забывать, что приобретая что-то новое, мы также что-то и утрачиваем. И я не вижу никаких гарантий, что утраченное не окажется более ценным.


Ну что тут сделаешь. Се ля ви. Так было, так есть, так будет.
Это такая же объективная реальность, как и сложность C++

AVC>В отношении языков программирования наблюдается тенденция пренебрегать надежностью. Возможно, в пользу производительности, хотя подтверждающих это данных у меня нет. Наверное, пока мы остаемся в рамках офисных приложений, это экономически оправдано, т.к. цена ошибок и сбоев сравнительно невысока, а рост производительности может быть значительным (хотя это зависит и от организационных факторов).

AVC>Часто такой подход иллюстрируют таким примером: хотя автомобиль делает жизнь немного более опасной, люди пренебрегают этим риском ради дополнительных удобств (экономия времени, свобода передвижения и т.д.)

Тут хочется вспомнить анекдот в тему:

Автомобилист хвастается другу о том, как много он стал успевать благодоря автомобилю: "Вот представь, в субботу утром я успеваю съездить на заправку, затем на авторынок за запчастями, а затем еще и на автомойку. И все это за каких-то 4 часа!"


AVC>Но (ИМХО) было бы ошибочно переносить такой подход на все сферы жизни. Существует ряд отраслей (ядерная, военная и т.д.), чреватых глобальными катастрофами. Здесь приоритет следует отдать надежности, в том числе — надежности ПО. А надежность ПО включает в себя много составляющих, среди которых строгий контроль типов, простота языка и основанная на этом корректность компилятора играют далеко не последнюю роль.


С этим сложно спорить. Но широкоизвестные космические катастрофы, связанные с ошибками ПО, никак с этим не были связаны. Про Ариан мы уже долго говорим. Был еще старый случай с фортраном и запятой вместо десятичной точки (хотя этот пример и может попасть в данную категорию, если только все это было на самом деле). А ведь еще был случай с Mars Explorer (или как его там), когда разные модули вычисляли значения в разных системах счисления.

Кроме-то, здесь в форумах кто-то предъявлял статистику Ericsson о качестве ПО. Если мне не отшибает память, там оказалось, что средняя плотность ошибок составляет 3 штуки на 1000 строк кода. Вне зависимости от языка программирования!

AVC>Создание такого простого языка — трудная задача. На мой взгляд, Вирт с ней справился лучше и раньше других.

AVC>Что касается Си++, то когда-то мне нравился этот язык. Пока в него не решили запихнуть все-все-все и еще чуть-чуть, а фундамент оставили прежним. К языку Си у меня больших претензий нет. Как "высокоуровневый ассемблер" он вполне хорош. А вот распространение Си++ во все области ПО (которое упомянуто у Страуструпа и поразило тебя) меня откровенно пугает. Представь себе, что над тобой нависает покосившийся небоскреб, практически лишенный фундамента.

Сейчас на наших глазах происходит интересное явление: острая конкуренция в языках программирования. С одной стороны, огромные финансовые вливания в Java и C#, с другой стороны -- Perl, Python, Ruby, PHP, да и старичек C++ сдаваться не собирается. Почему языки, лишенные мощной финансовой поддержки (т.к. Perl, Python, Ruby) успешно конкурируют с монстрами Java/C#? Имхо потому, что эти языки создавались для решения конкретных проблем. И развивались для решения других конкретных проблем. И выжили благодоря тому, что хорошо эти проблемы решали. Т.е. это реальные инструменты для реальных задач. Аналогично и с C++. Его необъятность и сложность проистекают из того, что он хорошо решает реальные задачи (было бы наоборот, его бы уже не было). Вот, например, я привел одну такую задачу, которую с помошью generic-ов Java и C# просто так не решить: А generic-и так могут?
Автор: eao197
Дата: 30.05.05


Если же брать Oberon, Modula-2, Smalltalk и др. оригинальные и интересные языки, то окажется, что универсальными они так и не стали. Действительно, за счет своих отличных (?) качеств они заняли доминирующее положение в той или иной нише. Но там они и остались. И в конкретной нише, скажем, в военной области, можно еще сравнивать C++ и Modula-2. Но если смотреть на язык программирования шире, то жизнь (или рынок, если быть точнее) уже доказали, что творения Вирта, какими бы гениальными они не были, для широкого применения не пригодны.

AVC>Но главная моя претензия в данном случае все же состоит в том, что язык разбухает. Требуется знать все больше и больше (о все меньшем и меньшем ).

AVC>Уже и тривиальный цикл написать нельзя. Говорят: используйте стандартные алгоритмы. Т.е. их все надо помнить...

Кто говорит? Ну и пусть говорят
Чувство меры и здравый смысл еще никто не отменял.

AVC>Наверное, здесь имелся в виду find, а не find_if?


Да, это я ошибся.

AVC>Думается, простой код

AVC>
AVC>for (int i = 0; i < sizeof a / sizeof a[0]; ++i)
AVC>    if (v == a[i]) {  ... }
AVC>

AVC>проще и понятнее.

Если он один (цикл этот), то да. Если их несколько, то нет. А дальше -- больше.
Оказывается, что если код развивается, то может оказаться, что a -- это больше не вектор, а list или даже set. Соответственно, цикл пришлось бы модифицировать. А обращение к find (find_if) нет.
Еще один вариант -- поиск должен поиметь side effect. В случае с циклом нам бы пришлось помещать в if() {...} дополнительную логику, которая может оказаться и не маленькой. В случае же с find_if эта логика может быть скрыта в предикате и не загромождать код основной процедуры.

AVC>Но если уж начал применять STL, то, конечно, надо применять его везде — для выработки автоматизма.


Если только это до маразма не доходит.

AVC>>>Во-вторых, Вы почему-то ничего не сказали о таких мелочах, как написании класса предиката, наследовании от unary_function или binary_function и т.д.

E>>Для многих стандартных алгоритмов, в том числе и для find_if, это не обязательно.

AVC>Это мелочь, но и здесь можно немного поспорить.

AVC>Все алгоритмы, чье имя заканчивается на _if, предполагают получить в качестве параметра предикат.
AVC>Рассмотрим в качестве примера одно из определений find_if (для компилятора GNU C++):
AVC>
AVC>template <class _InputIter, class _Predicate>
AVC>inline _InputIter find_if(_InputIter __first, _InputIter __last,
AVC>                          _Predicate __pred,
AVC>                          input_iterator_tag)
AVC>{
AVC>  while (__first != __last && !__pred(*__first))
AVC>    ++__first;
AVC>  return __first;
AVC>}
AVC>

AVC>Предикатом может быть как булевская функция, так и соответствующий класс. По ряду причин, рекомендуют второе.

Когда я сказал, что предикат для find_if не обязательно должен быть производен от unary_function, то я имел в виду именно это. Насколько я помню, наследование от *_function становиться важным при использовании различных bind1st и bind2nd. Хотя я, например, предпочитаю наследоваться от unary_function по простым прозаическим причинам:

1. Когда я указываю в unary_function параметры шаблона, то получаю для них удобные псевдонимы argument_type и result_type. Это позволяет мне в коде предиката использовать короткое имя argument_type вместо, например, std::map< some_my_key_t, some_my_value_t >::value_type const &.

2. Я имею возможность сменить типа параметра для unary_function, но это не затронет кода предиката, т.к. там я пользуюсь псевдонимами argument_type и result_type.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[29]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 19.06.05 13:09
Оценка: 3 (2)
Здравствуйте, eao197, Вы писали:

AVC>>Надо сказать, что наше общение не прошло для меня бесследно.

E>
E>Ну да, одна надпись на стене чего стоит



AVC>>В связи с бедным Арианом, я задумался над тем, что такое ошибка в программе.

AVC>>После чего совсем погрустнел. Даже кушаю плохо...
E>Мн-да. На самом деле тема серьезная. Мне проще, я не пишу софт, от которого зависит чья-нибудь жизнь.

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

E>>>>>Именно в этом задача и состояла -- нужно было повысить уровень абстракции.

AVC>>Скажу только, что раньше полностью разделял твою точку зрения (что и претворял на практике; и что забавно — именно в матричных вычислениях).
AVC>>А сейчас — с оговорками.

E>А с какими?


Как-нибудь соберусь разобрать все это подробнее.
В основном, я вижу опасность в неявном применении переопределенных операторов.
Я уже приводил на форумах примеры "неадекватного" поведения Си++ в подобных случаях.

E>>>>>Так может тогда прогресс вообще остановить?

AVC>>>>А что такое прогресс?
E>>>Ну хотя бы создание того, что еще совсем недавно казалось невозможным.
AVC>>Что касается именно прогресса, то (ИМХО) не следует забывать, что приобретая что-то новое, мы также что-то и утрачиваем. И я не вижу никаких гарантий, что утраченное не окажется более ценным.
E>Ну что тут сделаешь. Се ля ви. Так было, так есть, так будет.
E>Это такая же объективная реальность, как и сложность C++

C++ действительно сложен.
Вопрос в том, насколько необходима, а насколько излишня такая сложность.

AVC>>В отношении языков программирования наблюдается тенденция пренебрегать надежностью. Возможно, в пользу производительности, хотя подтверждающих это данных у меня нет. Наверное, пока мы остаемся в рамках офисных приложений, это экономически оправдано, т.к. цена ошибок и сбоев сравнительно невысока, а рост производительности может быть значительным (хотя это зависит и от организационных факторов).

AVC>>Часто такой подход иллюстрируют таким примером: хотя автомобиль делает жизнь немного более опасной, люди пренебрегают этим риском ради дополнительных удобств (экономия времени, свобода передвижения и т.д.)

E>Тут хочется вспомнить анекдот в тему:

E>

E>Автомобилист хвастается другу о том, как много он стал успевать благодоря автомобилю: "Вот представь, в субботу утром я успеваю съездить на заправку, затем на авторынок за запчастями, а затем еще и на автомойку. И все это за каких-то 4 часа!"

Вот ты шутишь, а я во многом так и отношусь к прогрессу. Непонятно: прогресс для людей или люди для "прогресса"?
Читал недавно экономический роман Рассела Робертса "Невидимое сердце". (Этот роман очень хвалил Милтон Фридман.)
Красной линией проходит мысль, что сострадание и помощь бедным и больным — недоступная для цивилизации роскошь.
Так в чем же прогресс, если мы по-прежнему все время заняты выживанием?
Я не возьмусь утверждать, что прогресса нет в принципе. Но зачастую это просто слово с приятной эмоциональной окраской, а реальность гораздо сложнее и непригляднее.

AVC>>Но (ИМХО) было бы ошибочно переносить такой подход на все сферы жизни. Существует ряд отраслей (ядерная, военная и т.д.), чреватых глобальными катастрофами. Здесь приоритет следует отдать надежности, в том числе — надежности ПО. А надежность ПО включает в себя много составляющих, среди которых строгий контроль типов, простота языка и основанная на этом корректность компилятора играют далеко не последнюю роль.


E>С этим сложно спорить. Но широкоизвестные космические катастрофы, связанные с ошибками ПО, никак с этим не были связаны. Про Ариан мы уже долго говорим. Был еще старый случай с фортраном и запятой вместо десятичной точки (хотя этот пример и может попасть в данную категорию, если только все это было на самом деле). А ведь еще был случай с Mars Explorer (или как его там), когда разные модули вычисляли значения в разных системах счисления.


Да, был такой случай в 1999 году.
С Фортраном тоже был случай. Кажется, это было в нашем (еще советском) проекте в начале 1970-х.
Я не понимаю, почему ты полагаешь, что широкоизвестные катастрофы никак не связаны с надежностью языка.
Смотри сам.
В случае с циклом FOR в Фортране, просто очевидно, что большая доля вины — на языке.
В случае с Арианом, из-за недостаточности ресурсов целочисленную переменную не защитили от переполнения, что привело к отключению компьютера. Обращаю внимание, что игнорирование переполнения могло привести к еще худшим последствиям. В области безопасности программа должна быть корректна на 100%. 99% недостаточно!
Из-за недостаточности ресурсов выбрали неадеватный тип данных для представления horizontal bias.
В случае с потерей орбиты Марса, если бы вычисления, связанные с разными единицами измерения, относились к разным типам, то ошибку, скорее всего, удалось бы предотвратить, т.к. потребовалось бы явное приведение типов.
Т.е. напротив, трудно назвать случай не связанный с языком (или нарушением его правил)!

E>Кроме-то, здесь в форумах кто-то предъявлял статистику Ericsson о качестве ПО. Если мне не отшибает память, там оказалось, что средняя плотность ошибок составляет 3 штуки на 1000 строк кода. Вне зависимости от языка программирования!


Результаты этого исследования настолько абсурдны, что даже не знаю, имеет ли смысл спрашивать об использованной методике?
Что именно считалось ошибкой?
Как устанавливалось наличие и число ошибок в программном коде?
Какие языки подвергались сравнению?

E>Сейчас на наших глазах происходит интересное явление: острая конкуренция в языках программирования. С одной стороны, огромные финансовые вливания в Java и C#, с другой стороны -- Perl, Python, Ruby, PHP, да и старичек C++ сдаваться не собирается. Почему языки, лишенные мощной финансовой поддержки (т.к. Perl, Python, Ruby) успешно конкурируют с монстрами Java/C#? Имхо потому, что эти языки создавались для решения конкретных проблем. И развивались для решения других конкретных проблем. И выжили благодоря тому, что хорошо эти проблемы решали. Т.е. это реальные инструменты для реальных задач. Аналогично и с C++. Его необъятность и сложность проистекают из того, что он хорошо решает реальные задачи (было бы наоборот, его бы уже не было). Вот, например, я привел одну такую задачу, которую с помошью generic-ов Java и C# просто так не решить: А generic-и так могут?
Автор: eao197
Дата: 30.05.05


Спасибо за действительно интересный пример!
Постараюсь его обдумать.
Конечно, сразу ясно, что возникшую проблему ты решил за счет специализации шаблонов.
Т.е. в "сердцевине" решения что-то вроде:
#include <cstdio>

template <bool T = false>
struct s {
    s() { printf("false\n"); }
};

// specialisation

template <>
struct s<true> {
    s() { printf("true\n"); }
};

int main()
{
    s<false> s1; // false
    s<true>  s2; // true
    s<>      s3; // false
    return 0;
}

Для стимулирования воображения, хотелось бы (если можно) увидеть маленький кусочек клиентского кода.
Т.е. я все примерно представляю, но в последнее время я мало доверяю своим "беглым мыслям". Стар стал, воображение уже не то...
Также ясно, что твоя жизнь оказалась бы гораздо приятнее, если бы Visual C++ 6.0 соответствовал стандарту.
Обошелся бы без "сверхплановых" наворотов.
(Однако, обращаю твое внимание, что ситуация с Visual C++ 6.0 косвенно связана с чрезмерной сложностью языка. Если уж такая фирма оказалась не в состоянии вовремя представить компилятор, соответствующий стандарту.)
Думается, что, на настоящий момент, generic-и на такое неспособны. (Правда, я мог отстать от жизни в своем захолустье. )
Но, будем справедливы, generic-и действуют в других обстоятельствах.
ИМХО, такие удобства достались Си++ далеко небесплатно.
Си++ расчитан на "старую" модель монолитной (stand-alone) программы.
Отсюда — трудности с компонентным программированием, чрезмерные навороты с COM и т.д.
Грубо говоря, Си++ — доживший до наших времен динозавр.
У динозавров несомненно были свои преимущества и особые эволюционные приспособления.
Но они вымерли. Все, кроме Си++.
Другой подход, более "современный" (конечно, все относительно) был реализован в Обероне еще в середине 1980-х.
Там вообще нет монолитных программ. (Разумеется, вне обероновской среды компиляторы предоставляют возможность создания и обычных exe-шек.)
Процесс инициируется не загрузкой программы, а вызовом команды (экспортируемой модулем процедуры).
Модули подгружаются автоматически, если они указаны в списке импорта загружаемого модуля (и не были загружены раньше).
При этом компонентное программирование получается просто само собой — и совершенно бесплатно. Просто пишешь свой модуль, и ни о чем плохом не думаешь.
Нет нужды читать умные книги, с названиями вроде "Сущность технологии COM". (Книга неплохая, но даже в ней написано, что COM возник из-за неспособности Си++ поддержать компонентное программирование напрямую. Т.е. на одну кучу избыточной сложности уже громоздится другая.)
Компонентная модель потребовала дополнительной безопасности типов (поэтому в Обероне, если не указывать в списке импорта SYSTEM, с переменной можно обращаться только в соответствии с его типом) и централизованной сборки мусора, что, кстати, является дополнительным удобством для программиста.
Через десяток лет возникла Java, через полтора — С# и .NET. Основные идеи были заимствованы из Оберона. Как принято в мире языков с Си-подобным синтаксисом — неявно .

E>Если же брать Oberon, Modula-2, Smalltalk и др. оригинальные и интересные языки, то окажется, что универсальными они так и не стали. Действительно, за счет своих отличных (?) качеств они заняли доминирующее положение в той или иной нише. Но там они и остались. И в конкретной нише, скажем, в военной области, можно еще сравнивать C++ и Modula-2. Но если смотреть на язык программирования шире, то жизнь (или рынок, если быть точнее) уже доказали, что творения Вирта, какими бы гениальными они не были, для широкого применения не пригодны.


Как говорится, "не говори квак, пока не прошел ВАК".
Что там доказала жизнь, судить рано.
На все требуется время.
Оберон — почти ровесник Си++. ИМХО, Си++ был принят (хотя и он популярным стал только в 90-х) "программистскими массами", потому что давал дополнительные удобства (много дополнительных удобств и... неудобств ) на основе старой модели, прочно засевшей в головах программистов.
Оберон же, видимо, опередил свое время. Но теперь (с таким опозданием!) эти идеи стали воплощаться в других языках и системах, уже пользующихся поддержкой "рыночных акул". Да и "старичок" Оберон не окончил еще свой земной путь.
Здесь же и Компонентный Паскаль, и пользующаяся поддержкой Microsoft новый член обероновского семейства языков — Zonnon.

AVC>>Но главная моя претензия в данном случае все же состоит в том, что язык разбухает. Требуется знать все больше и больше (о все меньшем и меньшем ).

AVC>>Уже и тривиальный цикл написать нельзя. Говорят: используйте стандартные алгоритмы. Т.е. их все надо помнить...
E>Кто говорит? Ну и пусть говорят
E>Чувство меры и здравый смысл еще никто не отменял.

Глядя на Страуструпа, я уже этого сказать не могу.

AVC>>Думается, простой код

AVC>>
AVC>>for (int i = 0; i < sizeof a / sizeof a[0]; ++i)
AVC>>    if (v == a[i]) {  ... }
AVC>>

AVC>>проще и понятнее.

E>Если он один (цикл этот), то да. Если их несколько, то нет. А дальше -- больше.


STL практически весь состоит из тривиальных алгоритмов (на большее согласия в комитетских товарищах не хватило). Как правило, одного цикла хватает.

E>Оказывается, что если код развивается, то может оказаться, что a -- это больше не вектор, а list или даже set. Соответственно, цикл пришлось бы модифицировать. А обращение к find (find_if) нет.


Ну, по крайней мере, приведенный тобой пример с массивом точно уж пришлось бы модифицировать.
В массиве Си++ никаких begin() и end() нет.
А если добавить, что компилятор Си++ помнит о массиве только в области его определения...

E>Еще один вариант -- поиск должен поиметь side effect. В случае с циклом нам бы пришлось помещать в if() {...} дополнительную логику, которая может оказаться и не маленькой. В случае же с find_if эта логика может быть скрыта в предикате и не загромождать код основной процедуры.


А что, в цикле использовать предикат запрещено?

AVC>>Но если уж начал применять STL, то, конечно, надо применять его везде — для выработки автоматизма.

E>Если только это до маразма не доходит.

Ну, тогда применять вообще не надо.

AVC>>>>Во-вторых, Вы почему-то ничего не сказали о таких мелочах, как написании класса предиката, наследовании от unary_function или binary_function и т.д.

E>>>Для многих стандартных алгоритмов, в том числе и для find_if, это не обязательно.

AVC>>Это мелочь, но и здесь можно немного поспорить.

AVC>>Все алгоритмы, чье имя заканчивается на _if, предполагают получить в качестве параметра предикат.
AVC>>Рассмотрим в качестве примера одно из определений find_if (для компилятора GNU C++):
AVC>>
AVC>>template <class _InputIter, class _Predicate>
AVC>>inline _InputIter find_if(_InputIter __first, _InputIter __last,
AVC>>                          _Predicate __pred,
AVC>>                          input_iterator_tag)
AVC>>{
AVC>>  while (__first != __last && !__pred(*__first))
AVC>>    ++__first;
AVC>>  return __first;
AVC>>}
AVC>>

AVC>>Предикатом может быть как булевская функция, так и соответствующий класс. По ряду причин, рекомендуют второе.

E>Когда я сказал, что предикат для find_if не обязательно должен быть производен от unary_function, то я имел в виду именно это. Насколько я помню, наследование от *_function становиться важным при использовании различных bind1st и bind2nd. Хотя я, например, предпочитаю наследоваться от unary_function по простым прозаическим причинам:

E>1. Когда я указываю в unary_function параметры шаблона, то получаю для них удобные псевдонимы argument_type и result_type. Это позволяет мне в коде предиката использовать короткое имя argument_type вместо, например, std::map< some_my_key_t, some_my_value_t >::value_type const &.
E>2. Я имею возможность сменить типа параметра для unary_function, но это не затронет кода предиката, т.к. там я пользуюсь псевдонимами argument_type и result_type.

Боже мой, как все-таки облегчили труд программиста в последнее время!
Я бы сказал, налицо все признаки прогресса.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[30]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 19.06.05 14:34
Оценка:
Здравствуйте, AVC

Алексей, спасибо за интересный ответ. Я возьму некоторый тайм-аут чтобы вдумчиво на него ответить.

Хотя, мне кажется, что в некоторых ветвях данного топика, в частности, в той, в которой мы сейчас общаемся, разговор пошел гораздо серьезнее священных войн. Жалко, что мы в дебрях этой ветви прячемся, а то мог бы еще кто-нибудь подключиться.
Уважаемые модераторы, нельзя ли нас (вот отсюда: Re[16]: Почему настоящие программисты избегают C++
Автор: eao197
Дата: 05.06.05
) в "Философию программирования" переместить?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[31]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 19.06.05 15:07
Оценка:
Здравствуйте, eao197, Вы писали:

E>Алексей, спасибо за интересный ответ. Я возьму некоторый тайм-аут чтобы вдумчиво на него ответить.


Взаимно!

E>Хотя, мне кажется, что в некоторых ветвях данного топика, в частности, в той, в которой мы сейчас общаемся, разговор пошел гораздо серьезнее священных войн. Жалко, что мы в дебрях этой ветви прячемся, а то мог бы еще кто-нибудь подключиться.

E>Уважаемые модераторы, нельзя ли нас (вот отсюда: Re[16]: Почему настоящие программисты избегают C++
Автор: eao197
Дата: 05.06.05
) в "Философию программирования" переместить?


Согласен.
Вообще, "воевать" уже не хочется.
А те вопросы, которые хочется обсудить, уже не "воинственные".

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re: Что толку в Ада если Ариан 5 все равно упал
От: AVM Россия  
Дата: 21.06.05 17:49
Оценка: 28 (3) +1
Здравствуйте, eao197, Вы писали:

E>В качестве примера -- катастрофа Ариан 5 при старте, тогда из-за ошибок программистов не было перехвачено исключение и софт просто вырубился, как на основной, так и на резервной системе контроля. <SKIP>


IMHO катастрофа Ариан 5(если ты конечно об этом http://www.osp.ru/os/1998/06/21.htm) — чисто конфигурационная проблема, не зависящая от ярыка программирования.

...
# ошибка "Operand Error" произошла из-за неожиданно большой величины BH (Horizontal Bias – горизонтальный наклон), посчитанной внутренней функцией на основании величины "горизонтальной скорости", измеренной находящимися на Платформе датчиками. Величина BH служила индикатором точности позиционирования Платформы;
# величина BH оказалась много больше, чем ожидалось потому, что траектория полета Ariane 5 на ранней стадии существенно отличалась от траектории полета Ariane 4 (где этот программный модуль использовался ранее), что и привело к значительно более высокой "горизонтальной скорости".
...
Однако, Ariane 5, в отличие от предыдущей модели, имел уже принципиально другую дисциплину выполнения предполетных действий – настолько другую, что работа рокового программного модуля после времени старта вообще не имела смысла. Однако, модуль повторно использовался без каких-либо модификаций – видимо из-за нежелания изменять программный код, который успешно работает.
...
Расследование показало, что в данном программном модуле присутствовало целых семь переменных, вовлеченных в операции преобразования типов. Оказалось, что разработчики проводили анализ всех операций, способных потенциально генерировать исключение, на уязвимость. И это было их вполне сознательным решением добавить надлежащую защиту к четырем переменным, а три – включая BH – оставить незащищенными. Основанием для такого решения была уверенность в том, что для этих трех переменных возникновение ситуации переполнения невозможно в принципе. Уверенность эта была подкреплена расчетами, показывающими, что ожидаемый диапазон физических полетных параметров, на основании которых определяются величины упомянутых переменных, таков, что к нежелательной ситуации привести не может. И это было верно – но для траектории, рассчитанной для модели Ariane 4. А ракета нового поколения Ariane 5 стартовала по совсем другой траектории, для которой никаких оценок не выполнялось. Между тем она (вкупе с высоким начальным ускорением) была такова, что "горизонтальная скорость" превзошла расчетную (для Ariane 4) более чем в пять раз.


Проблема не в языках а в головах
Re[2]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.06.05 19:19
Оценка:
Здравствуйте, AVM, Вы писали:

AVM>Проблема не в языках а в головах


Вот именно это я и подразумевал.

PS. Отдельное спасибо за точную ссылку на osp.ru -- я помнил, что там читал рускоязычный вариант описания катастрофы, но когда потребовалось -- не вспомнил где именно
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[18]: Что толку в Ада если Ариан 5 все равно упал
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 22.06.05 03:43
Оценка: +3 :)
Здравствуйте, AVC, Вы писали:

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


AVC>>>Весь смысл высокоуровневости — позволить компилятору гарантировать определенные свойства программ, например — безопасность типов (type safety).

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

E>>Что-то в этой ветке часто упоминается, что есть языки, в которых выход за пределы массива четко и точно отлавливается в run-time. И говорится, что это круто, и что из-за отсутствия таковой возможности C/C++ must die!


AVC>Я не думаю, что C++ must die! Это Вы меня прямо оклеветали.

AVC>Я думаю, что C++ is dead.
AVC>Говорят, что если петуху отрубить голову, он еще может носиться по двору. Вот C++ и носится... А потом бряк — и уже вверх ногами!

Эта разговоры продолжаются с года с 1985-ого, когда вышли первые более менее нормальные компилятор и описание...
На моей памяти, начиная с 1997 года, эти это уже 3-яя волна подобных "похорон" языка.
А вот что-то не умирает он и до сих пор носится по двору без башки... Или даже я сказал бы так — одну отрубили, а 2 выросло...
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re: Что толку в Ада если Ариан 5 все равно упал
От: faulx  
Дата: 22.06.05 11:38
Оценка: 9 (2)
Здравствуйте, eao197, Вы писали:

E>В качестве примера -- катастрофа Ариан 5 при старте, тогда из-за ошибок программистов не было перехвачено исключение и софт просто вырубился, как на основной, так и на резервной системе контроля. И что толку, что софт был написан на Ada, а не на C++? Поэтому то, что Oberon/Java/C# сгенерирует out of bound exception в run-time, имхо, ничем не поможет программе, в которой это исключение совершенно не ожидалось. А ведь в подавляющем большинстве случаев оно не ожидается


К вопросу о падающих космических аппаратах, языках программирования и статической типизации:

http://www.flownet.com/gat/jpl-lisp.html, в разделе "1994-2000 — Remote Agent"


The Remote Agent software, running on a custom port of Harlequin Common Lisp, flew aboard Deep Space 1 (DS1), the first mission of NASA's New Millennium program. Remote Agent controlled DS1 for two days in May of 1999. During that time we were able to debug and fix a race condition that had not shown up during ground testing. (Debugging a program running on a $100M piece of hardware that is 100 million miles away is an interesting experience. Having a read-eval-print loop running on the spacecraft proved invaluable in finding and fixing the problem. The story of the Remote Agent bug is an interesting one in and of itself.)

Re[23]: Что толку в Ада если Ариан 5 все равно упал
От: А почему вы спрашиваете Беларусь  
Дата: 22.06.05 12:11
Оценка: 29 (2) +1
Здравствуйте, Трурль, Вы писали:

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


AVC>>Из отчета, ссылку на который дал Cyberax (за что ему отдельное спасибо, хотя не помню, чтобы мы хоть раз совпали во мнениях ), очевидно, что первопричина — в недостаточности вычислительных ресурсов. Соответствующую цитату из отчета я уже приводил.


Т>Нет, первопричина — в пресловутом кодреюзе.


Неа. Перворичина совсем в другом. И она названа в отчете:

The reason behind this drastic action lies in the culture within the Ariane programme of only addressing random hardware failures. From this point of view exception — or error — handling mechanisms are designed for a random hardware failure which can quite rationally be handled by a backup system.


Очень интересно, что все участники дискуссии полностью проигнорировали этот фрагмент отчета. Собственно, ничего удивительного в этом нет, это типичное заблуждение, которое заключается в том, что ПО можно сделать свободным от дефектов и предусматривать какие-то меры восстановления от программных сбоев нет необходимости. И это-то при том, что именно программные ошибки занимают второе место среди причин отказов информационных систем (первое место — cockpit failure), а аппаратные сбои только на третьем.

На самом деле задача должна формулироваться так — необходимо сделать функционирование программно-аппаратного комплекса надежным даже в присутствии систематических дефектов софта, которых полностью избежать невозможно.

Ссылка по теме: диссертация Joe Armstrong'а на тему "Making reliable distributed systems in the presence of software errors" (здесь)
Re[24]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.06.05 12:34
Оценка:
Здравствуйте, А почему вы спрашиваете, Вы писали:

АПВ>Здравствуйте, Трурль, Вы писали:


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


AVC>>>Из отчета, ссылку на который дал Cyberax (за что ему отдельное спасибо, хотя не помню, чтобы мы хоть раз совпали во мнениях ), очевидно, что первопричина — в недостаточности вычислительных ресурсов. Соответствующую цитату из отчета я уже приводил.


Т>>Нет, первопричина — в пресловутом кодреюзе.


АПВ>Неа. Перворичина совсем в другом.


АПВ>Очень интересно, что все участники дискуссии полностью проигнорировали этот фрагмент отчета. Собственно, ничего удивительного в этом нет, это типичное заблуждение, которое заключается в том, что ПО можно сделать свободным от дефектов и предусматривать какие-то меры восстановления от программных сбоев нет необходимости. И это-то при том, что именно программные ошибки занимают второе место среди причин отказов информационных систем (первое место — cockpit failure), а аппаратные сбои только на третьем.


Вообще-то история развития этой ветки была немного другой. Мы здесь не обсуждали изначально проблему Ариана, она была приведена в качестве иллюстрации.

АПВ>На самом деле задача должна формулироваться так — необходимо сделать функционирование программно-аппаратного комплекса надежным даже в присутствии систематических дефектов софта, которых полностью избежать невозможно.


Вот, в статье, ссылку на которую предоставил AVM Re: Что толку в Ада если Ариан 5 все равно упал
Автор: AVM
Дата: 21.06.05
:

В данном же случае, возникла систематическая программная ошибка; "систематическая" – в том смысле, что при повторении тех же входных условий, она обязательно возникнет вновь, ибо – тавтология здесь уместна – запрограммирована.


Поскольку это была систематическая ошибка, то ее преодоление возможно, имхо, только если бы дублирующая система была реализована по другому, т.е. работала бы по другим алгоритмам. А это, опять же, имхо, вряд ли достижимо, т.к. создание двух разных версий контролирующих систем даже не удвоит стоимость, а утроит (за счет необходимости проверки их взаимозаменяемости).
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[25]: Что толку в Ада если Ариан 5 все равно упал
От: А почему вы спрашиваете Беларусь  
Дата: 22.06.05 12:55
Оценка: 12 (1) +2
Здравствуйте, eao197, Вы писали:

АПВ>>Очень интересно, что все участники дискуссии полностью проигнорировали этот фрагмент отчета. Собственно, ничего удивительного в этом нет, это типичное заблуждение, которое заключается в том, что ПО можно сделать свободным от дефектов и предусматривать какие-то меры восстановления от программных сбоев нет необходимости. И это-то при том, что именно программные ошибки занимают второе место среди причин отказов информационных систем (первое место — cockpit failure), а аппаратные сбои только на третьем.


E>Вообще-то история развития этой ветки была немного другой. Мы здесь не обсуждали изначально проблему Ариана, она была приведена в качестве иллюстрации.


Пардон. Видимо, я пропустил начало.

АПВ>>На самом деле задача должна формулироваться так — необходимо сделать функционирование программно-аппаратного комплекса надежным даже в присутствии систематических дефектов софта, которых полностью избежать невозможно.


E>Вот, в статье, ссылку на которую предоставил AVM Re: Что толку в Ада если Ариан 5 все равно упал
Автор: AVM
Дата: 21.06.05
:

E>

E>В данном же случае, возникла систематическая программная ошибка; "систематическая" – в том смысле, что при повторении тех же входных условий, она обязательно возникнет вновь, ибо – тавтология здесь уместна – запрограммирована.


E>Поскольку это была систематическая ошибка, то ее преодоление возможно, имхо, только если бы дублирующая система была реализована по другому, т.е. работала бы по другим алгоритмам. А это, опять же, имхо, вряд ли достижимо, т.к. создание двух разных версий контролирующих систем даже не удвоит стоимость, а утроит (за счет необходимости проверки их взаимозаменяемости).


Угу. Систематическая, все верно. Вот следующий абзац из отчета:

Although the failure was due to a systematic software design error, mechanisms can be introduced to mitigate this type of problem. For example the computers within the SRIs could have continued to provide their best estimates of the required attitude information. There is reason for concern that a software exception should be allowed, or even required, to cause a processor to halt while handling mission-critical equipment. Indeed, the loss of a proper software function is hazardous because the same software runs in both SRI units. In the case of Ariane 501, this resulted in the switch-off of two still healthy critical units of equipment.


Как правильно обрабатывать сбои: когда проигнорировать и продолжить как будто ничего не случилось, когда упасть с предсметрным воплем, а когда поправить положение и повторить операцию — вот интересная проблема и тема для дискуссии. А на каком языке писать, чтобы избежать переполнения, — нет.
Re[26]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.06.05 13:01
Оценка:
Здравствуйте, А почему вы спрашиваете, Вы писали:

E>>Вообще-то история развития этой ветки была немного другой. Мы здесь не обсуждали изначально проблему Ариана, она была приведена в качестве иллюстрации.


АПВ>Пардон. Видимо, я пропустил начало.


Это не удивительно, т.к. начало было в глубине знатного флейма про must-die-мость C++ в "Священых воинах"

E>>Поскольку это была систематическая ошибка, то ее преодоление возможно, имхо, только если бы дублирующая система была реализована по другому, т.е. работала бы по другим алгоритмам. А это, опять же, имхо, вряд ли достижимо, т.к. создание двух разных версий контролирующих систем даже не удвоит стоимость, а утроит (за счет необходимости проверки их взаимозаменяемости).


АПВ>Угу. Систематическая, все верно. Вот следующий абзац из отчета:

АПВ>

АПВ>Although the failure was due to a systematic software design error, mechanisms can be introduced to mitigate this type of problem. For example the computers within the SRIs could have continued to provide their best estimates of the required attitude information. There is reason for concern that a software exception should be allowed, or even required, to cause a processor to halt while handling mission-critical equipment. Indeed, the loss of a proper software function is hazardous because the same software runs in both SRI units. In the case of Ariane 501, this resulted in the switch-off of two still healthy critical units of equipment.


АПВ>Как правильно обрабатывать сбои: когда проигнорировать и продолжить как будто ничего не случилось, когда упасть с предсметрным воплем, а когда поправить положение и повторить операцию — вот интересная проблема и тема для дискуссии.

+1

АПВ> А на каком языке писать, чтобы избежать переполнения, — нет.

Именно так, но начиналось все с обсуждения недостатков C++, поэтому такой уклон в сравнении надежности языков в теме присутствует.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[24]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 22.06.05 13:22
Оценка: 22 (3) :)
Здравствуйте, А почему вы спрашиваете, Вы писали:

АПВ>На самом деле задача должна формулироваться так — необходимо сделать функционирование программно-аппаратного комплекса надежным даже в присутствии систематических дефектов софта, которых полностью избежать невозможно.


Согласен. Но, боюсь, очень сооблазнительно перейти от тезиса "В наших программах нет ошибок, потому что наши программисты их не делают." к тезису "Да, в наших программах есть ошибки, но это неважно, потому что наша система работает надежно даже в присутствии ошибок".

А вот еще один взгяд на проблему: Peter Amey, Logic Versus Magic in Critical Systems
Re[25]: Что толку в Ада если Ариан 5 все равно упал
От: А почему вы спрашиваете Беларусь  
Дата: 22.06.05 13:47
Оценка: +1
Здравствуйте, Трурль, Вы писали:

Т>Здравствуйте, А почему вы спрашиваете, Вы писали:


АПВ>>На самом деле задача должна формулироваться так — необходимо сделать функционирование программно-аппаратного комплекса надежным даже в присутствии систематических дефектов софта, которых полностью избежать невозможно.


Т>Согласен. Но, боюсь, очень сооблазнительно перейти от тезиса "В наших программах нет ошибок, потому что наши программисты их не делают." к тезису "Да, в наших программах есть ошибки, но это неважно, потому что наша система работает надежно даже в присутствии ошибок".


Ну, если в первый тезис никто в здравом уме не поверит, то насчет второго есть о чем поговорить.
Нет, конечно, поиск и устранение дефектов отменить невозможно. Но и полагаться только на них при проектировании отказоустойчивой системы нельзя.
Re: Что толку в Ада если Ариан 5 все равно упал
От: Airat Burganov Россия http://www.burganov.com
Дата: 22.06.05 21:16
Оценка: +3
Здравствуйте, eao197, Вы писали:

E> Поэтому то, что Oberon/Java/C# сгенерирует out of bound exception в run-time, имхо, ничем не поможет программе, в которой это исключение совершенно не ожидалось. А ведь в подавляющем большинстве случаев оно не ожидается


Не верно.

Если генерируется out of bound exception то правильно спроектированная программа знает, что произошла непридведенная ошибка и предпринимает какие-то разумные действия (запись в лог, перезапуск, запуск в безопасном режиме и т.п.)

Если происходит выход за границы массива в C/C++, то насколько я понимаю скорее всего произойдет вообще непонятно какой сбой или даже программа будет работать какое-то время вообще в непонятно каком состоянии. Естественно такая ситуация много хуже первой.
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: Дарней Россия  
Дата: 23.06.05 03:44
Оценка: +1
Здравствуйте, AVC, Вы писали:

AVC>Но давайте рассмотрим факты.

AVC>Основная часть ПО Ариан-5 была унаследована от ПО Ариан-4.
AVC>Траектория полета Ариан-5 отличалась от траектории полета Ариан-4.
AVC>Горизонтальная скорость Ариан-5 была значительно выше, чем у Ариан-4.
AVC>Именно поэтому 64-битное число с плавающей точкой (double?) оказалось
AVC>невозможным привести к 16-битному знаковому целому без потерь.
AVC>Это и вызвало исключение.
AVC>Данная переменная была незащищена (unprotected) от подобного исключения.
AVC>Ясно сказано, что решение не защищать данную переменную от исключения
AVC>было принято сознательно.
AVC>По-видимому, чтобы не превосходить указанный лимит ресурсов в 80%.
AVC>Дальше много говорится об "анализе, котрый проделали, перед тем как принять
AVC>такое решение" и прочей безответственной чуши. Пожалуйста, вот Вам цена
AVC>всех этих "верификаций"!
AVC>Что значит — переменная незащищена? Значит ли это, соответствующее исключение
AVC>было аппаратным (вроде исключения при делении на нуль)?
AVC>В Обероне, если присвоение значения переменной может привести к потере информации,
AVC>требуется явно указать допустимость этой потери информации, иначе
AVC>компилятор не пропустит данный оператор присвоения.
AVC>Если же программист явно указывает допустимость такой ситуации,
AVC>то, конечно, никакого исключения сгенерировано не будет (или оно обязательно
AVC>будет перехвачено, если имеет аппаратное происхождение).

А меня это наводит на другие мысли.
1. Системное тестирование комплекса с новым датчиком не проводилось.
2. Данные о "подавленных" исключениях не были задокументированы, и/или не были проверены во время разработки и модульного тестирования.
Высоконадежный софт, ептыть
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[2]: Что толку в Ада если Ариан 5 все равно упал
От: GlebZ Россия  
Дата: 23.06.05 07:20
Оценка: 1 (1) +5
Здравствуйте, Airat Burganov, Вы писали:

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


E>> Поэтому то, что Oberon/Java/C# сгенерирует out of bound exception в run-time, имхо, ничем не поможет программе, в которой это исключение совершенно не ожидалось. А ведь в подавляющем большинстве случаев оно не ожидается


AB>Не верно.


AB>Если генерируется out of bound exception то правильно спроектированная программа знает, что произошла непридведенная ошибка и предпринимает какие-то разумные действия (запись в лог, перезапуск, запуск в безопасном режиме и т.п.)

В системе реального времени? Запуск в безопасном режиме? Остановите ракету, мне надо перегрузиться.

AB>Если происходит выход за границы массива в C/C++, то насколько я понимаю скорее всего произойдет вообще непонятно какой сбой или даже программа будет работать какое-то время вообще в непонятно каком состоянии. Естественно такая ситуация много хуже первой.

Однако C++ ничего не предпринимает чтобы запретить тебе контролировать выход за границы. Пользуйся объектами.

С уважением, Gleb.
... << RSDN@Home 1.1.4 beta 4 rev. 358>>
Re[27]: Что толку в Ада если Ариан 5 все равно упал
От: prVovik Россия  
Дата: 23.06.05 12:46
Оценка: 9 (1)
Здравствуйте, eao197, Вы писали:

E>Да и Ада применяется только на Западе


У нас тоже кое-что на ней пишут. Знакомый как раз сейчас устраивается на работу "адским" программистом (МО РФ)
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[28]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 23.06.05 12:56
Оценка:
Здравствуйте, prVovik, Вы писали:

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


E>>Да и Ада применяется только на Западе


V>У нас тоже кое-что на ней пишут. Знакомый как раз сейчас устраивается на работу "адским" программистом (МО РФ)


Чего в жизни только не бывает
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[19]: Что толку в Ада если Ариан 5 все равно упал
От: prVovik Россия  
Дата: 23.06.05 13:48
Оценка: +1 :))) :))
Здравствуйте, Mr. None, Вы писали:

MN>А вот что-то не умирает он и до сих пор носится по двору без башки... Или даже я сказал бы так — одну отрубили, а 2 выросло...


Ага, осталось только определиться с разрядностью счетчика голов
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: A.Lokotkov Россия http://www.linkedin.com/pub/alexander-lokotkov/a/701/625
Дата: 23.06.05 14:42
Оценка:
Здравствуйте, AVC, Вы писали:

AVC>Кстати, интересно, кто-нибудь задумался, чтобы случилось, если бы вследствие этого выхода за границы диапазона исключения бы не было? Имеем: ракету рядом с земной поверхностью, "руководствующуюся" совершенно неверными данными.


В случае с Арианом-5 ничего бы не было. Ничего. Исключение возникло в "мертвом" коде, который кочевал из проекта в проект и в 5-м Ариане был не нужен. Там в отчете всё есть.
bloß it hudla
Re[3]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.06.05 23:58
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ> В системе реального времени? Запуск в безопасном режиме? Остановите ракету, мне надо перегрузиться.


В любой системе. Подумай что было бы если этот Ариан взорвался от ошибки в С++-программе? Попортили память... логов нет... Программа закончилась аварийно... Запускаем еще один спутник в отдалочный целях... а вось когда он грохнет мы поймем, что было тому причиной.

GZ>Однако C++ ничего не предпринимает чтобы запретить тебе контролировать выход за границы. Пользуйся объектами.


Да, да. А опасные возмоности С++ не применяй. А для чего их сделали?

Кстати, в STL из VC в std::vector нет проверок выхода за границы массива даже в безопасном режиме. Т от
*((&array[0]) - 10) = 12345;

никто не спасет. И не рассказывайте мне, что в ваших программах нет подобного кода.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 24.06.05 00:06
Оценка: 114 (4) +2
Здравствуйте, А почему вы спрашиваете, Вы писали:

АПВ>Как правильно обрабатывать сбои: когда проигнорировать и продолжить как будто ничего не случилось, когда упасть с предсметрным воплем, а когда поправить положение и повторить операцию — вот интересная проблема и тема для дискуссии. А на каком языке писать, чтобы избежать переполнения, — нет.


Я думаю, что Вы правильно сформулировали один из главных вопросов, на которые хотелось бы найти ответ.
Что делать с ошибками и сбоями (раз уж они случились)?
Как выстроить вторую (третью, четвертую, пятую) линию обороны в mission-critical системах?

Конечно, я не согласен с Вами насчет роли языка. Я уверен, что язык имеет значение, как один из факторов, влияющих на надежность системы. Я думаю, что type-safe язык является хотя и недостаточным, но все же необходимым требованием для создания надежных систем большой сложности.
Но на эту тему было уже много как дискуссий, так и откровенного флейма.
Поэтому я думаю, что обсудить Ваш вопрос будет сейчас гораздо полезнее, чем спорить на тему языка.

Все же тема языка должна навести нас и на другую тему: предотвращение ошибок.
Вот здесь-то я и загрустил.
Я понял, что недостаточно разбираюсь в самом понятии ошибки.
До тех пор я настаивал (и сейчас настаиваю, хотя в голове у меня завелись тараканы беспокойства), что программа (вроде ПО Ариана) должна быть корректной, а не просто "надежной".
Но что такое корректность? Соответствие спецификациям?
Я думаю, такая корректность в принципе достижима.
Но как удостовериться, что сами спецификации полностью соответствуют объективной реальности и не оставляют "щели" для катастрофы?
Такая задача кажется мне невыполнимой.
Выясняется, что сама борьба с ошибками — творческое дело. Надо уметь думать о том, о чем ты думать не можешь, так как не знаешь этого, или оно просто не приходило тебе в голову.
Творчество — это хорошо, но оно, в отличие от рутины, всегда связано с ошибками, а значит — с риском.

Другая причина для беспокойства в том, что, возможно, не существует абсолютных решений даже одной единственной проблемы.
Вероятно, именно это имел в виду Трурль, когда говорил, что "причина в пресловутом кодреюзе".
Я тогда не оценил эту мысль и ответил примерно так, что, если бы программа была корректной, то Ариан бы не упал.
Но между самой совершенной моделью и реальностью всегда существует некоторая дистанция.
Поэтому надо каждый раз заново проверять применимость вчерашних решений.
Выбор рабочей модели похож на попытку укрыться коротким одеялом: укутаешь плечи, высунутся ноги.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[23]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 24.06.05 00:06
Оценка:
Здравствуйте, A.Lokotkov, Вы писали:

AVC>>Кстати, интересно, кто-нибудь задумался, чтобы случилось, если бы вследствие этого выхода за границы диапазона исключения бы не было? Имеем: ракету рядом с земной поверхностью, "руководствующуюся" совершенно неверными данными.


AL>В случае с Арианом-5 ничего бы не было. Ничего. Исключение возникло в "мертвом" коде, который кочевал из проекта в проект и в 5-м Ариане был не нужен. Там в отчете всё есть.


Мне кажется, если в коде возникло исключение, то он не "мертвый".
Почему-то вспоминается ехидная фраза Пуанкаре: "Логистика (=матлогика теперь) более не бесплодна: она порождает ошибки!"

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[27]: Что толку в Ада если Ариан 5 все равно упал
От: faulx  
Дата: 24.06.05 03:36
Оценка: 183 (10)
Здравствуйте, AVC, Вы писали:

AVC>Но что такое корректность? Соответствие спецификациям?

AVC>Я думаю, такая корректность в принципе достижима.
AVC>Но как удостовериться, что сами спецификации полностью соответствуют объективной реальности и не оставляют "щели" для катастрофы?
AVC>Такая задача кажется мне невыполнимой.

Теоретически это так и есть. Но на практике имеются способы повысить уверенность в соответствии спецификации тому, что мы на самом деле имели в виду. Рекомендую в связи с этим посмотреть систему PVS. Это — система именно для нахождения "дыр" в спецификациях.

Вкратце идея такова. Спецификация описывается на формальном языке PVS в виде аксиом, предположений и т.п. Эти аксиомы и соответствуют спецификации на программу. Затем мы начинаем выдвигать различные "теоремы", т.е. предположения о поведении программы в тех или иных ситуациях. Если эти предположения верны, т.е. выводятся строго формально из наших аксиом, уверенность в том, что эти аксиомы полны и непротиворечивы, повышается. Абсолютной гарантии это не дает, но по крайней мере позволяет выявлять неочевидные ошибки еще на стадии проектирования.

PVS использовался для верификации IEEE 854 floating point specification. Для подробного знакомства нужно посмотреть сайт или почитать хотя бы первю главу вот этого учебника: http://www.csl.sri.com/papers/wift-tutorial/
Re[4]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 24.06.05 07:55
Оценка: +3
Здравствуйте, VladD2, Вы писали:

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


GZ>> В системе реального времени? Запуск в безопасном режиме? Остановите ракету, мне надо перегрузиться.


VD>В любой системе. Подумай что было бы если этот Ариан взорвался от ошибки в С++-программе? Попортили память... логов нет... Программа закончилась аварийно... Запускаем еще один спутник в отдалочный целях... а вось когда он грохнет мы поймем, что было тому причиной.


То, что ПО для Ариан-а было написано не на C++, сильно смягчило потерю полумиллиарда долларов
Сразу стало легче на душе.

GZ>>Однако C++ ничего не предпринимает чтобы запретить тебе контролировать выход за границы. Пользуйся объектами.


VD>Да, да. А опасные возмоности С++ не применяй. А для чего их сделали?


Для возможности выжать максимум производительности.

VD>Кстати, в STL из VC в std::vector нет проверок выхода за границы массива даже в безопасном режиме. Т от

VD>
VD>*((&array[0]) - 10) = 12345;
VD>

VD>никто не спасет. И не рассказывайте мне, что в ваших программах нет подобного кода.

Таки нет.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[24]: Что толку в Ада если Ариан 5 все равно упал
От: A.Lokotkov Россия http://www.linkedin.com/pub/alexander-lokotkov/a/701/625
Дата: 24.06.05 10:28
Оценка: +2
Здравствуйте, AVC, Вы писали:

AL>>В случае с Арианом-5 ничего бы не было. Ничего. Исключение возникло в "мертвом" коде, который кочевал из проекта в проект и в 5-м Ариане был не нужен. Там в отчете всё есть.


AVC>Мне кажется, если в коде возникло исключение, то он не "мертвый".

AVC>Почему-то вспоминается ехидная фраза Пуанкаре: "Логистика (=матлогика теперь) более не бесплодна: она порождает ошибки!"

Как было сказано в одном постов этого треда, проблема ариана-5 -- проблема управления конфигурациями ПО. 99% остальных сообщений в этом треде, касающихся языков программирования, с проблемой ариана-5 не связаны. Хотя, конечно, можно очень постараться и связать их, например, высказав утверждение, что современные широко используемые языки программирования общего применения, в которых явно не представлен координационный слой, заведомо не приспособлены для создания сложных программных систем, особенно реального времени и, не дай Бог, распределенных. Явное и неявное приведение типов, исключения, синтаксический сахар и прочие механизмы, удачные и не очень, -- детский лепет по сравнению с реальными проблемами, возникающими при создании систем управления вроде той, что летает на арианах.
bloß it hudla
Re[4]: Что толку в Ада если Ариан 5 все равно упал
От: GlebZ Россия  
Дата: 24.06.05 11:20
Оценка: +3
Здравствуйте, VladD2, Вы писали:

GZ>> В системе реального времени? Запуск в безопасном режиме? Остановите ракету, мне надо перегрузиться.


VD>В любой системе. Подумай что было бы если этот Ариан взорвался от ошибки в С++-программе? Попортили память... логов нет... Программа закончилась аварийно... Запускаем еще один спутник в отдалочный целях... а вось когда он грохнет мы поймем, что было тому причиной.

Ага. Только наверняка там стоял DrWatson, пдбешки и все заключено в ATLTrace и ему подобное. Главное чтобы драйвера от видео-карты не подкачали.

GZ>>Однако C++ ничего не предпринимает чтобы запретить тебе контролировать выход за границы. Пользуйся объектами.

VD>Да, да. А опасные возмоности С++ не применяй. А для чего их сделали?
Производительность vs Надежность.

VD>Кстати, в STL из VC в std::vector нет проверок выхода за границы массива даже в безопасном режиме. Т от

VD>
VD>*((&array[0]) - 10) = 12345;
VD>

VD>никто не спасет. И не рассказывайте мне, что в ваших программах нет подобного кода.
Не-а. На С++ у меня другой код с другими подобными фичами и в большом количестве. Есть некоторые правила которые я выполняю (типа smart pointers и т.д.). Сверх того не собираюсь. Ну не полетят мои программы в космос. А если бы и полетели, то на фиг они там кому-то сдались.
Мне значительно проще и легче контролировать именно себя чем активно реализовывать программы чтобы контролировать ошибки которые я мог бы сделать. А в космосе нужны меры именно предупреждающего контроля. Как-то слыхал какую вероятность отказа высчитывали наши для каждой подсистемы ракет. Цифру не помню, но она впечатляла. Достичь ее наверняка можно даже если пишешь на машинных кодах. Просто это будет дольше по времени и дороже.

С уважением, Gleb.
... << RSDN@Home 1.1.4 beta 4 rev. 358>>
Re[25]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 24.06.05 12:34
Оценка:
Здравствуйте, A.Lokotkov, Вы писали:

AL>Явное и неявное приведение типов, исключения, синтаксический сахар и прочие механизмы, удачные и не очень, -- детский лепет по сравнению с реальными проблемами, возникающими при создании систем управления вроде той, что летает на арианах.


Все это так. Но согласитесь, что даже если весь синтаксический сахар какого-тот конкретного языка способен оказать влияние хотя бы на 5% ошибок, то в системах класса Ариан-5 это достаточно высокий показатель для того, чтобы им пренебрегать. И, поскольку изначально тема касалась сложности C++ и ошибок, которые в программы привносятся именно из-за сложности C++, то, имхо, все эти рассуждения в тему.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: Что толку в Ада если Ариан 5 все равно упал
От: AndreyFedotov Россия  
Дата: 24.06.05 13:03
Оценка:
Насколько я понимаю ситуацию, ошибка была не в языке программирования, а в процессе разработки.
Технически ошибка заключалась в том, что код использовался с иным диапазоном данных, чем тот, на который он был расчитан.
И решать её научились очень давно — когда начинают с описания как раз таки допустимых значений входных данных и строго контролируют совпадение или не совпадение диапазонов данных одного модуля с другим. Притом это делается автоматически — просто производится проверка спецификаций.
Метод, кстати очень старый, и как его теория, так и практика хорошо отработаны. По крайней мере в резульате его применения в нашей космонавтике подобных проблем было на порядок меньше, чем в западной.
По всей видимости здесь этого сделано не было, что показывает или раздолбайство, или не высокий профессионализм команды, которая писала код для ариана 5.
Re[30]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 24.06.05 13:14
Оценка: 14 (2)
Здравствуйте, AVC, Вы писали:

AVC>В случае с потерей орбиты Марса, если бы вычисления, связанные с разными единицами измерения, относились к разным типам, то ошибку, скорее всего, удалось бы предотвратить, т.к. потребовалось бы явное приведение типов.


Кстати, я тут недавно приводил
Автор: CrystaX
Дата: 23.05.05
примерную реализацию на C++ систем единиц. Сам ею пользуюсь теперь. Что интересно, результат получился довольно приличный.
1. Переменные, обозначающие разные физические понятия (такие как масса и длина, например), не приводятся друг к другу автоматически.
2. В случае присвоения одной переменной значения другой (обозначающей то же понятие, но в другой системе единиц), происходит аквтоматический пересчет из одной системы в другую.

Что примечательно, работает это вообще без оверхеда в run-time. Посему вопрос — можно ли в Обероне, или в Ада, или в Модула-2 сделать подобное же? Если можно, то можно ли сделать это с нулевым run-time оверхедом? Если да, то останется ли использование этих переменных синтаксически таким же?
Вопросы не флейма ради, а действительно интересно.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[31]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 24.06.05 13:21
Оценка: 8 (1)
Здравствуйте, CrystaX, Вы писали:


CX>Кстати, я тут недавно приводил
Автор: CrystaX
Дата: 23.05.05
примерную реализацию на C++ систем единиц. Сам ею пользуюсь теперь. Что интересно, результат получился довольно приличный.


Баян
Re[2]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 24.06.05 13:27
Оценка: 7 (2)
Здравствуйте, AndreyFedotov, Вы писали:

AF>Насколько я понимаю ситуацию, ошибка была не в языке программирования, а в процессе разработки.

+1

AF>По всей видимости здесь этого сделано не было, что показывает или раздолбайство, или не высокий профессионализм команды, которая писала код для ариана 5.


С этим можно было бы согласиться, если бы не одно "но" (и это очень большое "но", как я люблю говорить).
Андрей, а тебе приходилось работать в областях, которые можно сравнивать с разработкой софта для Ариан-а?
Мне, например, в течении года довелось поработать в области военной радиолокации. Это был такой дурдом! Причем сложность там была не столько алгоритмическая (реализация конкретных алгоритмов -- это совсем плевое дело, т.к. не мы ими занимались ). Хуже всего, что это был комплекс из немерянного количества компонентов, соединенных разными интерфейсами. И большую часть внимания приходится уделять как раз учету различных особенностей этих интерфейсов. И что самое плохое, нет и никогда не было окончательных спецификаций. Мы делаем свою часть и выясняется, что вон тот модуль чего-то нам не сообщает. Утрясли, согласовали. Проявились смежники, говорят, что мы им чего-то недодаем. Проверили -- действительно. Сделали. Проверили -- не попадаем в расчетное время. Упростили алгоритм, переделали, оказалось, что для него еще чего-то не хватает. Запросили, нам сделали. Проявляются поставщики железа с новой версией своих спецвычислителей. Для которых что-то нужно переделать. Переделали. Проявились смежники. Оказалось, что мы им опять чего-то не выдаем. Выяснили, выдаем, но константное значение, которое не изменяется со временем. Раскопали, наша ошибка в версии для нового спецвычислителя.

И такая канитель каждый день, дзинь-ди-лень, дзинь-ди-лень.

Вот потому я оттуда и ушел.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[32]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 24.06.05 13:31
Оценка:
Здравствуйте, Трурль, Вы писали:

CX>>Кстати, я тут недавно приводил
Автор: CrystaX
Дата: 23.05.05
примерную реализацию на C++ систем единиц. Сам ею пользуюсь теперь. Что интересно, результат получился довольно приличный.


Т>Баян


"Это как же, вашу мать, извиняюсь, понимать?" (с) не помню кто

1. Мы не в "Коллеги, улыбнитесь", чтобы баянами кидаться. К тому же на RSDN этого не было, стало быть — не баян в любом случае.
2. Меня на создание этого враппера подвигло чтение документации к boost::mpl. Если ты внимательно почитаешь доку, что мне дал, то обратишь внимание, что решение Мейерса немного другое. У Мейерса нет систем единиц, у меня — есть. Кроме того, у меня есть автоматический перевод из одной системы в другую.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[3]: Что толку в Ада если Ариан 5 все равно упал
От: AndreyFedotov Россия  
Дата: 24.06.05 13:36
Оценка:
Здравствуйте, eao197, Вы писали:

AF>>По всей видимости здесь этого сделано не было, что показывает или раздолбайство, или не высокий профессионализм команды, которая писала код для ариана 5.


E>С этим можно было бы согласиться, если бы не одно "но" (и это очень большое "но", как я люблю говорить).

E>Андрей, а тебе приходилось работать в областях, которые можно сравнивать с разработкой софта для Ариан-а?
Чуть-чуть.
E>Мне, например, в течении года довелось поработать в области военной радиолокации. Это был такой дурдом! Причем сложность там была не столько алгоритмическая (реализация конкретных алгоритмов -- это совсем плевое дело, т.к. не мы ими занимались ). Хуже всего, что это был комплекс из немерянного количества компонентов, соединенных разными интерфейсами. И большую часть внимания приходится уделять как раз учету различных особенностей этих интерфейсов. И что самое плохое, нет и никогда не было окончательных спецификаций. Мы делаем свою часть и выясняется, что вон тот модуль чего-то нам не сообщает. Утрясли, согласовали. Проявились смежники, говорят, что мы им чего-то недодаем. Проверили -- действительно. Сделали. Проверили -- не попадаем в расчетное время. Упростили алгоритм, переделали, оказалось, что для него еще чего-то не хватает. Запросили, нам сделали. Проявляются поставщики железа с новой версией своих спецвычислителей. Для которых что-то нужно переделать. Переделали. Проявились смежники. Оказалось, что мы им опять чего-то не выдаем. Выяснили, выдаем, но константное значение, которое не изменяется со временем. Раскопали, наша ошибка в версии для нового спецвычислителя.

E>И такая канитель каждый день, дзинь-ди-лень, дзинь-ди-лень.


E>Вот потому я оттуда и ушел.


Очень знакомая картина. Правда аксакалы рассказывали, что во времена седой старины всех жутко дрючили и заставляли документировать интерфейсы в первую очередь и это давало свои плоды... И как все радовались, когда контроль ослаб (как стало ясно горздо позде — как раз в тот момент когда стали терять культуру управления сложными промышленными проектами) и как плевались потом, когда всё пришло к столь знакомой ситуации.
Re[4]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 24.06.05 13:48
Оценка:
Здравствуйте, AndreyFedotov, Вы писали:

AF>Очень знакомая картина. Правда аксакалы рассказывали, что во времена седой старины всех жутко дрючили и заставляли документировать интерфейсы в первую очередь и это давало свои плоды... И как все радовались, когда контроль ослаб (как стало ясно горздо позде — как раз в тот момент когда стали терять культуру управления сложными промышленными проектами) и как плевались потом, когда всё пришло к столь знакомой ситуации.


Как раз документирование лично меня сильно не напрягало, хотя я не много-то в том проекте и задокументировал. Хуже было другое: держишь на руках готовые спецификации, вроде бы всеми согласованные и утвержденные. А начинаешь по ним работать... Мать, мать, мать!!! Оказывается, что все ключевые разработчики, которые реально все знают и все делают, ничего об этих спецификациях и не знают , т.к. пишут бумажки те, кому компилятор в руки давать страшно.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[5]: Что толку в Ада если Ариан 5 все равно упал
От: AndreyFedotov Россия  
Дата: 24.06.05 15:39
Оценка: 1 (1) +1
Здравствуйте, eao197, Вы писали:

E>Как раз документирование лично меня сильно не напрягало, хотя я не много-то в том проекте и задокументировал. Хуже было другое: держишь на руках готовые спецификации, вроде бы всеми согласованные и утвержденные. А начинаешь по ним работать... Мать, мать, мать!!! Оказывается, что все ключевые разработчики, которые реально все знают и все делают, ничего об этих спецификациях и не знают , т.к. пишут бумажки те, кому компилятор в руки давать страшно.


Так я об этом бардаке и говорю. По рассказам было время, когда за подобную ситуацию начальника легко могли снять, а спеца если он отступит от бумажки вполне могли вообще под статью подвести. И эта система себя оправдывала. А потом начался либерализм...
Re[30]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 24.06.05 15:55
Оценка: 34 (6)
Здравствуйте, AVC

Попробуем разобраться с твоими вопросами по частям.

AVC>В основном, я вижу опасность в неявном применении переопределенных операторов.

AVC>Я уже приводил на форумах примеры "неадекватного" поведения Си++ в подобных случаях.
AVC>C++ действительно сложен.
AVC>Вопрос в том, насколько необходима, а насколько излишня такая сложность.

Эти вопросы оказались для меня более тяжелыми, чем я предполагал вначале. Дать объективный ответ сложно, поскольку я являюсь ортодоксальным фанатом C++. Так уж получилось, что несколько языков я изучил в университете, а затем особо ничего не изучал, т.к. мне хватало C++. Ситуация частично изменялась всего два раза: в 2001 году, когда я сменил место работы и попрограммировал на Java и в 2004-м году, когда я выбирал язык для реализации своего очередного велосипеда (тогда я серьезно рассмотрел Perl, Python и Ruby, на котором и остановился). Года до 2001-го я думал, что хорошо знаю C++, но затем я узнал про boost и время от времени заглядываю в его реализацию, что бы в очередной раз убедиться, что сейчас C++ -- это совсем не то, что было еще десять лет назад. Сложнее и мощнее.

Собственно, такое длинное вступление я делаю для того, чтобы поделиться своим субъективным мнением. Язык C++ слишком сложен для того, чтобы применяться в большой команде (может быть даже в условиях т.н. промышленной разработки). Подобными выводами я уже делился вот здесь: Re[44]: Почему нельзя преподавать C#
Автор: eao197
Дата: 07.04.05
.

Если провести аналогию, то C++ -- это топор в руках плотника. Известны случаи, когда плотники достигали такого совершенства во владении топором, что могли им бриться (сам видел по телевизору). Равно как известны случаи, когда один-два мастера возводили здания без единого гвоздя и эти здания стояли столетия. Т.е., в моем понимании, C++ -- это сложный, но черезвычайно мощный инструмент, который позволяет за приемлимое время, в условиях органиченных ресурсов, получать отличные результаты. Но платить за это приходится высокой (а иногда и высочайшей) квалификацией и способностями разработчика. Когда над C++ проектом работают два/три продвинутых C++ программиста, они создают очень качественный и надежный код. Но! Стоит этот коллектив каким-то образом разладить, скажем ввести в него парочку менее квалифицированных товарищей, как вся стройность и красота C++ кода превращается в страшилки, которыми регулярно пугают программистов.

Поэтому я думаю, что если в условиях ограниченных ресурсов нужно что-то сделать, и испольнитель отлично владеет C++, то лучше C++ сложно что-то придумать (хотя я не знаток диаметрально противоположных языков, т.к. Smalltalk или Lisp). И еще одно важнейшее условие: команда должна быть небольшой и очень слаженной. Собственно, такое определение можно отнести к любому языку, но для C++ важно то, что C++ имеет очень высокую стоимость вхождения. Гораздо более высокую, чем паскале-подобные языки или Java/C# (хотя последние демонстрируют тенденцию к усложнению). К сожалению, подобные команды складываются не часто. И, к еще большему сожалению, они распадаются под влиянием различных внешних факторов. А стоимость потери ключевого разработчика в C++ проекте, имхо, все же выше, чем в Java. Во многом из-за того, что одну и туже идею на C++ можно реализовать гораздо большим количеством способов, чем на Java. И когда кто-то уходит, то его way теряется безвозвратно.

Опять же к этому можно добавить кучу проблем, которая появилась в C++ из-за совместимости с C. Это и отсутствие проверок при выходе за пределы массива. И возможность приведения типов (как явных, так и неявных). И пятое, и десятое.

В общем, нелицеприятная картина для С++ получается. Особенно в области критически важных систем. И я вынужден с ней согласиться.
Более того, вспоминая свой короткий опыт работы над военным софтом могу сказать, что там не было никаких сверхзадач, для которых потребовалась бы мощь C++ (шаблонов, RAII, макросов). Отличные задачи для реализации на Pascal-е. Хотя, если бы команду уменьшили бы раза в два, то единственным языком, на котором ее можно было бы вовремя решить, имхо, был бы C++. Как раз за счет макросов и шаблонов, которые позволяют писать меньше кода.

E>>С этим сложно спорить. Но широкоизвестные космические катастрофы, связанные с ошибками ПО, никак с этим не были связаны. Про Ариан мы уже долго говорим. Был еще старый случай с фортраном и запятой вместо десятичной точки (хотя этот пример и может попасть в данную категорию, если только все это было на самом деле). А ведь еще был случай с Mars Explorer (или как его там), когда разные модули вычисляли значения в разных системах счисления.


AVC>Да, был такой случай в 1999 году.

AVC>С Фортраном тоже был случай. Кажется, это было в нашем (еще советском) проекте в начале 1970-х.
AVC>Я не понимаю, почему ты полагаешь, что широкоизвестные катастрофы никак не связаны с надежностью языка.
AVC>Смотри сам.
AVC>В случае с циклом FOR в Фортране, просто очевидно, что большая доля вины — на языке.

Возможно, но где-то в форумах было показано, что досадные ляпы можно допускать практически везде. И даже подсветка синтаксиса в интеллектуальных редакторах не спасает.

AVC>В случае с Арианом, из-за недостаточности ресурсов целочисленную переменную не защитили от переполнения, что привело к отключению компьютера. Обращаю внимание, что игнорирование переполнения могло привести к еще худшим последствиям. В области безопасности программа должна быть корректна на 100%. 99% недостаточно!


+1
Но как в этом удостовериться?
Так что это была именно проектная проблема, а не проблема языка.

AVC>В случае с потерей орбиты Марса, если бы вычисления, связанные с разными единицами измерения, относились к разным типам, то ошибку, скорее всего, удалось бы предотвратить, т.к. потребовалось бы явное приведение типов.

AVC>Т.е. напротив, трудно назвать случай не связанный с языком (или нарушением его правил)!

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

Кроме того, я не очень понимаю твою фразу по поводу разных типов. Ведь оперировали-то одним понятием: дистация. Может быть даже тип ввели такой distance . Только одни вычисляли дистанцию в футах, а другие -- в метрах .
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[33]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 24.06.05 16:42
Оценка:
CrystaX,

> "Это как же, вашу мать, извиняюсь, понимать?" (с) не помню кто


Леонид Филатов. "Сказка о Федоте — стрельце, удалом молодце"
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[26]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 24.06.05 21:30
Оценка:
Здравствуйте, eao197, Вы писали:

AL>>Явное и неявное приведение типов, исключения, синтаксический сахар и прочие механизмы, удачные и не очень, -- детский лепет по сравнению с реальными проблемами, возникающими при создании систем управления вроде той, что летает на арианах.


E>Все это так. Но согласитесь, что даже если весь синтаксический сахар какого-тот конкретного языка способен оказать влияние хотя бы на 5% ошибок, то в системах класса Ариан-5 это достаточно высокий показатель для того, чтобы им пренебрегать. И, поскольку изначально тема касалась сложности C++ и ошибок, которые в программы привносятся именно из-за сложности C++, то, имхо, все эти рассуждения в тему.


Никоим образом не желая возобновить флейм на "лингвистические темы", все же не удержусь и подкину "информацию к размышлению".
В том же номере "Открытых систем", откуда взята русскоязычная статья о падении Ариана-5, приводятся следующие сведения. (Кстати, весь этот номер был посвящен теме надежности ПО.)
http://www.osp.ru/os/1998/06/46.htm

Язык С++ дает на 25% больше ошибок, чем традиционные Си или Паскаль, а исправление ошибок в ОО программах на С++ требует в 2-3 раза больше времени. Наследование порождает в 6 раз больше ошибок.

Конечно, будет справедливо, если ты в свою очередь спросишь, кто и как установил сей факт.
Буду честен — не знаю. Так что на цифрах не настаиваю.
Но все же журнал взял откуда-то эти цифры?!

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[28]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 24.06.05 21:30
Оценка:
Здравствуйте, faulx, Вы писали:

F>PVS использовался для верификации IEEE 854 floating point specification. Для подробного знакомства нужно посмотреть сайт или почитать хотя бы первю главу вот этого учебника: http://www.csl.sri.com/papers/wift-tutorial/


Спасибо за ссылку!
Мне кажется, что роль формальных методов в создании надежного ПО сейчас недооценивается.
Хорошо, что не всеми.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[31]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 24.06.05 21:34
Оценка: 15 (2)
Здравствуйте, eao197, Вы писали:

E>Попробуем разобраться с твоими вопросами по частям.


AVC>>В основном, я вижу опасность в неявном применении переопределенных операторов.

AVC>>Я уже приводил на форумах примеры "неадекватного" поведения Си++ в подобных случаях.
AVC>>C++ действительно сложен.
AVC>>Вопрос в том, насколько необходима, а насколько излишня такая сложность.

E>Эти вопросы оказались для меня более тяжелыми, чем я предполагал вначале. Дать объективный ответ сложно, поскольку я являюсь ортодоксальным фанатом C++.


Тем более я ценю твою попытку посмотреть на проблему объективно.
Даже если твои выводы не совпадут с моими.
Из-за некоторой ограниченности во времени отвечать буду тоже по частям.

E>>>С этим сложно спорить. Но широкоизвестные космические катастрофы, связанные с ошибками ПО, никак с этим не были связаны. Про Ариан мы уже долго говорим. Был еще старый случай с фортраном и запятой вместо десятичной точки (хотя этот пример и может попасть в данную категорию, если только все это было на самом деле). А ведь еще был случай с Mars Explorer (или как его там), когда разные модули вычисляли значения в разных системах счисления.


AVC>>Да, был такой случай в 1999 году.

AVC>>С Фортраном тоже был случай. Кажется, это было в нашем (еще советском) проекте в начале 1970-х.
AVC>>Я не понимаю, почему ты полагаешь, что широкоизвестные катастрофы никак не связаны с надежностью языка.
AVC>>Смотри сам.
AVC>>В случае с циклом FOR в Фортране, просто очевидно, что большая доля вины — на языке.

E>Возможно, но где-то в форумах было показано, что досадные ляпы можно допускать практически везде. И даже подсветка синтаксиса в интеллектуальных редакторах не спасает.


Согласен, что ошибки можно совершать везде.
Но некоторые языки (не будем тыкать пальцем ), кажется, и не думают им препятствовать, что несомненно увеличивает число ошибок.
Справедливости ради, должен признать, что и надежные языки таят в себе подводные камни.
После того, как мы начали обсуждать катастрофу Ариана-5, я обратил внимание на пример из электронной книги Вирта "Программирование на Обероне".
PROCEDURE sum(VAR x: ARRAY OF REAL): REAL;
  VAR i: INTEGER; s: REAL;
BEGIN s := 0.0;
  FOR i := 0 TO LEN(x)-1 DO s := x[i] + s END ;
  RETURN s
END sum

На невнимательный взгляд, этот маленький кусок кода не внушает опасений.
Но я только что обдумывал то, что случилось с Арианом-5.
Там переполнилось 16-битное знаковое целое.
В данном случае INTEGER — именно 16-битное знаковое целое, а вот LEN(x) — 32-битное знаковое целое.
По моим представлениям об Обероне компилятор не должен был пропустить такую конструкцию. (Я могу обосновать это, со ссылками на определение языка.)
Но, раз такой пример закрался даже в книгу Вирта (если это не опечатка), я решил проверить доступные мне компиляторы Оберона на "вшивость".
Компиляторы ETH Oberon и BlackBox (в последнем другая разрядность INTEGER и LONGINT, так что я модифицировал исходный код, выбрав тип i: SHORTINT) показали себя "молодцами" и гневно отвергли ошибочный код.
Но вот компилятор XDS счел его корректным.
Для завершения эксперимента осталось только создать массив размерности, превышающей вместимость типа INTEGER
VAR a: ARRAY MAX(INTEGER)+2 OF REAL;

и передать его в качестве параметра процедуре-функции sum.
Как и следовало ожидать, это привело к ошибке времени выполнения.
Т.е. в каком-то смысле повторилась ситуация с Арианом.
Я провел небольшое исследование, откуда мог попасть в компилятор XDS (очень хороший компилятор!) этот баг, но не хочу отвелекаться от темы форума.
Когда я сообщил в XDS о вероятном баге, они не стали "отпираться" и баг признали.
Вот такая история.
Кто-то может сказать: вот видите, надежный язык не помогает.
Я так не думаю. Просто "и на старуху бывает проруха", и надо быть бдительным.
Как говорил Козьма Прутков: "Бди!"

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[27]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 25.06.05 07:53
Оценка: +1
Здравствуйте, AVC, Вы писали:

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


AL>>>Явное и неявное приведение типов, исключения, синтаксический сахар и прочие механизмы, удачные и не очень, -- детский лепет по сравнению с реальными проблемами, возникающими при создании систем управления вроде той, что летает на арианах.


E>>Все это так. Но согласитесь, что даже если весь синтаксический сахар какого-тот конкретного языка способен оказать влияние хотя бы на 5% ошибок, то в системах класса Ариан-5 это достаточно высокий показатель для того, чтобы им пренебрегать. И, поскольку изначально тема касалась сложности C++ и ошибок, которые в программы привносятся именно из-за сложности C++, то, имхо, все эти рассуждения в тему.


AVC>http://www.osp.ru/os/1998/06/46.htm

AVC>

AVC>Язык С++ дает на 25% больше ошибок, чем традиционные Си или Паскаль, а исправление ошибок в ОО программах на С++ требует в 2-3 раза больше времени. Наследование порождает в 6 раз больше ошибок.

AVC>Конечно, будет справедливо, если ты в свою очередь спросишь, кто и как установил сей факт.
AVC>Буду честен — не знаю. Так что на цифрах не настаиваю.
AVC>Но все же журнал взял откуда-то эти цифры?!

Честно говоря, я очень скептически отношусть к сравнениям языков между собой по подобным критериям. Ведь что значит сравнить количество ошибок в реализации на C++ или на Паскале? Как минимум, это означает, что нужно взять одну и туже задачу и реализовать ее на двух языках. И вот тут хочется остановиться на двух моментах:

1. Я никогда не видел, чтобы реальную коммерческую или производственную задачу сделали сначала на одном языке, а затем в точно такой же постановке реализовали на другом языке. Ну просто никогда не видел. Обычно систему выпускают и эксплуатируют, сопровождая по дороге. И только когда оказывается проще все заново переписать, тогда могут сделать новую реализацию на другом языке. Но ведь тогда создается совершенно новый продукт, причем базируясь на опыте предыдущей системы.

2. Не понимаю, как сравнивать качество кода, написанного разными командами, разными людьми с разной квалификацией? А если задачу реализует один человек, то как можно оценивать, насколько хорошо он знает оба языка?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[34]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 25.06.05 08:53
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Леонид Филатов. "Сказка о Федоте — стрельце, удалом молодце"


Точно! Спасибо, Павел!
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[27]: Что толку в Ада если Ариан 5 все равно упал
От: FR  
Дата: 25.06.05 08:57
Оценка:
Здравствуйте, AVC, Вы писали:


AVC>Никоим образом не желая возобновить флейм на "лингвистические темы", все же не удержусь и подкину "информацию к размышлению".

AVC>В том же номере "Открытых систем", откуда взята русскоязычная статья о падении Ариана-5, приводятся следующие сведения. (Кстати, весь этот номер был посвящен теме надежности ПО.)
AVC>http://www.osp.ru/os/1998/06/46.htm
AVC>

AVC>Язык С++ дает на 25% больше ошибок, чем традиционные Си или Паскаль, а исправление ошибок в ОО программах на С++ требует в 2-3 раза больше времени. Наследование порождает в 6 раз больше ошибок.

AVC>Конечно, будет справедливо, если ты в свою очередь спросишь, кто и как установил сей факт.
AVC>Буду честен — не знаю. Так что на цифрах не настаиваю.
AVC>Но все же журнал взял откуда-то эти цифры?!

Бред редкостный, судя по дате публикации и стилю, цифры взяты из буржуйских источников эпохи тотального перхода с процедурных языков на C++.
Re[30]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 25.06.05 20:52
Оценка:
Здравствуйте, AVC

E>>Сейчас на наших глазах происходит интересное явление: острая конкуренция в языках программирования. С одной стороны, огромные финансовые вливания в Java и C#, с другой стороны -- Perl, Python, Ruby, PHP, да и старичек C++ сдаваться не собирается. Почему языки, лишенные мощной финансовой поддержки (т.к. Perl, Python, Ruby) успешно конкурируют с монстрами Java/C#? Имхо потому, что эти языки создавались для решения конкретных проблем. И развивались для решения других конкретных проблем. И выжили благодоря тому, что хорошо эти проблемы решали. Т.е. это реальные инструменты для реальных задач. Аналогично и с C++. Его необъятность и сложность проистекают из того, что он хорошо решает реальные задачи (было бы наоборот, его бы уже не было). Вот, например, я привел одну такую задачу, которую с помошью generic-ов Java и C# просто так не решить: А generic-и так могут?
Автор: eao197
Дата: 30.05.05


AVC>Спасибо за действительно интересный пример!

AVC>Постараюсь его обдумать.
AVC>Для стимулирования воображения, хотелось бы (если можно) увидеть маленький кусочек клиентского кода.
AVC>Т.е. я все примерно представляю, но в последнее время я мало доверяю своим "беглым мыслям". Стар стал, воображение уже не то...

Алексей, я вот попробовал более простыми словами описать чего хотел: Re: А generic-и: попытка упростить описание
Автор: eao197
Дата: 25.06.05
и Sinclair привел два возможных решения этой проблемы в C#: Re[2]: А generic-и: попытка упростить описание
Автор: Sinclair
Дата: 25.06.05
и Re[4]: А generic-и: попытка упростить описание
Автор: Sinclair
Дата: 25.06.05
.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[5]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.06.05 01:39
Оценка: +1
Здравствуйте, eao197, Вы писали:

E>То, что ПО для Ариан-а было написано не на C++, сильно смягчило потерю полумиллиарда долларов

E>Сразу стало легче на душе.

Да, потому что следующие пол миллиарда терять уже не прийдется. Ведь ошибка была найдена. А при проходе по памяти после взрыва сказать что-либо разумное уже не удалось бы.

VD>>Да, да. А опасные возмоности С++ не применяй. А для чего их сделали?


E>Для возможности выжать максимум производительности.


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

E>Таки нет.


Позволь не поверить. Тут вообще лучше спрашивать ваших пользователей. А то вот в МС тоже говорят, что их Ворд очень надежен. А у меня он вылетает трофейный мессер.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 26.06.05 06:49
Оценка:
Здравствуйте, VladD2, Вы писали:

E>>Таки нет.


VD>Позволь не поверить. Тут вообще лучше спрашивать ваших пользователей. А то вот в МС тоже говорят, что их Ворд очень надежен. А у меня он вылетает трофейный мессер.


Не веришь, проверь: http://eao197.narod.ru/objessty/oess.1.4.0-b2.tar.bz2, если делать больше нечего.
Я свой код ни от кого не скрываю.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[31]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 26.06.05 13:10
Оценка: 27 (1)
Здравствуйте, eao197, Вы писали:

AVC>>C++ действительно сложен.

AVC>>Вопрос в том, насколько необходима, а насколько излишня такая сложность.

E>Эти вопросы оказались для меня более тяжелыми, чем я предполагал вначале. Дать объективный ответ сложно, поскольку я являюсь ортодоксальным фанатом C++. Так уж получилось, что несколько языков я изучил в университете, а затем особо ничего не изучал, т.к. мне хватало C++. Ситуация частично изменялась всего два раза: в 2001 году, когда я сменил место работы и попрограммировал на Java и в 2004-м году, когда я выбирал язык для реализации своего очередного велосипеда (тогда я серьезно рассмотрел Perl, Python и Ruby, на котором и остановился). Года до 2001-го я думал, что хорошо знаю C++, но затем я узнал про boost и время от времени заглядываю в его реализацию, что бы в очередной раз убедиться, что сейчас C++ -- это совсем не то, что было еще десять лет назад. Сложнее и мощнее.


Причем ты делаешь акцент на мощности, а я — на сложности.
Давай, я приму твой довод о мощности Си++, и посмотрим, что из этого получится.
Я думаю, что сложность Си++ во многом вытекает из попыток решения реальных проблем программирования при сохранении старого фундамента.
В силу уже одного этого фактора язык становится сложнее. (Причем "сложнее" — не то слово.)
Казалось бы, такой сложный (и, конечно, мощный тоже) язык теперь предназначается все меньшему числу "истинных профессионалов", так как остальные программиисты ("похуже" ) неизбежно будут путаться и совершать множество ошибок, как "грубых", так и "тонких".
Т.е. Си++ должен был бы позиционироваться как "язык для немногих".
Ведь вряд ли ты ожидаешь увидеть рекламу вроде: "В широкую продажу поступила новая партия машин класса Формула-1, еще более мощных и опасных."
Но вот из "поразившей" тебя цитаты Страуструпа следует, что он гордится безудержным ростом числа Си++программистов (а ведь кому захочется признать себя "лохом", не способным породить высококачественный код на Си++ ). Он пишет, что еще не было года, чтобы в "его полку не прибыло".
Ответственная ли это позиция, учитывая, что подавляющее большинство новоявленных Си++программистов напишет ужасный код?

E>Собственно, такое длинное вступление я делаю для того, чтобы поделиться своим субъективным мнением. Язык C++ слишком сложен для того, чтобы применяться в большой команде (может быть даже в условиях т.н. промышленной разработки). Подобными выводами я уже делился вот здесь: Re[44]: Почему нельзя преподавать C#
Автор: eao197
Дата: 07.04.05
.


E>Если провести аналогию, то C++ -- это топор в руках плотника. Известны случаи, когда плотники достигали такого совершенства во владении топором, что могли им бриться (сам видел по телевизору). Равно как известны случаи, когда один-два мастера возводили здания без единого гвоздя и эти здания стояли столетия. Т.е., в моем понимании, C++ -- это сложный, но черезвычайно мощный инструмент, который позволяет за приемлимое время, в условиях органиченных ресурсов, получать отличные результаты. Но платить за это приходится высокой (а иногда и высочайшей) квалификацией и способностями разработчика. Когда над C++ проектом работают два/три продвинутых C++ программиста, они создают очень качественный и надежный код. Но! Стоит этот коллектив каким-то образом разладить, скажем ввести в него парочку менее квалифицированных товарищей, как вся стройность и красота C++ кода превращается в страшилки, которыми регулярно пугают программистов.


Хочу привести пример в подкрепление твоей точки зрения.
Есть у меня один знакомый Си++программист высочайшего уровня.
(Я даже назову его имя, так как страна должна знать своих героев: Иван Жиганов.)
В одиночку он сопровождает огромный код, обслуживающий целую отрасль нашего города.
Но работать в команде он практически неспособен. (Потому и делает все сам.)
Его код труден для понимания, настолько там все закручено на ООП.
Как он поясняет свои мысли, я уже рассказывал.
Добавим сюда, что программирование для него — образ жизни, а не "просто работа".
Вот таким я и вижу настоящего Си++программиста.
Образ притягивающий и отталкивающий одновременно.
Наподобие Стрикленда, главного героя романа Сомерсета Моэма "Луна и грош".

E>Поэтому я думаю, что если в условиях ограниченных ресурсов нужно что-то сделать, и испольнитель отлично владеет C++, то лучше C++ сложно что-то придумать (хотя я не знаток диаметрально противоположных языков, т.к. Smalltalk или Lisp). И еще одно важнейшее условие: команда должна быть небольшой и очень слаженной. Собственно, такое определение можно отнести к любому языку, но для C++ важно то, что C++ имеет очень высокую стоимость вхождения. Гораздо более высокую, чем паскале-подобные языки или Java/C# (хотя последние демонстрируют тенденцию к усложнению). К сожалению, подобные команды складываются не часто. И, к еще большему сожалению, они распадаются под влиянием различных внешних факторов. А стоимость потери ключевого разработчика в C++ проекте, имхо, все же выше, чем в Java. Во многом из-за того, что одну и туже идею на C++ можно реализовать гораздо большим количеством способов, чем на Java. И когда кто-то уходит, то его way теряется безвозвратно.


E>Опять же к этому можно добавить кучу проблем, которая появилась в C++ из-за совместимости с C. Это и отсутствие проверок при выходе за пределы массива. И возможность приведения типов (как явных, так и неявных). И пятое, и десятое.


BTW, сильно сомневаюсь в искренности аргумента Страуструпа о "совместимости" Си++ и Си (тема legacy code).
Если даже я, грешный, весьма свободно сочетаю в своей работе несколько языков (в том числе Си++ и Оберон).
Ведь, как правило, "сменные части" наших систем мы выносим в DLL, которые могут быть написаны на разных языках.

E>В общем, нелицеприятная картина для С++ получается. Особенно в области критически важных систем. И я вынужден с ней согласиться.

E>Более того, вспоминая свой короткий опыт работы над военным софтом могу сказать, что там не было никаких сверхзадач, для которых потребовалась бы мощь C++ (шаблонов, RAII, макросов). Отличные задачи для реализации на Pascal-е. Хотя, если бы команду уменьшили бы раза в два, то единственным языком, на котором ее можно было бы вовремя решить, имхо, был бы C++. Как раз за счет макросов и шаблонов, которые позволяют писать меньше кода.

E>>>С этим сложно спорить. Но широкоизвестные космические катастрофы, связанные с ошибками ПО, никак с этим не были связаны. Про Ариан мы уже долго говорим. Был еще старый случай с фортраном и запятой вместо десятичной точки (хотя этот пример и может попасть в данную категорию, если только все это было на самом деле). А ведь еще был случай с Mars Explorer (или как его там), когда разные модули вычисляли значения в разных системах счисления.


AVC>>Да, был такой случай в 1999 году.

AVC>>С Фортраном тоже был случай. Кажется, это было в нашем (еще советском) проекте в начале 1970-х.
AVC>>Я не понимаю, почему ты полагаешь, что широкоизвестные катастрофы никак не связаны с надежностью языка.
AVC>>Смотри сам.
AVC>>В случае с циклом FOR в Фортране, просто очевидно, что большая доля вины — на языке.

E>Возможно, но где-то в форумах было показано, что досадные ляпы можно допускать практически везде. И даже подсветка синтаксиса в интеллектуальных редакторах не спасает.


AVC>>В случае с Арианом, из-за недостаточности ресурсов целочисленную переменную не защитили от переполнения, что привело к отключению компьютера. Обращаю внимание, что игнорирование переполнения могло привести к еще худшим последствиям. В области безопасности программа должна быть корректна на 100%. 99% недостаточно!


E>+1

E>Но как в этом удостовериться?
E>Так что это была именно проектная проблема, а не проблема языка.

Вместе с тем, это проектное решение, наверное, нашло выражение в конкретной строке кода.
Т.к. это была Ада, подозреваю, что строка выглядела примерно так:
pragma SUPPRESS(OUT_OF_BOUNDS);

(Интересно, владеет ли кто-нибудь информацией об этом злополучном фрагменте исходного кода Ариана-5?)
Хоар много раз выступал против подобной практики удаления защитного кода после отладки.

AVC>>В случае с потерей орбиты Марса, если бы вычисления, связанные с разными единицами измерения, относились к разным типам, то ошибку, скорее всего, удалось бы предотвратить, т.к. потребовалось бы явное приведение типов.

AVC>>Т.е. напротив, трудно назвать случай не связанный с языком (или нарушением его правил)!

E>Вот чего я в этой аварии не понимаю, так это то, что данную ошибку не смогли обнаружить во время тестовых прогонов на Земле! Такое чувство, что разные модули вообще не сопрягали в тестовом режиме! Имхо, здесь проблема была в организации тестирования (хотя мне легко об этом говорить).


Меня это тоже удивляет.
Вероятно, прав Трурль: во многом причина в беспечности, связанной с "кодреюзом" (это код многократно тестировался и использовался до того, blah-blah-blah, зачем его тестировать заново?).

E>Кроме того, я не очень понимаю твою фразу по поводу разных типов. Ведь оперировали-то одним понятием: дистация. Может быть даже тип ввели такой distance . Только одни вычисляли дистанцию в футах, а другие -- в метрах .


Наверное, ты прав: я здесь "умен задним числом".
Но хотя бы на будущее...

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[32]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 26.06.05 13:42
Оценка: 12 (1) :)
Здравствуйте, AVC

Алексей, если так пойдет и дальше, то мы не столько спорить, сколько поддакивать друг другу будем

AVC>Причем ты делаешь акцент на мощности, а я — на сложности.


В C++ это почти одно и то же

AVC>Давай, я приму твой довод о мощности Си++, и посмотрим, что из этого получится.

AVC>Я думаю, что сложность Си++ во многом вытекает из попыток решения реальных проблем программирования при сохранении старого фундамента.
AVC>В силу уже одного этого фактора язык становится сложнее. (Причем "сложнее" — не то слово.)
AVC>Казалось бы, такой сложный (и, конечно, мощный тоже) язык теперь предназначается все меньшему числу "истинных профессионалов", так как остальные программиисты ("похуже" ) неизбежно будут путаться и совершать множество ошибок, как "грубых", так и "тонких".
AVC>Т.е. Си++ должен был бы позиционироваться как "язык для немногих".
AVC>Ведь вряд ли ты ожидаешь увидеть рекламу вроде: "В широкую продажу поступила новая партия машин класса Формула-1, еще более мощных и опасных."

+1
Пока я полностью со всем согласен.

AVC>Но вот из "поразившей" тебя цитаты Страуструпа следует, что он гордится безудержным ростом числа Си++программистов (а ведь кому захочется признать себя "лохом", не способным породить высококачественный код на Си++ ). Он пишет, что еще не было года, чтобы в "его полку не прибыло".


Я бы просто добавил здесь, что рост числа C++ программистов происходит на фоне еще большего роста числа Java/C#/Perl/Python/Ruby/PHP программистов. Т.е. Страуструп гордиться тем, что несмотря на широко рекламируемые панацеии от всех бед и все более и более безопасные языки, которые, вроде бы должны были собрать под свои знамена оставшихся C++ отщепенцев, прирост C++ программистов все равно происходит. Т.е. пока жизнь доказывает, что мощность C++ востребована даже не смотря на сложность.

AVC>Ответственная ли это позиция, учитывая, что подавляющее большинство новоявленных Си++программистов напишет ужасный код?


Я думаю, что объективности от Страуструпа ожидать тяжело. Ведь C++ -- это его детище, а какой родитель к своим детям объективно относится?

Что же касается плохого кода, который выдают начинающие C++ программисты, то это, во многом организационный вопрос. Нельзя давать новичку ответственные задачи и нельзя принимать от него код без строго code-review. Но ведь "не боги горшки обжигают"! Если нормально построить процесс обучения, то со временем и опытом они начнут писать нормальный код и контроль можно будет постепенно ослаблять.

Я вот у себя на работе занимаюсь тремя студентами-практикантами. Началось все с факультативных лекций о C++, о наших инструментах. Сейчас они подключены на поддержку некоторых наших внутренних библиотек. Не скажу, что результаты поразительные, но прогресс виден. Ребята вполне вменяемые и нормально осваиваются. Глядишь через год-полтора, после окончания ВУЗа будут вполне пристойно программировать. И их можно будет без особой опаски привлекать к реальным коммерческим проектам. По крайней мере я на это надеюсь.

Гораздо хуже бывает обучать C++ уже опытных программистов, приходящих с других технологий. Вот здесь действительно проблемы.

E>>Собственно, такое длинное вступление я делаю для того, чтобы поделиться своим субъективным мнением. Язык C++ слишком сложен для того, чтобы применяться в большой команде (может быть даже в условиях т.н. промышленной разработки). Подобными выводами я уже делился вот здесь: Re[44]: Почему нельзя преподавать C#
Автор: eao197
Дата: 07.04.05
.


AVC>Хочу привести пример в подкрепление твоей точки зрения.

AVC>Есть у меня один знакомый Си++программист высочайшего уровня.
AVC>(Я даже назову его имя, так как страна должна знать своих героев: Иван Жиганов.)
AVC>В одиночку он сопровождает огромный код, обслуживающий целую отрасль нашего города.
AVC>Но работать в команде он практически неспособен. (Потому и делает все сам.)

Почти как я

AVC>Его код труден для понимания, настолько там все закручено на ООП.


Да, такое бывает. И я такими вещами грешу. Хотя практика показывает, что наиболее удачный и долгоживущий код -- это самый простой код (хотя на разном уровне квалификации под простотой понимаешь разные вещи).

AVC>Добавим сюда, что программирование для него — образ жизни, а не "просто работа".

AVC>Вот таким я и вижу настоящего Си++программиста.
AVC>Образ притягивающий и отталкивающий одновременно.

Опять про меня

Наверное, это объективно так и есть. Вероятно в C++ постоянно находится какая-то неизведанная область, в которую, если есть к этому призвание, всегда хочется заглянуть. Поэтому замшелых C++ программистов так тяжело в другую веру перетянуть. Я сам попробовал на Java поработать. Удобно, просто и скучно пока решаешь типовые задачи для которых готовые framework-и есть. Не удобно, сложно, еще более скучно, если требуется сделать что-то нестандартное. Иное дело C++. Вот придет в голову такая идея: Re: Aka Tuple
Автор: Alexey Chen
Дата: 25.06.05
и ура! День (неделя, месяц) прошел не зря!
На эту тему здесь хорошая статья была: С++ulture
Автор: Зверёк Харьковский
Дата: 11.06.04
.
Если попробовать сделать кратенькое резюме этому абзацу, то C++ для тех, у кого шило в заднице.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[33]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 26.06.05 23:10
Оценка: 1 (1) +1 :))
Здравствуйте, eao197, Вы писали:

E>Алексей, если так пойдет и дальше, то мы не столько спорить, сколько поддакивать друг другу будем


Дожили...
Надо исправлять положение.

AVC>>Ответственная ли это позиция, учитывая, что подавляющее большинство новоявленных Си++программистов напишет ужасный код?


E>Я думаю, что объективности от Страуструпа ожидать тяжело. Ведь C++ -- это его детище, а какой родитель к своим детям объективно относится?


Трудно сказать, я никогда не был на месте других родителей.
Мне просто повезло с детьми.

По ассоциации вспомнил капрала Шовинэ. Всем известно страшное слово "шовинизм"; но, кажется, доблестный капрал сказал примерно следующее:

"Не могу понять этих бесконечных споров, какая нация храбрее. Солдаты всех армий примерно одинаковы; за исключением, разве что, французов, которые в этом отношении и правда несколько превосходят всех прочих."



E>Что же касается плохого кода, который выдают начинающие C++ программисты, то это, во многом организационный вопрос. Нельзя давать новичку ответственные задачи и нельзя принимать от него код без строго code-review. Но ведь "не боги горшки обжигают"! Если нормально построить процесс обучения, то со временем и опытом они начнут писать нормальный код и контроль можно будет постепенно ослаблять.


E>Я вот у себя на работе занимаюсь тремя студентами-практикантами. Началось все с факультативных лекций о C++, о наших инструментах. Сейчас они подключены на поддержку некоторых наших внутренних библиотек. Не скажу, что результаты поразительные, но прогресс виден. Ребята вполне вменяемые и нормально осваиваются. Глядишь через год-полтора, после окончания ВУЗа будут вполне пристойно программировать. И их можно будет без особой опаски привлекать к реальным коммерческим проектам. По крайней мере я на это надеюсь.


BTW, это интересная тема (хотя уже и не моя ): как передавать в разумные сроки практический навык программирования на Си++?
Возможно, это позволило бы несколько уменьшить ущерб цивилизации от Си++.

E>Гораздо хуже бывает обучать C++ уже опытных программистов, приходящих с других технологий. Вот здесь действительно проблемы.


Наверное, приходится многое менять в их конструкции: пересаживать руки из заднего места, исправлять ошибки в ДНК?

E>Наверное, это объективно так и есть. Вероятно в C++ постоянно находится какая-то неизведанная область, в которую, если есть к этому призвание, всегда хочется заглянуть. Поэтому замшелых C++ программистов так тяжело в другую веру перетянуть. Я сам попробовал на Java поработать. Удобно, просто и скучно пока решаешь типовые задачи для которых готовые framework-и есть. Не удобно, сложно, еще более скучно, если требуется сделать что-то нестандартное. Иное дело C++. Вот придет в голову такая идея: Re: Aka Tuple
Автор: Alexey Chen
Дата: 25.06.05
и ура! День (неделя, месяц) прошел не зря!


Понимаю.
Собственно, на предыдущей работе я "прославился" жизнерадостным воплем в 9 вечера: "День пропал не зря!"
(Этой оговоркой я всегда тихо гордился. )
Но все же страсть к минимализму не позволяет моей душе принять Си++.

E>На эту тему здесь хорошая статья была: С++ulture
Автор: Зверёк Харьковский
Дата: 11.06.04
.


Помню. Когда я ссылался на нее в одном из своих особо критических постов о Си++, перепутал автора.
Было неудобно. Извинялся потом перед обоими оклеветанными мной программистами: автором и тем, кому я это авторство приписал.

E>Если попробовать сделать кратенькое резюме этому абзацу, то C++ для тех, у кого шило в заднице.


Вспоминая уже названного мной программиста И.Ж.: выражение наивысшего торжества я видел у него, когда в книге, которую внимательно прочитали несколько человек (увы, я в том числе ; это был "Христос" Морозова, издания еще 20-х годов) он нашел неразрезанные страницы.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[32]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 27.06.05 06:34
Оценка: +1 :))) :)
Здравствуйте, AVC, Вы писали:

AVC>Меня это тоже удивляет.

AVC>Вероятно, прав Трурль: во многом причина в беспечности, связанной с "кодреюзом" (это код многократно тестировался и использовался до того, blah-blah-blah, зачем его тестировать заново?).

И что интересно, даже самый захудалый 1С-программист в самой завалящей конторе не станет использовать позапрошлогодний модуль расчета налогов.
Re[31]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 27.06.05 06:52
Оценка:
Здравствуйте, eao197, Вы писали:

E>Вот чего я в этой аварии не понимаю, так это то, что данную ошибку не смогли обнаружить во время тестовых прогонов на Земле! Такое чувство, что разные модули вообще не сопрягали в тестовом режиме! Имхо, здесь проблема была в организации тестирования (хотя мне легко об этом говорить).


Во-первых, что там говроили классики о возможностях тестирования?
Во-вторых, для того только чтобы иметь возможность проводить более-менее адекватные тестовые прогоны, необходимо смоделировать объективную реальность. Возможно, слетать на Марс дешевле.
Re[21]: Что толку в Ада если Ариан 5 все равно упал
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 27.06.05 07:36
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>В Обероне что, совсем НЕТ кастов? Тогда его как язык можно в утиль

C>отправить.

Component Pascal:
MODULE Test;

  IMPORT StdLog;

  PROCEDURE Do*;
    VAR i16: SHORTINT; i64: LONGINT;
  BEGIN
    i64 := 1000000000000001L;

    i16 := SHORT(SHORT(i64));  (* Вот так кастуются от LONGINT к SHORTINT *)

    StdLog.Int(i64); StdLog.Ln;
    StdLog.Int(i16); StdLog.Ln
  END Do;

END Test.

Получим:
i64 = 1152921504606846977
i16 = 1

INTEGER = SHORT(LONGINT)
SHORTINT = SHORT(INTEGER)
BYTE = SHORT(SHORTINT)

BYTE -> SHORTINT -> INTEGER -> LONGINT

(* В Oberon 2 типы чуток подругому называются, там HUGEINT — 64, LONGINT — 32, INTEGER — 16, SHORTINT — 8 битов *)
Re[19]: Что толку в Ада если Ариан 5 все равно упал
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 27.06.05 07:45
Оценка:
Здравствуйте, Владик, Вы писали:

В>Что ты будешь делать на Обероне, если при преобразовании длинного целого в короткое возникнет ошибка?


Какая ошибка?
Re[21]: Esmertec
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 27.06.05 10:35
Оценка:
Здравствуйте, Cyberax, Вы писали:

>> При этом, в отличие от Java и C#, это эффективный язык, на котором

>> пишут операционные системы.

C>На Яве тоже пишут операционные системы (причем распространенные больше,

C>чем BlueBottle).

Если вдруг Вы случайно под операционками на Java имели в виду ОС реального времени для встраиваемых систем от Esmertec, то как раз эти самые операционки написаны на обероне-компонентном паскале. С самого сайта информация об этом убрана, но в web.archive.org ее отыскать можно: http://web.archive.org/web/19970227054908/www.oberon.ch/denia/index.html
(не удивляйтесь что сайт oberon microsystems-кий, ведь esmertec ее дочерняя компания). Для BlackBox есть много компонентов от Esmertec для этой "операционки на Java":

Java Owner: Esmertec, Inc.
Purpose: commercial
Info: www.esmertec.com/
Code: www.esmertec.com/
Source: not available
Requires: target hardware with the Jbed operating system
Provides: Library components of Jbed's Java library. They are needed on the target hardware when running Java code on Jbed, in addition to the Jbed modules.


--------------------------------------------------------------------------------

Javae Owner: Esmertec, Inc.
Purpose: commercial
Info: www.esmertec.com/
Code: www.esmertec.com/
Source: not available
Requires: Windows, BlackBox
Provides: Tool and glue components for turning BlackBox into a Java cross-development environment. Glue to a Java byte-code compiler. Only needed for cross-developing Jbed applications.


--------------------------------------------------------------------------------

Jbed Owner: Esmertec, Inc.
Purpose: commercial
Info: www.esmertec.com/
Code: www.esmertec.com/
Source: not available
Requires: target hardware with the Jbed operating system
Provides: OS components that implement the Jbed real-time operating system. They are needed on the target hardware that runs Jbed.


--------------------------------------------------------------------------------

Jbede Owner: Esmertec, Inc.
Purpose: commercial
Info: www.esmertec.com/
Code: www.esmertec.com/
Source: not available
Requires: Windows, BlackBox
Provides: Tool components for turning BlackBox into a (Component Pascal and Java) cross-development environment. Only needed for cross-developing Jbed applications.


--------------------------------------------------------------------------------

JComm Owner: Esmertec, Inc.
Purpose: commercial
Info: www.esmertec.com/
Code: www.esmertec.com/
Source: not available
Requires: Windows, BlackBox
Provides: Glue components for the communication between Windows PCs and Jbed systems. Only needed for developing or communicating with Jbed applications.

Что же касается Java, то это не ОСь на Java, а приложения для этих операционок можно писать на Java. Опять же совершенно случайно, в Esmertec работает Питер Мюллер создатель BlueBottle, о которой Вы сами упомянули.

Ежели Вы говоря о так называемых операционках на Java имели в виду вовсе не компанию Esmertec, то было бы интересно узнать, а что тогда?
Re[22]: Esmertec
От: Cyberax Марс  
Дата: 27.06.05 11:01
Оценка:
Сергей Губанов wrote:

> Если вдруг Вы случайно под операционками на Java имели в виду ОС

> реального времени для встраиваемых систем от Esmertec
> <http://www.esmertec.ch/&gt;, то как раз эти самые операционки написаны
> на обероне-компонентном паскале.

Вообще, две лидирующие (QNX и VxWorks) hard realtime OS написапы на С.
На остальные ОСки приходится всего несколько процентов рынка.

> Ежели Вы говоря о так называемых операционках на Java имели в виду

> вовсе не компанию Esmertec, то было бы интересно узнать, а что тогда?

http://www.newmonics.com/
http://www.nsicom.com/
http://pr.fujitsu.com/en/news/2000/04/5.html

Всего Java OS около двух десятков. Hard-realtime штук 5 наберется.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: Sergey J. A. Беларусь  
Дата: 27.06.05 11:15
Оценка:
Здравствуйте, AVC, Вы писали:

AVC>У них есть достаточно интересный продукт BlackBox.

AVC>Я сначала его не оценил, а сейчас использую в работе.

Можно поинтересоватся, как ? А то я его тож не оценил, и пока не вижу ни одного применения .
Вот интересно, может я чего-то упустил....
Я — свихнувшееся сознание Джо.
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: Владик Россия  
Дата: 27.06.05 14:26
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

В>>Что ты будешь делать на Обероне, если при преобразовании длинного целого в короткое возникнет ошибка?

СГ>Какая ошибка?

Ошибка невозможности представления преобразовываемого значения в виде короткого целого.
Как все запущенно...
Re[34]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 27.06.05 14:36
Оценка: 1 (1)
Здравствуйте, AVC, Вы писали:

E>>Я вот у себя на работе занимаюсь тремя студентами-практикантами. Началось все с факультативных лекций о C++, о наших инструментах. Сейчас они подключены на поддержку некоторых наших внутренних библиотек. Не скажу, что результаты поразительные, но прогресс виден. Ребята вполне вменяемые и нормально осваиваются. Глядишь через год-полтора, после окончания ВУЗа будут вполне пристойно программировать. И их можно будет без особой опаски привлекать к реальным коммерческим проектам. По крайней мере я на это надеюсь.


AVC>BTW, это интересная тема (хотя уже и не моя ): как передавать в разумные сроки практический навык программирования на Си++?

AVC>Возможно, это позволило бы несколько уменьшить ущерб цивилизации от Си++.

А ведь это действительно серьезная тема. Причем, когда речь идет о C++, то все как бы понимают, что язык сложный и нормального уровня программирования достичь сложно. Хотя сложность C++ именно в языке. Но в других языках, например, Java, с которой мне самому довелось столкнуться, ситуация-то такая же. Только там сложность не в языке, а в огромном количестве framework-ом и постоянно плодящихся стандартов. Но из-за того, что сам по себе язык Java проще, кажется, что обучить нормального Java программиста проще. Имхо, это не так.

E>>Гораздо хуже бывает обучать C++ уже опытных программистов, приходящих с других технологий. Вот здесь действительно проблемы.


AVC>Наверное, приходится многое менять в их конструкции: пересаживать руки из заднего места, исправлять ошибки в ДНК?


Нет. Но проблема, имхо, действительно существует.
Во-первых, человек имеет опыт и ему трудно привыкнуть думать по-другому и решать теже задачи, но по другому. В результате, если смены сознания не происходит, человек начинает писать на C++ как на своем предыдущем языке. Что и приводит к проблемам. Например, люди, приходящие с Java ожидают, что у вектора можно узнать его размерность. Или возвращают объекты по значению. Или не думают об операторах копирования для классов с указателями. Или забывают оборачивать указатели в std::auto_ptr или другие умные указатели. Или не используют шаблонов, предпочитая им макросы для генерации кода. И т.д. и т.п. И хорошо, если человек отдает себе отчет, что в C++ можно сильно облегчить себе жизнь, если к таким нюансам привыкнуть. Но бывает, что вместо изучения C++ производится постоянное сравнение C++ с хорошо знакомыми альтернативами. Не в пользу C++ естественно.
Во-вторых, когда на работу приходит опытный программист, но без знания C++, то возникают вопросы по его нагрузке. Вроде бы и нужно ему задачу реальную дать, но и на уровень его мастерства оглядываться приходится. И тут еще вопросы оплаты могут встать (если он не выдает такого же качества код, как его колеги)...

Так что я видел случаи, когда C++ программисты успешно переходили на Java. А вот обратно -- ни разу.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 27.06.05 15:31
Оценка: :)
Здравствуйте, prVovik, Вы писали:

MN>>А вот что-то не умирает он и до сих пор носится по двору без башки... Или даже я сказал бы так — одну отрубили, а 2 выросло...

V>Ага, осталось только определиться с разрядностью счетчика голов

long long, однако.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[27]: Что толку в Ада если Ариан 5 все равно упал
От: Gaperton http://gaperton.livejournal.com
Дата: 27.06.05 18:36
Оценка: 24 (2) +1
Здравствуйте, AVC, Вы писали:

AVC>Здравствуйте, А почему вы спрашиваете, Вы писали:


АПВ>>Как правильно обрабатывать сбои: когда проигнорировать и продолжить как будто ничего не случилось, когда упасть с предсметрным воплем, а когда поправить положение и повторить операцию — вот интересная проблема и тема для дискуссии. А на каком языке писать, чтобы избежать переполнения, — нет.


AVC>Я думаю, что Вы правильно сформулировали один из главных вопросов, на которые хотелось бы найти ответ.

AVC>Что делать с ошибками и сбоями (раз уж они случились)?
AVC>Как выстроить вторую (третью, четвертую, пятую) линию обороны в mission-critical системах?

АПВС привел вам диссертацию Армстронга. В ней идет речь о разработке надежного ПО в условиях присутствия программных и аппаратных ошибок. Если вы интересуетесь ответами на эти вопросы — то диссертация must read сама по себе, и к тому же имеет набор библиографических ссылок в конце.

AVC>Конечно, я не согласен с Вами насчет роли языка. Я уверен, что язык имеет значение, как один из факторов, влияющих на надежность системы. Я думаю, что type-safe язык является хотя и недостаточным, но все же необходимым требованием для создания надежных систем большой сложности.

AVC>Но на эту тему было уже много как дискуссий, так и откровенного флейма.

Диссертация особенно интересна тем, что Джо Армстронг не теоретик, а инженер, благодаря которому создан программно-аппаратный комплекс высокой сложности (Ericsson AXD 301 softswitch) с фактическим процентом отказов девять девяток. В нем были ошибки? Да, безусловно. Кроме всего прочего, в нем ядро написано на динамически типизированном языке. Более того, этот язык специально разработан для написания отказоустойчивых систем, и имеет динамическую типизацию не случайно, а вполне намеренно. Хотите знать как такое возможно? Читайте диссертацию.

AVC>Поэтому я думаю, что обсудить Ваш вопрос будет сейчас гораздо полезнее, чем спорить на тему языка.


AVC>Все же тема языка должна навести нас и на другую тему: предотвращение ошибок.

Все достаточно просто.

Ошибку нельзя предотвратить. Количество вносимых ошибок постоянно на сотню строк кода и почти не зависит от используемого языка. Далее, на разных стадиях разработки некий процент ошибок вылавливается. Цена исправления ошибки в среднем пропорциональна времени с ее внесения до обнаружения/исправления. Т. е. чем раньше находится ошибка, тем меньше ее цена.

Языки типа Ады разработаны с целью максимально увеличить процент ошибок, выловленных на этапе компиляции. Языки вроде Erlang, который, в противовес Аде, динамически типизирован, разработаны с целью облегчить написание отказоустойчивых систем в условиях присутствия любого рода (в т.ч. и аппаратных) ошибок.

При этом, раннему вылавливанию ошибок также способствуют:
1) методы формальных спецификаций.
2) юнит-тесты, автоматическое тестирование, и инструменты измерения покрытия тестами.
3) Ручное тестирование.
4) Процедуры review и самые разнообразные процессы, ориентированные на качество. Команда Бурана приманяла, например, в числе прочих, такой процесс: отдельная группа восстанавливала по ассемблерному коду фортрановский. Другая группа сличала его с оригиналом, ищя различия. Зачем? Они в результате нашли 2 ошибки в компиляторе фортрана, из-за которых Буран должен был упасть. Ордена дали за эти ошибки.

Надо понимать, что каждая из подобных процедур позволяет отлавливать только некоторый достаточно стабильный процент дефектов от имеющихся в системе до применения процедуры. Поэтому ошибки все равно попадут в систему, и тут уже вам поможет диссертация Армстронга.
Re[28]: Что толку в Ада если Ариан 5 все равно упал
От: А почему вы спрашиваете Беларусь  
Дата: 27.06.05 19:11
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Диссертация особенно интересна тем, что Джо Армстронг не теоретик, а инженер, благодаря которому создан программно-аппаратный комплекс высокой сложности (Ericsson AXD 301 softswitch) с фактическим процентом отказов девять девяток. В нем были ошибки? Да, безусловно. Кроме всего прочего, в нем ядро написано на динамически типизированном языке. Более того, этот язык специально разработан для написания отказоустойчивых систем, и имеет динамическую типизацию не случайно, а вполне намеренно. Хотите знать как такое возможно? Читайте диссертацию.


Пара замечаний:
1) AXD 301 — не софтсвитч. Это мультисервисный коммутатор: TDM, Frame Relay, ATM, IP/MPLS.
2) Насчет девяти девяток есть определенные сомнения. См. стр. 203 упомянутой диссертации. Другие материалы говорят о пяти девятках, что тоже очень неплохой результат.
Re[29]: Что толку в Ада если Ариан 5 все равно упал
От: Gaperton http://gaperton.livejournal.com
Дата: 27.06.05 19:30
Оценка:
Здравствуйте, А почему вы спрашиваете, Вы писали:

АПВ>Здравствуйте, Gaperton, Вы писали:


G>>Диссертация особенно интересна тем, что Джо Армстронг не теоретик, а инженер, благодаря которому создан программно-аппаратный комплекс высокой сложности (Ericsson AXD 301 softswitch) с фактическим процентом отказов девять девяток. В нем были ошибки? Да, безусловно. Кроме всего прочего, в нем ядро написано на динамически типизированном языке. Более того, этот язык специально разработан для написания отказоустойчивых систем, и имеет динамическую типизацию не случайно, а вполне намеренно. Хотите знать как такое возможно? Читайте диссертацию.


АПВ>Пара замечаний:

АПВ>1) AXD 301 — не софтсвитч. Это мультисервисный коммутатор: TDM, Frame Relay, ATM, IP/MPLS.
Ну, это тебе как CCIE видней .

АПВ>2) Насчет девяти девяток есть определенные сомнения. См. стр. 203 упомянутой диссертации. Другие материалы говорят о пяти девятках, что тоже очень неплохой результат.

пять девяток (что означает, кстати, 99.999%) — это требование из requirement spec к AXD 301. Потом они замерили фактическое время отказов и оно оказалось сильно меньше требуемого, т.е. на момент написания диссертации — девять девяток, о чем и написано в диссертации на странице 203. Девять их потому, что я считаю первые две девятки до запятой — так принято.

С этими процентами, кстати, не все так просто. While everyone in telecom has been using the term "five-nines" for decades, I'm willing to bet that few actually know what 99.999 percent really means
Re[30]: Что толку в Ада если Ариан 5 все равно упал
От: А почему вы спрашиваете Беларусь  
Дата: 27.06.05 19:44
Оценка:
Здравствуйте, Gaperton, Вы писали:

АПВ>>2) Насчет девяти девяток есть определенные сомнения. См. стр. 203 упомянутой диссертации. Другие материалы говорят о пяти девятках, что тоже очень неплохой результат.

G>пять девяток (что означает, кстати, 99.999%) — это требование из requirement spec к AXD 301. Потом они замерили фактическое время отказов и оно оказалось сильно меньше требуемого, т.е. на момент написания диссертации — девять девяток, о чем и написано в диссертации на странице 203. Девять их потому, что я считаю первые две девятки до запятой — так принято.

Ну конечно же, сколько девяток есть, столько и надо считать.

Ты прочти внимательней, что там написано.

For the Ericsson AXD301 the only information on the long-term stability of the system came from a power-point presentation showing some figures claiming that a major customer had run an 11 node system with a 99.9999999% reliability, though how these figure had been obtained was not documented.


Эти девять девяток намеряли на одной системе, что совсем неинтересно.

G>С этими процентами, кстати, не все так просто. While everyone in telecom has been using the term "five-nines" for decades, I'm willing to bet that few actually know what 99.999 percent really means


Спасибо, я в курсе . Это правда, бОльшая часть разговоров про девятки — маркетинговый булшыт, что еще более подрывает доверие к словам "девять девяток". Если б ты себе представлял, насколько это умопомрачительно дофига — девять девяток.
Re[31]: Что толку в Ада если Ариан 5 все равно упал
От: Gaperton http://gaperton.livejournal.com
Дата: 27.06.05 20:01
Оценка:
Здравствуйте, А почему вы спрашиваете, Вы писали:

АПВ>Ты прочти внимательней, что там написано.

АПВ>

АПВ>For the Ericsson AXD301 the only information on the long-term stability of the system came from a power-point presentation showing some figures claiming that a major customer had run an 11 node system with a 99.9999999% reliability, though how these figure had been obtained was not documented.


АПВ>Эти девять девяток намеряли на одной системе, что совсем неинтересно.

Ну, в общем, ты прав. Это совсем не средняя цифра, я на это внимания не обратил — приводил по памяти. Цифру я вспомнил отсюда.

G>>С этими процентами, кстати, не все так просто. While everyone in telecom has been using the term "five-nines" for decades, I'm willing to bet that few actually know what 99.999 percent really means


АПВ>Спасибо, я в курсе .

Дык мне слабо верится в то, что ты не в курсе . Я эту ссылку в основном дал для тех, кто будет читать нашу ветку. Штоб вопросы снять.

АПВ>Это правда, бОльшая часть разговоров про девятки — маркетинговый булшыт, что еще более подрывает доверие к словам "девять девяток". Если б ты себе представлял, насколько это умопомрачительно дофига — девять девяток.

Ну, вот Армстронг говорит, что это "31 ms. year!" Я представляю себе, что это такое.

Раз это действительно дофига, то в чем проблема . Их сложно добиться в программном комплексе такого объема? Да, это практически невозможно. Это имеет отношение к качеству софта? Да, прямое. Ну так что? Пусть там не 32 ms а например секунда — по мне так все равно хорошо.
Re[24]: Что толку в Ада если Ариан 5 все равно упал
От: Gaperton http://gaperton.livejournal.com
Дата: 27.06.05 21:10
Оценка: 9 (1)
Здравствуйте, AVC, Вы писали:

AVC>Здравствуйте, Трурль, Вы писали:


AVC>>>Из отчета, ссылку на который дал Cyberax (за что ему отдельное спасибо, хотя не помню, чтобы мы хоть раз совпали во мнениях ), очевидно, что первопричина — в недостаточности вычислительных ресурсов. Соответствующую цитату из отчета я уже приводил.


Т>>Нет, первопричина — в пресловутом кодреюзе.


AVC>Наверное, Вы имеете в виду, что код во многом унаследован от Ариана-4 (если не раньше)?

AVC>Вырисовывается такая картина: код во многом остался прежним, а вот траектория полета изменилась.
AVC>Можно подумать, что в этом и есть причина катастрофы.
AVC>Но мне так не кажется.
AVC>Если бы код, унаследованный от Ариана-4, был действительно корректным, то и с Арианом-5 беды бы не случилось.

AVC>Возможно, мое мнение покажется Вам спорным.

AVC>Все упирается в понятие ошибки; вопрос почти философский.
Ошибка — это несоответствие требованиям. Требования могут быть выражены конструктивно в виде набора тестов (т.е. она в некотором смысле существует даже тогда, когда вы о ней не думаете), на котором тестируется система, а могут быть представлены и декларативной спецификацией. Спецификация может быть неполна, а набор тестов — не покрывать все возможные варианты исполнения (а для неразделяемого кода все и не нужны). Собственно, все.

Язык вас практически не спасет. Объясняю почему. С требованиями часто происходит такая засада — поведение в граничных ситуациях не покрывается спецификацией, и в коде происходит неявная закладка на фактическое поведение в такой ситуации. Т. е. нечто подразумевается "само собой очевидным", и на это закрываются глаза. И это в принципе нормально для неразделяемого кода.

Далее, как только код становится разделяемым (используется повторно), вылезают два вида грабель. Во-первых, если в него внести изменения или дополнения, может запросто отвалиться старый код. Во-вторых, может не получится написать новый из-за того, что требуемый сценарий взаимодействия не оттестирован в старой системе, так как никогда в ней не возникал.

Чтобы с этим бороться, необходимо
1) Тщательно специфицировать интерфейсы, предназначеные для повторного использования, регламентируя поведение для всего диапазона возможных параметров. Полуформальной спецификации достаточно. Пред/пост — условия и инварианты из спецификаций вбиваются прямо в код в виде ассертов.
2) Составлять unit-test на основе анализа спецификации (есть правила, как это делать), покрывающий все классы сценариев использования.
3) Применять автоматическое регрессионное тестирование — само собой разумеется.

Это слишком дорого, чтобы делать так для каждой функции/класса. Так что в реальной жизни ищут компромисс — выполняют приведенные процедуры для более-менее крупных и наиболее критичных модулей. И все будет хокей — но только для модулей, которые планируется в будущем повторно использовать.
Re[30]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 27.06.05 21:46
Оценка: 88 (9)
Здравствуйте, AVC, Вы писали:

AVC>Си++ расчитан на "старую" модель монолитной (stand-alone) программы.

AVC>Отсюда — трудности с компонентным программированием, чрезмерные навороты с COM и т.д.
AVC>Грубо говоря, Си++ — доживший до наших времен динозавр.
AVC>У динозавров несомненно были свои преимущества и особые эволюционные приспособления.
AVC>Но они вымерли. Все, кроме Си++.

Все, что здесь перечислено является следствием некоторых других факторов, о которых речь пойдет ниже. Но не о расчете C++ на какую-то модель или о невозможность "гладкой" реализации компонентности в C++. Я продолжаю оставаться на той позиции, что C++ -- это универсальный язык, на котором можно сказать все что угодно. Ведь ни английский язык, ни русский, еще сто лет назад не были предназначены для описания компонентной модели программного обеспечения. И ничего, справляется. Так же и с C++.

AVC>Другой подход, более "современный" (конечно, все относительно) был реализован в Обероне еще в середине 1980-х.

AVC>Там вообще нет монолитных программ. (Разумеется, вне обероновской среды компиляторы предоставляют возможность создания и обычных exe-шек.)
AVC>Процесс инициируется не загрузкой программы, а вызовом команды (экспортируемой модулем процедуры).
AVC>Модули подгружаются автоматически, если они указаны в списке импорта загружаемого модуля (и не были загружены раньше).
AVC>При этом компонентное программирование получается просто само собой — и совершенно бесплатно. Просто пишешь свой модуль, и ни о чем плохом не думаешь.
AVC>Нет нужды читать умные книги, с названиями вроде "Сущность технологии COM". (Книга неплохая, но даже в ней написано, что COM возник из-за неспособности Си++ поддержать компонентное программирование напрямую. Т.е. на одну кучу избыточной сложности уже громоздится другая.)
AVC>Компонентная модель потребовала дополнительной безопасности типов (поэтому в Обероне, если не указывать в списке импорта SYSTEM, с переменной можно обращаться только в соответствии с его типом) и централизованной сборки мусора, что, кстати, является дополнительным удобством для программиста.
AVC>Через десяток лет возникла Java, через полтора — С# и .NET. Основные идеи были заимствованы из Оберона. Как принято в мире языков с Си-подобным синтаксисом — неявно .

Вероятно, начать можно с того, что компонентная модель и интроперабильность начали появляться и применяться еще до того, как были придуманы хитрые технологии типа COM, Corba, XPCOM, SOM, DCOP и платформы .Net, главной целью которой является интероперабильность. Простые примеры:

Unix pipes и, как следствие, unix way (один компонент делает только одну вещь, но делает ее хорошо). Сложный результат получается путем перенаправления выхода одной программы на вход другой программе. Например:
grep "some_event" 200506??.log | grep -v "fail" | wc -l

Берем суточные логи за июнь, выбираем оттуда все записи о каком-то событии, удаляем оттуда записи о неудачных событиях и подсчитываем результат. Вполне нормальное объединение нескольких компонентов

Средства коммуникаций: e-mail, ftp, http. Интероперабильность в чистом виде. Где-то, на другом краю Земли, на неизвестно какой платформе крутится web-сервер, написанный на непонятно каком языке. Но я получаю от него html-странички и смотрю их на Wintel платформе в написанном на C++ браузере.

Но аппетит приходит во время еды. Хочется большего. Хочется встроить чужой браузер в свой контейнер. Или подключить в своего почтового клиента PGP модуль для шифрования своей почты. Или еще чего. А фактически, встроить чужой код в свою программу. Но вот проблема: безболезненно можно сделать это только, если и свой и чужой код построены на общем базисе: общем соглашении о вызовах и базовых библиотеках. И здесь Java показывает поразительный результат, т.к. она без проблем позволяет объединять произвольный Java-код. Дейсвительно, а что здесь сложного, если везде один и тот же байт-код и один и тот же JRE? (Похожая картина и с .Net с его IL, CRL и всем прочим).

Принято думать, что в C++ это недостижимо. Но ведь это не так. Прежде всего, из-за чего такое мнение возникло? Да из-за того, что C++ компиляторов всегда было больше, чем Java или C# компиляторов вместе взятых. Но никогда не было общего формата объектных или библиотечных файлов (можно ли винить в этом C++?). Так же, как никогда и не было общих стандартных библиотек. Особенно на x86 архитектуре. Вот и получилось, что связать вместе dll-ку, скомпилированную Borland-ом, exe-шник, скомпилированный Visual-ом, ой как не просто. Более того, нужно много поизвращаться, чтобы передать C++ объект из DLL в exe-шник или наоборот. А отчего нужно было объединять чужой exe-шник с чьей-то dll-кой. А оттого, что исходников-то их нет, нужно пробовать объединить то, что есть.

Но что, если отказаться от использования зоопарка языков и компиляторов? А взять всего один C++ компилятор. И компилировать все одним компилятором с одинаковыми настройками (release, multithreading shared rtl)? Можно ли тогда получать в C++ компонентность?

Да. И без особых проблем. И тому есть примеры.

Вот на Linux-ах и *BSD есть только GNU C++. И есть KDE, в котором есть такая интересная штука, как KParts. Позволяет делать тоже, что и OLE/COM под Windows. Но на нормальном C++.

Или вот агентная технология в разработке которой я сам принимал участие. На обычном C++ описываются классы агентов, затем добавляется специальное описание агентов для run-time и все. Нужно только запрограммировать взаимодействие агентов путем отсылки/приема сообщений. Причем так можно прозрачно распределенные приложения строить (что мы и делаем). И, что важно, агенты знают только имена друг друга и типы сообщений. Но не знают реальных типов друг-друга. Что позволят заменять одного агента другим.
Все реальные комплексы у нас представляют из себя небольшой exe-загрузчик, который использует маленький framework для подгрузки dll с агентами и динамической регистрацией агентов по специальному скрипту (я чуть-чуть говорил об этом здесь: Re[46]: Почему нельзя преподавать C#
Автор: eao197
Дата: 09.04.05
). В результате приложение строится из dll с агентами как из кирпичиков.

А удалось достичь этого благодоря тому, что инструмент был расчитан только на C++ и на то, что все компоненты будут создаваться с использованием именно этого инструмента (как я понимаю, в Обероне и Зононе точно такая же ситуация). Конечно, наша технология не позволит создать инструменты типа Януса, Ворда или Konquerer-а. Но вот построить несколько черных ящиков, обрабатывающих какие-то события и обменивающихся данными между собой -- легко. А все остальное можно с помощью KParts в KDE сделать (Linux forever! )


Собственно резюмируюя хочу сказать, что успех Java (как и .Net) в области интероперабельности связан с тем, что Java не платформенно-независимый язык, а платформа. А в рамках единой платформы можно делать все, что угодно. C++ -- это действительно платформенно-независимый язык. Он не зависит ни от .Net, ни от Windows, ни от Unix. Но его пытаются притянуть на чуждые ему платформы (имеется в виду OLE/COM/.Net), потому и результат получается такой, как получается. Но вот если платформу сделать родной для C++ (как в KDE или в нашей агентной технологии), то компонентность на C++ вполне достижима. Однако такая компонентность будет являться вещью в себе (как Java со своими Java-технологиями сейчас), а это, вероятно, в настоящий момент не слишком востребованно

PS.

Алексей мне будет очень интересно узнать твое мнение о нашем SObjectizer. Если найдешь время, глянь краем глаза, пожалуйста (равно как и другие читатели, если таковые доберутся до этого постсриптума) -- я буду признателен любому мнению.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[35]: Что толку в Ада если Ариан 5 все равно упал
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.06.05 22:11
Оценка: 52 (5) +2
Здравствуйте, eao197, Вы писали:

E>А ведь это действительно серьезная тема. Причем, когда речь идет о C++, то все как бы понимают, что язык сложный и нормального уровня программирования достичь сложно. Хотя сложность C++ именно в языке. Но в других языках, например, Java, с которой мне самому довелось столкнуться, ситуация-то такая же. Только там сложность не в языке, а в огромном количестве framework-ом и постоянно плодящихся стандартов. Но из-за того, что сам по себе язык Java проще, кажется, что обучить нормального Java программиста проще. Имхо, это не так.


Имхо, джава все же проще.
1. в него пвстроено значительно меньше концепций: нет множественного наследования, перегрузки операторов, шаблонов.
2. Сборка мусора дает не только отсутствие оператора delete, но и избавляет от всяческих smart_ptr, auto_ptr, и прочих средств управления памятью, которые замусоривают код.
В итоге, научить читать джава-программы можно очень-очень быстро. Да, уменьшение выразительности приводит к увеличению объема кодирования в сложных и интересных случаях. Зато меньше шансов не понять код. А ведь мудрые люди говорят: код гораздо чаще читается, чем пишется.
3. Фреймворки — это да. А вот насчет стандартов ты совершенно прав! Причем стандарты эти придумывают не самые тупые люди, и придумывают их с дивной оперативностью. Для плюсов пока что (за столько-то лет!) стандартизовали STL. Теперь вот, по слухам, скоро boost застандартизуют. Обалдеть. Каков должен быть интерфейс XML-парсера? Как выводить графику? Чем пользоваться для работы с сетью? Нет ответа. Тишина. Гуглим, читаем, качаем, ставим, выбрасываем. А в джаве что? Есть задача. Я вот не могу сходу изобрести задачу, для которой нет стандарта и референс реализации!
Что это означает?
— все API подчиняются более-менее одному стилю. Большинство конвенций кочует из одного API в другой, снижая время на освоение
— все API стандартизуются централизованно. Есть авторитативный центр, который может дать четкий ответ на вопрос "какие стандарты действуют в этой области".
— поэтому можно просто пойти туда, скачать доку, и начать разработку
— можно тестироваться и даже запуститься на бесплатной reference implementation
— когда не хватит reference implementation, можно выбрать из двух-трех взаимозаменяемых производителей.

Это опять же резко снижает стоимость разработчиков, которые владеют. Потому как магии нет.
E>Так что я видел случаи, когда C++ программисты успешно переходили на Java. А вот обратно -- ни разу.
Точно. Очень уж тяжело приходится. Вот, говорят, в Канаде так же — вроде тебе и березки, и водка есть... А все — не Россия!
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[31]: Что толку в Ада если Ариан 5 все равно упал
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.06.05 22:11
Оценка: 1 (1)
Здравствуйте, eao197, Вы писали:

E>Но что, если отказаться от использования зоопарка языков и компиляторов? А взять всего один C++ компилятор. И компилировать все одним компилятором с одинаковыми настройками (release, multithreading shared rtl)? Можно ли тогда получать в C++ компонентность?


E>Да. И без особых проблем. И тому есть примеры.

Угу. Особенно удачными получаются примеры сращивания, к примеру, библиотек, построенных на борландовых AnsiString c MFCшными CString. От тут то лепота просто преть.
Самое приятное, что эти заразы до сих пор с std::string дела иметь не хотят. Так бы хоть способ был кошерный трансформации строк...
К чему это я? Да к тому, что вот у Java все в порядке именно благодаря во-первых широкому охвату базовой библиотеки (сразу при выходе Java разработчику почти не оставалось места под велосипедостроительство) а во-вторых благодаря динамичной стандартизации. Поэтому можно писать EJB приложение не особо беспокоямь, что за сервер будет его хостить. Можно писать сайт на JSP, а уж потом выбирать между Resin и Tomcat. Если я пищу JDBC драйвер, то у меня есть спецификация. Есть ли невиндовый стандарт доступа к данным в плюсах?

E>А удалось достичь этого благодоря тому, что инструмент был расчитан только на C++ и на то, что все компоненты будут создаваться с использованием именно этого инструмента (как я понимаю, в Обероне и Зононе точно такая же ситуация). Конечно, наша технология не позволит создать инструменты типа Януса, Ворда или Konquerer-а. Но вот построить несколько черных ящиков, обрабатывающих какие-то события и обменивающихся данными между собой -- легко. А все остальное можно с помощью KParts в KDE сделать (Linux forever! )

E>)
Сам по себе язык — гол. Даже если затачиваться не только на язык, но и на конкретный компилятор. Надо еще и с логарифмической линейкой в руках следить за используемыми библиотеками.
E>Собственно резюмируюя хочу сказать, что успех Java (как и .Net) в области интероперабельности связан с тем, что Java не платформенно-независимый язык, а платформа.
Точно. Кстати, у дотнета пока что есть огромный шанс облажаться. Потому как пока что-то не видно инициатив МС по стандартизации типовых решений. То есть опять мы имеем триста разных подходов к проектированию форм, а стало быть огребем себе и нестандартных почт, и много чего еще... Дотнет пока что спасается благодаря наличию толстого API, доступного через интероп. Потому нет особого риска нарваться на два независимых интерфейса к 3d, к примеру. Все едино это будет ДиреетХэ, как ты его ни оберни...
E>А в рамках единой платформы можно делать все, что угодно. C++ -- это действительно платформенно-независимый язык. Он не зависит ни от .Net, ни от Windows, ни от Unix. Но его пытаются притянуть на чуждые ему платформы (имеется в виду OLE/COM/.Net), потому и результат получается такой, как получается. Но вот если платформу сделать родной для C++ (как в KDE или в нашей агентной технологии), то компонентность на C++ вполне достижима. Однако такая компонентность будет являться вещью в себе (как Java со своими Java-технологиями сейчас), а это, вероятно, в настоящий момент не слишком востребованно
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[36]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 28.06.05 05:44
Оценка:
Здравствуйте, Sinclair

Согласен почти со всем написанным за исключением, разве что:

S>- поэтому можно просто пойти туда, скачать доку, и начать разработку


То все не так просто, то ли я был туповат, то ли не в ту команду попал, но именно освоение непомерного множества разных стандаров и их имплементаций, а так же переход с одного устаревшего стандарта на другой, более новый, а затем на следующий, еще более новый, как раз разработку и не ускоряли, и не упрощали, и не делали ее более качественной и надежной.
Сам такое видел. Может быть это и единичный случай, но осадок остался.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[37]: Что толку в Ада если Ариан 5 все равно упал
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.06.05 06:39
Оценка:
Здравствуйте, eao197, Вы писали:

E>То все не так просто, то ли я был туповат, то ли не в ту команду попал, но именно освоение непомерного множества разных стандаров и их имплементаций, а так же переход с одного устаревшего стандарта на другой, более новый, а затем на следующий, еще более новый, как раз разработку и не ускоряли, и не упрощали, и не делали ее более качественной и надежной.

E>Сам такое видел. Может быть это и единичный случай, но осадок остался.
Конечно. Просто в Java удельный вес языка гораздо ниже. Смысл — именно в том, что мы после недельного тренинга получаем человека, способного читать на Java. Учить человека читать на плюсах нужно как минимум полгода, и то он будет периодически вставать в паузу при виде кода гуру.
После того, как программер научился читать, его можно постепенно учить писать. Вот для этого уже нужны библиотеки, и стандартизованность и наличие доки здесь только плюс.
Да, типовой интернет-проект имеет дело с 5-10 стандартами. И совсем новичку сначала довольно тяжело. Однако уже следующий интернет-проект ему делать легче.

Не думаю, что освоение множества имплементаций, не основанных ни на каких стандартах, и их увязывание между собой, сэкономило бы вашей команде время. Переход на новую версию стандарта — дело добровольное.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[21]: Что толку в Ада если Ариан 5 все равно упал
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 28.06.05 06:54
Оценка:
Здравствуйте, Владик, Вы писали:

В>>>Что ты будешь делать на Обероне, если при преобразовании длинного целого в короткое возникнет ошибка?


СГ>>Какая ошибка?


В>Ошибка невозможности представления преобразовываемого значения в виде короткого целого.


Так ведь, при преобразовании, например, от 64 к 16 битному представлению берутся младшие (или старшие, в зависимости от архитектуры процессора) 16 битов из 64 и просто копируются. Все дела. То что исходное число могло быть больше или меньше ни кого уже не волнует:

http://www.rsdn.ru/Forum/Message.aspx?mid=1241852&amp;only=1
Автор: Сергей Губанов
Дата: 27.06.05


Проверить вхождение числа в диапазон допустимых значений — дело программиста
IF (MIN(SHORTINT) <= i64) & (i64 <= MAX(SHORTINT)) THEN
  i16 := SHORT(SHORT(i64))
ELSE
  делай что хочешь...
END
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: Кодт Россия  
Дата: 28.06.05 08:40
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Так ведь, при преобразовании, например, от 64 к 16 битному представлению берутся младшие (или старшие, в зависимости от архитектуры процессора) 16 битов из 64 и просто копируются. Все дела. То что исходное число могло быть больше или меньше ни кого уже не волнует:


СГ>http://www.rsdn.ru/Forum/Message.aspx?mid=1241852&amp;only=1
Автор: Сергей Губанов
Дата: 27.06.05


СГ>Проверить вхождение числа в диапазон допустимых значений — дело программиста

СГ>
СГ>IF (MIN(SHORTINT) <= i64) & (i64 <= MAX(SHORTINT)) THEN
СГ>  i16 := SHORT(SHORT(i64))
СГ>ELSE
СГ>  делай что хочешь...
СГ>END
СГ>


Так ведь лень-матушка допрежь нас родилась. Если такое преобразование нужно сделать более чем в одном месте, то, максимум что напишут,
TYPE
  WHAT_TO_DO_IF_OUT_OF_RANGE =
  ( alert,    (* кинуть исключение *)
    rollover, (* перекрутить по модулю - т.е., в данном случае, срезать старшие биты *)
    limit,    (* прижать к границе *)
    garbage   (* вернуть что попало *)
    default   (* выполнить стандартное преобразование и будь что будет *)
  );

PROCEDURE i64to16(x: LONGINT, hint: WHAT_TO_DO_IF_OUT_OF_RANGE): SHORTINT
BEGIN
  IF (x & ~0xFFFF) # 0 THEN
    (* анализируем hint *)
    CASE hint OF
      alert: THROW(OutOfRange) |
      rollover: x := (x & $FFFF) |
      limit: IF x<0 THEN x := MIN(SHORTINT) ELSE x := MAX(SHORTINT) |
      garbage: x := 0 |
      default: x := x
    END
  END;
  RETURN SHORT(SHORT(x))
END

И то, можно предположить, что параметр hint будут использовать случайным образом (стратегия Garbage In, Garbage Out, — если x заведомо в пределах, то нечего и беспокоиться).

А в минимальном случае (и с прицелом в сторону производительности — чтобы не вызывать лишний раз функцию, да ещё с доп.параметром) — будут писать по месту:
z := SHORT(SHORT(x)) + SHORT(SHORT(y)); (* N.B. не забыть где-нибудь сделать ловлю исключения *)

Собственно, ариановцы примерно это и сделали.
Перекуём баги на фичи!
Re[36]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 28.06.05 08:44
Оценка: :)
Здравствуйте, Sinclair, Вы писали:

S>- все API стандартизуются централизованно. Есть авторитативный центр, который может дать четкий ответ на вопрос "какие стандарты действуют в этой области".


Может это от молодости технологии и пока еще небольшой ниши применения?
Вот, кстати, что сейчас является стандартом на GUI в Java: awt, Swing или SWT?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 28.06.05 09:03
Оценка: +2
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Так ведь, при преобразовании, например, от 64 к 16 битному представлению берутся младшие (или старшие, в зависимости от архитектуры процессора) 16 битов из 64 и просто копируются. Все дела. То что исходное число могло быть больше или меньше ни кого уже не волнует:


А ведь ничего хорошего в этом нет.
Re[32]: Что толку в Ада если Ариан 5 все равно упал
От: FR  
Дата: 28.06.05 09:17
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>Точно. Кстати, у дотнета пока что есть огромный шанс облажаться. Потому как пока что-то не видно инициатив МС по стандартизации типовых решений. То есть опять мы имеем триста разных подходов к проектированию форм, а стало быть огребем себе и нестандартных почт, и много чего еще... Дотнет пока что спасается благодаря наличию толстого API, доступного через интероп. Потому нет особого риска нарваться на два независимых интерфейса к 3d, к примеру. Все едино это будет ДиреетХэ, как ты его ни оберни...


Насколько я знаю OpenGL в C# тоже доступен, и уже есть приложения на C# + OpenGL.
Вообще с 3D API и в С++ не большой выбор.
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: Владик Россия  
Дата: 28.06.05 10:42
Оценка: 1 (1) +1
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Так ведь, при преобразовании, например, от 64 к 16 битному представлению берутся младшие (или старшие, в зависимости от архитектуры процессора) 16 битов из 64 и просто копируются. Все дела. То что исходное число могло быть больше или меньше ни кого уже не волнует:


Мда... И после этого кто-то позиционирует этот язык как высокоуровневый и безопасный??? С "оверхедом" и так давно все ясно. Все, я окончательно разочаровался в его хоть какой-то практической ценности.

P.S. Присоединяюсь к просьбам показать решение реальных задач на обероне.
Как все запущенно...
Re[37]: Что толку в Ада если Ариан 5 все равно упал
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.06.05 11:58
Оценка:
Здравствуйте, eao197, Вы писали:
E>Вот, кстати, что сейчас является стандартом на GUI в Java: awt, Swing или SWT?
А меня-то что спрашивать? Я на джаве только читаю. В последний раз с ней имел дело в 2001.
Рекомендую обратить свое внимание на http://java.sun.com/
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[38]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 28.06.05 12:33
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

E>>Вот, кстати, что сейчас является стандартом на GUI в Java: awt, Swing или SWT?
S>А меня-то что спрашивать? Я на джаве только читаю. В последний раз с ней имел дело в 2001.
S>Рекомендую обратить свое внимание на http://java.sun.com/

А я к тому, что в Java со временем ситуация со стандартами будет не такая однозначная, как сейчас. Насколько мне известно, Swing (который как бы стандартный) проигрывает в популярности SWT (который из Eclipse). И вот если бы я был Java разработчиком, то в какую сторону мне нужно было бы смотреть?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[39]: Что толку в Ада если Ариан 5 все равно упал
От: Cyberax Марс  
Дата: 28.06.05 13:19
Оценка:
eao197 wrote:

> S>А меня-то что спрашивать? Я на джаве только читаю. В последний раз с

> ней имел дело в 2001.
> S>Рекомендую обратить свое внимание на http://java.sun.com/
> А я к тому, что в Java со временем ситуация со стандартами будет не
> такая однозначная, как сейчас. Насколько мне известно, Swing (который
> как бы стандартный) проигрывает в популярности SWT (который из
> Eclipse). И вот если бы я был Java разработчиком, то в какую сторону
> мне нужно было бы смотреть?

Без разницы, на самом деле. Те кому нравится SWING — пишут на нем, кому
нравится SWT — на SWT. Хотя SWING чуть лучше подходит для сложных GUI.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[40]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 28.06.05 13:33
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>eao197 wrote:


>> S>А меня-то что спрашивать? Я на джаве только читаю. В последний раз с

>> ней имел дело в 2001.
>> S>Рекомендую обратить свое внимание на http://java.sun.com/
>> А я к тому, что в Java со временем ситуация со стандартами будет не
>> такая однозначная, как сейчас. Насколько мне известно, Swing (который
>> как бы стандартный) проигрывает в популярности SWT (который из
>> Eclipse). И вот если бы я был Java разработчиком, то в какую сторону
>> мне нужно было бы смотреть?

C>Без разницы, на самом деле. Те кому нравится SWING — пишут на нем, кому

C>нравится SWT — на SWT. Хотя SWING чуть лучше подходит для сложных GUI.

Я вообще-то к тому, что сейчас в Java стараются все стандартизировать, чтобы затем были независимые реализации этих стандартов. Но, поскольку нельзя объять необъятного, то ситуация со стандартностью библиотек должна рано или позно ухудшиться. Вот не устраивает же людей стандартный Swing -- сделали нестандартную альтернативу SWT. Т.е. процесс пошел. Так же в свое время и C++ на части разорвали, когда вместо согласованных библиотек каждый делал что хотел. Ну да это совсем другая история...
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[41]: Что толку в Ада если Ариан 5 все равно упал
От: Cyberax Марс  
Дата: 28.06.05 13:53
Оценка:
eao197 wrote:

> C>Без разницы, на самом деле. Те кому нравится SWING — пишут на нем, кому

> C>нравится SWT — на SWT. Хотя SWING чуть лучше подходит для сложных GUI.
> Я вообще-то к тому, что сейчас в Java стараются все стандартизировать,
> чтобы затем были независимые реализации этих стандартов. Но, поскольку
> нельзя объять необъятного, то ситуация со стандартностью библиотек
> должна рано или позно ухудшиться. Вот не устраивает же людей
> стандартный Swing -- сделали нестандартную альтернативу SWT. Т.е.
> процесс пошел. Так же в свое время и C++ на части разорвали, когда
> вместо согласованных библиотек каждый делал что хотел. Ну да это
> совсем другая история...

У Java другая проблема — есть стандарты, но они достаточно ограниченные.
Вот каждый и делает свои нестандартные велосипеды.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[42]: Что толку в Ада если Ариан 5 все равно упал
От: Кодт Россия  
Дата: 28.06.05 14:42
Оценка: +1 :)
Здравствуйте, Cyberax, Вы писали:

C>У Java другая проблема — есть стандарты, но они достаточно ограниченные.

C>Вот каждый и делает свои нестандартные велосипеды.

Велосипедисты всюду пролезли! Как там говорилось в анекдоте — "спаси нацию, бей жидов и велосипедистов", видно товарищ был прозорлив.
Перекуём баги на фичи!
Re[43]: Что толку в Ада если Ариан 5 все равно упал
От: Cyberax Марс  
Дата: 28.06.05 15:22
Оценка: 1 (1) :)
Кодт wrote:

> C>У Java другая проблема — есть стандарты, но они достаточно

> ограниченные.
> C>Вот каждый и делает свои нестандартные велосипеды.
> Велосипедисты всюду пролезли!

А как же, они как и евреи — везде есть.

> Как там говорилось в анекдоте — "спаси нацию, бей жидов и

> велосипедистов", видно товарищ был прозорлив.

Ну про евреев — все понятно

А велосипедистов-то зачем? Они хорошие — из их велосипедов вырастают
мотоциклы, автомобили и Боинги-747.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[31]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 28.06.05 21:22
Оценка: 14 (2)
Здравствуйте, CrystaX, Вы писали:

AVC>>В случае с потерей орбиты Марса, если бы вычисления, связанные с разными единицами измерения, относились к разным типам, то ошибку, скорее всего, удалось бы предотвратить, т.к. потребовалось бы явное приведение типов.


CX>Кстати, я тут недавно приводил
Автор: CrystaX
Дата: 23.05.05
примерную реализацию на C++ систем единиц. Сам ею пользуюсь теперь. Что интересно, результат получился довольно приличный.

CX>1. Переменные, обозначающие разные физические понятия (такие как масса и длина, например), не приводятся друг к другу автоматически.
CX>2. В случае присвоения одной переменной значения другой (обозначающей то же понятие, но в другой системе единиц), происходит аквтоматический пересчет из одной системы в другую.

Очень интересный пример. Спасибо!
Вообще, в ходе данной дискуссии я познакомился с очень интересными фрагментами кода: Ваш пример; пример, который привел eao197 (тема: а generic-и так могут?), и ответ на это Sinclair.
Но, честно говоря, когда я "ляпнул" фразу о разных типах данных для разных единиц измерения, я имел в виду более простую вещь: не дать типам приводиться друг к другу произвольно. В переложении на Си++: завести на каждую единицу измерения класс и определить над этими классами набор операторов, позволяющих контролировать соответствующие преобразования.
Это была "беглая" мысль, которую я сразу "излил" на клавиатуру. И, возможно, зря. (Хотя я рад, что благодаря этому познакомился с Вашим кодом.)
Во-первых, eao197 правильно сказал, что, скорее всего, программисты, скорее, использовали такие понятия, как "дистанция", чем конкретно "метры" или "футы". Т.е. они и ввели бы тип "дистанция", а не "метры" и "футы". Но все же из этого можно извлечь урок на будущее.
Во-вторых, как раз Оберон в "классическом" своем варианте (правда, есть и другие разновидности Оберона) и не позволил бы ввести естественным образом такие типы, т.к. в нем нет перегрузки операторов. Поэтому пришлось бы использовать процедуры-функции.
Подробнее см. ниже.

CX>Что примечательно, работает это вообще без оверхеда в run-time. Посему вопрос — можно ли в Обероне, или в Ада, или в Модула-2 сделать подобное же? Если можно, то можно ли сделать это с нулевым run-time оверхедом? Если да, то останется ли использование этих переменных синтаксически таким же?

CX>Вопросы не флейма ради, а действительно интересно.

Здесь я отвечу только на вопрос об Обероне. (Думаю, что для Модулы-2 ответ будет близким. А вот насчет Ады — не уверен. По крайней мере, там есть перегрузка операторов.)
Действительно, в Си++ решение проблемы не должно создавать "оверхеда" в run-time. (Такова, собственно, была цель создателя языка.)
Создаем классы для единиц измерения, операторы (бинарные, а для перевода родственных единиц измерения из одной системы елиниц в другую — explicit конструкторы) преобразования их друг в друга. Благодаря тому, что операторы будут объявлены как inline, оверхеда не будет. Конечно, немного муторно, но чего не сделаешь ради благородной цели — предотвращения ошибок.
Ваш вопрос заключался в том, как это сделать на Обероне.
Например, реализация для ETH Oberon была бы схожей с реализацией на Си++ и, возможно, не приводила бы к "оверхеду".
(Возможно, потому что я не знаю точно, позволяет ли ETH Oberon встраивать процедуры, наподобие того, как это делает XDS.)
Вот как это могло бы выглядеть:
TYPE
  Meters*  = RECORD [NOTAG]
    x: REAL
  END;
  Feet*    = RECORD [NOTAG]
    x: REAL
  END;

  PROCEDURE "+" * (a, b: Meters): Meters;
    VAR c: Meters;
  BEGIN
    c.x := a.x + b.x;
    RETURN c;
  END "+";

  (* и далее - куча других операторов *)

Надо сказать, что ETH Oberon (в современном виде) позволяет многое из того, что не входит в "дубовые требования" (стандарт Оберона-2 de facto).
Например:
— перегрузка операторов (ради чего специально разрешен возврат структурных переменных);
— при импорте SYSTEM можно игнорировать возвращаемое значение функции (что прежде всего применяется
к возвращаемым значениям Windows API, котрые программист считает возможным игнорировать).
Как и большинство компиляторов Оберона, используемых в "чужеродной" среде, ETH Oberon позволяет создавать структурные типы без "тэга". В основном, чтобы взаимодействовать с кодом, написанным на Си и других языках.
"Тэг" обероновской записи отчасти похож на указатель на таблицу виртуальных функций в Си++. Но в одном дескрипторе обероновского типа содержится сразу три таблицы:
— присоединенных процедур (аналог виртуальных функций в Си++);
— базовых типов;
— указателей, входящих в состав записи (для поддержки работы сборщика мусора).
Обыкновенно, обероновская запись (аналог структуры или класса в Си++) имеет "тэг", что скрыто увеличивает размер экземплятра на 4 байта. (Примерно то же самое происходит с классом Си++, когда в нем "заводятся" виртуальные функции.)
Но, используя специальные модификаторы (NOTAG в ETH Oberon, untagged в BlackBox и т.д.), можно отказаться от этого "оверхеда".
Короче, решение в ETH Oberon сходно с Си++.
Но стандарт Оберона всего этого не поддерживает.
Поэтому большинство известных мне компиляторов Оберона не позволяет перегрузку операторов.
А это значит, что синтаксически решение на "стандартном" Обероне будет выглядеть иначе: придется использовать процедуры, а не инфиксные операторы.
Возможно, перегрузка операторов слишком изменила бы язык.
С этой точки зрения, показательна дискуссия вокруг поддержки в Обероне-2 типа COMPLEX (по просьбе представителя NASA), отраженная в материалах "дубовых требований".
Среди прочих названных Джозефом Темплом причин была следующая:

3.3.3.8 Structured function returns
A common misbelief is that introducing structured function returns would eliminate the
discussion about COMPLEX, because then one could define complex operations as functions.
It should be noted that this is only half the way since the mathematicians still want
to have infix notation which would require the introduction of a more general overloading
concept including infix operators. This in turn would break the idea of always qualifying
imported objects by the module name.

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

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[32]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 28.06.05 21:40
Оценка:
Здравствуйте, AVC, Вы писали:

AVC>Но, честно говоря, когда я "ляпнул" фразу о разных типах данных для разных единиц измерения, я имел в виду более простую вещь: не дать типам приводиться друг к другу произвольно. В переложении на Си++: завести на каждую единицу измерения класс и определить над этими классами набор операторов, позволяющих контролировать соответствующие преобразования.

AVC>Это была "беглая" мысль, которую я сразу "излил" на клавиатуру. И, возможно, зря. (Хотя я рад, что благодаря этому познакомился с Вашим кодом.)
AVC>Во-первых, eao197 правильно сказал, что, скорее всего, программисты, скорее, использовали такие понятия, как "дистанция", чем конкретно "метры" или "футы". Т.е. они и ввели бы тип "дистанция", а не "метры" и "футы". Но все же из этого можно извлечь урок на будущее.

Если Вы посмотрите в той же ветке чуть выше, Вы найдете там более упрощенную реализацию. Там нет систем единиц, а есть только разные физические понятия — длина, масса, время. К системам единиц я пришел, будучи подталкиваемым Кодтом.

AVC>Во-вторых, как раз Оберон в "классическом" своем варианте (правда, есть и другие разновидности Оберона) и не позволил бы ввести естественным образом такие типы, т.к. в нем нет перегрузки операторов. Поэтому пришлось бы использовать процедуры-функции.


Ок, понятно.

AVC>Проще говоря, назначение Оберона (поддержка компонентного программирования) отличается от назначения Си++ (поддержка ООП и обобщенного программирования в рамках отдельной программы, избегая ненужного "оверхеда" в run-time).

AVC>Программист, пишущий на Обероне, иногда испытывает некоторые трудности, реализуя то, что на Си++ выразить сравнительно легко.
AVC>Программист, пишущий на Си++, зачастую вообще не представляет, чего он лишен.

Допускаю. Но как-то в голову ничего не приходит. Если Вас не затруднит, не могли бы Вы привести примерный список возможностей? Как известно, язык не только расширяет, но и ограничивает мышление.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[31]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 28.06.05 23:44
Оценка:
Здравствуйте, eao197, Вы писали:

E>А удалось достичь этого благодоря тому, что инструмент был расчитан только на C++ и на то, что все компоненты будут создаваться с использованием именно этого инструмента (как я понимаю, в Обероне и Зононе точно такая же ситуация). Конечно, наша технология не позволит создать инструменты типа Януса, Ворда или Konquerer-а. Но вот построить несколько черных ящиков, обрабатывающих какие-то события и обменивающихся данными между собой -- легко. А все остальное можно с помощью KParts в KDE сделать (Linux forever! )

E>)

В отношении Оберона ты прав.
Собственно, это идея была использована Виртом еще при создании Lilith и основывалась тогда на Модула-2.

E>Алексей мне будет очень интересно узнать твое мнение о нашем SObjectizer. Если найдешь время, глянь краем глаза, пожалуйста (равно как и другие читатели, если таковые доберутся до этого постсриптума) -- я буду признателен любому мнению.


Евгений, я обязательно прочту. (Может быть, это потребует немного времени.)

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[31]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 29.06.05 01:25
Оценка: 1 (1)
Здравствуйте, eao197, Вы писали:

E>Алексей мне будет очень интересно узнать твое мнение о нашем SObjectizer. Если найдешь время, глянь краем глаза, пожалуйста (равно как и другие читатели, если таковые доберутся до этого постсриптума) -- я буду признателен любому мнению.


Пока только начал знакомиться с твоей книгой SObjectizer-4 Book.
Конечно, сначала — "наискосок".
Но тут нахлынули эмоции. ("Вспомнились годы ушедшие..." )
Знаешь, была в свое время интересная книжка Shlaer, Mellor "Object lifecycles: modeling the world in states".
У нас ее еще издавали под каким-то безликим названием, что-то вроде "Объектно-ориентированного анализа".
Я ее когда-то прочитал, а впоследствии это пригодилось.
Из нее я усвоил метод анализа с помощью моделей состояний (=конечных автоматов).
В одном из проектов это позволило нам избавиться от лишней аппаратуры и одновременно организовать корректную работу системного ретранслятора, отвечающего за обмен информацией между центральной станцией и абонентами в условиях довольно жесткого реального времени (задержка не должна была превышать 1 миллисекунды). (Собственно, я писал эту программу; меня тогда даже чуть не побили за то, что я мог говорить только о конечных автоматах. )
Мне кажется (наверное, это поверхностное впечатление; просто нахлынуло ), что их метод хорошо бы "лег" на вашу систему. Их метод анализа назывался OOA (и еще последние две цифры, обозначающие год). Кажется, последняя версия была OOA96. Затем все методы были "подмяты" UML-ем. Но ребята не растерялись, и создали xUML — исполняемый UML. Если не ошибаюсь, их фирма называлась Project Technology.
Ну и еще, конечно: датчики температуры, датчики дыма...
"Жизнь моя, иль ты приснилась мне?" (c) Есенин

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[32]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 29.06.05 03:13
Оценка: :)
Здравствуйте, AVC, Вы писали:

AVC>Но тут нахлынули эмоции. ("Вспомнились годы ушедшие..." )

AVC>Знаешь, была в свое время интересная книжка Shlaer, Mellor "Object lifecycles: modeling the world in states".
AVC>У нас ее еще издавали под каким-то безликим названием, что-то вроде "Объектно-ориентированного анализа".

Тоненькая, маленькая, в бумажной белой обложке с, по-моему, зеленым рисунком... Рамочки какие-то, что ли? Эх...
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[32]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 29.06.05 05:35
Оценка:
Здравствуйте, AVC, Вы писали:

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


E>>Алексей мне будет очень интересно узнать твое мнение о нашем SObjectizer. Если найдешь время, глянь краем глаза, пожалуйста (равно как и другие читатели, если таковые доберутся до этого постсриптума) -- я буду признателен любому мнению.


AVC>Пока только начал знакомиться с твоей книгой SObjectizer-4 Book.

AVC>Конечно, сначала — "наискосок".
AVC>Но тут нахлынули эмоции. ("Вспомнились годы ушедшие..." )
AVC>Знаешь, была в свое время интересная книжка Shlaer, Mellor "Object lifecycles: modeling the world in states".
AVC>У нас ее еще издавали под каким-то безликим названием, что-то вроде "Объектно-ориентированного анализа".

Более того, именно она, вместе с фолиантом Буча и описанием OMT-нотации использовалась у нас при проектировании SObjectizer-а в далеких 90-х годах
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[33]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 29.06.05 05:35
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, AVC, Вы писали:


AVC>>Но тут нахлынули эмоции. ("Вспомнились годы ушедшие..." )

AVC>>Знаешь, была в свое время интересная книжка Shlaer, Mellor "Object lifecycles: modeling the world in states".
AVC>>У нас ее еще издавали под каким-то безликим названием, что-то вроде "Объектно-ориентированного анализа".

ПК>Тоненькая, маленькая, в бумажной белой обложке с, по-моему, зеленым рисунком... Рамочки какие-то, что ли? Эх...


Да, по-моему, именно она.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[23]: Что толку в Ада если Ариан 5 все равно упал
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 29.06.05 07:45
Оценка:
Здравствуйте, Кодт, Вы писали:

К> x: LONGINT


К> IF (x & ~0xFFFF) # 0 THEN


У меня маленькая поправочка. Так нельзя. Если x: LONGINT (64 бита), то на 32-битной машине единственный способ такой:

IF (MIN(SHORTINT) <= x) & (x <= MAX(SHORTINT)) THEN

Вот если бы x: INTEGER (32 бита), то появляется еще один способ (который имели в виду Вы):

IF BITS(x) * BITS(0FFFF0000H) # {} THEN

Re[23]: Что толку в Ада если Ариан 5 все равно упал
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 29.06.05 07:46
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>А ведь ничего хорошего в этом нет.


Согласен
Re[24]: Что толку в Ада если Ариан 5 все равно упал
От: Кодт Россия  
Дата: 29.06.05 09:29
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, Кодт, Вы писали:


К>> x: LONGINT


К>> IF (x & ~0xFFFF) # 0 THEN


СГ>У меня маленькая поправочка. Так нельзя. Если x: LONGINT (64 бита), то на 32-битной машине единственный способ такой:


Ну я не спец по Оберону. Просто мне тоже было лень ( — кстати об истоках проблемы) писать длинное условие.
Да и в реализации rollover тоже не всё корректно: мы получаем 32-битное беззнаковое, а присваиваем 31+1-битному знаковому. Тоже повод ругнуться на предмет переполнения.

Главное, что я хотел сказать: можно приложить доп.усилия, чтобы сделать код безопасным. Но явный оверхед от этого (бОльшая писанина, и потенциально — бОльшее время вычислений) стимулируют в обратную сторону.

Впрочем, ведь таких функций можно наделать много: Cutoff (срезает пик), Rollover (перекручивает), Fuse (обнуляет), Verify (кидает исключение).
Тогда конверсия типов становится прозрачнее для понимания.
А если эти функции intristic (звоним разработчику компилятора) или хотя бы inline И входят в стандартную библиотеку — то, на пару со строгой типизацией, вообще будет щастье. (С поправками на радиус кривизны рук PM'а).
Перекуём баги на фичи!
Re[33]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 01.07.05 21:53
Оценка: 11 (2) -1
Здравствуйте, CrystaX, Вы писали:

CX>Если Вы посмотрите в той же ветке чуть выше, Вы найдете там более упрощенную реализацию. Там нет систем единиц, а есть только разные физические понятия — длина, масса, время. К системам единиц я пришел, будучи подталкиваемым Кодтом.


Интересно, что тема эта не новая.
Наткнулся на днях в старой уже книге (1980-х годов) "Языки программирования Ада, Си, Паскаль. Сравнение и оценка" на статью Джехани, где (в разделе о производных типах) он предлагает подход "единиц измерения", впоследствии реализованный в языке Физкал.
Надо отметить, что к тому времени в языке Ада уже существовала возможность объявления производных типов:
type LENGTH is new FLOAT;
type AREA is new FLOAT;
type VOLUME is new FLOAT;

Объявленные производные типы по умолчанию не могут смешиваться между собой.
Чтобы разрешить корректное смешение типов (например, когда переменная типа VOLUME получается из произведения переменных типов AREA и LENGTH) требуется определить соответствующие операторы.
Джехани не понравилось, что требуется определять так много вспомогательных операторов, и он предложил другой способ, который и был реализован в языке Физкал.
Оба эти способа отличаются от того, как это делается в Си++. (Что уже интересно.)
Такое впечатление, что объявление класса является в Си++ панацеей, хотя иногда можно было бы (ИМХО) поискать и более простые пути.
Что касается возможного решения этой проблемы для Оберона, то мне пришла в голову другая идея.
В языке Оберон немного не хватает возможности накладывать ограничения (constraint) на использования типов.
В частности нет средства, аналогичного "дженерикам", хотя еще в середине 1990-х Роу и Шиперски предложили простой способ реализовать lightweight parametric polymorphism для Оберона. (Я узнал об этом от Трурля.)
В принципе, ограничение использования типов, производных от базовых — тоже вид constraint-а.
Может быть, есть возможность найти общее решение для этих случаев?
(P.S. BTW: то, что в свое время была издана целая книга о сравнении языков Ада, Си и Паскаль (причем некоторые статьи были написаны еще в середине 70-х), указывает на то, что нащ "флейм" ведется уже около 30 лет! )

AVC>>Проще говоря, назначение Оберона (поддержка компонентного программирования) отличается от назначения Си++ (поддержка ООП и обобщенного программирования в рамках отдельной программы, избегая ненужного "оверхеда" в run-time).

AVC>>Программист, пишущий на Обероне, иногда испытывает некоторые трудности, реализуя то, что на Си++ выразить сравнительно легко.
AVC>>Программист, пишущий на Си++, зачастую вообще не представляет, чего он лишен.

CX>Допускаю. Но как-то в голову ничего не приходит. Если Вас не затруднит, не могли бы Вы привести примерный список возможностей? Как известно, язык не только расширяет, но и ограничивает мышление.


Пытаться перечислить достоинства обероновского подхода не так легко, хотя они для меня очевидны.
Возможно, здесь нужен более систематический и уравновешенный ум, чем мой.
Кроме того, нужно больше времени, чем у меня обычно есть в распоряжении.
Но я попробую назвать хотя бы несколько преимуществ.
Благодаря защите типов, раздельной компиляции и динамической загрузке модулей, "оберонщики" пользуются компонентным подходом уже почти 20 лет, т.е. намного раньше остальных (до COM, до Java и т.д.). Причем программирование компонентов ничем не отличается от "просто программирования". (В Обероне это одно и то же.)
Многие свойства языка Оберон объясняются требованиями компонентного подхода.
Например: строгий контроль типов (type safety) и сборка мусора (garbage collection).
Оберон позволяет использовать переменную только в соответствии с ее типом (исключение составляет низкоуровневре программирование с явным использованием псевдомодуля SYSTEM, необходимого для написания самых низких "этажей" Оберон-системы). Статический контроль типов осуществляется при компиляции, динамический в run-time. Динамический контроль реализован весьма эффективно. Для проверки указателя (или процедурного типа) достаточно сравнить его с NIL (указатели инициализируются значением NIL, так что указатель всегда либо равен NIL, либо указывет на переменную, созданную с помощью NEW). Для проверки динамического типа достаточно одного сравнения, т.к. каждый тип в Оберона характеризуется (кроме прочего) уровнем расширения.
Если учесть, что Оберон в основном работает по "голому железу", то цена, которую он "платит" за надежность, минимальна — оверхед по отношению к Си/Си++ составляет всего несколько процентов (а не разы, как для Java или C#).
Если убрать из кода дополнительные проверки, то оверхеда нет совсем. (В конце 1990-х XDS "побил" все компиляторы Си++, включая Watcom, на тесте drystone).
Сборка мусора, вероятно, попала в Оберон не из Лиспа, а из паскалеподобного языка Cedar, который был создан в качестве эксперимента в Xerox PARC по следам Смоллтока. Т.к. на один и тот же объект можно ссылаться из разных компонентов, совершенно ничего не знающих друг о друге и написанных разными программистами в разное время, то самый простой способ обеспечить корректную работу с памятью — централизовать сборку мусора, поручить ее системе, а не доверять ее отдельным компонентам.
Чтобы обеспечить простоту сборки мусора, Вирт полностью отказался от вариантных записей (RECORD CASE или union), полностью вытеснив их расширяемыми (extensible) записями.
Все известные мне компиляторы Оберона предоставляют возможность финализации как объектов, так и модулей.
Можно сделать вывод, что в Обероне (в отличие от Паскаля или даже Модулы-2) Вирту полностью удалось решить проблему защиты памяти, причем минимальными средствами.
Кроме того, сборка мусора облегчает программисту реализацию нетривиальных алгоритмов, работающих с динамической памятью.
В Обероне "упор" делается не на классы, как в Си++, а на модули: модуль в Обероне — и единица трансляции, и единица загрузки, и пространство имен, и единица инкапсуляции. Благодаря последнему, модули позволяют естественно реализовывать целые паттерны проектирования (вроде тех, что описаны в книге "банды четырех"). Нет никакой потребности в явных извращениях, вроде friend-ов.
Модульная структура Оберона облегчает написание программ в команде. Если интерфейс модуля не меняется, то клиентные модули не нуждаются в перекомпиляции. Вместе с тем, Оберон обеспечивает межмодульный контроль типов.
Поддержка обероновской средой информации о типах в run-time создает возможности метапрограммирования. Например, в ETH Oberon обработка исключений решается методами метапрограммирования, причем, если исключения не возникло, накладные расходы равны нулю.
В Обероне нет программы или главной процедуры (main). Действия активируются командами вида M.P, где M — имя модуля, а P — имя процедуры. Это облегчает создание тестов, т.к. тест может вызывать непосредственно нужный фрагмент программы, не надо писать отдельную тестовую программу. Тест может храниться непосредственно в исходнике.
Т.к. типичная обероновская среда (вроде BlackBox) работают с документами (а не просто текстами), то документирование программ сильно облегчается. Можно использовать по своему усмотрению выделение цветом или шрифтом, или, например, гиперссылки. Можно использовать для документирования программы фрагменты других документов, непосредственно вставив их в соответствующие места программы.
Ну, это уже "рюшечки", хотя это и удобно, и красиво.
В обероновской среде нет никакой нужды в отдельном программистском IDE. Все дополнительные возможности достаются (благодаря свойствам среды) практически бесплатно. (Поэтому наивна критика вроде: "Вы говорите о свойствах языка или свойствах среды? Определитесь!" Просто уровень интеграции в Обероне гораздо выше, чем в обычных системах.)
Иногда мне даже не верится, что такие возможности создаются на основе языка, настолько простого, что его первый компилятор (написанный Виртом) "весил" всего 45K!

Конечно, и у других языков есть свои плюсы. Мне понравилась изобретательность, которую проявили eao197 и Вы, решая проблемы с помощью шаблонов. Но все же я отношусь к этим примерам не более как к хитроумным трюкам, вроде известной задачи о программе, печатающей саму себя. Например, на Обероне она решается так (пример прилагается к компилятору XDS):
<*+ MAIN *> MODULE self;
IMPORT InOut;
CONST C=27X; F=6; L=15;
VAR s: ARRAY F+L OF ARRAY 64 OF CHAR;
    i: INTEGER;
BEGIN
  s[ 0] := '<*+ MAIN *> MODULE self;';
  s[ 1] := 'IMPORT InOut;';
  s[ 2] := 'CONST C=27X; F=6; L=15;';
  s[ 3] := 'VAR s: ARRAY F+L OF ARRAY 64 OF CHAR;';
  s[ 4] := '    i: INTEGER;';
  s[ 5] := 'BEGIN';
  s[ 6] := '  FOR i := 0 TO (F+L)*2-1 DO';
  s[ 7] := '    IF i>=F*2+L THEN InOut.WriteString (s[i-F-L])';
  s[ 8] := '    ELSIF i<F   THEN InOut.WriteString (s[i])';
  s[ 9] := '    ELSE';
  s[10] := '      InOut.WriteString ("  s[");';
  s[11] := '      InOut.WriteInt (i-F, 2);';
  s[12] := '      InOut.WriteString ("] := ");';
  s[13] := '      InOut.Write (C);';
  s[14] := '      InOut.WriteString (s[i-F]);';
  s[15] := '      InOut.Write (C);';
  s[16] := '      InOut.Write (";")';
  s[17] := '    END;';
  s[18] := '    InOut.WriteLn;';
  s[19] := '  END';
  s[20] := 'END self.';
  FOR i := 0 TO (F+L)*2-1 DO
    IF i>=F*2+L THEN InOut.WriteString (s[i-F-L])
    ELSIF i<F   THEN InOut.WriteString (s[i])
    ELSE
      InOut.WriteString ("  s[");
      InOut.WriteInt (i-F, 2);
      InOut.WriteString ("] := ");
      InOut.Write (C);
      InOut.WriteString (s[i-F]);
      InOut.Write (C);
      InOut.Write (";")
    END;
    InOut.WriteLn;
  END
END self.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[34]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 01.07.05 22:49
Оценка: 52 (3) +2
Здравствуйте, AVC, Вы писали:

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


CX>>Если Вы посмотрите в той же ветке чуть выше, Вы найдете там более упрощенную реализацию. Там нет систем единиц, а есть только разные физические понятия — длина, масса, время. К системам единиц я пришел, будучи подталкиваемым Кодтом.


AVC>Интересно, что тема эта не новая.

AVC>Наткнулся на днях в старой уже книге (1980-х годов) "Языки программирования Ада, Си, Паскаль. Сравнение и оценка" на статью Джехани, где (в разделе о производных типах) он предлагает подход "единиц измерения", впоследствии реализованный в языке Физкал.
AVC>Надо отметить, что к тому времени в языке Ада уже существовала возможность объявления производных типов:
AVC>
AVC>type LENGTH is new FLOAT;
AVC>type AREA is new FLOAT;
AVC>type VOLUME is new FLOAT;
AVC>

AVC>Объявленные производные типы по умолчанию не могут смешиваться между собой.
AVC>Чтобы разрешить корректное смешение типов (например, когда переменная типа VOLUME получается из произведения переменных типов AREA и LENGTH) требуется определить соответствующие операторы.
AVC>Джехани не понравилось, что требуется определять так много вспомогательных операторов, и он предложил другой способ, который и был реализован в языке Физкал.
AVC>Оба эти способа отличаются от того, как это делается в Си++. (Что уже интересно.)
AVC>Такое впечатление, что объявление класса является в Си++ панацеей, хотя иногда можно было бы (ИМХО) поискать и более простые пути.

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

AVC>Что касается возможного решения этой проблемы для Оберона, то мне пришла в голову другая идея.

AVC>В языке Оберон немного не хватает возможности накладывать ограничения (constraint) на использования типов.
AVC>В частности нет средства, аналогичного "дженерикам", хотя еще в середине 1990-х Роу и Шиперски предложили простой способ реализовать lightweight parametric polymorphism для Оберона. (Я узнал об этом от Трурля.)
AVC>В принципе, ограничение использования типов, производных от базовых — тоже вид constraint-а.
AVC>Может быть, есть возможность найти общее решение для этих случаев?
AVC>(P.S. BTW: то, что в свое время была издана целая книга о сравнении языков Ада, Си и Паскаль (причем некоторые статьи были написаны еще в середине 70-х), указывает на то, что нащ "флейм" ведется уже около 30 лет! )

Как известно, все новое — это хорошо забытое старое.

AVC>Пытаться перечислить достоинства обероновского подхода не так легко, хотя они для меня очевидны.

AVC>Возможно, здесь нужен более систематический и уравновешенный ум, чем мой.
AVC>Кроме того, нужно больше времени, чем у меня обычно есть в распоряжении.
AVC>Но я попробую назвать хотя бы несколько преимуществ.
[skipped]

В этом месте Вы рассказали только ожидаемое, а именно — модули и garbage collector. На самом деле это не совсем то, что я хотел услышать. Попробую переформулировать вопрос по-другому: "Что есть в Обероне такого, принципиально не реализуемого на C++ с приемлемыми затратами или же без таковых?".
Объясню более подробно. Та же модульность и garbage collector вполне реализуемы на C++ (с помощью конвенций, принятых для проекта — не используем голые указатели, только смарт-пойнтеры, определяем жесткие интерфейсы модулей и т.д. и т.п.). Понятно, что неопытный программист, вторгшийся в такую систему и/или незнакомый с конвенцией, принятой в текущем проекте, запросто может посеять трудноуловимый (в той или иной степени) баг. Оберон же реализует эти конвенции на уровне языка, поэтому за их выполнением следит компилятор, а не программисты. Но, честно говоря, для меня это не довод. Я сейчас говорю не о каких-то теоретических коммандах программистов, в которых профессиональный уровень участников неоднороден, а о себе и людях, с которыми я работаю. В нашей ситуации вероятность нарушения конвенции крайне мала, а посему это преимущество Оберона для меня сводится практически к нулю. Повторю еще раз — я не пытаюсь доказать преимущество C++ над всеми остальными языками (в этом форуме и без меня найдутся те, кто это будет доказывать). Я пытаюсь понять одну простую вещь: "Что принципиально нового может принести для меня Оберон?" (ибо я есть C++-программист, а Вы утверждали, что C++-программист зачастую не представляет, чего он лишен).
Теперь о формулировке "приемлемые затраты". В конце концов, и на чистом C можно написать программу, построенную на ООП, с ручной реализацией наследования, ручным разруливанием "виртуальных" вызовов и т.д. Как легко заметить, здесь также все основывается на конвенции. Но в этом случае затраты времени и труда, на мой взгляд, слишком высоки. Так какие же затраты приемлемы а какие нет? А очень просто — если мы вводим "запретительную" конвенцию (вроде того же запрета на использование голых указателей), большую часть работы удается автоматизировать. Такие трудозатраты приемлемы. Если же конвенция носит "принудительный" характер (реализация наследования и динамического полиморфизма на C), возникает гораздо большая вероятность промахнуться и допустить ошибку. Такие трудозатраты неприемлемы. Данная формулировка приемлемости/неприемлемости затрат относится исключительно к фразе "Что есть в Обероне такого, принципиально не реализуемого на C++ с приемлемыми затратами или же без таковых?" и никоим образом не претендует на универсальность.

Так что скажете? Что есть в Обероне такого, что может сильно облегчить мне жизнь как программисту (или даже заставит по-новому взглянуть на суть программирования вообще)?

AVC>В Обероне нет программы или главной процедуры (main). Действия активируются командами вида M.P, где M — имя модуля, а P — имя процедуры. Это облегчает создание тестов, т.к. тест может вызывать непосредственно нужный фрагмент программы, не надо писать отдельную тестовую программу. Тест может храниться непосредственно в исходнике.

AVC>Т.к. типичная обероновская среда (вроде BlackBox) работают с документами (а не просто текстами), то документирование программ сильно облегчается. Можно использовать по своему усмотрению выделение цветом или шрифтом, или, например, гиперссылки. Можно использовать для документирования программы фрагменты других документов, непосредственно вставив их в соответствующие места программы.
AVC>Ну, это уже "рюшечки", хотя это и удобно, и красиво.
AVC>В обероновской среде нет никакой нужды в отдельном программистском IDE. Все дополнительные возможности достаются (благодаря свойствам среды) практически бесплатно. (Поэтому наивна критика вроде: "Вы говорите о свойствах языка или свойствах среды? Определитесь!" Просто уровень интеграции в Обероне гораздо выше, чем в обычных системах.)

Алексей, согласитесь все же, что все это не имеет ни малейшего отношения к языку. Быть может, для Вас заданный мною вопрос и прозвучал наивно, но для меня предыдущий текст звучит ничуть не менее наивно.

AVC>Иногда мне даже не верится, что такие возможности создаются на основе языка, настолько простого, что его первый компилятор (написанный Виртом) "весил" всего 45K!


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

AVC>Конечно, и у других языков есть свои плюсы. Мне понравилась изобретательность, которую проявили eao197 и Вы, решая проблемы с помощью шаблонов. Но все же я отношусь к этим примерам не более как к хитроумным трюкам, вроде известной задачи о программе, печатающей саму себя. Например, на Обероне она решается так (пример прилагается к компилятору XDS):

[skipped]

Когда будет немного больше времени, обязательно изучу Ваш код — интересно!

Но все же "изобретательность, проявленная мною и Евгением" при решении наших задач — это далеко не только хитроумные трюки! Это вполне рабочие решения, применяемые в промышленном коде и позволяющие сэкономить много сил и времени.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[23]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 01.07.05 23:04
Оценка:
Здравствуйте, A.Lokotkov, Вы писали:

AVC>>Кстати, интересно, кто-нибудь задумался, чтобы случилось, если бы вследствие этого выхода за границы диапазона исключения бы не было? Имеем: ракету рядом с земной поверхностью, "руководствующуюся" совершенно неверными данными.


AL>В случае с Арианом-5 ничего бы не было. Ничего. Исключение возникло в "мертвом" коде, который кочевал из проекта в проект и в 5-м Ариане был не нужен. Там в отчете всё есть.


Прошу прощения, не сразу понял, что Вы имеете в виду.
Сработал автоматизм писателя компиляторов: "мертвый" код — код, который никогда не исполняется.
А Вы имели в виду: "мертвый" код — бесполезный, уже не нужный.
Сейчас вот дошло.
Все же, дело не в том, что этот "мертвый" код был не нужен в Ариане-5. Он был нужен, но только до взлета ракеты.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[35]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 02.07.05 00:48
Оценка: 1 (1)
Здравствуйте, CrystaX, Вы писали:

AVC>>Такое впечатление, что объявление класса является в Си++ панацеей, хотя иногда можно было бы (ИМХО) поискать и более простые пути.


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


Наверное, правильно. Зачастую мы слишком много и слишком горячо спорим о мелочах.

AVC>>Пытаться перечислить достоинства обероновского подхода не так легко, хотя они для меня очевидны.

AVC>>Возможно, здесь нужен более систематический и уравновешенный ум, чем мой.
AVC>>Кроме того, нужно больше времени, чем у меня обычно есть в распоряжении.
AVC>>Но я попробую назвать хотя бы несколько преимуществ.
CX>[skipped]

CX>В этом месте Вы рассказали только ожидаемое, а именно — модули и garbage collector. На самом деле это не совсем то, что я хотел услышать. Попробую переформулировать вопрос по-другому: "Что есть в Обероне такого, принципиально не реализуемого на C++ с приемлемыми затратами или же без таковых?".

CX>Объясню более подробно. Та же модульность и garbage collector вполне реализуемы на C++ (с помощью конвенций, принятых для проекта — не используем голые указатели, только смарт-пойнтеры, определяем жесткие интерфейсы модулей и т.д. и т.п.). Понятно, что неопытный программист, вторгшийся в такую систему и/или незнакомый с конвенцией, принятой в текущем проекте, запросто может посеять трудноуловимый (в той или иной степени) баг. Оберон же реализует эти конвенции на уровне языка, поэтому за их выполнением следит компилятор, а не программисты. Но, честно говоря, для меня это не довод. Я сейчас говорю не о каких-то теоретических коммандах программистов, в которых профессиональный уровень участников неоднороден, а о себе и людях, с которыми я работаю. В нашей ситуации вероятность нарушения конвенции крайне мала, а посему это преимущество Оберона для меня сводится практически к нулю. Повторю еще раз — я не пытаюсь доказать преимущество C++ над всеми остальными языками (в этом форуме и без меня найдутся те, кто это будет доказывать). Я пытаюсь понять одну простую вещь: "Что принципиально нового может принести для меня Оберон?" (ибо я есть C++-программист, а Вы утверждали, что C++-программист зачастую не представляет, чего он лишен).

Сходный аргумент выдвигает и Евгений (eao197).
Честно говоря, я здесь вас (обоих) не совсем понимаю.
Вы так верите в неконтролируемые компилятором конвенции, которые не будут нарушаться?
Так ведь все ошибки делаются "ненарочно", и ошибки в соблюдении конвенций — в том числе.
У меня же конвенции с детства ассоциируются с Паниковским и прочими детьми лейтенанта Шмидта.
А может быть, Си++программисты просто несколько самоуверены, и каждый из них думает: "Я-то уж не ошибусь!"?
В Обероне можно выделить две принципиальные вещи:
1) надежность (особо удалась Вирту защита памяти; надежность — это очень приятное чувство!);
2) простота.
По поводу последнего можно распространяться долго.
Здесь не только простота языка.
Что освоить COM, толковые люди (которые потом пишут об этом книги) тратят по полгода; при этом, по их словам, ощущают туман в своей голове.
А на Обероне Вы просто пишете свой модуль.
Возьмем самое малое. Разве невидимо и безошибочно работающий garbage collector не лучше, чем AddRef() и Release()?
Разве это не аргумент?
Неужели простота ничего не стоит? А затраты на изучение слишком сложных программных продуктов, а потерянные годы жизни (все лучшие годы! ), а тот ужасный (и потенциально опасный!) код, который громоздят те несчастные, которые так и не разобрались до конца во всех тонкостях очередного модного и, как всегда, чрезмерно сложного средства?
А можете Вы гарантировать, что Ваш код не будет сопровождать менее грамотный программист, который не станет соблюдать все конвенции?
О комментариях, например, уже давно говорят, что они не должны содержать то, что можно сказать с помощью самого кода.
А ведь Ваши конвенции — во многом такие вот комментарии. Многие решения в коде будут без них непонятны.

CX>Теперь о формулировке "приемлемые затраты". В конце концов, и на чистом C можно написать программу, построенную на ООП, с ручной реализацией наследования, ручным разруливанием "виртуальных" вызовов и т.д. Как легко заметить, здесь также все основывается на конвенции. Но в этом случае затраты времени и труда, на мой взгляд, слишком высоки.


Не все согласятся с Вами так уж безоговорочно.
Пайк в своей старой статье "Notes on Programming in C" пишет:

The O-O languages give you you more of course — prettier syntax, derived types and so on — but conceptually they provide little extra.
Combining data-driven programs with function pointers leads to an astinishingly expressive way of working, a way that, in my experience, has often led to pleasant surprises. Even without a special O-O language, you can get 90% of the benefit for no extra work and be more in control of result.

Впрочем, я, разумеется, не спорю, что O-O языки лучше приспособлены для ООП.

CX>Так какие же затраты приемлемы а какие нет? А очень просто — если мы вводим "запретительную" конвенцию (вроде того же запрета на использование голых указателей), большую часть работы удается автоматизировать. Такие трудозатраты приемлемы. Если же конвенция носит "принудительный" характер (реализация наследования и динамического полиморфизма на C), возникает гораздо большая вероятность промахнуться и допустить ошибку. Такие трудозатраты неприемлемы. Данная формулировка приемлемости/неприемлемости затрат относится исключительно к фразе "Что есть в Обероне такого, принципиально не реализуемого на C++ с приемлемыми затратами или же без таковых?" и никоим образом не претендует на универсальность.


CX>Так что скажете? Что есть в Обероне такого, что может сильно облегчить мне жизнь как программисту (или даже заставит по-новому взглянуть на суть программирования вообще)?


Подумаю, "поскриплю" мозгами.

AVC>>В Обероне нет программы или главной процедуры (main). Действия активируются командами вида M.P, где M — имя модуля, а P — имя процедуры. Это облегчает создание тестов, т.к. тест может вызывать непосредственно нужный фрагмент программы, не надо писать отдельную тестовую программу. Тест может храниться непосредственно в исходнике.

AVC>>Т.к. типичная обероновская среда (вроде BlackBox) работают с документами (а не просто текстами), то документирование программ сильно облегчается. Можно использовать по своему усмотрению выделение цветом или шрифтом, или, например, гиперссылки. Можно использовать для документирования программы фрагменты других документов, непосредственно вставив их в соответствующие места программы.
AVC>>Ну, это уже "рюшечки", хотя это и удобно, и красиво.
AVC>>В обероновской среде нет никакой нужды в отдельном программистском IDE. Все дополнительные возможности достаются (благодаря свойствам среды) практически бесплатно. (Поэтому наивна критика вроде: "Вы говорите о свойствах языка или свойствах среды? Определитесь!" Просто уровень интеграции в Обероне гораздо выше, чем в обычных системах.)

CX>Алексей, согласитесь все же, что все это не имеет ни малейшего отношения к языку. Быть может, для Вас заданный мною вопрос и прозвучал наивно, но для меня предыдущий текст звучит ничуть не менее наивно.


Может быть.
А, может быть, и нет.
Между Обероном-языком и Обероном-средой (и Обероном-системой) есть связь.
Ничего подобного я не видел в системах, написанных на Си.

AVC>>Иногда мне даже не верится, что такие возможности создаются на основе языка, настолько простого, что его первый компилятор (написанный Виртом) "весил" всего 45K!


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


Правильно. В частности, потому что именно люди выбирают хорошие или плохие языки.
Я привел размер оригинального компилятора Вирта только для того, чтобы проиллюстрировать простоту Оберона.
Другие сторонники Оберона зачастую приводят в качестве аргумента размер определения языка (всего несколько страниц).
Но описание может быть просто неполным, "урезанным".
Размер компилятора убеждает больше.

AVC>>Конечно, и у других языков есть свои плюсы. Мне понравилась изобретательность, которую проявили eao197 и Вы, решая проблемы с помощью шаблонов. Но все же я отношусь к этим примерам не более как к хитроумным трюкам, вроде известной задачи о программе, печатающей саму себя. Например, на Обероне она решается так (пример прилагается к компилятору XDS):

CX>[skipped]

CX>Когда будет немного больше времени, обязательно изучу Ваш код — интересно!


Это не мой код.
Это один из примеров, поставляемых вместе с компилятором XDS.
Я привел его как пример остроумного (да еще и написанного на любимом Обероне! ), но не имеющего большого практического значения кода.
Впрочем, это не критика кода, т.к. охотно допускаю и просто "искусство для искусства".
Но, однако, не в "производственной" программе.

CX>Но все же "изобретательность, проявленная мною и Евгением" при решении наших задач — это далеко не только хитроумные трюки! Это вполне рабочие решения, применяемые в промышленном коде и позволяющие сэкономить много сил и времени.


Возможно. Хотя, честно говоря, это вызывает у меня сомнения. Иногда мне кажется, что здесь больше "любви к искусству", чем реальной потребности.
Я не оспариваю пользы трюков, когда они действительно необходимы.
Вероятно, что в Вашем случае и в случае Евгения это действительно так.
Но представьте себе, что весь код (а не отдельный небольшой фрагмент) такой!
Читателю программы, ИМХО, будет легче сразу повеситься!

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[36]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 02.07.05 08:32
Оценка: 6 (1)
Здравствуйте, AVC, Вы писали:

CX>>В этом месте Вы рассказали только ожидаемое, а именно — модули и garbage collector. На самом деле это не совсем то, что я хотел услышать. Попробую переформулировать вопрос по-другому: "Что есть в Обероне такого, принципиально не реализуемого на C++ с приемлемыми затратами или же без таковых?".

CX>>Объясню более подробно. Та же модульность и garbage collector вполне реализуемы на C++ (с помощью конвенций, принятых для проекта — не используем голые указатели, только смарт-пойнтеры, определяем жесткие интерфейсы модулей и т.д. и т.п.). Понятно, что неопытный программист, вторгшийся в такую систему и/или незнакомый с конвенцией, принятой в текущем проекте, запросто может посеять трудноуловимый (в той или иной степени) баг. Оберон же реализует эти конвенции на уровне языка, поэтому за их выполнением следит компилятор, а не программисты. Но, честно говоря, для меня это не довод. Я сейчас говорю не о каких-то теоретических коммандах программистов, в которых профессиональный уровень участников неоднороден, а о себе и людях, с которыми я работаю. В нашей ситуации вероятность нарушения конвенции крайне мала, а посему это преимущество Оберона для меня сводится практически к нулю. Повторю еще раз — я не пытаюсь доказать преимущество C++ над всеми остальными языками (в этом форуме и без меня найдутся те, кто это будет доказывать). Я пытаюсь понять одну простую вещь: "Что принципиально нового может принести для меня Оберон?" (ибо я есть C++-программист, а Вы утверждали, что C++-программист зачастую не представляет, чего он лишен).

AVC>Сходный аргумент выдвигает и Евгений (eao197).

AVC>Честно говоря, я здесь вас (обоих) не совсем понимаю.
AVC>Вы так верите в неконтролируемые компилятором конвенции, которые не будут нарушаться?
AVC>Так ведь все ошибки делаются "ненарочно", и ошибки в соблюдении конвенций — в том числе.
AVC>У меня же конвенции с детства ассоциируются с Паниковским и прочими детьми лейтенанта Шмидта.
AVC>А может быть, Си++программисты просто несколько самоуверены, и каждый из них думает: "Я-то уж не ошибусь!"?

Вы знаете, определенная доля самоуверенности во мне, конечно же, есть. И конечно же, соблюдение конвенций не спасает на 100% от ошибок. Но на 95% спасает, а это уже приемлемый уровень. Ведь у меня две альтернативы:
1. Полностью положиться на безопасный язык программирования и не задумываться об этом вообще.
2. Создать безопасность самому, следую конвенциям, и имея возможность, в случае необходимости, в каком-то конкретном куске коде переделать его, не нарушая безопасность "снаружи" (для пользователей этого кода), но убрав лишние проверки и прочие прелести безопасного кода внутри, достигнув тем самым значительного улучшения производительности.

Я выбираю второй вариант. Более того, слова о достижении более высокой производительности — это не просто слова, а случаи (не такие и редкие) из моей практики. Мне очень нравиться принцип "сделать из правильной программы быструю гораздо легче, чем из быстрой — правильную", но защищенные языки программирования во многом ограничивают мою свободу в создании действительно быстрой программы. Да, они предлагают взамен безопасность (и это дорогого стоит!), но уж такова специфика моей работы, что мне зачастую очень важна производительность (я говорю о программировании под микродевайсы, у которых очень ограниченные ресурсы).

AVC>В Обероне можно выделить две принципиальные вещи:

AVC>1) надежность (особо удалась Вирту защита памяти; надежность — это очень приятное чувство!);
AVC>2) простота.
AVC>По поводу последнего можно распространяться долго.
AVC>Здесь не только простота языка.
AVC>Что освоить COM, толковые люди (которые потом пишут об этом книги) тратят по полгода; при этом, по их словам, ощущают туман в своей голове.
AVC>А на Обероне Вы просто пишете свой модуль.
AVC>Возьмем самое малое. Разве невидимо и безошибочно работающий garbage collector не лучше, чем AddRef() и Release()?
AVC>Разве это не аргумент?

Нет. Для меня — не аргумент. Потому что те же AddRef и Release пишутся всего пару раз и потом вызывающий код ими только пользуется. При должной организации разбиения на модули (не в Обероновском понимании этого слова) нет никакой нужды знать, что происходит в потрохах.

AVC>Неужели простота ничего не стоит? А затраты на изучение слишком сложных программных продуктов, а потерянные годы жизни (все лучшие годы! ), а тот ужасный (и потенциально опасный!) код, который громоздят те несчастные, которые так и не разобрались до конца во всех тонкостях очередного модного и, как всегда, чрезмерно сложного средства?

AVC>А можете Вы гарантировать, что Ваш код не будет сопровождать менее грамотный программист, который не станет соблюдать все конвенции?
AVC>О комментариях, например, уже давно говорят, что они не должны содержать то, что можно сказать с помощью самого кода.
AVC>А ведь Ваши конвенции — во многом такие вот комментарии. Многие решения в коде будут без них непонятны.

Мне — понятны. А также людям, с которыми я работаю. Ибо мы сообща вырабатываем эти конвенции и потом сообща их придерживаемся. Аргумент же о сопровождающем программисте, который не будет знать об этих конвенциях — я Вам об этом уже говорил. Не знаю, быть может это только мне так повезло, но наше руководство не будет бросать на поддержку кода неподготовленных людей. Кроме того, все соглашения и замечания по проекту хранятся в документе "Project design", который надо прочитать, прежде чем браться за поддержку.

CX>>Так что скажете? Что есть в Обероне такого, что может сильно облегчить мне жизнь как программисту (или даже заставит по-новому взглянуть на суть программирования вообще)?


AVC>Подумаю, "поскриплю" мозгами.


Ок, буду ждать.

CX>>Алексей, согласитесь все же, что все это не имеет ни малейшего отношения к языку. Быть может, для Вас заданный мною вопрос и прозвучал наивно, но для меня предыдущий текст звучит ничуть не менее наивно.


AVC>Может быть.

AVC>А, может быть, и нет.
AVC>Между Обероном-языком и Обероном-средой (и Обероном-системой) есть связь.

Но мы ведь говорим об Обероне-языке, а не об Обероне-системе?

AVC>Ничего подобного я не видел в системах, написанных на Си.


Хмм... А как же Unix? Типичнейшая C-среда. Да, конечно, если говорить о GUI и прочих рюшечках, то этого нет. Но мне, честно говоря, GUI абсолютно не важен. Мне очень нравиться высказывание Денниса Ритчи по этому поводу: "UNIX — это очень простая и гибкая операционная система. Правда, для того, чтобы понять и принять эту простоту, требуется гений или, как минимум, программист"

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

AVC>Правильно. В частности, потому что именно люди выбирают хорошие или плохие языки.

AVC>Я привел размер оригинального компилятора Вирта только для того, чтобы проиллюстрировать простоту Оберона.
AVC>Другие сторонники Оберона зачастую приводят в качестве аргумента размер определения языка (всего несколько страниц).
AVC>Но описание может быть просто неполным, "урезанным".
AVC>Размер компилятора убеждает больше.

Честно говоря, меня не убеждает. Я, например, и на ассемблерах, бывало, писал — так там размер транслятора и того меньше. И что? О чем это говорит? Да ровным счетом ни о чем.

AVC>Это не мой код.

AVC>Это один из примеров, поставляемых вместе с компилятором XDS.
AVC>Я привел его как пример остроумного (да еще и написанного на любимом Обероне! ), но не имеющего большого практического значения кода.
AVC>Впрочем, это не критика кода, т.к. охотно допускаю и просто "искусство для искусства".
AVC>Но, однако, не в "производственной" программе.

Вот в этом, похоже, мы с Вами и не сходимся — я допускаю в производственной программе использование интересного кода.

AVC>Возможно. Хотя, честно говоря, это вызывает у меня сомнения. Иногда мне кажется, что здесь больше "любви к искусству", чем реальной потребности.

AVC>Я не оспариваю пользы трюков, когда они действительно необходимы.
AVC>Вероятно, что в Вашем случае и в случае Евгения это действительно так.
AVC>Но представьте себе, что весь код (а не отдельный небольшой фрагмент) такой!
AVC>Читателю программы, ИМХО, будет легче сразу повеситься!

Здесь мы опять переходим на обсуждение некого гипотетического "читателя программы", который к тому же (гипотетически!) недостаточно грамотен, чтобы разобраться в коде, даже предварительно почитав документ "Project design"! Однако, мне как-то неинтересно обсуждать этого самого читателя. Прямо как у Стругацких: "Ах, дурак, какой ты умный! Какой ты хороший, дурак! Не беспокойся ни о чем, дурак!"
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[36]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 02.07.05 10:27
Оценка: 12 (1) +1 -1
Здравствуйте, AVC

Почитал тут вашу переписку с CrystaX, получил большое удовольствие. Не часто в сравнениях каких-либо языков здесь на RSDN я видел такое спокойное и конструктивное изложение своих взглядов и позиций. Мой респект вам, Алексей и Дмитрий.

AVC>Сходный аргумент выдвигает и Евгений (eao197).

AVC>Честно говоря, я здесь вас (обоих) не совсем понимаю.
AVC>Вы так верите в неконтролируемые компилятором конвенции, которые не будут нарушаться?
AVC>Так ведь все ошибки делаются "ненарочно", и ошибки в соблюдении конвенций — в том числе.
AVC>У меня же конвенции с детства ассоциируются с Паниковским и прочими детьми лейтенанта Шмидта.
AVC>А может быть, Си++программисты просто несколько самоуверены, и каждый из них думает: "Я-то уж не ошибусь!"?
AVC>В Обероне можно выделить две принципиальные вещи:
AVC>1) надежность (особо удалась Вирту защита памяти; надежность — это очень приятное чувство!);
AVC>2) простота.
AVC>По поводу последнего можно распространяться долго.
AVC>Здесь не только простота языка.
AVC>Что освоить COM, толковые люди (которые потом пишут об этом книги) тратят по полгода; при этом, по их словам, ощущают туман в своей голове.
AVC>А на Обероне Вы просто пишете свой модуль.
AVC>Возьмем самое малое. Разве невидимо и безошибочно работающий garbage collector не лучше, чем AddRef() и Release()?
AVC>Разве это не аргумент?
AVC>Неужели простота ничего не стоит? А затраты на изучение слишком сложных программных продуктов, а потерянные годы жизни (все лучшие годы! ), а тот ужасный (и потенциально опасный!) код, который громоздят те несчастные, которые так и не разобрались до конца во всех тонкостях очередного модного и, как всегда, чрезмерно сложного средства?

Все, что здесь написано, Алексей, увы, горькая правда. Я бы добавил только, что, имхо, COM -- это как раз пример неудачной технологии, раскрученной благодоря монополизму и упертости Microsoft. В то же время Oberon производит впечатление стройной и красивой (может потому и компактной) системы. Но, нераскрученной и уж точно не мейнстримовой. Се ля ви. "Все мы жертвы цепи нелепых случайностей" ((С) К.Вонегут).

Тем не менее меня интересует другая сторона медали. И ты, и я уже сошлись на мнении, что C++ сложный, тяжелый и небезопасный язык. Но что дальше? Есть ведь куча C/C++ кода от которого нельзя просто так отказаться, бросить все и уйти в Java/C#/Oberon. Более того, есть области, про которые говорил Дмитрий, в которых мейнстримовые сейчас Java и C# по своей ресурсоемкости и производительности просто C++ не конкуренты. Да и мне, в свое время, довелось поработать на платформе, где кроме убогого C++ компилятора вообще никаких других языков не было. Вот здесь и начинаешь задаваться вопросом, так как же программировать на C++, чтобы было и просто, и безопасно? Сложный вопрос, однако.

Честно говоря, я не знаю, возможен ли на него однозначный ответ. Более того, я склоняюсь к мысли, что вряд ли. Слишком уж много разных направлений C++ накрыл. Но, может быть, можно делать какие-то удобные framework-и для отдельных прикладных направлений и достигать с помощью таких framework-ов надежности и простоты, которой так не хватает? Путь хотя бы в рамках одной компании и одного семейства продуктов.

У меня есть опыт создания и работы с таким framework-ом, SObjectizer-ом, о котором я тебе говорил. Благодоря некоторым идеологическим и техническим решениям простота и надежность там достигаются. Вряд ли ее уровень можно сравнить с уровнем Oberon, но все же. Например, в SObjectizer все сообщения являются динамически-созданными объектами, но об их уничтожении программисту совершенно не нужно заботиться -- это делает run-time. Так же благодоря взаимодействию на основе сообщений достигается модульность (можно даже сказать компонентность). А возможность собирать конкретные программые комплексы из отдельных dll-кирпичиков для меня уже так необходима, что я даже не знаю, как без нее обходиться.

Довольно комфортные условия для программирования на C++ предлагает Qt от www.trolltech.com. Там настолько продуманная и удобная схема владения объектами, что очень редко приходится писать delete, в основном, только new . Может быть как раз эта продуманность и удобство Qt определила успешность проекта KDE? А так же компонентную модель, которая есть в KDE.

Собственно резюмировать хочется тем, что в рамках конкретных технологий и фреймворков в C++ можно обеспечить себе вополне безопасную, надежную и комфортную работу в C++. Причем, удачные фреймворки (типа Qt) имеют достаточно серьезный запас прочности для того, чтобы "случайно залетевший дятел не вызвал гибель цивилизации" (т.е. чтобы новичек неумелыми действиями не навредил остальному коду). Так что будущее C++ определяется, имхо, не столько развитием самого языка, сколько технологиями вокруг C++ (короля играет свита, если проще ).
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[37]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 02.07.05 17:11
Оценка: 14 (3)
Здравствуйте, eao197, Вы писали:

E>Почитал тут вашу переписку с CrystaX, получил большое удовольствие. Не часто в сравнениях каких-либо языков здесь на RSDN я видел такое спокойное и конструктивное изложение своих взглядов и позиций. Мой респект вам, Алексей и Дмитрий.


Взаимно!

E>Все, что здесь написано, Алексей, увы, горькая правда. Я бы добавил только, что, имхо, COM -- это как раз пример неудачной технологии, раскрученной благодоря монополизму и упертости Microsoft. В то же время Oberon производит впечатление стройной и красивой (может потому и компактной) системы. Но, нераскрученной и уж точно не мейнстримовой. Се ля ви. "Все мы жертвы цепи нелепых случайностей" ((С) К.Вонегут).


E>Тем не менее меня интересует другая сторона медали. И ты, и я уже сошлись на мнении, что C++ сложный, тяжелый и небезопасный язык. Но что дальше? Есть ведь куча C/C++ кода от которого нельзя просто так отказаться, бросить все и уйти в Java/C#/Oberon. Более того, есть области, про которые говорил Дмитрий, в которых мейнстримовые сейчас Java и C# по своей ресурсоемкости и производительности просто C++ не конкуренты. Да и мне, в свое время, довелось поработать на платформе, где кроме убогого C++ компилятора вообще никаких других языков не было. Вот здесь и начинаешь задаваться вопросом, так как же программировать на C++, чтобы было и просто, и безопасно? Сложный вопрос, однако.


E>Честно говоря, я не знаю, возможен ли на него однозначный ответ. Более того, я склоняюсь к мысли, что вряд ли. Слишком уж много разных направлений C++ накрыл. Но, может быть, можно делать какие-то удобные framework-и для отдельных прикладных направлений и достигать с помощью таких framework-ов надежности и простоты, которой так не хватает? Путь хотя бы в рамках одной компании и одного семейства продуктов.


E>У меня есть опыт создания и работы с таким framework-ом, SObjectizer-ом, о котором я тебе говорил. Благодоря некоторым идеологическим и техническим решениям простота и надежность там достигаются. Вряд ли ее уровень можно сравнить с уровнем Oberon, но все же. Например, в SObjectizer все сообщения являются динамически-созданными объектами, но об их уничтожении программисту совершенно не нужно заботиться -- это делает run-time. Так же благодоря взаимодействию на основе сообщений достигается модульность (можно даже сказать компонентность). А возможность собирать конкретные программые комплексы из отдельных dll-кирпичиков для меня уже так необходима, что я даже не знаю, как без нее обходиться.


E>Довольно комфортные условия для программирования на C++ предлагает Qt от www.trolltech.com. Там настолько продуманная и удобная схема владения объектами, что очень редко приходится писать delete, в основном, только new . Может быть как раз эта продуманность и удобство Qt определила успешность проекта KDE? А так же компонентную модель, которая есть в KDE.


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


Достаточно неожиданно — языковой флейм оказался для меня весьма полезным.
Я вижу, пусть скромный, но все же результат: мы понимаем друг друга (хотя бы отчасти).
ИМХО, это даже важнее, чем соглашаться друг с другом. (Соглашаться можно и не понимая.)
Наверное, мне стоит взять небольшую паузу, и хорошо обдумать аргументы — как твои, так и Дмитрия.
У меня есть опасение, что в некоторых "пунктах разногласия" я достиг предела своей сегодняшней компетентности.
Несмотря на то, что я писал самые разные программы (большие и маленькие), работал в одиночку и в команде, у меня есть один значительный пробел в "жизненных университетах".
Я никогда не писал больших библиотек.
Вместе с тем, глядя на то, как устроены многие современные языки и библиотеки, сколько ошибок делается как при их проектировании, так и при использовании, и какие усилия требуются для освоения ряда современных программных (особенно — компонентных) технологий, я пришел к радикальным выводам (может быть — слишком радикальным ).
В это время я "наткнулся" на Оберон и был именно поражен (твое слово! ) его простотой, надежностью и красотой замысла.
Во основном этим и объясняется моя позиция.
Мне казалось, что на форумах RSDN мои оппоненты просто не видят идеи, которую Вирт вложил в Оберон.
Но, как оказалось, есть оппоненты (и ты, и Дмитрий, и еще ряд уважаемых мною "противников"), которые видят эту идею, но какие-то (возможно, недостаточно оцененные мной) факторы приводят их к другим выводам, не совпадающим с моими.
Короче, мне есть над чем подумать. Поэтому я возьму небольшую паузу.
Тем более, что есть еще ряд вопросов, уже не связанных с языком, которые мне бы хотелось обсудить на данном форуме.
(Это я снова о понятии ошибки и анализе всех стадий, на которых можно внести ошибку: анализе проблемной области, выборе модели, выборе типов данных и т.д. и т.п. Хочу в ближайшее время собрать мысли "в кучку" "родить" небольшой пост на эту тему. )

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[38]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 02.07.05 17:35
Оценка: 1 (1) +1
Здравствуйте, AVC, Вы писали:

AVC>Достаточно неожиданно — языковой флейм оказался для меня весьма полезным.

AVC>Я вижу, пусть скромный, но все же результат: мы понимаем друг друга (хотя бы отчасти).
AVC>ИМХО, это даже важнее, чем соглашаться друг с другом. (Соглашаться можно и не понимая.)

Возможно, именно это и есть самый главный результат.

AVC>Наверное, мне стоит взять небольшую паузу, и хорошо обдумать аргументы — как твои, так и Дмитрия.

AVC>У меня есть опасение, что в некоторых "пунктах разногласия" я достиг предела своей сегодняшней компетентности.
AVC>Несмотря на то, что я писал самые разные программы (большие и маленькие), работал в одиночку и в команде, у меня есть один значительный пробел в "жизненных университетах".
AVC>Я никогда не писал больших библиотек.
AVC>Вместе с тем, глядя на то, как устроены многие современные языки и библиотеки, сколько ошибок делается как при их проектировании, так и при использовании, и какие усилия требуются для освоения ряда современных программных (особенно — компонентных) технологий, я пришел к радикальным выводам (может быть — слишком радикальным ).
AVC>В это время я "наткнулся" на Оберон и был именно поражен (твое слово! ) его простотой, надежностью и красотой замысла.
AVC>Во основном этим и объясняется моя позиция.
AVC>Мне казалось, что на форумах RSDN мои оппоненты просто не видят идеи, которую Вирт вложил в Оберон.
AVC>Но, как оказалось, есть оппоненты (и ты, и Дмитрий, и еще ряд уважаемых мною "противников"), которые видят эту идею, но какие-то (возможно, недостаточно оцененные мной) факторы приводят их к другим выводам, не совпадающим с моими.
AVC>Короче, мне есть над чем подумать. Поэтому я возьму небольшую паузу.

Будем ждать. Со своей стороны хочу сказать, что спокойных и уравновешенных оппонентов на форумах RSDN на самом деле не так уж и много. Но они все же есть (пусть и в небольших количествах), что не может не радовать. Вспоминается фраза, уже не помню откуда: "Вы мой лучший враг!"

AVC>Тем более, что есть еще ряд вопросов, уже не связанных с языком, которые мне бы хотелось обсудить на данном форуме.

AVC>(Это я снова о понятии ошибки и анализе всех стадий, на которых можно внести ошибку: анализе проблемной области, выборе модели, выборе типов данных и т.д. и т.п. Хочу в ближайшее время собрать мысли "в кучку" "родить" небольшой пост на эту тему. )
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[37]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.07.05 13:38
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Вы знаете, определенная доля самоуверенности во мне, конечно же, есть. И конечно же, соблюдение конвенций не спасает на 100% от ошибок. Но на 95% спасает, а это уже приемлемый уровень. Ведь у меня две альтернативы:

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

CX>Я выбираю второй вариант.


А я оба.

CX> Более того, слова о достижении более высокой производительности — это не просто слова,


Ага. Это пустые слова.

Думаю что большинство программистов даже не подазревает сколько пустых циклов выполняют их программы. И вина в этом лежит отнюдь не на языках и компиляторах.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[38]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 03.07.05 13:52
Оценка: +3 -1 :)
Здравствуйте, VladD2, Вы писали:

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


CX>>Вы знаете, определенная доля самоуверенности во мне, конечно же, есть. И конечно же, соблюдение конвенций не спасает на 100% от ошибок. Но на 95% спасает, а это уже приемлемый уровень. Ведь у меня две альтернативы:

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

CX>>Я выбираю второй вариант.


VD>А я оба.


С чем тебя и поздравляю. Твой выбор.

CX>> Более того, слова о достижении более высокой производительности — это не просто слова,


VD>Ага. Это пустые слова.


Без комментариев.

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


Да что там, наверняка даже эти самые программисты не подозревают, отчего программы вообще работают. Наверняка среди программистов бытует мнение, что внутри этих железяк (компьютеров) злой дух сидит — называется странным демоническим именем Процессор! И что этот Процессор вытворяет с бедными программами — описанию не поддается! Он их выполняет!




Пришел Влад. С этого момента спокойная дискуссия превратится в яростный флейм с блеском фанатизма в глазах. Но я устраняюсь — не люблю фанатиков, пусть даже и неглупых.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[39]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.07.05 22:22
Оценка: -1
Здравствуйте, CrystaX, Вы писали:

CX>Пришел Влад. С этого момента спокойная дискуссия превратится в яростный флейм с блеском фанатизма в глазах. Но я устраняюсь — не люблю фанатиков, пусть даже и неглупых.


Не... спокойный безосновательный треп заканчивается.

Тут уже была куча тестов и как-то не вдино, чтобы они показали какое-то серьезное приемущество в скорости неуправляемого кода. Сдается мне, что все таки тормоза в приложениях в основном являются следствием плохой прокладки... между креслом и монитором. И если эта прокладка начнет тратить время не только на вылов глюков, а еще на поиск более производительных алгоритмов и оптимизацию производительности, то толку будет больше. И управляемый код ту ей очень поможет.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 04.07.05 07:21
Оценка: 1 (1) +1
Здравствуйте, CrystaX, Вы писали:

CX>>>Так что скажете? Что есть в Обероне такого, что может сильно облегчить мне жизнь как программисту (или даже заставит по-новому взглянуть на суть программирования вообще)?


AVC>>Подумаю, "поскриплю" мозгами.


CX>Ок, буду ждать.


А я буду думать.
Но пока я думаю, все же отреагирую на некоторые Ваши реплики.

CX>>>Алексей, согласитесь все же, что все это не имеет ни малейшего отношения к языку. Быть может, для Вас заданный мною вопрос и прозвучал наивно, но для меня предыдущий текст звучит ничуть не менее наивно.


AVC>>Может быть.

AVC>>А, может быть, и нет.
AVC>>Между Обероном-языком и Обероном-средой (и Обероном-системой) есть связь.

CX>Но мы ведь говорим об Обероне-языке, а не об Обероне-системе?


AVC>>Ничего подобного я не видел в системах, написанных на Си.


CX>Хмм... А как же Unix? Типичнейшая C-среда. Да, конечно, если говорить о GUI и прочих рюшечках, то этого нет. Но мне, честно говоря, GUI абсолютно не важен. Мне очень нравиться высказывание Денниса Ритчи по этому поводу: "UNIX — это очень простая и гибкая операционная система. Правда, для того, чтобы понять и принять эту простоту, требуется гений или, как минимум, программист"


К UNIX, как среде программирования, я отношусь очень хорошо.
Скажу, хотя бы, что каждый день пользуюсь инструментами, разработанными в этой программистской среде: редактирую программы в vi, использую в работе yacc, lex и т.д. И совсем не по причине фанатизма или эксцентричности. Просто для моих задач (создание систем программирования) эта среда подходит идеально.
Поэтому, когда я говорю о достоинствах обероновской среды, мне есть с чем сравнивать.
Некоторые (лучшие) особенности UNIX свойственны также и обероновской среде.
Например, Оберон-система так же строится из маленьких кусочков, хорошо выполняющих свою задачу и способных интегрироваться для решения больших задач. Только для интеграции используется единое адресное пространство (Вы можете обмениваться данными с нужным модулем напрямую), а не pipelines, как в UNIX. (ИМХО, многие особенности UNIX являются следствием того, что оперативная память в используемых Томпсоном и Ритчи компьютерах была слишком мала.)
И высказывание Ритчи вполне подходит не только к UNIX, но и к Оберону.
Возможно (трудно детально разобраться в самом себе ), что причины моего хорошего отношения к UNIX и Оберону одни и те же (или, по крайней мере, сходные).
Но в обероновской среде действительно есть некоторые "фичи", которых я не видел в системах, написанных на Си.

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


В Ваших словах есть резон.
Но когда я говорю о среде программирования, я имею в виду не "навороты" какого-то отдельно взятого IDE.
Вы сами дали мне хороший пример среды програмирования: UNIX.
Одна из книг Кернигана и Пайка так и называется: "UNIX — универсальная среда программирования" (the UNIX programming enviroment).
Свойства UNIX не сводятся к свойсвам отдельных программ. Здесь важен именно системный эффект.
Поэтому я и не могу согласиться с тем, что не надо апеллировать к свойствам среды.
Язык Оберон был создан для и в процессе создания операционной системы Оберон.
И поэтому был спроектирован так, чтобы обеспечивать требуемые системные качества и тот системный эффект, что роднит его с UNIX.
Почему же я должен об этом молчать?
Вот Си++ был создан для того, чтобы сохранить высокую эффективность кода при использовании объектно-ориентированного программирования.
Вы же не "стесняетесь" приводить высокую эффективность кода Си++ в качестве довода.
Но у всего есть своя цена, свои издержки.
Си++ был изначально рассчитан именно на создание отдельных (stand-alone) программ, поэтому и не имеет того системного эффекта, который есть у Оберона.

AVC>>Размер компилятора убеждает больше.


CX>Честно говоря, меня не убеждает. Я, например, и на ассемблерах, бывало, писал — так там размер транслятора и того меньше. И что? О чем это говорит? Да ровным счетом ни о чем.


Не могу здесь с Вами согласиться.
Язык высокого уровня — это не просто ассемблер.
Он предоставляет дополнительные возможности, которых ассемблер не дает.
Поэтому имеет смысл сравнивать только компиляторы языков сходного уровня функциональности.
В Обероне значение дроби функциональность/сложность превосходит аналогичное значение для большинства языков программирования (может, даже для всех; но этого я утверждать не стану, т.к., разумеется, не знаю всех языков).
Чтобы показать, почему я не принимаю Ваш аргумент, доведу его до абсурда и замечу, что если бы Вы писали прямо в машинных кодах (моя мама когда-то писала ), то Вам бы и ассемблер не понадобился.

AVC>>Но представьте себе, что весь код (а не отдельный небольшой фрагмент) такой!

AVC>>Читателю программы, ИМХО, будет легче сразу повеситься!

CX>Здесь мы опять переходим на обсуждение некого гипотетического "читателя программы", который к тому же (гипотетически!) недостаточно грамотен, чтобы разобраться в коде, даже предварительно почитав документ "Project design"! Однако, мне как-то неинтересно обсуждать этого самого читателя. Прямо как у Стругацких: "Ах, дурак, какой ты умный! Какой ты хороший, дурак! Не беспокойся ни о чем, дурак!"


Я исхожу из того, что чтение программ зачастую является более трудной задачей, чем их написание.
При чтении иных программ мозгам прямо-таки приходится становиться раком.
Поэтому "узкое место" я вижу именно в читабельности программ.
Я частенько сталкиваюсь с ситуациями, когда программы не модифицируются, а заново переписываются, настолько трудным кажется программисту труд чтения чужих программ.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[37]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 04.07.05 08:07
Оценка: +1
Здравствуйте, CrystaX, Вы писали:

AVC>>Между Обероном-языком и Обероном-средой (и Обероном-системой) есть связь.

CX>Но мы ведь говорим об Обероне-языке, а не об Обероне-системе?

Без знакомства с Оберон-системой Оберон как язык не производит должного впечатления. Так же, как и Smalltalk, Java или C#. Представьте любой из этих языков как средство разработки на голом Win(Unix)Api.
Re[38]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 04.07.05 08:14
Оценка:
Здравствуйте, AVC, Вы писали:

CX>>Хмм... А как же Unix? Типичнейшая C-среда. Да, конечно, если говорить о GUI и прочих рюшечках, то этого нет. Но мне, честно говоря, GUI абсолютно не важен. Мне очень нравиться высказывание Денниса Ритчи по этому поводу: "UNIX — это очень простая и гибкая операционная система. Правда, для того, чтобы понять и принять эту простоту, требуется гений или, как минимум, программист"


AVC>К UNIX, как среде программирования, я отношусь очень хорошо.

AVC>Скажу, хотя бы, что каждый день пользуюсь инструментами, разработанными в этой программистской среде: редактирую программы в vi, использую в работе yacc, lex и т.д. И совсем не по причине фанатизма или эксцентричности. Просто для моих задач (создание систем программирования) эта среда подходит идеально.
AVC>Поэтому, когда я говорю о достоинствах обероновской среды, мне есть с чем сравнивать.
AVC>Некоторые (лучшие) особенности UNIX свойственны также и обероновской среде.
AVC>Например, Оберон-система так же строится из маленьких кусочков, хорошо выполняющих свою задачу и способных интегрироваться для решения больших задач. Только для интеграции используется единое адресное пространство (Вы можете обмениваться данными с нужным модулем напрямую), а не pipelines, как в UNIX. (ИМХО, многие особенности UNIX являются следствием того, что оперативная память в используемых Томпсоном и Ритчи компьютерах была слишком мала.)
AVC>И высказывание Ритчи вполне подходит не только к UNIX, но и к Оберону.
AVC>Возможно (трудно детально разобраться в самом себе ), что причины моего хорошего отношения к UNIX и Оберону одни и те же (или, по крайней мере, сходные).
AVC>Но в обероновской среде действительно есть некоторые "фичи", которых я не видел в системах, написанных на Си.

Видимо, я просто не замечаю этих фич. "Все есть документ"? Не могу сказать, что эта фича мне нравится. Что еще?

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


AVC>В Ваших словах есть резон.

AVC>Но когда я говорю о среде программирования, я имею в виду не "навороты" какого-то отдельно взятого IDE.
AVC>Вы сами дали мне хороший пример среды програмирования: UNIX.
AVC>Одна из книг Кернигана и Пайка так и называется: "UNIX — универсальная среда программирования" (the UNIX programming enviroment).

Именно с этой книги началось мое знакомство с UNIX.

AVC>Свойства UNIX не сводятся к свойсвам отдельных программ. Здесь важен именно системный эффект.

AVC>Поэтому я и не могу согласиться с тем, что не надо апеллировать к свойствам среды.
AVC>Язык Оберон был создан для и в процессе создания операционной системы Оберон.
AVC>И поэтому был спроектирован так, чтобы обеспечивать требуемые системные качества и тот системный эффект, что роднит его с UNIX.
AVC>Почему же я должен об этом молчать?

Видимо, мы говорим о разных вещах. Насколько я понял, мы говорим о языках. Если бы я приводил преимущества UNIX как среды, но при этом не хотел бы ничего слышать об Оберон-среде (тот же Blackbox, например), очевидно, я был бы необъективен. Подробнее см. ниже.

AVC>Вот Си++ был создан для того, чтобы сохранить высокую эффективность кода при использовании объектно-ориентированного программирования.

AVC>Вы же не "стесняетесь" приводить высокую эффективность кода Си++ в качестве довода.
AVC>Но у всего есть своя цена, свои издержки.
AVC>Си++ был изначально рассчитан именно на создание отдельных (stand-alone) программ, поэтому и не имеет того системного эффекта, который есть у Оберона.

Именно так. C++ (как, впрочем, и C) как язык системного эффекта не имеет. Он начинает проявляться только при использовании определенных технологий и в определенных средах (что, впрочем, все равно отношения к языку не имеет).
В случае Оберона же (как языка) единственное, что в нем относится к среде, это модульность. Ок, я согласен рассматривать эту его возможность как преимущество (о котором, впрочем, тоже можно спорить). Но говорить об IDE и о том, что в ней можно линки вставлять — не могу воспринять это как преимущество языка.

AVC>Не могу здесь с Вами согласиться.

AVC>Язык высокого уровня — это не просто ассемблер.
AVC>Он предоставляет дополнительные возможности, которых ассемблер не дает.
AVC>Поэтому имеет смысл сравнивать только компиляторы языков сходного уровня функциональности.
AVC>В Обероне значение дроби функциональность/сложность превосходит аналогичное значение для большинства языков программирования (может, даже для всех; но этого я утверждать не стану, т.к., разумеется, не знаю всех языков).
AVC>Чтобы показать, почему я не принимаю Ваш аргумент, доведу его до абсурда и замечу, что если бы Вы писали прямо в машинных кодах (моя мама когда-то писала ), то Вам бы и ассемблер не понадобился.

Совершенно верно! И тогда размер транслятора был бы 0! Но было бы от этого удобнее? Очевидно, что нет. Это я к тому, что размер компилятора не является доводом вообще.

CX>>Здесь мы опять переходим на обсуждение некого гипотетического "читателя программы", который к тому же (гипотетически!) недостаточно грамотен, чтобы разобраться в коде, даже предварительно почитав документ "Project design"! Однако, мне как-то неинтересно обсуждать этого самого читателя. Прямо как у Стругацких: "Ах, дурак, какой ты умный! Какой ты хороший, дурак! Не беспокойся ни о чем, дурак!"


AVC>Я исхожу из того, что чтение программ зачастую является более трудной задачей, чем их написание.

AVC>При чтении иных программ мозгам прямо-таки приходится становиться раком.
AVC>Поэтому "узкое место" я вижу именно в читабельности программ.
AVC>Я частенько сталкиваюсь с ситуациями, когда программы не модифицируются, а заново переписываются, настолько трудным кажется программисту труд чтения чужих программ.

Это только для неподготовленного (и, что греха таить, недисциплинированного) программиста. У меня был опыт практически полного переписывания кода, но каждый раз это случалось не из-за трудностей в понимании, а из-за необходимости изменения архитектуры.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[38]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 04.07.05 08:16
Оценка:
Здравствуйте, Трурль, Вы писали:

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


AVC>>>Между Обероном-языком и Обероном-средой (и Обероном-системой) есть связь.

CX>>Но мы ведь говорим об Обероне-языке, а не об Обероне-системе?

Т>Без знакомства с Оберон-системой Оберон как язык не производит должного впечатления. Так же, как и Smalltalk, Java или C#. Представьте любой из этих языков как средство разработки на голом Win(Unix)Api.


Я как раз на днях ознакомился с Оберон-системой (Blackbox). Не скажу, что мое восприятие языка от этого изменилось. Впрочем, поживем — увидим.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[39]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 04.07.05 09:04
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Я как раз на днях ознакомился с Оберон-системой (Blackbox). Не скажу, что мое восприятие языка от этого изменилось. Впрочем, поживем — увидим.


Blackbox – несколько не то. Там своя философия, ближе к ОО-мейнстриму. Не стану утверждать, что он хуже чем Оберон но, во всяком случае, не столь своеобразен.
Например, в Обероне нет методов. Его за это в свое время много критиковали и вынудили таки добавить в Оберон-2 "процедуры, связанные с типами". Между тем, Вирт не стал включать методы в язык, потому что они не понадобились при разработке системы.
Re[40]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 04.07.05 09:05
Оценка:
Здравствуйте, Трурль, Вы писали:

CX>>Я как раз на днях ознакомился с Оберон-системой (Blackbox). Не скажу, что мое восприятие языка от этого изменилось. Впрочем, поживем — увидим.


Т>Blackbox – несколько не то. Там своя философия, ближе к ОО-мейнстриму. Не стану утверждать, что он хуже чем Оберон но, во всяком случае, не столь своеобразен.

Т>Например, в Обероне нет методов. Его за это в свое время много критиковали и вынудили таки добавить в Оберон-2 "процедуры, связанные с типами". Между тем, Вирт не стал включать методы в язык, потому что они не понадобились при разработке системы.

Ок. На что, в таком случае, Вы посоветовали бы обратить внимание?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re: Что толку в Ада если Ариан 5 все равно упал
От: Pavel Dvorkin Россия  
Дата: 04.07.05 09:14
Оценка: +2
Здравствуйте, eao197, Вы писали:

E>Что-то в этой ветке часто упоминается, что есть языки, в которых выход за пределы массива четко и точно отлавливается в run-time. И говорится, что это круто, и что из-за отсутствия таковой возможности C/C++ must die!


Насчет C/C++ must die — как говорится, no comments, потому как комментироват чушь не хочется.

А вот насчет того, что есть языки с контролем выхода за пределы массива — не надо никакой Java/Oberon, это еще Turbo Pascal умел. Разумееется, для массивов описанных статически. И кстати, Compaq Fortran умеет , недавно сам убедился.

А вообще не слишком ли много уделяется внимания такой, в общем-то , несложной проблеме, как выход за пределы индекса ? Дело даже не в том, что это обычно не перехватывают. Дело в том, что типов ошибок море, и в большинстве случаев компилятор/среда помочь в их отлавливании не может. Ну, к примеру, плюс вместо минуса поставил или не ту переменную употребил. Если такие ошибки остались в программе — значит, она плохо оттестирована. Вот и все. И выход индекса — лишь одна из таких ошибок. А при отладке банальный ASSERT поможет эту ошибку найти.
With best regards
Pavel Dvorkin
Re[2]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 04.07.05 10:12
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А вот насчет того, что есть языки с контролем выхода за пределы массива — не надо никакой Java/Oberon, это еще Turbo Pascal умел. Разумееется, для массивов описанных статически.


А почему, собственно, "разумеется"?
Оберон и с динамическими многомерными массивами прекрасно справляется.

PD>А вообще не слишком ли много уделяется внимания такой, в общем-то , несложной проблеме, как выход за пределы индекса ?


Дело не только в выходе за пределы массива.
Практически вся работа с памятью в Си/Си++ ведется опасными средствами.

PD>Дело даже не в том, что это обычно не перехватывают. Дело в том, что типов ошибок море, и в большинстве случаев компилятор/среда помочь в их отлавливании не может. Ну, к примеру, плюс вместо минуса поставил или не ту переменную употребил. Если такие ошибки остались в программе — значит, она плохо оттестирована. Вот и все. И выход индекса — лишь одна из таких ошибок. А при отладке банальный ASSERT поможет эту ошибку найти.


Если бы с проблемами Си/Си++ можно было справиться банальными ASSERT!
Кто бы стал критиковать такой замечательный язык!
Но, увы, это не так. Не верите мне, спросите других Си++программистов, какими средствами они добиваются надежности своих программ. Почти всегда это весьма изобретательные и остроумные, но натужные решения простых, в общем-то, проблем.
А что касается конкретной Вашей рекомендации (ASSERT), то ничего против нее не имею.
Но только (по крайней мере, в чистом виде) не выручит она Вас в случае с массивом. Ведь массив в Си/Си++ в качестве параметра синтаксически неотличим от указателя (т.е. и есть указатель). Чем же поможет Вам ASSERT применительно к указателю, просто указателю?

А вообще-то, у нас здесь языковой флейм потихоньку (не все сразу ) сходит "на нет".
Оказывается, можем мы все-таки понимать друг друга.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[3]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 04.07.05 11:27
Оценка:
Здравствуйте, AVC, Вы писали:

AVC>Но только (по крайней мере, в чистом виде) не выручит она Вас в случае с массивом. Ведь массив в Си/Си++ в качестве параметра синтаксически неотличим от указателя (т.е. и есть указатель). Чем же поможет Вам ASSERT применительно к указателю, просто указателю?


Вообще-то в C++ указатель и массив — это разные вещи!

AVC>А вообще-то, у нас здесь языковой флейм потихоньку (не все сразу ) сходит "на нет".

AVC>Оказывается, можем мы все-таки понимать друг друга.

... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[4]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 04.07.05 18:30
Оценка:
Здравствуйте, CrystaX, Вы писали:

AVC>>Но только (по крайней мере, в чистом виде) не выручит она Вас в случае с массивом. Ведь массив в Си/Си++ в качестве параметра синтаксически неотличим от указателя (т.е. и есть указатель). Чем же поможет Вам ASSERT применительно к указателю, просто указателю?


CX>Вообще-то в C++ указатель и массив — это разные вещи!


В области видимости (scope) массива — несомненно.
Но при передаче массива в качестве параметра в другую функцию — уже нет.
Пример:
#include <cstdio>
#include <cassert>

void foo(int *p)
{
    assert(p != NULL); // для начала, перекрестясь, подстрахуемся с помощью assert; авось, поможет!
    // здесь какой-то код, работающий то ли с массивом, то ли с указателем.
    printf("%d\n", p[1023]); // например, так; ах, я кажется вышел за границу массива... но откуда мне было знать?
    delete p; // или так; ой, я "удалил" стековую переменную... какой все-таки Си++ сложный!  :) 
}

int main()
{
    int a[10]; // массив
    int *p;    // указатель;
    
    foo(a); // передаем массив
    p = new int;
    foo(p); // передаем указатель на int
    p = new int[10];
    foo(p); // передаем указатель (или все-таки массив? :) )
    return 0;
}

В Обероне (и не только), напротив, массив — всегда массив.
(Это что-то из детства:

Недаром люди говорят:
Солдат — всегда солдат!

)
Например:
PROCEDURE foo(VAR p: ARRAY OF INTEGER);
  VAR i: LONGINT;
BEGIN
  FOR i := 0 TO LEN(p)-1 DO
    Out.Int(p[i], 0); Out.Ln; (* совершенно безопасно *)
  END:
  p := NIL; (* ошибка компиляции *)
  NEW(p);   (* ошибка компиляции *)
END foo;

Разумеется, я привел эти шуточные примеры не для того, чтобы доказать, что Си++ — "плох", а Оберон — "хорош".
Надеюсь, мы все-таки переросли эту детскую "болезнь левизны".
Я только хотел проиллюстрировать свое утверждение о неотличимости (иногда) в Си/Си++ массива от указателя.

AVC>>А вообще-то, у нас здесь языковой флейм потихоньку (не все сразу ) сходит "на нет".

AVC>>Оказывается, можем мы все-таки понимать друг друга.

CX>


Взаимно!
Надеюсь скоро "родить" пост о проблемах надежности ПО.
Все как-то не хватает — то времени, то сосредоточенности...

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[5]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 04.07.05 19:03
Оценка: 6 (1) -1
Здравствуйте, AVC, Вы писали:

Может, перейдем на ты? Удобнее, да и форуму соответствует.

AVC>В области видимости (scope) массива — несомненно.

AVC>Но при передаче массива в качестве параметра в другую функцию — уже нет.
AVC>Пример:
[skipped]

А теперь попробуй так:

#include <cstdio>
#include <cassert>

template <size_t N>
void foo(int (&p)[N])
{
    assert(p != NULL); // для начала, перекрестясь, подстрахуемся с помощью assert; авось, поможет!
    // здесь какой-то код, работающий то ли с массивом, то ли с указателем.
    printf("%d\n", p[1023]); // например, так; ах, я кажется вышел за границу массива... но откуда мне было знать?
    delete p; // или так; ой, я "удалил" стековую переменную... какой все-таки Си++ сложный!  :) 
}

int main()
{
    int a[10]; // массив
    int *p;    // указатель;
    
    foo(a); // передаем массив
    p = new int;
    foo(p); // передаем указатель на int
    p = new int[10];
    foo(p); // передаем указатель (или все-таки массив? :) )
    return 0;
}


И попробуй скомпилировать это нормальным компилятором (Comeau C++ online подойдет). Узнаешь много нового

AVC>Разумеется, я привел эти шуточные примеры не для того, чтобы доказать, что Си++ — "плох", а Оберон — "хорош".

AVC>Надеюсь, мы все-таки переросли эту детскую "болезнь левизны".
AVC>Я только хотел проиллюстрировать свое утверждение о неотличимости (иногда) в Си/Си++ массива от указателя.

В данном случае ты воспользовался автоматическим приведением массива к указателю (array-to-pointer conversion), поэтому сетовать можешь только на себя. Кстати, это еще один довод в пользу неиспользования голых указателей. В случае, если бы там был смарт-пойнтер, даже этой проблемы не было бы.

AVC>>>А вообще-то, у нас здесь языковой флейм потихоньку (не все сразу ) сходит "на нет".

AVC>>>Оказывается, можем мы все-таки понимать друг друга.

CX>>


AVC>Взаимно!

AVC>Надеюсь скоро "родить" пост о проблемах надежности ПО.
AVC>Все как-то не хватает — то времени, то сосредоточенности...

Ничего страшного, времени у нас достаточно.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[6]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 04.07.05 20:12
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Может, перейдем на ты? Удобнее, да и форуму соответствует.


С удовольствием.
Да и то правда — какое там "Вы", когда Ариан-5 все-таки упал!

AVC>>В области видимости (scope) массива — несомненно.

AVC>>Но при передаче массива в качестве параметра в другую функцию — уже нет.
AVC>>Пример:
CX>[skipped]

CX>А теперь попробуй так:


CX>
CX>#include <cstdio>
CX>#include <cassert>

CX>template <size_t N>
CX>void foo(int (&p)[N])
CX>{
CX>    assert(p != NULL); // для начала, перекрестясь, подстрахуемся с помощью assert; авось, поможет!
CX>    // здесь какой-то код, работающий то ли с массивом, то ли с указателем.
CX>    printf("%d\n", p[1023]); // например, так; ах, я кажется вышел за границу массива... но откуда мне было знать?
CX>    delete p; // или так; ой, я "удалил" стековую переменную... какой все-таки Си++ сложный!  :) 
CX>}

CX>int main()
CX>{
CX>    int a[10]; // массив
CX>    int *p;    // указатель;
    
CX>    foo(a); // передаем массив
CX>    p = new int;
CX>    foo(p); // передаем указатель на int
CX>    p = new int[10];
CX>    foo(p); // передаем указатель (или все-таки массив? :) )
CX>    return 0;
CX>}
CX>


CX>И попробуй скомпилировать это нормальным компилятором (Comeau C++ online подойдет). Узнаешь много нового


Стыжусь, но я действительно этого не знал!
Comeau C++ online не потребовался — уже второй домашний компилятор Си++ (GNU C++) с этим справился.
К сожалению, код
    p = new int[10];
    foo(p); // передаем указатель (или все-таки массив? :) )

так и не скомпилировался. А ведь вроде бы — чем не массив?
У меня по ходу дела два вопроса.
1) Почему здесь все знатоки Си++ ссылаются, как правило, на Comeau C++?
(Помню, этим меня удивил еще Павел Кузнецов.)
Comeau C++ особенно продвинут? Или здесь важнее его доступность online?
2) Не растет ли в данном случае размер кода, если foo вызывается с массивами разной размерности?

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[7]: Что толку в Ада если Ариан 5 все равно упал
От: Кодт Россия  
Дата: 04.07.05 21:14
Оценка: 2 (2)
Здравствуйте, AVC, Вы писали:

AVC>К сожалению, код

AVC>
AVC>    p = new int[10];
AVC>    foo(p); // передаем указатель (или все-таки массив? :) )
AVC>

AVC>так и не скомпилировался. А ведь вроде бы — чем не массив?

Э, батенька! Указатель на массив и массив — это разные вещи. Это ещё Сергей Губанов разъяснял!

AVC>У меня по ходу дела два вопроса.

AVC>1) Почему здесь все знатоки Си++ ссылаются, как правило, на Comeau C++?
AVC>(Помню, этим меня удивил еще Павел Кузнецов.)
AVC>Comeau C++ особенно продвинут? Или здесь важнее его доступность online?

Один из наиболее соответвтвующих Стандарту компиляторов. (Хотя тоже есть бажки, но, в отличие от MS, он не занимается обратной совместимостью с хреновыми предшественниками).
Ну и онлайновость — приятный бонус.

AVC>2) Не растет ли в данном случае размер кода, если foo вызывается с массивами разной размерности?


Вообще говоря, если попрактиковать жёсткую типизацию, то проблем не будет.
template<class T>
class array_t
{
  typedef T* iterator; // кому хочется - прикручивайте онлайновые проверки
  size_t size() const { return e_-b_; }
  iterator begin() const { return b_; }
  iterator end() const { return e_; }

  array_t(T* b, T* e) : b_(b), e_(e) { assert(b && e && b<=e); }

  template<int N>
  array_t(T (&arr)[N]) : b_(arr), e_(arr+N) {}
private:
  T *b_, *e_; // наследие Си - массив как указатель - тщательно спрятано
};

template<class T>
array_t<T> array(T* arr, int N) { return array_t<T>(arr,arr+N); } // для явного приведения; пользоваться только в случае крайней нужды!

template<class T>
array_t<T> array(T* arr, T* end) { return array_t<T>(arr,end); } // для явного приведения; пользоваться только в случае крайней нужды!

template<class T>
array_t<T> new_array(size_t n) { T* arr=new T[n]; return array_t<T>(arr,arr+N); } // создавать динамически? извольте-с

template<class T>
void delete_array(array_t<T> arr) { delete[] arr.begin(); } // ну там френды-шменды, разумеется. Не так уж влоб

void foo(array_t<int> arr); // это нешаблонная функция

int main()
{
  int x[10];
  int* y = x; // бардак-с! тяжкое legacy наследие

  array_t<int> z = new_array(10);

  foo(x);
  foo(array(y,10));
  foo(z);

  delete_array(z); // это мы по-простому, без умных указателей.
}
Перекуём баги на фичи!
Re[8]: Что толку в Ада если Ариан 5 все равно упал
От: Кодт Россия  
Дата: 04.07.05 21:26
Оценка:
<>

Понятно, что такие изыски — это заделывание дыр, оставшихся от голого Си.
Типы и конструкции типов, которые в других языках встроены в синтаксис, можно/нужно воспроизвести в виде шаблонов классов.
По сути, разработчик шаблонной библиотеки повторяет работу, которую делает разработчик компилятора другого языка.

Кроме того, разработчик шаблонной библиотеки делает шлюзы для совместимости с примитивными типами (массивами, массивами как указателями, строками как массивами, строками как указателями) — чтобы можно было состыковывать с литералами и с legacy-кодом.
(Если бы std::string не имел конвертора из const char*, было бы сущее мучение создавать строки; как, впрочем, и набивать строковый литерал в виде массива символов).
Перекуём баги на фичи!
Re[8]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 04.07.05 23:59
Оценка:
Здравствуйте, Кодт, Вы писали:

AVC>>К сожалению, код

AVC>>
AVC>>    p = new int[10];
AVC>>    foo(p); // передаем указатель (или все-таки массив? :) )
AVC>>

AVC>>так и не скомпилировался. А ведь вроде бы — чем не массив?

К>Э, батенька! Указатель на массив и массив — это разные вещи. Это ещё Сергей Губанов разъяснял!


А есть способ создать указатель на массив в динамической памяти, не прибегая к явному приведению типа?
int (*p)[10] = ((*)[10]) new int[10]; // радует также возможность употребить одну и ту же константу трижды :)

Посмотрим, решает ли все проблемы введение указателя на массив.

Допустим, я хочу вызвать упомянутую процедуру foo
PROCEDURE foo(a: ARRAY OF INTEGER);
BEGIN
END foo;

из обероновского кода, передав в качестве параметра открытый массив, расположенный в куче.
Все просто:
PROCEDURE test_foo(size: INTEGER);
  VAR a: ARRAY 10 OF INTEGER;
    p: POINTER TO ARRAY OF INTEGER; (* указатель на открытый массив *)
BEGIN
  foo(a);       (* все хорошо *)
  NEW(p, size); (* создаем массив заранее неизвестного размера *)
  foo(p^);      (* все еще лучше :) *)
END test_foo;

Здесь нет никаких проблем, причем в любом случае массив остается массивом.

А что же с попыткой передать в функцию
template <size_t N>
void foo(int (&p)[N])
{
}

открытый массив, расположенный в динамической памяти, не прибегая к новым темплитам и/или классам?
Сделаем по аналогии с Обероном (хотя все-таки потребуется явное приведение типа):
void test_foo(size_t size)
{
    int a[10];
    int (*p)[size] = (int (*)[size]) new int[size];
    foo(a);
    // пока все хорошо
    foo(*p); // а здесь у меня случился кряк: внутренняя ошибка компилятора 243
}

Ай, получил сообщение компилятора (GNU C++):

Internal compiler error 243.

К чему бы это? Наверное, к дождю. Уже голова болит от того, что даже такая мелочь здесь проблема.
Может, какому-нибудь компилятору Си++ (например, Comeau C++) повезло бы здесь больше? Но выяснить это уже нет сил.

AVC>>У меня по ходу дела два вопроса.

AVC>>1) Почему здесь все знатоки Си++ ссылаются, как правило, на Comeau C++?
AVC>>(Помню, этим меня удивил еще Павел Кузнецов.)
AVC>>Comeau C++ особенно продвинут? Или здесь важнее его доступность online?

К>Один из наиболее соответвтвующих Стандарту компиляторов. (Хотя тоже есть бажки, но, в отличие от MS, он не занимается обратной совместимостью с хреновыми предшественниками).

К>Ну и онлайновость — приятный бонус.

Спасибо за информацию!
А что касается "совместимости с хреновыми предшественниками", то разве только MS этим занимается?
Да весь Си++ на этом выстроен, как Петербург на болоте!

AVC>>2) Не растет ли в данном случае размер кода, если foo вызывается с массивами разной размерности?


К>Вообще говоря, если попрактиковать жёсткую типизацию, то проблем не будет.

К>
К>template<class T>
К>class array_t
К>{
К>  typedef T* iterator; // кому хочется - прикручивайте онлайновые проверки
К>  size_t size() const { return e_-b_; }
К>  iterator begin() const { return b_; }
К>  iterator end() const { return e_; }

К>  array_t(T* b, T* e) : b_(b), e_(e) { assert(b && e && b<=e); }

К>  template<int N>
К>  array_t(T (&arr)[N]) : b_(arr), e_(arr+N) {}
К>private:
К>  T *b_, *e_; // наследие Си - массив как указатель - тщательно спрятано
К>};

К>template<class T>
К>array_t<T> array(T* arr, int N) { return array_t<T>(arr,arr+N); } // для явного приведения; пользоваться только в случае крайней нужды!

К>template<class T>
К>array_t<T> array(T* arr, T* end) { return array_t<T>(arr,end); } // для явного приведения; пользоваться только в случае крайней нужды!

К>template<class T>
К>array_t<T> new_array(size_t n) { T* arr=new T[n]; return array_t<T>(arr,arr+N); } // создавать динамически? извольте-с

К>template<class T>
К>void delete_array(array_t<T> arr) { delete[] arr.begin(); } // ну там френды-шменды, разумеется. Не так уж влоб

К>void foo(array_t<int> arr); // это нешаблонная функция

К>int main()
К>{
К>  int x[10];
К>  int* y = x; // бардак-с! тяжкое legacy наследие

К>  array_t<int> z = new_array(10);

К>  foo(x);
К>  foo(array(y,10));
К>  foo(z);

К>  delete_array(z); // это мы по-простому, без умных указателей.
К>}
К>


Как говорила девочка из одной книжки: "Все чудесатее и чудесатее!"

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[3]: Что толку в Ада если Ариан 5 все равно упал
От: Pavel Dvorkin Россия  
Дата: 05.07.05 05:45
Оценка: +2
Здравствуйте, AVC, Вы писали:

AVC>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>А вот насчет того, что есть языки с контролем выхода за пределы массива — не надо никакой Java/Oberon, это еще Turbo Pascal умел. Разумееется, для массивов описанных статически.


AVC>А почему, собственно, "разумеется"?

AVC>Оберон и с динамическими многомерными массивами прекрасно справляется.

"Разумеется" относится к Турбо Паскалю.


AVC>Дело не только в выходе за пределы массива.

AVC>Практически вся работа с памятью в Си/Си++ ведется опасными средствами.

Именно благодаря этому код на C/C++ столь эффективен.

AVC>А что касается конкретной Вашей рекомендации (ASSERT), то ничего против нее не имею.

AVC>Но только (по крайней мере, в чистом виде) не выручит она Вас в случае с массивом. Ведь массив в Си/Си++ в качестве параметра синтаксически неотличим от указателя (т.е. и есть указатель). Чем же поможет Вам ASSERT применительно к указателю, просто указателю?

К просто указателю — ничем. Но если он (я это знаю) показывает на область памяти, которую я рассматриваю как массив, то он поможет, так как размер мне известен, а указатель всегда индексируется. Проверьте индекс, и все дела.
Если же указатель показывает не на массив, то индексы здесь ни при чем.
With best regards
Pavel Dvorkin
Re[9]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 05.07.05 05:53
Оценка: 1 (1) +1
Здравствуйте, AVC, Вы писали:

AVC>К чему бы это? Наверное, к дождю. Уже голова болит от того, что даже такая мелочь здесь проблема.

AVC>Как говорила девочка из одной книжки: "Все чудесатее и чудесатее!"

Алексей, помнишь: "Это не дурдом, это особенность"

Просто для того, чтобы не забивать себе голову такими проблемами, нужно использовать библиотеки классов и шаблонов вместо привычных C-ных конструкций. Тот же STL, например. Берем std::vector<int> и у нас нет проблем с приведенными примерами вообще.

Помню, что когда прочитал 3-е издание Страуструпа, то понял, что C++ стал совсем другим языком. Который уже нужно использовать совсем не так, как "C с классами".
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[7]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 05.07.05 06:17
Оценка: 12 (1)
Здравствуйте, AVC, Вы писали:

CX>>Может, перейдем на ты? Удобнее, да и форуму соответствует.


AVC>С удовольствием.

AVC>Да и то правда — какое там "Вы", когда Ариан-5 все-таки упал!

Точно!

AVC>Стыжусь, но я действительно этого не знал!

AVC>Comeau C++ online не потребовался — уже второй домашний компилятор Си++ (GNU C++) с этим справился.
AVC>К сожалению, код
AVC>
AVC>    p = new int[10];
AVC>    foo(p); // передаем указатель (или все-таки массив? :) )
AVC>

AVC>так и не скомпилировался. А ведь вроде бы — чем не массив?
AVC>У меня по ходу дела два вопроса.
AVC>1) Почему здесь все знатоки Си++ ссылаются, как правило, на Comeau C++?
AVC>(Помню, этим меня удивил еще Павел Кузнецов.)
AVC>Comeau C++ особенно продвинут? Или здесь важнее его доступность online?

По этому поводу тебе уже Кодт ответил, но вставлю свои пять копеек и я. Дело в том, что Comeau C++ на сегодняшний день, пожалуй, самый лучший компилятор C++ в части соответствия стандарту. А также намного более интеллектуальный, чем другие. Например, на твой код (попытку обращения к 1023-му элементу 10-елементного массива) он выдает warning о возможности out of bound.

"ComeauTest.c", line 9: warning: subscript out of range
      printf("%d\n", p[1023]); // например, так; ах, я кажется вышел за границу массива... но откуда мне было знать?


AVC>2) Не растет ли в данном случае размер кода, если foo вызывается с массивами разной размерности?


Да, для массива каждой размерности создается своя функция. Это общее свойство темплейтов. Если хочется этого избежать, надо использовать стандартные классы (vector и т.д.), как уже советовал Евгений (eao197). Да и вообще, использование голых массивов, как и голых указателей не должно быть повсеместным. Надо просто использовать стандартную библиотеку, которая, кстати, является частью языка, т.к. зафиксирована в стандарте.



Вообще, сегодняшний C++ — это совсем другой язык (не тот, что был 10 лет назад). Эти изменения, на первый взгляд, не так заметны, но как только начинаешь углубляться, они все более и более проявляются. У меня складывается такое впечатление (поправь меня, если я неправ), что ты, говоря о C++, говоришь не о современном языке, а о "C с классами". На самом деле я очень много людей встречал в своем близком окружении, которые не видят этой разницы. Да что там говорить, каких-нибудь три года назад я и сам был таким же.
В общем, у меня предложение. Ты говорил об идее, вложенной в Оберон, которую, как тебе казалось, не видят на этих форумах. Мы вроде сошлись на мнении, что идея видна и понятна, не так ли? Попытайся теперь понять идею, которая вложена в современный C++. Я потихоньку начал изучать Оберон (для общего развития), — почему бы тебе не взяться за изучение современного C++? А через некоторое время мы опять вернемся к этой теме и посмотрим, насколько изменились наши взгляды. Что скажешь?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[9]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 05.07.05 06:45
Оценка: 1 (1)
Здравствуйте, AVC, Вы писали:

Алексей, давай я твои примеры сейчас переделаю немного, ок?

AVC>А есть способ создать указатель на массив в динамической памяти, не прибегая к явному приведению типа?

AVC>
AVC>int (*p)[10] = ((*)[10]) new int[10]; // радует также возможность употребить одну и ту же константу трижды :) 
AVC>


Например, так:
vector<int> *p = new vector<int>(10);
// Конечно же, удалить тоже надо не забыть. А лучше всего воспользоваться смарт-пойнтером. Например, так:
auto_ptr<vector<int> > p(new vector<int>(10));
// Вот тут даже удалять не надо. Но остается проблема с семантикой передачи владения у auto_ptr.
// Хорошо, сделаем так:
boost::shared_ptr<vector<int> > p(new vector<int>(10));
// Тут уже можно копировать сколько угодно и куда хочешь. Но как же быть, если хочется избежать оверхеда
// от дополнительного выделения памяти для счетчика? Например, используя linked_ptr от Максима Егорушкина
// или другие, обеспечивающие иное поведение. В общем, на выбор пожаловаться нельзя.


AVC>Посмотрим, решает ли все проблемы введение указателя на массив.

[skipped]

А теперь так:
template <typename Array>
void foo(Array &p)
{
}

void test_foo(size_t size)
{
    vector<int> a(10);
    auto_ptr<vector<int> > p(new vector<int>(size));
    foo(a);  // Все работает
    foo(*p); // И здесь тоже!
}


AVC>Ай, получил сообщение компилятора (GNU C++):

AVC>

AVC>Internal compiler error 243.

AVC>К чему бы это? Наверное, к дождю. Уже голова болит от того, что даже такая мелочь здесь проблема.
AVC>Может, какому-нибудь компилятору Си++ (например, Comeau C++) повезло бы здесь больше? Но выяснить это уже нет сил.

Интересно, а какая версия GCC? Небось старичка используешь? Потому как у меня GCC 3.4.2 отругался на этот код как положено. Ты используешь run-time value в объявлении указателя на массив. Нельзя. Должна быть compile-time. Посмотри мой код — там эти проблемы решены, причем без всяких усилий с моей стороны — я просто использовал стандартную библиотеку.

К>>Один из наиболее соответвтвующих Стандарту компиляторов. (Хотя тоже есть бажки, но, в отличие от MS, он не занимается обратной совместимостью с хреновыми предшественниками).

К>>Ну и онлайновость — приятный бонус.

AVC>Спасибо за информацию!

AVC>А что касается "совместимости с хреновыми предшественниками", то разве только MS этим занимается?
AVC>Да весь Си++ на этом выстроен, как Петербург на болоте!

Ты путаешь две вещи:
1. Совместимость с C кодом (практически все компиляторы стараются этому соответствовать)
2. Совместимость с хреновыми предшественниками (более ранними и более плохими версиями компиляторов)
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[9]: Что толку в Ада если Ариан 5 все равно упал
От: Кодт Россия  
Дата: 05.07.05 09:07
Оценка: 1 (1) +2 :)))
Здравствуйте, AVC, Вы писали:

AVC>А что касается "совместимости с хреновыми предшественниками", то разве только MS этим занимается?

AVC>Да весь Си++ на этом выстроен, как Петербург на болоте!

Как петербуржец и сиплюсплюсник, я должен обидеться или возгордиться?

Насчёт чудесатости: необходимо и достаточно, чтобы
1) некто единожды написал библиотеку строгих типов с требуемой функциональностью
2) остальные пользовались именно ею, а не мешали в кучу с голыми сишными типами
STL + boost, большей частью, уже выполнили п.1. Осталось дело за малым — за п.2...

А тут уже дело привычки: если кому-то проще накопипастить
if(x==0) a0 = a0+1;
if(x==1) a1 = a1+1;
...
if(x==99) a99 = a99+1;
// вместо
if(x>=0&&x<=99) ++a[x];

(пример, адаптированный из книги "Жемчужины программирования" — только там было на Коболе)
то это лечится электричеством.
Перекуём баги на фичи!
Re[8]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 05.07.05 10:57
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Вообще, сегодняшний C++ — это совсем другой язык (не тот, что был 10 лет назад). Эти изменения, на первый взгляд, не так заметны, но как только начинаешь углубляться, они все более и более проявляются. У меня складывается такое впечатление (поправь меня, если я неправ), что ты, говоря о C++, говоришь не о современном языке, а о "C с классами". На самом деле я очень много людей встречал в своем близком окружении, которые не видят этой разницы. Да что там говорить, каких-нибудь три года назад я и сам был таким же.


В принципе, ты прав.
В основном, и я, и большинство ребят, пишущих у нас на Си++, используют его как "Си с классами".
Не совсем, конечно. Библиотекой стандартных шаблонов все-таки иногда пользуемся. (Но и от нее я не в восторге.)
Думаю, что вы с Евгением действительно нашли источник многих наших недоразумений.
Вероятно, "народный" (практикуемый не только "гуру") Си++ стал бурно меняться после принятия стандарта языка, когда я уже не так внимательно следил за его развитием.
Тому есть свои причины. У нас много сугубо прикладной работы, некоторые ребята — даже не профессиональные программисты, а просто пишущие на Си++ специалисты. Польза от новшеств языка для нас не слишком велика, а "накладные расходы" — напротив.
Еще мне кажется, что Си++ — уже не только (а по вашим примерам — и не столько ) язык процедурного и объектно-ориентированного программирования. Возможно, в него "затесались" элементы плохо знакомой мне парадигмы, например — функционального программирования.
Я охотно допускаю мысль, что новые черты языка делают его мощным орудием писателей библиотек.
Но, увы, пока не вижу реальной пользы для наших программистов. А вот головокружение от некоторых публикуемых вами трюков — действительно чувствую.

CX>В общем, у меня предложение. Ты говорил об идее, вложенной в Оберон, которую, как тебе казалось, не видят на этих форумах. Мы вроде сошлись на мнении, что идея видна и понятна, не так ли? Попытайся теперь понять идею, которая вложена в современный C++. Я потихоньку начал изучать Оберон (для общего развития), — почему бы тебе не взяться за изучение современного C++? А через некоторое время мы опять вернемся к этой теме и посмотрим, насколько изменились наши взгляды. Что скажешь?


Я думаю, это хорошая мысль.
Так честно. Хотя, боюсь. усилия, которые нам придется приложить, вряд ли будут равными.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[9]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 05.07.05 11:11
Оценка: 1 (1)
Здравствуйте, AVC, Вы писали:

AVC>В принципе, ты прав.

AVC>В основном, и я, и большинство ребят, пишущих у нас на Си++, используют его как "Си с классами".
AVC>Не совсем, конечно. Библиотекой стандартных шаблонов все-таки иногда пользуемся. (Но и от нее я не в восторге.)
AVC>Думаю, что вы с Евгением действительно нашли источник многих наших недоразумений.
AVC>Вероятно, "народный" (практикуемый не только "гуру") Си++ стал бурно меняться после принятия стандарта языка, когда я уже не так внимательно следил за его развитием.
AVC>Тому есть свои причины. У нас много сугубо прикладной работы, некоторые ребята — даже не профессиональные программисты, а просто пишущие на Си++ специалисты. Польза от новшеств языка для нас не слишком велика, а "накладные расходы" — напротив.
AVC>Еще мне кажется, что Си++ — уже не только (а по вашим примерам — и не столько ) язык процедурного и объектно-ориентированного программирования. Возможно, в него "затесались" элементы плохо знакомой мне парадигмы, например — функционального программирования.

Да, так и есть. Особенно если говорить о метапрограммировании на шаблонах.

AVC>Я охотно допускаю мысль, что новые черты языка делают его мощным орудием писателей библиотек.

AVC>Но, увы, пока не вижу реальной пользы для наших программистов. А вот головокружение от некоторых публикуемых вами трюков — действительно чувствую.

Реальная польза C++ (в современном его понимании) не видна сразу. Я тоже так думал довольно большое время. Но все же стоит попытаться ее увидеть.

CX>>В общем, у меня предложение. Ты говорил об идее, вложенной в Оберон, которую, как тебе казалось, не видят на этих форумах. Мы вроде сошлись на мнении, что идея видна и понятна, не так ли? Попытайся теперь понять идею, которая вложена в современный C++. Я потихоньку начал изучать Оберон (для общего развития), — почему бы тебе не взяться за изучение современного C++? А через некоторое время мы опять вернемся к этой теме и посмотрим, насколько изменились наши взгляды. Что скажешь?


AVC>Я думаю, это хорошая мысль.

AVC>Так честно. Хотя, боюсь. усилия, которые нам придется приложить, вряд ли будут равными.

В этом нет никаких сомнений — современный C++ выучить очень сложно. Но дело ведь в том, что его и не надо полностью изучать для того, чтоб увидеть новые стороны. К тому же, нас никто не торопит.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[10]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 05.07.05 11:15
Оценка:
Здравствуйте, eao197, Вы писали:

AVC>>К чему бы это? Наверное, к дождю. Уже голова болит от того, что даже такая мелочь здесь проблема.

AVC>>Как говорила девочка из одной книжки: "Все чудесатее и чудесатее!"

E>Алексей, помнишь: "Это не дурдом, это особенность"


E>Просто для того, чтобы не забивать себе голову такими проблемами, нужно использовать библиотеки классов и шаблонов вместо привычных C-ных конструкций. Тот же STL, например. Берем std::vector<int> и у нас нет проблем с приведенными примерами вообще.


E>Помню, что когда прочитал 3-е издание Страуструпа, то понял, что C++ стал совсем другим языком. Который уже нужно использовать совсем не так, как "C с классами".


Евгений, в этом пункте я согласен с тобой и с Дмитрием.
Действительно, Си++ сильно изменился.
Возможно, я просто отстал от его развития, как отстают от поезда. Вышел купить арбуз — и только ту-ту...
Тут вы оба правы.
Но я по прежнему считаю, что Си++ стал слишком сложным, что он сам во многом стал проблемой.
Понимаешь, я привык смотреть на предмет и сквозь язык. ИМХО, язык должен быть прозрачным и незаметным.
Именно так обстоит дело с Обероном.
Почти так было даже с Си++ как "Си с классами", которым я достаточно успешно пользуюсь уже много лет.
А сейчас — не так.
Я уверен, что большинство Си++программистов не умеет должным образом пользоваться новым Си++.
(Например, я не умею. Хотя, с некоторым усилием, все-таки понимаю ваши (твои, Дмитрия, Кодта) примеры. Но по прежнему есть чувство, что эта сложность неоправданная, чрезмерная.)
Библиотеки по прежнему пишут "гуру".
Что-то здесь не так...

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[11]: Что толку в Ада если Ариан 5 все равно упал
От: Кодёнок  
Дата: 05.07.05 11:27
Оценка: 1 (1) :))
AVC>Что-то здесь не так...

Ты не один это чувствуешь
Re[4]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 05.07.05 11:32
Оценка: 1 (1)
Здравствуйте, Pavel Dvorkin, Вы писали:

AVC>>Практически вся работа с памятью в Си/Си++ ведется опасными средствами.


PD>Именно благодаря этому код на C/C++ столь эффективен.


Опыт общения с различными программами заставляет меня усомниться в истинности данного высказывания.
Re[10]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 05.07.05 12:27
Оценка:
Здравствуйте, Кодт, Вы писали:

AVC>>А что касается "совместимости с хреновыми предшественниками", то разве только MS этим занимается?

AVC>>Да весь Си++ на этом выстроен, как Петербург на болоте!

К>Как петербуржец и сиплюсплюсник, я должен обидеться или возгордиться?


Как петербуржец — несомненно возгордиться!
А вот как сиплюсплюсник... (задумчиво) это как совесть подсказывает...

К>Насчёт чудесатости: необходимо и достаточно, чтобы

К>1) некто единожды написал библиотеку строгих типов с требуемой функциональностью
К>2) остальные пользовались именно ею, а не мешали в кучу с голыми сишными типами
К>STL + boost, большей частью, уже выполнили п.1. Осталось дело за малым — за п.2...

Если бы разумные правила были заложены в сам язык, а не только в библиотеки, то пункт 2 выполнялся бы автоматически.

К>А тут уже дело привычки: если кому-то проще накопипастить

К>
К>if(x==0) a0 = a0+1;
К>if(x==1) a1 = a1+1;
К>...
К>if(x==99) a99 = a99+1;
К>// вместо
К>if(x>=0&&x<=99) ++a[x];
К>

К>(пример, адаптированный из книги "Жемчужины программирования" — только там было на Коболе)
К>то это лечится электричеством.

Запоминающийся пример! (И хорошая книга.)
Ну вот, я видел такое раньше только на Коболе, а теперь — и на Си. Ну никакой разницы!

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[10]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 05.07.05 12:58
Оценка: :)
Здравствуйте, CrystaX, Вы писали:

CX>Алексей, давай я твои примеры сейчас переделаю немного, ок?


(подозрительно) Ну, OK.

AVC>>А есть способ создать указатель на массив в динамической памяти, не прибегая к явному приведению типа?

AVC>>
AVC>>int (*p)[10] = ((*)[10]) new int[10]; // радует также возможность употребить одну и ту же константу трижды :) 
AVC>>


CX>Например, так:

CX>
CX>vector<int> *p = new vector<int>(10);
CX>// Конечно же, удалить тоже надо не забыть. А лучше всего воспользоваться смарт-пойнтером. Например, так:
CX>auto_ptr<vector<int> > p(new vector<int>(10));
CX>// Вот тут даже удалять не надо. Но остается проблема с семантикой передачи владения у auto_ptr.
CX>// Хорошо, сделаем так:
CX>boost::shared_ptr<vector<int> > p(new vector<int>(10));
CX>// Тут уже можно копировать сколько угодно и куда хочешь. Но как же быть, если хочется избежать оверхеда
CX>// от дополнительного выделения памяти для счетчика? Например, используя linked_ptr от Максима Егорушкина
CX>// или другие, обеспечивающие иное поведение. В общем, на выбор пожаловаться нельзя.
CX>


AVC>>Посмотрим, решает ли все проблемы введение указателя на массив.

CX>[skipped]

CX>А теперь так:

CX>
CX>template <typename Array>
CX>void foo(Array &p)
CX>{
CX>}

CX>void test_foo(size_t size)
CX>{
CX>    vector<int> a(10);
CX>    auto_ptr<vector<int> > p(new vector<int>(size));
CX>    foo(a);  // Все работает
CX>    foo(*p); // И здесь тоже!
CX>}
CX>


+1
Как просто-то!
Где нам с Обероном чай пить...

AVC>>Ай, получил сообщение компилятора (GNU C++):

AVC>>

AVC>>Internal compiler error 243.

AVC>>К чему бы это? Наверное, к дождю. Уже голова болит от того, что даже такая мелочь здесь проблема.
AVC>>Может, какому-нибудь компилятору Си++ (например, Comeau C++) повезло бы здесь больше? Но выяснить это уже нет сил.

CX>Интересно, а какая версия GCC? Небось старичка используешь? Потому как у меня GCC 3.4.2 отругался на этот код как положено. Ты используешь run-time value в объявлении указателя на массив. Нельзя. Должна быть compile-time. Посмотри мой код — там эти проблемы решены, причем без всяких усилий с моей стороны — я просто использовал стандартную библиотеку.


Ты прав.
На работе у меня 3.4.2, как у тебя (но, увы, нет http ), а вот дома — пока еще старенький 2.95.
Ошибку я, конечно, сделал нарочно, из вредности.
Чтобы показать, что то твое решение еще было не вполне адекватное.
Что же касается стандартной библиотеки, то там есть свои подводные камни.
Я недавно приводил пример, когда нам потребовался трехмерный массив заранее неизвестных измерений для проведения небольшого эксперимента.
На Обероне — дело одной минуты, а вот с векторами провозились дольше.
Надо было использовать не reserve(), а resize().

AVC>>А что касается "совместимости с хреновыми предшественниками", то разве только MS этим занимается?

AVC>>Да весь Си++ на этом выстроен, как Петербург на болоте!

CX>Ты путаешь две вещи:

CX>1. Совместимость с C кодом (практически все компиляторы стараются этому соответствовать)
CX>2. Совместимость с хреновыми предшественниками (более ранними и более плохими версиями компиляторов)

(важно) Я не путаю. Я обобщаю.
P.S. Схожу куплю себе тортик — как-никак, юбилейный пост!

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[11]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 05.07.05 13:15
Оценка:
Здравствуйте, AVC, Вы писали:

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


CX>>Алексей, давай я твои примеры сейчас переделаю немного, ок?


AVC>(подозрительно) Ну, OK.




AVC>Ты прав.

AVC>На работе у меня 3.4.2, как у тебя (но, увы, нет http ), а вот дома — пока еще старенький 2.95.
AVC>Ошибку я, конечно, сделал нарочно, из вредности.
AVC>Чтобы показать, что то твое решение еще было не вполне адекватное.

На самом деле то было вовсе не решение. Я просто изменил сигнатуру функцию и предложил тебе посмотреть, что в таком случае скажет компилятор. Решение — это использовать стандартную библиотеку.

AVC>Что же касается стандартной библиотеки, то там есть свои подводные камни.

AVC>Я недавно приводил пример, когда нам потребовался трехмерный массив заранее неизвестных измерений для проведения небольшого эксперимента.
AVC>На Обероне — дело одной минуты, а вот с векторами провозились дольше.

Да как тебе сказать... Мне здесь ничего сложного не видится. На векторах — тоже дело одной минуты. Ну или если хочется обязательно массивы с ровным краем (а не с резаным, как может быть с векторами), то велосипед пишется за 2 минуты. Или используется готовый. Тут, скорее всего, не со стандартной библиотекой проблема, а с привычками.

AVC>Надо было использовать не reserve(), а resize().


Ну вот видишь! Все дело в чтении документации.

CX>>Ты путаешь две вещи:

CX>>1. Совместимость с C кодом (практически все компиляторы стараются этому соответствовать)
CX>>2. Совместимость с хреновыми предшественниками (более ранними и более плохими версиями компиляторов)

AVC>(важно) Я не путаю. Я обобщаю.

AVC>P.S. Схожу куплю себе тортик — как-никак, юбилейный пост!

Эээ... А что в нем юбилейного? Не заметил.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[4]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 05.07.05 13:44
Оценка: 3 (1) -2
Здравствуйте, Pavel Dvorkin, Вы писали:

AVC>>Дело не только в выходе за пределы массива.

AVC>>Практически вся работа с памятью в Си/Си++ ведется опасными средствами.

PD>Именно благодаря этому код на C/C++ столь эффективен.


Ненамного эффективнее Оберона.
Если отключить run-time проверки (хотя они в Обероне реализованы весьма эффективно — так спроектирован язык), то преимущества вообще нет.
Но я противник удаления проверок из кода.
А правда заключается в том, что Страуструп (ИМХО на сегодня , может измениться в будущем) изначально отказался от надежности ради (достаточно эфемерной) эффективности кода, а теперь это необходимое свойство пытается протащить "в окно" с помощью шаблонов, чрезмерно усложняя язык. Своих ошибок он признавать не хочет, благодаря чему выглядит в глазах наивной общественности "Страшилой мудрым". А ведь весь секрет в том, что в голове солома.

AVC>>А что касается конкретной Вашей рекомендации (ASSERT), то ничего против нее не имею.

AVC>>Но только (по крайней мере, в чистом виде) не выручит она Вас в случае с массивом. Ведь массив в Си/Си++ в качестве параметра синтаксически неотличим от указателя (т.е. и есть указатель). Чем же поможет Вам ASSERT применительно к указателю, просто указателю?

PD>К просто указателю — ничем. Но если он (я это знаю) показывает на область памяти, которую я рассматриваю как массив, то он поможет, так как размер мне известен, а указатель всегда индексируется. Проверьте индекс, и все дела.

PD>Если же указатель показывает не на массив, то индексы здесь ни при чем.

Я не понял. Откуда Вам известен размер массива?
Или у Вас в программе больше одного массива не водится?

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[5]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 05.07.05 14:47
Оценка: +2
Здравствуйте, AVC, Вы писали:

AVC>>>Дело не только в выходе за пределы массива.

AVC>>>Практически вся работа с памятью в Си/Си++ ведется опасными средствами.
PD>>Именно благодаря этому код на C/C++ столь эффективен.
AVC>Ненамного эффективнее Оберона.
AVC>Если отключить run-time проверки (хотя они в Обероне реализованы весьма эффективно — так спроектирован язык), то преимущества вообще нет.
AVC>Но я противник удаления проверок из кода.
AVC>А правда заключается в том, что Страуструп (ИМХО на сегодня , может измениться в будущем) изначально отказался от надежности ради (достаточно эфемерной) эффективности кода, а теперь это необходимое свойство пытается протащить "в окно" с помощью шаблонов, чрезмерно усложняя язык. Своих ошибок он признавать не хочет, благодаря чему выглядит в глазах наивной общественности "Страшилой мудрым". А ведь весь секрет в том, что в голове солома.

Да нет, ни к чему вводить такие проверки в качестве обязательного средства языка. Сразу же возникает вопрос: какие ещё проверки нужно ввести кроме контроля выхода за границы массива? Чем таким особенным массивы выделяются из класса наборов?

Это как раз и есть усложнение языка и усложнение жизни разработчикам компиляторов. Так что, тут Страуструп прав — язык должен предоставлять достаточные средства для разработки библиотек, а не пытаться решать "всё, что можно решить". Такие проблемы разумно пребросить разработчикам прикладных библиотек.

Потом, нередко пользуются таким трюком: помещают в -1-й элемент массива некоторую служебную информацию (например, так поступили в MFC::CString). Ну и наверни сюда ещё проверку на выход за границу, что получится? Хак?
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[6]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 05.07.05 16:00
Оценка: :)
Здравствуйте, Геннадий Васильев, Вы писали:

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


AVC>>>>Дело не только в выходе за пределы массива.

AVC>>>>Практически вся работа с памятью в Си/Си++ ведется опасными средствами.
PD>>>Именно благодаря этому код на C/C++ столь эффективен.
AVC>>Ненамного эффективнее Оберона.
AVC>>Если отключить run-time проверки (хотя они в Обероне реализованы весьма эффективно — так спроектирован язык), то преимущества вообще нет.
AVC>>Но я противник удаления проверок из кода.
AVC>>А правда заключается в том, что Страуструп (ИМХО на сегодня , может измениться в будущем) изначально отказался от надежности ради (достаточно эфемерной) эффективности кода, а теперь это необходимое свойство пытается протащить "в окно" с помощью шаблонов, чрезмерно усложняя язык. Своих ошибок он признавать не хочет, благодаря чему выглядит в глазах наивной общественности "Страшилой мудрым". А ведь весь секрет в том, что в голове солома.

ГВ>Да нет, ни к чему вводить такие проверки в качестве обязательного средства языка. Сразу же возникает вопрос: какие ещё проверки нужно ввести кроме контроля выхода за границы массива? Чем таким особенным массивы выделяются из класса наборов?


Массив находится в памяти. Когда мы адресуемся к элементу массива, как правило мы обращаемся к нему с заранее неизвестныи (вычисляемым) индексом. Да и размерность массива зачастую неизвестна на этапе компиляции. Чтобы программа по ошибке не испортила память вне массива, надо вставить проверку индекса.
Для этого компилятор должен знать, откуда извлечь информацию о массиве. Компилятор Оберона это знает, а компилятор Си++ — нет, потому что массив в Си++ передается как указатель, от которого ничего не добьешься — молчит как партизан.
Кроме индекса массива, в Обероне проверяются на NIL указатели и процедурные переменные. (Если они имеют значение, отличное от NIL, то их валидность гарантируется. В том числе — сборщиком мусора.)
Еще иногда требуется проверка динамического типа переменной. Для этого в Обероне достаточно одного сравнения.
Вот, пожалуй, и все необходимые проверки в Обероне. Можете видеть сами — все они связаны с безопасностью типов и требуют не более одного-двух (для индекса массива) сравнений.
Этого достаточно, чтобы компилятор гарантировал обращение с переменными только в соответствии с их типом (type safety).
Для исключения ошибок в вычислениях иногда желательны проверки на переполнение и т.п. В этом Оберон не отличается от других языков. Оберон позволяет как использовать, так и отключать подобные проверки. (Лично я против такого отключения.)

ГВ>Это как раз и есть усложнение языка и усложнение жизни разработчикам компиляторов. Так что, тут Страуструп прав — язык должен предоставлять достаточные средства для разработки библиотек, а не пытаться решать "всё, что можно решить". Такие проблемы разумно пребросить разработчикам прикладных библиотек.


Может быть, тогда разумно иметь два языка: для создателей библиотек и всех прочих?

ГВ>Потом, нередко пользуются таким трюком: помещают в -1-й элемент массива некоторую служебную информацию (например, так поступили в MFC::CString). Ну и наверни сюда ещё проверку на выход за границу, что получится? Хак?


Еще скорее — кряк.
Рассмотрим пример.
Создадим в динамической памяти массив объектов, для которых определен деструктор.
Чтобы обеспечить отработку деструкторов при удалении массива, Си++ сохранит прямо перед массивом число элементов в массиве.
Тем самым поддерживается оператор
delete [] p;

Кажется, все хорошо. Но ведь Си++ не обеспечивает type safety. Следовательно, я могу по ошибке присвоить какое-нибудь значение элементу p[i], где i, например, может быть равным -1.
Последствия непредсказуемы.
Что это — хак, кряк? Или хрюк? Применительно к Страуструпу — скорее последнее.
(Ничего не могу с собой поделать. Я его очень не люблю. Я вообще не люблю жуликов. Но я постараюсь освоить современный Си++; может быть, пойму, почему Си++ — это хорошо. И буду ходить по улицам и распевать "Харе, Кришна!")

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[7]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 05.07.05 16:30
Оценка: -1
Здравствуйте, AVC, Вы писали:

AVC>>>А правда заключается в том, что Страуструп (ИМХО на сегодня , может измениться в будущем) изначально отказался от надежности ради (достаточно эфемерной) эффективности кода, а теперь это необходимое свойство пытается протащить "в окно" с помощью шаблонов, чрезмерно усложняя язык. Своих ошибок он признавать не хочет, благодаря чему выглядит в глазах наивной общественности "Страшилой мудрым". А ведь весь секрет в том, что в голове солома.


ГВ>>Да нет, ни к чему вводить такие проверки в качестве обязательного средства языка. Сразу же возникает вопрос: какие ещё проверки нужно ввести кроме контроля выхода за границы массива? Чем таким особенным массивы выделяются из класса наборов?


AVC>Массив находится в памяти. Когда мы адресуемся к элементу массива, как правило мы обращаемся к нему с заранее неизвестныи (вычисляемым) индексом. Да и размерность массива зачастую неизвестна на этапе компиляции. Чтобы программа по ошибке не испортила память вне массива, надо вставить проверку индекса.


Куда? Массив может быть закопан в глубине абстракции, а проверка индекса выполняться на несколько уровней выше. Ошибка по индексу приведёт к выкидыванию исключения и отказу в работе алгоритма более высокого уровня. Следовательно, проверять индекс нужно до его использования, следовательно, проверять индекс на уровне массива никакой необходимости нет — всё равно он ему "приходит" уже заведомо корректным.

AVC>Для этого компилятор должен знать, откуда извлечь информацию о массиве. Компилятор Оберона это знает, а компилятор Си++ — нет, потому что массив в Си++ передается как указатель, от которого ничего не добьешься — молчит как партизан.


Это наследие C и, кроме того, остаётся открытым вопрос: как конкретно должен быть реализован массив? std::vector<> — то частное решение, хоть и стандартизированное.

AVC>Кроме индекса массива, в Обероне проверяются на NIL указатели и процедурные переменные. (Если они имеют значение, отличное от NIL, то их валидность гарантируется. В том числе — сборщиком мусора.)


Опять таки, проверки на NULL (NIL) по месту вызова нужны не всегда. Точно так же, как и с массивами. Зачастую гораздо проще проверить валидность структур перед началом выполнения алгоритма, чем проверять их при каждом использовании.

AVC>Еще иногда требуется проверка динамического типа переменной. Для этого в Обероне достаточно одного сравнения.

А это вообще часто называется ошибкой проектирования.

AVC>Вот, пожалуй, и все необходимые проверки в Обероне. Можете видеть сами — все они связаны с безопасностью типов и требуют не более одного-двух (для индекса массива) сравнений.

Угу, но каждый раз...

AVC>Этого достаточно, чтобы компилятор гарантировал обращение с переменными только в соответствии с их типом (type safety).

AVC>Для исключения ошибок в вычислениях иногда желательны проверки на переполнение и т.п. В этом Оберон не отличается от других языков. Оберон позволяет как использовать, так и отключать подобные проверки. (Лично я против такого отключения.)
В отладочных версиях такие проверки полезны, спору нет. В не-отладочных такие проверки очень круто сажают производительность, особенно при большом количестве разыменований.

ГВ>>Это как раз и есть усложнение языка и усложнение жизни разработчикам компиляторов. Так что, тут Страуструп прав — язык должен предоставлять достаточные средства для разработки библиотек, а не пытаться решать "всё, что можно решить". Такие проблемы разумно пребросить разработчикам прикладных библиотек.


AVC>Может быть, тогда разумно иметь два языка: для создателей библиотек и всех прочих?

Нет. Это есть очень большая ошибка, потому что комбинаторные способности языков вступят в конфликт друг с другом. У нас и так проблем с импедансом C++ — SQL, C++ — xxxScript и т.п. хватает.

ГВ>>Потом, нередко пользуются таким трюком: помещают в -1-й элемент массива некоторую служебную информацию (например, так поступили в MFC::CString). Ну и наверни сюда ещё проверку на выход за границу, что получится? Хак?


AVC>Еще скорее — кряк.

AVC>Рассмотрим пример.
AVC>Создадим в динамической памяти массив объектов, для которых определен деструктор.
AVC>Чтобы обеспечить отработку деструкторов при удалении массива, Си++ сохранит прямо перед массивом число элементов в массиве.
AVC>Тем самым поддерживается оператор
AVC>
AVC>delete [] p;
AVC>

AVC>Кажется, все хорошо. Но ведь Си++ не обеспечивает type safety. Следовательно, я могу по ошибке присвоить какое-нибудь значение элементу p[i], где i, например, может быть равным -1.

Средствами C++ можно обойти type safety. Разумность такого решения — отдельный вопрос. Если голова на плечах есть — всмё будет в порядке, если с этим проблема, то runtime проверками дела не поправишь. Приведённый пример с NASA свидетельствует, скорее, не о бенефитах типобезопасности, а о том, что всем в NASA было настолько страшно взять ответственность на себя, что спихнули всё на "неправильную" фичу языка. Т.е., проблема не в языке, а в головах.

AVC>Последствия непредсказуемы.


После любого неправильного использования алгоритма последствия непредсказуемы. Ну... пользуйтесь правильными идиомами и т.п.

AVC>Что это — хак, кряк? Или хрюк? Применительно к Страуструпу — скорее последнее.

AVC>(Ничего не могу с собой поделать. Я его очень не люблю. Я вообще не люблю жуликов. Но я постараюсь освоить современный Си++; может быть, пойму, почему Си++ — это хорошо. И буду ходить по улицам и распевать "Харе, Кришна!")
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[7]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 05.07.05 16:36
Оценка: +1
Здравствуйте, AVC, Вы писали:

AVC>Что это — хак, кряк? Или хрюк? Применительно к Страуструпу — скорее последнее.

AVC>(Ничего не могу с собой поделать. Я его очень не люблю. Я вообще не люблю жуликов.

Ребята, давайте Страуструпа оставим в покое. Он сделал то, что сделал. А мы можем либо пользоваться результатами его труда, либо нет. Но я уверен, что разработок масштаба достижений Страуструпа (язык программирования которым пользуются уже 20 лет и пару книг-бестселлеров) никто на данном форуме не достиг и, имхо, далеко не всем суждено достигнуть. Так что "Don't shot pianist...".
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[7]: Что толку в Ада если Ариан 5 все равно упал
От: Кодт Россия  
Дата: 05.07.05 17:13
Оценка: +1 :))
Здравствуйте, AVC, Вы писали:

AVC>Массив находится в памяти. Когда мы адресуемся к элементу массива, как правило мы обращаемся к нему с заранее неизвестныи (вычисляемым) индексом. Да и размерность массива зачастую неизвестна на этапе компиляции. Чтобы программа по ошибке не испортила память вне массива, надо вставить проверку индекса.

AVC>Для этого компилятор должен знать, откуда извлечь информацию о массиве. Компилятор Оберона это знает, а компилятор Си++ — нет, потому что массив в Си++ передается как указатель, от которого ничего не добьешься — молчит как партизан.

Это не совсем так. В точке объявления массива компилятор знает о его размере. Беда в другом: эту compile-time информацию слишком легко потерять (выполнив кастинг вверх).
Компилятор не по своей инициативе теряет её, а молча позволяет сделать это программисту. И это, на самом деле, и есть дурное наследие Си.

Вот пример
typedef int Data;

void foo(void* p) { Data* pData = (Data*)p; ..... } // мы подозреваем, что это должна была быть Data
void bar(Data* p) { Data (&rArray)[123] = *(Data(*)[123])p; ..... } // мы подозреваем, что это массив из 123 элементов
void buz(void* p) { Data (&rArray)[123] = *(Data(*)[123])p; ..... } // мы такие самоуверенные


template<class T>
class array_ref
{
public:
  template<int N> array_ref(T(&plain_old_array)[N]);
  // и другие полезные сигнатуры
  array_ref(std::vector<T> vec);
  template<int N> array_rev(boost::array<T,N> arr);
  .....
};


void good(array_ref<Data> arr) { ..... } // мы не подозреваем, а знаем; информация о размере переехала в run-time.

int main()
{
  Data arr[123];

  foo(&arr[7]); // потеря информации о типе
  bar(arr);     // потеря информации о размере массива (фактически, потеря информации о типе: из Data(&)[N] получили Data*)
  buz(arr);     // потеря вообще всего что возможно

  good(arr); // а ведь можно было и по-человечески, договориться...

  // а если писать вот так:
  boost::array<Data,123> brr;
  // то за голые вызовы foo,bar,buz нам ещё и в лоб дадут.
  good(brr);
}


AVC>Кроме индекса массива, в Обероне проверяются на NIL указатели и процедурные переменные. (Если они имеют значение, отличное от NIL, то их валидность гарантируется. В том числе — сборщиком мусора.)


С++ экономит (большей частью, на спичках): оставляет инициализацию ПОДданных на совести их хозяев.
Зато это позволяет работать с файлмаппингами и большими массивами без дополнительного "прогревочного заезда".

AVC>Еще иногда требуется проверка динамического типа переменной. Для этого в Обероне достаточно одного сравнения.


Если просто сравнить type_info — то и в С++ (правда, не для всех типов, а только для полиморфных классов или обёрток наподобие VARIANT) это тоже занимает одно сравнение.
А если проверять в рантайме принадлежность некоему суперклассу — то я сомневаюсь, что это делается за O(1).

AVC>Вот, пожалуй, и все необходимые проверки в Обероне. Можете видеть сами — все они связаны с безопасностью типов и требуют не более одного-двух (для индекса массива) сравнений.

AVC>Этого достаточно, чтобы компилятор гарантировал обращение с переменными только в соответствии с их типом (type safety).
AVC>Для исключения ошибок в вычислениях иногда желательны проверки на переполнение и т.п. В этом Оберон не отличается от других языков. Оберон позволяет как использовать, так и отключать подобные проверки. (Лично я против такого отключения.)

ГВ>>Это как раз и есть усложнение языка и усложнение жизни разработчикам компиляторов. Так что, тут Страуструп прав — язык должен предоставлять достаточные средства для разработки библиотек, а не пытаться решать "всё, что можно решить". Такие проблемы разумно пребросить разработчикам прикладных библиотек.


AVC>Может быть, тогда разумно иметь два языка: для создателей библиотек и всех прочих?


Ха! Тогда любитель легаси-кодирования просто заявит, что он пишет "библиотеку" и продолжит своё чёрное дело

ГВ>>Потом, нередко пользуются таким трюком: помещают в -1-й элемент массива некоторую служебную информацию (например, так поступили в MFC::CString). Ну и наверни сюда ещё проверку на выход за границу, что получится? Хак?


AVC>Еще скорее — кряк.


Это не хак и не кряк, а непонимание того, как устроен CString.
У него нет "минус-первого" элемента массива (хотя бы потому, что элементы массива — это символы — CHAR/WCHAR, а служебная информация там явно не однобайтная).

Схематично,
class CString
{
  struct Header { ..... };

  // в одном блоке памяти размещены встык некий заголовок и массив символов
  inline Header* header() { return (Header*)block(); }
  inline TCHAR* data() { return (TCHAR*)(header()+1); }

  TCHAR* m_data; // но из некоторых коварных соображений мы храним в объекте указатель не на начало блока, а на точку, где начинается строка
  inline void* block() { return (Header*)m_data-1; }
  inline void setblock(void* blk) { m_data = (TCHAR*)((Header*)blk+1); }

public:
  .....
};
STATIC_ASSERT( sizeof(CString) == sizeof(TCHAR*) );

Такое устройство было сделано для того, чтобы можно было передавать CString в эллипсис под видом обычного указателя на строку. Вообще-то, это неопределённое поведение (если вообще не ill-formed), но для известных компиляторов предсказуемое и нормально работающее.

(А потом привыкаешь, и случайно делаешь printf("%s",string("blabla")); вместо printf("%s",string("blabla").c_str()); )

AVC>Рассмотрим пример.

AVC>Что это — хак, кряк? Или хрюк? Применительно к Страуструпу — скорее последнее.

Нет, просто разгильдяйство. Язык С++ позволяет, вслед за С, деградировать информацию о типах. К ней, кстати говоря, можно отнести и информацию о размещении и времени жизни объекта.
int main()
{
  int array[10];
  delete[] array; // нормальный компилятор надаёт по рукам за такое

  int* trick = array; // но его можно обмануть
  delete[] trick;
}

AVC>(Ничего не могу с собой поделать. Я его очень не люблю. Я вообще не люблю жуликов. Но я постараюсь освоить современный Си++; может быть, пойму, почему Си++ — это хорошо. И буду ходить по улицам и распевать "Харе, Кришна!")

С++, как "пиво с утра — не только вредно, но и полезно". А Оберон — только полезно. Половинчатость, понимаешь
Перекуём баги на фичи!
Re[34]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 05.07.05 18:36
Оценка: 6 (1)
AVC,

> CX>Если Вы посмотрите в той же ветке чуть выше, Вы найдете там более упрощенную реализацию. Там нет систем единиц, а есть только разные физические понятия — длина, масса, время. К системам единиц я пришел, будучи подталкиваемым Кодтом.


> Интересно, что тема эта не новая.

> Наткнулся на днях в старой уже книге (1980-х годов) "Языки программирования Ада, Си, Паскаль. Сравнение и оценка" на статью Джехани, где (в разделе о производных типах) он предлагает подход "единиц измерения", впоследствии реализованный в языке Физкал.
> Надо отметить, что к тому времени в языке Ада уже существовала возможность объявления производных типов:
>
> type LENGTH is new FLOAT;
> type AREA is new FLOAT;
> type VOLUME is new FLOAT;
>

> Объявленные производные типы по умолчанию не могут смешиваться между собой.
> Чтобы разрешить корректное смешение типов (например, когда переменная типа VOLUME получается из произведения переменных типов AREA и LENGTH) требуется определить соответствующие операторы.

К сожалению, в отличие от C++, поддержки сколько-нибудь сложных вычислений при таком подходе не выйдет, т.к. в процессе вычислений и L^4 (квадрат площади), и L^5 (площать * объем), и L / T (скорость), и L^2 / T^2 (квадрат скорости), и M * L / T (импульс), и M * L^2 / T^2 (энергия), и M^2 * L^4 / T^4 (квадрат энергии), и т.п. легко получаются...

> Джехани не понравилось, что требуется определять так много вспомогательных операторов, и он предложил другой способ, который и был реализован в языке Физкал.


Хочу подчеркнуть, что это не из категории нравится/не нравится, а из категории осуществимо/неосуществимо, т.к. явное определение всех нужных комбинаций типов, плюс их взаимодействий, нереально.

Аде, на мой поверхностный взгляд, вообще, присуще избыточно явное описание происходящего. Например, "Адские" generics мне кажутся сравнительно неудобными и малофункциональными, т.к. требуют явного инстанцирования всех используемых сигнатур.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[8]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 05.07.05 18:40
Оценка:
Здравствуйте, eao197, Вы писали:

AVC>>Что это — хак, кряк? Или хрюк? Применительно к Страуструпу — скорее последнее.

AVC>>(Ничего не могу с собой поделать. Я его очень не люблю. Я вообще не люблю жуликов.

E>Ребята, давайте Страуструпа оставим в покое. Он сделал то, что сделал. А мы можем либо пользоваться результатами его труда, либо нет. Но я уверен, что разработок масштаба достижений Страуструпа (язык программирования которым пользуются уже 20 лет и пару книг-бестселлеров) никто на данном форуме не достиг и, имхо, далеко не всем суждено достигнуть. Так что "Don't shot pianist...".


Евгений, мне жаль, что я огорчил тебя.
Но ведь у каждого своя точка зрения.
Достижения бывают разными. Мне кажется, если у человека нет достижений вроде тех, которыми отличились Герострат или Гитлер, то это хорошо.
Поэтому аргумент о достижениях вообще не убеждает.
Для меня не является аргументом, что кто-то написал бестселлер. Это чисто коммерческий аргумент, применимый не всегда и не во всех обстоятельствах.
Поэтому аргумент о бестселлерах не принимается, по крайней мере — в абстрактном виде.
Я бы принял его во внимание, если бы был книготорговцем.
По поводу самих книг я хочу сказать, что они написаны действительно хорошо, и они гораздо лучше языка, которому они посвящены. Я и не думал отрицать наличие у Страуструпа таланта.
Гораздо хуже обстоит с языком, которым "пользуются уже 20 лет".
Наш мир вообще очень опасен и нестабилен.
Но некоторые люди делают его еще опаснее.
Ты говоришь, что надо оставить в покое Страуструпа. А он оставит меня в покое?
Все в мире взаимосвязано.
Во-первых, неправда, что у нас есть свобода "не пользоваться результатами его труда".
Если ты обыкновенный программист, тебе, вероятно, придется иногда писать на Си++. В случае твоего гордого отказа другой программист "воспользуется результатами его труда", а тебе будет нечем кормить семью.
Разумеется, в тех случаях, когда у меня есть выбор, я не стану пользоваться Си++. (Я так и делаю, и ни разу не ощутил, что мне не хватает каких-либо "фич" Си++. Поэтому я полагаю, что Си++ — сильно раздутый миф. Конечно, я стараюсь внимательно слушать оппонентов, опасаясь собственных заблуждений. При такой собственной пристрастности мне очень важно иметь возможность услышать и другую точку зрения.)
Во-вторых, я никак не могу понять аргументов, что чрезмерно сложный и раздутый язык, не позволяющий даже в отладочном режиме обеспечить контроль типов, является вершиной человеческой мысли и результатом непосильного труда.
Скорее, я склонен видеть в нем результат халтурной работы.
В-третьих, меня действительно очень волнуют вопросы безопасности.
Говорят, что тому, кто любит кобасу, не надо знать, как она делается.
Моя проблема в том, что я "люблю колбасу", но "знаю, как она делается".
На душе у меня действительно неспокойно. Конечно, не только из-за Страуструпа. Но ведь и из-за него тоже.
Поэтому я не люблю Страуструпа и считаю, что имею право высказывать это вслух, а не шептать ночью в подушку.
Мне жаль, что иногда по несдержанности я делаю это в грубой форме. (Все-таки темперамент у меня, увы, бурный. )
Вместе с тем, мне приятно общаться с интересными мне людьми, даже если им Страуструп нравится.
По возможности, я сдерживаюсь и не слишком выпячиваю свое отношение к автору Си++, а больше сосредотачиваюсь на самом языке.
Но иногда меня все-таки "прорывает". Прости дурака.
Мир?

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[9]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 05.07.05 19:16
Оценка:
Здравствуйте, AVC, Вы писали:

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


AVC>>>Что это — хак, кряк? Или хрюк? Применительно к Страуструпу — скорее последнее.

AVC>>>(Ничего не могу с собой поделать. Я его очень не люблю. Я вообще не люблю жуликов.

E>>Ребята, давайте Страуструпа оставим в покое. Он сделал то, что сделал. А мы можем либо пользоваться результатами его труда, либо нет. Но я уверен, что разработок масштаба достижений Страуструпа (язык программирования которым пользуются уже 20 лет и пару книг-бестселлеров) никто на данном форуме не достиг и, имхо, далеко не всем суждено достигнуть. Так что "Don't shot pianist...".


AVC>Но иногда меня все-таки "прорывает". Прости дурака.

AVC>Мир?

Мир, конечно!

Просто, имхо, невежливо неуважительно отзываться о человеке, который тебе вообще ничем ответить не может. Не красиво это.
К тому же я недавно уже наслушался про Страутрупа в другом флэйме, так что это твое высказывание стало "последней каплей" из-за которой меня самого прорвало.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[8]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 05.07.05 20:24
Оценка: +1 :)
Здравствуйте, Геннадий Васильев, Вы писали:

AVC>>Массив находится в памяти. Когда мы адресуемся к элементу массива, как правило мы обращаемся к нему с заранее неизвестныи (вычисляемым) индексом. Да и размерность массива зачастую неизвестна на этапе компиляции. Чтобы программа по ошибке не испортила память вне массива, надо вставить проверку индекса.


ГВ>Куда? Массив может быть закопан в глубине абстракции, а проверка индекса выполняться на несколько уровней выше. Ошибка по индексу приведёт к выкидыванию исключения и отказу в работе алгоритма более высокого уровня. Следовательно, проверять индекс нужно до его использования, следовательно, проверять индекс на уровне массива никакой необходимости нет — всё равно он ему "приходит" уже заведомо корректным.


Все-таки подозрительно, что проверка индекса может "привести к исключению", если индекс "приходит уже корректным".
Кроме того, не до конца понятно, как проверять индексы до обращения к элементу массива.
Ведь число становится индексом только в момент обращения к элементу массива.
В некоторых случаях излишние проверки могут устраняться оптимизатором.
Например, в процедуре
PROCEDURE Init(VAR a: ARRAY OF INTEGER);
  VAR i: LONGINT;
BEGIN
  FOR i := 0 TO LEN(a)-1 DO
    a[i] := 0;
  END;
END Init;

проверки вообще необязательны. Код заведомо корректен, т.к. значение i не меняется внутри цикла.

AVC>>Для этого компилятор должен знать, откуда извлечь информацию о массиве. Компилятор Оберона это знает, а компилятор Си++ — нет, потому что массив в Си++ передается как указатель, от которого ничего не добьешься — молчит как партизан.


ГВ>Это наследие C и, кроме того, остаётся открытым вопрос: как конкретно должен быть реализован массив? std::vector<> — то частное решение, хоть и стандартизированное.


Пока не изобретен лучший вариант, меня вполне устраивает виртовское решение.

AVC>>Кроме индекса массива, в Обероне проверяются на NIL указатели и процедурные переменные. (Если они имеют значение, отличное от NIL, то их валидность гарантируется. В том числе — сборщиком мусора.)


ГВ>Опять таки, проверки на NULL (NIL) по месту вызова нужны не всегда. Точно так же, как и с массивами. Зачастую гораздо проще проверить валидность структур перед началом выполнения алгоритма, чем проверять их при каждом использовании.


Существует понятие программирования по контракту. (Мейер)
Главный принцип: не доверяй клиенту (вызывающему коду).

AVC>>Еще иногда требуется проверка динамического типа переменной. Для этого в Обероне достаточно одного сравнения.

ГВ>А это вообще часто называется ошибкой проектирования.

Это смотря как и где этим пользоваться.
В Си++ также есть соответствующие "касты".
В самом первом виртовском Обероне не было присоединенных процедур (=виртуальных функций).
Полиморфизм работал исключительно благодаря динамическому приведению типа.
Наверное, поэтому динамическое приведение типа реализовано так эффективно.
Например (опустив все лишнее):
MODULE Objects;
  TYPE
    Msg        = RECORD END;
    Object     = POINTER TO ObjectDesc;
    ObjectDesc = RECORD
      handle: PROCEDURE(this: Object; VAR msg: Msg);
    END;

    (* ... *)

    Module     = POINTER TO ModuleDesc;
    ModuleDesc = RECORD (ObjectDesc)
      (* ... *)
    END;

  VAR module: Module;

  PROCEDURE HandleModule(this: Object; VAR msg: Msg);
    VAR m: Module;
  BEGIN m := this(Module); (* динамическое приведение типа (конечно, с проверкой) *)
    (* ... *)
  END Handle;

BEGIN NEW(module); module.handle := ModuleHandle;
END Objects.


AVC>>Вот, пожалуй, и все необходимые проверки в Обероне. Можете видеть сами — все они связаны с безопасностью типов и требуют не более одного-двух (для индекса массива) сравнений.

ГВ>Угу, но каждый раз...

Опять-таки оптимизатор может устранить некоторые лишние проверки.

AVC>>Этого достаточно, чтобы компилятор гарантировал обращение с переменными только в соответствии с их типом (type safety).

AVC>>Для исключения ошибок в вычислениях иногда желательны проверки на переполнение и т.п. В этом Оберон не отличается от других языков. Оберон позволяет как использовать, так и отключать подобные проверки. (Лично я против такого отключения.)
ГВ>В отладочных версиях такие проверки полезны, спору нет. В не-отладочных такие проверки очень круто сажают производительность, особенно при большом количестве разыменований.

Измерения производительности этого не подтверждают.

ГВ>Средствами C++ можно обойти type safety. Разумность такого решения — отдельный вопрос. Если голова на плечах есть — всмё будет в порядке, если с этим проблема, то runtime проверками дела не поправишь. Приведённый пример с NASA свидетельствует, скорее, не о бенефитах типобезопасности, а о том, что всем в NASA было настолько страшно взять ответственность на себя, что спихнули всё на "неправильную" фичу языка. Т.е., проблема не в языке, а в головах.


Согласен, что проблема — в головах.
Потому что именно из голов она попадает в языки.
Забавно читать, что "средствами C++ можно обойти type safety".
Где бы найти в Си++ эту самую type safety...

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[9]: Что толку в Ада если Ариан 5 все равно упал
От: Кодт Россия  
Дата: 05.07.05 21:02
Оценка: 2 (2) +3 :))
Здравствуйте, AVC, Вы писали:

ГВ>>Средствами C++ можно обойти type safety. Разумность такого решения — отдельный вопрос. Если голова на плечах есть — всмё будет в порядке, если с этим проблема, то runtime проверками дела не поправишь. Приведённый пример с NASA свидетельствует, скорее, не о бенефитах типобезопасности, а о том, что всем в NASA было настолько страшно взять ответственность на себя, что спихнули всё на "неправильную" фичу языка. Т.е., проблема не в языке, а в головах.


AVC>Согласен, что проблема — в головах.

AVC>Потому что именно из голов она попадает в языки.
AVC>Забавно читать, что "средствами C++ можно обойти type safety".
AVC>Где бы найти в Си++ эту самую type safety...

Скорее, "в С++ можно обрести type safety... если руки дойдут... если эти руки тимлидер не повыдёргивал ещё раньше..."
Перекуём баги на фичи!
Re[10]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 05.07.05 21:03
Оценка:
Здравствуйте, eao197, Вы писали:

AVC>>Но иногда меня все-таки "прорывает". Прости дурака.

AVC>>Мир?

E>Мир, конечно!




E>Просто, имхо, невежливо неуважительно отзываться о человеке, который тебе вообще ничем ответить не может. Не красиво это.


Согласен.
Кроме того, обидно, что "срывается" план уйти от языкового флейма.
Надо вернуться на "стезю добродетели".

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[35]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 05.07.05 21:03
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>К сожалению, в отличие от C++, поддержки сколько-нибудь сложных вычислений при таком подходе не выйдет, т.к. в процессе вычислений и L^4 (квадрат площади), и L^5 (площать * объем), и L / T (скорость), и L^2 / T^2 (квадрат скорости), и M * L / T (импульс), и M * L^2 / T^2 (энергия), и M^2 * L^4 / T^4 (квадрат энергии), и т.п. легко получаются...


Согласен.
Действительно, получается абсурд.
Что-то вроде
VAR a, b, c: LENGTH;
...
  c := a * b;

Здесь простота объявления "производного" типа не соответствует реальности.

>> Джехани не понравилось, что требуется определять так много вспомогательных операторов, и он предложил другой способ, который и был реализован в языке Физкал.


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


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


Да, не слишком удобно.
Но, может быть, иногда это имеет смысл?

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[36]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 06.07.05 00:34
Оценка: 1 (1)
AVC,

> Здесь простота объявления "производного" типа не соответствует реальности.


+1

"Simple things simple. Complex things possible." — в данном случае, к сожалению, выполняется только первая часть.

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


> Да, не слишком удобно.

> Но, может быть, иногда это имеет смысл?

Конечно. Когда разрабатываешь компилятор

Насколько можно верить rationale к спецификации Ada83, в Аде было решено ограничиться явным инстанцированием из-за сложностей компиляции в присутствии неявного:

The requirement that instantiation be explicit greatly simplifies the compilation of program units obtained by generic instantiation.


К сожалению, это лишило (или избавило — в зависимости от отношения) Аду такой библиотеки как STL — по крайней мере так говорил Степанов в одном из интервью. Более того, за многие аспекты нынешних шаблонов C++ следует благодарить (или винить) именно STL: членам комитета настолько понравилась библиотека, что местами они "прогибали" под нее язык, делая возможным полноценное использование STL. В общем, это меня уже совсем в другую сторону понесло...
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[7]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 06.07.05 00:56
Оценка: 1 (1) +3
AVC,

> Массив находится в памяти. Когда мы адресуемся к элементу массива, как правило мы обращаемся к нему с заранее неизвестныи (вычисляемым) индексом. Да и размерность массива зачастую неизвестна на этапе компиляции. Чтобы программа по ошибке не испортила память вне массива, надо вставить проверку индекса.

> Для этого компилятор должен знать, откуда извлечь информацию о массиве. Компилятор Оберона это знает, а компилятор Си++ — нет, потому что массив в Си++ передается как указатель, от которого ничего не добьешься — молчит как партизан.

Отсюда какой должен следовать вывод у человека, которому надежность работы его программ небезразлична? На мой взгляд простой: не передавать массивы в C++ через указатели. Благо, возможностей для этого хоть отбавляй: от std::vector до самописных классов массивов...
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: Что толку в Ада если Ариан 5 все равно упал
От: Pavel Dvorkin Россия  
Дата: 06.07.05 05:24
Оценка: :))
Здравствуйте, Трурль, Вы писали:


PD>>Именно благодаря этому код на C/C++ столь эффективен.


Т>Опыт общения с различными программами заставляет меня усомниться в истинности данного высказывания.


Личный опыт сравнения кода, сгенерированного VC++ (Release, конечно) и оптимизированного кода на ассемблере позволяет мне делать это утверждение.
With best regards
Pavel Dvorkin
Re[35]: Что толку в Ада если Ариан 5 все равно упал
От: raskin Россия  
Дата: 06.07.05 06:48
Оценка:
Павел Кузнецов wrote:
> К сожалению, в отличие от C++, поддержки сколько-нибудь сложных
> вычислений при таком подходе не выйдет, т.к. в процессе вычислений и L^4
> (квадрат площади), и L^5 (площать * объем), и L / T (скорость), и L^2 /
> T^2 (квадрат скорости), и M * L / T (импульс), и M * L^2 / T^2
> (энергия), и M^2 * L^4 / T^4 (квадрат энергии), и т.п. легко получаются...
>

Это детали реализации. Можно сгенерировать модуль с типами, названными в
духе t3l_2m1e1 (размерность Кл*кг*с*с*с/(м*м)).
Posted via RSDN NNTP Server 2.0 beta
Re[8]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 06.07.05 07:10
Оценка: 22 (2) +1 :)))
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Отсюда какой должен следовать вывод у человека, которому надежность работы его программ небезразлична? На мой взгляд простой: не передавать массивы в C++ через указатели.

Или не использовать C++. Тоже вариант.
Re[8]: Что толку в Ада если Ариан 5 все равно упал
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 06.07.05 08:06
Оценка: 6 (1)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Следовательно, проверять индекс нужно до его использования, следовательно, проверять индекс на уровне массива никакой необходимости нет — всё равно он ему "приходит" уже заведомо корректным.


А если приходит всё же не корректным, тогда что, портить память?

AVC>>Еще иногда требуется проверка динамического типа переменной. Для этого в Обероне достаточно одного сравнения.


ГВ>А это вообще часто называется ошибкой проектирования.


Наоборот. Это такой способ проектирования.
http://www.inr.ac.ru/~info21/wirth/programming_in_oberon.pdf

Programming in Oberon
Niklaus Wirth
Part 4
23. Object-oriented Programming
23.4. Handlers and Messages

  PROCEDURE Handle(f: Figure; VAR msg: Message);
    VAR r: Rectangle;
  BEGIN r := f(Rectangle);
    IF msg IS DrawMsg THEN (*draw rectangle r*)
    ELSIF msg IS MarkMsg THEN MarkRectangle(r, msg(MarkMsg).on)
    ELSIF msg IS MoveMsg THEN
      INC(r.x, msg(MoveMsg).x); INC(r.y, msg(MoveMsg).y)
    ELSIF …
    END
  END Handle


Component Pascal:
TYPE
  Message = ABSTRACT RECORD END;

  CtrlMsg = RECORD (Message)
    Key: INTEGER;
    Shift: SET
  END;

  TickMsg = RECORD (Message)
    TickCount: INTEGER
  END;

  ...

  PROCEDURE Receive(VAR msg: Message);
  BEGIN
    WITH msg: CtrlMsg DO (* Только одна проверка. Внутри блока проверок больше нет *)
        ... 
        IF msg.Key = 13 THEN ... END;
        ...
      | msg: TickMsg DO  (* Только одна проверка. Внутри блока проверок больше нет *)
        ...
        IF msg.TickCount > last THEN ... END;
        ...  
    ELSE
      (* Тип сообщения не опознан *)
    END     
  END Receive;
Re[9]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 08:27
Оценка: 1 (1) +2
Здравствуйте, AVC, Вы писали:

Попробую резюмировать.

Все примеры, что ты приводил, относятся к той самой части языка, которая не type-safety и досталась в наследие от C. И конечно же, ты можешь неявно привести массив к указателю, обратиться за границы массива и т.д. и т.п. Компилятор тебе этого не запретит. Но кто тебя заставляет это делать? Никто. Это как раз пример той самой "запретительной" конвенции, о которой я говорил чуть раньше. Не используй массивы — есть много им альтернатив, начиная с std::vector. Не используй голые указатели — смарт-пойнтеров огромное множество. Type safety будет почти 100%. И глядишь, все станет радужнее и приятнее.
Все эти низкоуровневые элементы есть смысл использовать только при реализации высокоуровневых примитивов и/или в критичных по производительности местах (хотя и тут надо смотреть внимательно — зачастую высокоуровневые средства типа тех же смарт-пойнтеров никакого run-time оверхеда в себе не несут). Конечно, если ты начнешь направо и налево указатели разбрасывать да массивы к указателям приводить, ничего путного не получится. Но не надо, пожалуйста, приводить это в качестве довода — никто не заставляет тебя их использовать где попало.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[10]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 06.07.05 08:39
Оценка: +1 :)
Здравствуйте, CrystaX, Вы писали:

CX>Попробую резюмировать.


CX>Все примеры, что ты приводил, относятся к той самой части языка, которая не type-safety и досталась в наследие от C. И конечно же, ты можешь неявно привести массив к указателю, обратиться за границы массива и т.д. и т.п. Компилятор тебе этого не запретит. Но кто тебя заставляет это делать? Никто. Это как раз пример той самой "запретительной" конвенции, о которой я говорил чуть раньше. Не используй массивы — есть много им альтернатив, начиная с std::vector. Не используй голые указатели — смарт-пойнтеров огромное множество. Type safety будет почти 100%. И глядишь, все станет радужнее и приятнее.

CX>Все эти низкоуровневые элементы есть смысл использовать только при реализации высокоуровневых примитивов и/или в критичных по производительности местах (хотя и тут надо смотреть внимательно — зачастую высокоуровневые средства типа тех же смарт-пойнтеров никакого run-time оверхеда в себе не несут). Конечно, если ты начнешь направо и налево указатели разбрасывать да массивы к указателям приводить, ничего путного не получится. Но не надо, пожалуйста, приводить это в качестве довода — никто не заставляет тебя их использовать где попало.

Дмитрий, конечно, я согласен с тобой в том, что "надо делать хорошо и не надо плохо".
Но мне вот подумалось, что твой совет мало отличается от совета Трурля не использовать Си++ вообще.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[11]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 08:43
Оценка: 1 (1)
Здравствуйте, AVC, Вы писали:

AVC>Дмитрий, конечно, я согласен с тобой в том, что "надо делать хорошо и не надо плохо".

AVC>Но мне вот подумалось, что твой совет мало отличается от совета Трурля не использовать Си++ вообще.

Ну почему же — отличается. Прежде всего тем, что в моем случае, если понадобится, я смогу использовать и голые указатели, и прочее. Кроме того, отказавшись от C++, я потеряю мощнейшую вещь, которой нет пока ни в одном другом языке — шаблонное метапрограммирование.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[10]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 06.07.05 09:01
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX> Но кто тебя заставляет это делать? Никто... Не используй массивы .... Не используй голые указатели...

Вспомнилась одна фраза, сказанная по другому поводу.

... у меня есть одна маленькая славная штучка, ... которая нужна как зайцу стоп-сигнал... и, при некоторой изобретательности, и затратив надлежащее время и усердие — можно сделать так, что она даже не будет мешать!

Re[11]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 09:07
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>Вспомнилась одна фраза, сказанная по другому поводу.

Т>

... у меня есть одна маленькая славная штучка, ... которая нужна как зайцу стоп-сигнал... и, при некоторой изобретательности, и затратив надлежащее время и усердие — можно сделать так, что она даже не будет мешать!



Да, это все действительно забавно, но вообще Ваша фраза — только следствие того, что пока во внимание принимаются только недостатки C++ и не принимаются достоинства. Неужели Вы их не видите (достоинств)?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[12]: Что толку в Ада если Ариан 5 все равно упал
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 06.07.05 09:11
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX> Кроме того, отказавшись от C++, я потеряю мощнейшую вещь, которой нет пока ни в одном другом языке — шаблонное метапрограммирование.


Наверное стоит изобрести совершенно новый язык принципиально основанный на шаблонах но не имеющий к С++ ни какого отношения. Вот тогда программисты наконец-то бросят С++...
Re[12]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 06.07.05 09:15
Оценка: +1
Здравствуйте, CrystaX, Вы писали:

CX>Кроме того, отказавшись от C++, я потеряю мощнейшую вещь, которой нет пока ни в одном другом языке — шаблонное метапрограммирование.


А чем шаблонное метапрограммирование лучше нешаблонного?

Наверное, лет через 10 рекомендации будут звучать примерно так:

Не используй шаблоны — есть много им альтернатив, начиная с мегафичи X...

Re[13]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 09:16
Оценка: +1
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, CrystaX, Вы писали:


CX>> Кроме того, отказавшись от C++, я потеряю мощнейшую вещь, которой нет пока ни в одном другом языке — шаблонное метапрограммирование.


СГ>Наверное стоит изобрести совершенно новый язык принципиально основанный на шаблонах но не имеющий к С++ ни какого отношения. Вот тогда программисты наконец-то бросят С++...


Вряд ли. Сила C++ не в отдельных парадигмах, а в тесной их взаимосвязи в рамках одного языка.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[14]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 06.07.05 09:20
Оценка: +3
Здравствуйте, CrystaX, Вы писали:

CX>Здравствуйте, Сергей Губанов, Вы писали:


СГ>>Здравствуйте, CrystaX, Вы писали:


CX>>> Кроме того, отказавшись от C++, я потеряю мощнейшую вещь, которой нет пока ни в одном другом языке — шаблонное метапрограммирование.


СГ>>Наверное стоит изобрести совершенно новый язык принципиально основанный на шаблонах но не имеющий к С++ ни какого отношения. Вот тогда программисты наконец-то бросят С++...


CX>Вряд ли. Сила C++ не в отдельных парадигмах, а в тесной их взаимосвязи в рамках одного языка.


А так же из-за невообразимо большого количество унаследованного кода и огромного количества активных проектов, выполняющихся на C++.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[12]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 06.07.05 09:22
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Здравствуйте, Трурль, Вы писали:


Т>>Вспомнилась одна фраза, сказанная по другому поводу.

Т>>

... у меня есть одна маленькая славная штучка, ... которая нужна как зайцу стоп-сигнал... и, при некоторой изобретательности, и затратив надлежащее время и усердие — можно сделать так, что она даже не будет мешать!


CX>

CX>Да, это все действительно забавно, но вообще Ваша фраза — только следствие того, что пока во внимание принимаются только недостатки C++ и не принимаются достоинства. Неужели Вы их не видите (достоинств)?

Ну, поскольку ветка посвящена написанию надежных программ, то достоинства C++ в плане помощи создания таких программ, еще поискать нужно.
К сожалению.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[9]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 06.07.05 09:23
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

ГВ>>А это вообще часто называется ошибкой проектирования.


СГ>Наоборот. Это такой способ проектирования.


Больше того, когда перекомпиляция невозможна (хотя бы из-за того, что существует огромное количество клиентного кода), этот способ остается единственным.
См. Оберон, Windows etc.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[12]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 06.07.05 09:26
Оценка:
Здравствуйте, CrystaX, Вы писали:

AVC>>Дмитрий, конечно, я согласен с тобой в том, что "надо делать хорошо и не надо плохо".

AVC>>Но мне вот подумалось, что твой совет мало отличается от совета Трурля не использовать Си++ вообще.

CX>Ну почему же — отличается. Прежде всего тем, что в моем случае, если понадобится, я смогу использовать и голые указатели, и прочее. Кроме того, отказавшись от C++, я потеряю мощнейшую вещь, которой нет пока ни в одном другом языке — шаблонное метапрограммирование.


Наслышан. Правда, все примеры, которые мне попадались, сводились к вычислениям во времени компиляции. Других выгод я пока не видел.
А, как таковое, метапрограммирование существует во многих языках — Lisp, Oberon и т.д.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[13]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 09:26
Оценка: :)
Здравствуйте, Трурль, Вы писали:

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


CX>>Кроме того, отказавшись от C++, я потеряю мощнейшую вещь, которой нет пока ни в одном другом языке — шаблонное метапрограммирование.


Т>А чем шаблонное метапрограммирование лучше нешаблонного?


Попробуйте — увидите. Я приводил уже пример реализации системы единиц с автоматическим пересчетом из одной системы в жругую, с выводом нового типа из операций, в которых участвуют другие типы (скорость = длина/время) и с запретом преобразования из одного типа в другой. Как мне удалось это сделать? А именно с помощью шаблонного метапрограммирования, причем основывался я на boost::mpl, который весь сплошь — информация для компилятора, не генерирующая никаких вычислений в run-time.

Т>Наверное, лет через 10 рекомендации будут звучать примерно так:

Т>

Не используй шаблоны — есть много им альтернатив, начиная с мегафичи X...


Вряд ли. Просто потому, что шаблоны к тому времени изменятся, но сохранят то лучшее, что в них есть сейчас. Да, современные C++ шаблоны можно во многом улучшить, но в них есть то, чего нет ни в каком другом языке — механизм вычислений на этапе компиляции.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[13]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 09:33
Оценка: +1
Здравствуйте, eao197, Вы писали:

CX>>

CX>>Да, это все действительно забавно, но вообще Ваша фраза — только следствие того, что пока во внимание принимаются только недостатки C++ и не принимаются достоинства. Неужели Вы их не видите (достоинств)?

E>Ну, поскольку ветка посвящена написанию надежных программ, то достоинства C++ в плане помощи создания таких программ, еще поискать нужно.

E>К сожалению.

Надо разделять два понятия:
1. Язык помогает писать надежные программы
2. Язык запрещает писать ненадежные программы.

Так вот, C++ помогает писать надежные, но не запрещает писать ненадежные программы, только и всего.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[13]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 09:38
Оценка:
Здравствуйте, AVC, Вы писали:

CX>>Ну почему же — отличается. Прежде всего тем, что в моем случае, если понадобится, я смогу использовать и голые указатели, и прочее. Кроме того, отказавшись от C++, я потеряю мощнейшую вещь, которой нет пока ни в одном другом языке — шаблонное метапрограммирование.


AVC>Наслышан. Правда, все примеры, которые мне попадались, сводились к вычислениям во времени компиляции. Других выгод я пока не видел.


А разве этого недостаточно?

AVC>А, как таковое, метапрограммирование существует во многих языках — Lisp, Oberon и т.д.


Согласен. Но я говорил именно о шаблонном метапрограммировании, compile-time программировании, присущем только C++.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[14]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 06.07.05 09:39
Оценка:
Здравствуйте, CrystaX, Вы писали:

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


CX>>>

CX>>>Да, это все действительно забавно, но вообще Ваша фраза — только следствие того, что пока во внимание принимаются только недостатки C++ и не принимаются достоинства. Неужели Вы их не видите (достоинств)?

E>>Ну, поскольку ветка посвящена написанию надежных программ, то достоинства C++ в плане помощи создания таких программ, еще поискать нужно.

E>>К сожалению.

Я бы подкоректировал твой список:

CX>Надо разделять два понятия:

CX>1. Язык помогает писать надежные программы
CX>2. Язык запрещает писать ненадежные программы.
3. Язык позволяет писать надежные программы.

CX>Так вот, C++ помогает писать надежные, но не запрещает писать ненадежные программы, только и всего.


Имхо, C++ позволяет писать надежные программы.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[15]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 09:43
Оценка:
Здравствуйте, eao197, Вы писали:

E>Я бы подкоректировал твой список:


CX>>Надо разделять два понятия:

CX>>1. Язык помогает писать надежные программы
CX>>2. Язык запрещает писать ненадежные программы.
E>3. Язык позволяет писать надежные программы.

CX>>Так вот, C++ помогает писать надежные, но не запрещает писать ненадежные программы, только и всего.


E>Имхо, C++ позволяет писать надежные программы.


Ок. На мой взгляд, позволяет и помогает писать надежные, но не запрещает писать ненадежные программы.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[16]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 06.07.05 09:50
Оценка: 1 (1) +1
Здравствуйте, CrystaX, Вы писали:

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


E>>Я бы подкоректировал твой список:


CX>>>Надо разделять два понятия:

CX>>>1. Язык помогает писать надежные программы
CX>>>2. Язык запрещает писать ненадежные программы.
E>>3. Язык позволяет писать надежные программы.

CX>>>Так вот, C++ помогает писать надежные, но не запрещает писать ненадежные программы, только и всего.


E>>Имхо, C++ позволяет писать надежные программы.


CX>Ок. На мой взгляд, позволяет и помогает писать надежные, но не запрещает писать ненадежные программы.


Нет. Я бы еще уточнил:

C++ позволяет писать надежные программы и помогает создавать библиотеки для упрощения этого процесса.
Так же для меня очевидно, что C++ не запрешает писать надежные программы.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[17]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 09:51
Оценка: +1
Здравствуйте, eao197, Вы писали:

CX>>Ок. На мой взгляд, позволяет и помогает писать надежные, но не запрещает писать ненадежные программы.


E>Нет. Я бы еще уточнил:


E>C++ позволяет писать надежные программы и помогает создавать библиотеки для упрощения этого процесса.

E>Так же для меня очевидно, что C++ не запрешает писать надежные программы.

Ок, пусть будет по-твоему.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[14]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 06.07.05 10:11
Оценка:
Здравствуйте, CrystaX, Вы писали:

AVC>>Наслышан. Правда, все примеры, которые мне попадались, сводились к вычислениям во времени компиляции. Других выгод я пока не видел.


CX>А разве этого недостаточно?


Что-то это мне напоминает...

AVC>>Но я попробую назвать хотя бы несколько преимуществ.
CX>[skipped]
CX>В этом месте Вы рассказали только ожидаемое, а именно — модули и garbage collector. На самом деле это не совсем то, что я хотел услышать.



CX>Согласен. Но я говорил именно о шаблонном метапрограммировании, compile-time программировании, присущем только C++.

"Только C++" — это очень сильно сказано.
Re[15]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 10:19
Оценка:
Здравствуйте, Трурль, Вы писали:

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


AVC>>>Наслышан. Правда, все примеры, которые мне попадались, сводились к вычислениям во времени компиляции. Других выгод я пока не видел.


CX>>А разве этого недостаточно?


Т>Что-то это мне напоминает...

Т>

AVC>>Но я попробую назвать хотя бы несколько преимуществ.
CX>>[skipped]
CX>>В этом месте Вы рассказали только ожидаемое, а именно — модули и garbage collector. На самом деле это не совсем то, что я хотел услышать.


Не совсем понял, к чему здесь эта цитата. Объясните, если не трудно.
Или Вы о повторяемости ситуации? Так здесь схожесть только внешняя, не более того.

CX>>Согласен. Но я говорил именно о шаблонном метапрограммировании, compile-time программировании, присущем только C++.

Т>"Только C++" — это очень сильно сказано.

Согласен. Сильно. Скажу тогда чуток послабже: "Из всех известных мне языков шаблонное, compile-time программирование присуще только C++". Но если я неправ и есть язык, поддерживающий эту концепцию столь же хорошо, как C++, покажите мне его. Я таких не нашел.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[16]: Что толку в Ада если Ариан 5 все равно упал
От: WFrag США  
Дата: 06.07.05 10:47
Оценка: +1
Здравствуйте, CrystaX, Вы писали:

CX>Согласен. Сильно. Скажу тогда чуток послабже: "Из всех известных мне языков шаблонное, compile-time программирование присуще только C++". Но если я неправ и есть язык, поддерживающий эту концепцию столь же хорошо, как C++, покажите мне его. Я таких не нашел.


Могу только догадываться, что ты имел ввиду под словом "шаблонное". Вот тебе примеры compile-time программирования:

Конечно же, LISP. Правда, тут метапрограммирование не "шаблонное", а основанное на преобразовании AST. Scheme-овские syntax-rules. В принципе, похожи на шаблоны C++.

Ну и куча языков/средств, куда были добавлены макросы на основе сплайсов: Nemerle, Template Haskell, Java Syntactic Extender. Наверное, наиболее похожи на шаблоны C++. С учетом того, что, например, в Template Haskell часть задач шаблонов C++ решается более мощной системой типов (параметрический полиморфизм).

Заметь, в отличии от C++ для метапрограммирования используется тот же host-язык. В C++, например, в компайл-тайм вызвать функцию некую библиотечную функцию (например, sin) нельзя.
Re[17]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 10:57
Оценка:
Здравствуйте, WFrag, Вы писали:

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


CX>>Согласен. Сильно. Скажу тогда чуток послабже: "Из всех известных мне языков шаблонное, compile-time программирование присуще только C++". Но если я неправ и есть язык, поддерживающий эту концепцию столь же хорошо, как C++, покажите мне его. Я таких не нашел.


WF>Могу только догадываться, что ты имел ввиду под словом "шаблонное". Вот тебе примеры compile-time программирования:


WF>Конечно же, LISP. Правда, тут метапрограммирование не "шаблонное", а основанное на преобразовании AST. Scheme-овские syntax-rules. В принципе, похожи на шаблоны C++.


Эээ... А разве здесь compile-time? Или все же interpret-time?

WF>Ну и куча языков/средств, куда были добавлены макросы на основе сплайсов: Nemerle, Template Haskell, Java Syntactic Extender. Наверное, наиболее похожи на шаблоны C++. С учетом того, что, например, в Template Haskell часть задач шаблонов C++ решается более мощной системой типов (параметрический полиморфизм).


Мне вообще интересен вполне конкретный механизм — рекурсивные вычисления в compile-time с возможностью эту самую рекурсию останавливать. В C++ это делается с помощью специализаций. Как с этим обстоит дело в вышеприведенных языках?

WF>Заметь, в отличии от C++ для метапрограммирования используется тот же host-язык. В C++, например, в компайл-тайм вызвать функцию некую библиотечную функцию (например, sin) нельзя.


Совершенно верно, т.к. в вычислениях должны участвовать только compile-time значения. Иначе какой же это compile-time?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[18]: Что толку в Ада если Ариан 5 все равно упал
От: WFrag США  
Дата: 06.07.05 11:15
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Эээ... А разве здесь compile-time? Или все же interpret-time?


Интересный вопрос. Но учитывая существование комипиляторов LISP (например, SBCL), то можно сказать что и compile-time тоже.

CX>Мне вообще интересен вполне конкретный механизм — рекурсивные вычисления в compile-time с возможностью эту самую рекурсию останавливать. В C++ это делается с помощью специализаций. Как с этим обстоит дело в вышеприведенных языках?


Очень просто. Как я уже сказал, эти вычисления пишутся на том же языке, что и основной код. Результат вычислений просто подставляется в код (в случае макросов, основанных на сплайсах).

В случае Scheme-овских syntax-rules так вообще есть почти прямой аналог специализации шаблонов — паттерн матчинг.

CX>Совершенно верно, т.к. в вычислениях должны участвовать только compile-time значения. Иначе какой же это compile-time?


Не вижу противоречий. Почему бы, например, не подсчитать тот же sin в compile-time? Или strlen? Например, хочу такую конструкцию: (print-with-len "Some string") разворачивать в такую: (begin (print "Some string") (print 11)), где 11 — это просто длина строки. Я ведь вполне могу это сделать и в compile-time?
Re[9]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.07.05 11:16
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>>Следовательно, проверять индекс нужно до его использования, следовательно, проверять индекс на уровне массива никакой необходимости нет — всё равно он ему "приходит" уже заведомо корректным.

СГ>А если приходит всё же не корректным, тогда что, портить память?
Я говорил о том случае, когда индекс заведомо корректен. "Если" злонамеренно не предусматривается, поскольку этих "если" может быть вагон помимо индексов, так что, вопрос отклоняется.

AVC>>>Еще иногда требуется проверка динамического типа переменной. Для этого в Обероне достаточно одного сравнения.

ГВ>>А это вообще часто называется ошибкой проектирования.
СГ>Наоборот. Это такой способ проектирования.
Да, есть такой способ. Правда он слегка не LSP-compliant. Из того, что пользуясь им Вирт иллюстрирует программирование на Обероне следует только то, что Вирт таким образом иллюстрирует программирование на Обероне. Не стоит обобщать.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[18]: Что толку в Ада если Ариан 5 все равно упал
От: raskin Россия  
Дата: 06.07.05 11:33
Оценка:
CrystaX wrote:
> WF>Конечно же, LISP. Правда, тут метапрограммирование не "шаблонное", а
> основанное на преобразовании AST. Scheme-овские syntax-rules. В
> принципе, похожи на шаблоны C++.
>
> Эээ... А разве здесь compile-time? Или все же interpret-time?
>
По выбору

> WF>Заметь, в отличии от C++ для метапрограммирования используется тот же

> host-язык. В C++, например, в компайл-тайм вызвать функцию некую
> библиотечную функцию (например, sin) нельзя.
>
> Совершенно верно, т.к. в вычислениях должны участвовать только
> compile-time значения. Иначе какой же это compile-time?
Легко. Мне нравится Паскаль. Но возможности нормально обратиться по
именам к 25 переменным по очереди не хватает. Ладно, пишу программу,
генерирующую нужный код, а её вывод гордо въезжает (на велосипеде, т.к.
хранить отдельно и не забывать собирать лень) в библиотеку.
Posted via RSDN NNTP Server 2.0 beta
Re[19]: Что толку в Ада если Ариан 5 все равно упал
От: FR  
Дата: 06.07.05 11:41
Оценка:
Здравствуйте, WFrag, Вы писали:


WF>Не вижу противоречий. Почему бы, например, не подсчитать тот же sin в compile-time? Или strlen? Например, хочу такую конструкцию: (print-with-len "Some string") разворачивать в такую: (begin (print "Some string") (print 11)), где 11 — это просто длина строки. Я ведь вполне могу это сделать и в compile-time?


так вроде с таким компиляторы C++ уже довольно давно справляются:
int main(int argc, char *argv[])
{
printf("%d\n", strlen("Some string"));
return 0;
}


превращается с помощью VC7.1 в:
; 13   : printf("%d\n", strlen("Some string"));

    push    11                    ; 0000000bH
    push    OFFSET FLAT:$SG928
    call    _printf
    add    esp, 8

; 14   : return 0;

    xor    eax, eax

; 15   : }

    ret    0
Re[19]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 11:43
Оценка:
Здравствуйте, WFrag, Вы писали:

CX>>Мне вообще интересен вполне конкретный механизм — рекурсивные вычисления в compile-time с возможностью эту самую рекурсию останавливать. В C++ это делается с помощью специализаций. Как с этим обстоит дело в вышеприведенных языках?


WF>Очень просто. Как я уже сказал, эти вычисления пишутся на том же языке, что и основной код. Результат вычислений просто подставляется в код (в случае макросов, основанных на сплайсах).


WF>В случае Scheme-овских syntax-rules так вообще есть почти прямой аналог специализации шаблонов — паттерн матчинг.


Интересно. В свободное время обращу на это внимание. А затем, вполне возможно, вернемся к данному обсуждению.

CX>>Совершенно верно, т.к. в вычислениях должны участвовать только compile-time значения. Иначе какой же это compile-time?


WF>Не вижу противоречий. Почему бы, например, не подсчитать тот же sin в compile-time? Или strlen? Например, хочу такую конструкцию: (print-with-len "Some string") разворачивать в такую: (begin (print "Some string") (print 11)), где 11 — это просто длина строки. Я ведь вполне могу это сделать и в compile-time?


Да, это возможно. Но и в C++ возможно выполнить подобное вычисление в compile-time. Вообще, конечно, нынешняя ситуация с шаблонами не очень удобна для создания подобных конструкций, но с введением в язык мета-функций (что, я надеюсь, все-таки случится) ситуация упростится и Ваш аргумент будет применим и к C++.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[19]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 11:46
Оценка:
Здравствуйте, raskin, Вы писали:

>> Совершенно верно, т.к. в вычислениях должны участвовать только

>> compile-time значения. Иначе какой же это compile-time?
R>Легко. Мне нравится Паскаль. Но возможности нормально обратиться по
R>именам к 25 переменным по очереди не хватает. Ладно, пишу программу,
R>генерирующую нужный код, а её вывод гордо въезжает (на велосипеде, т.к.
R>хранить отдельно и не забывать собирать лень) в библиотеку.

Разве это можно назвать compile-time вычислениями? Это же просто генерация кода, которая может быть выполнена практически на любом языке. Вот, например, в QT прежде чем скомпилировать программу, ее надо через их препроцессор прогнать (moc). Но разве можно это назвать метапрограммированием в compile-time?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: WFrag США  
Дата: 06.07.05 11:55
Оценка:
Здравствуйте, FR, Вы писали:

WF>>Не вижу противоречий. Почему бы, например, не подсчитать тот же sin в compile-time? Или strlen? Например, хочу такую конструкцию: (print-with-len "Some string") разворачивать в такую: (begin (print "Some string") (print 11)), где 11 — это просто длина строки. Я ведь вполне могу это сделать и в compile-time?


FR>так вроде с таким компиляторы C++ уже довольно давно справляются:

FR>
[...]
FR>


FR>превращается с помощью VC7.1 в:

FR>
[...]
FR>


Ну ты же понимаешь, что это не то.
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: raskin Россия  
Дата: 06.07.05 11:55
Оценка:
CrystaX wrote:
> Здравствуйте, raskin, Вы писали:
>
>> > Совершенно верно, т.к. в вычислениях должны участвовать только
>> > compile-time значения. Иначе какой же это compile-time?
> R>Легко. Мне нравится Паскаль. Но возможности нормально обратиться по
> R>именам к 25 переменным по очереди не хватает. Ладно, пишу программу,
> R>генерирующую нужный код, а её вывод гордо въезжает (на велосипеде, т.к.
> R>хранить отдельно и не забывать собирать лень) в библиотеку.
>
> Разве это можно назвать compile-time вычислениями? Это же просто
> генерация кода, которая может быть выполнена практически на любом языке.
> Вот, например, в QT прежде чем скомпилировать программу, ее надо через
> их препроцессор прогнать (moc). Но разве можно это назвать
> метапрограммированием в compile-time?

Добавлю в язык — можно будет. Если нет — то что Вы называете
мета-программированием? (я не утверждаю, что у меня есть хорошее
определение; это вопрос с целью узнать) Пока — да, генерация кода. Но
разные мелочи вроде упомянутых в теме позволяет сделать с меньшей моей
работой (а в чём ещё цель? надёжность тоже уменьшает работу). Я это, как
правило, использую вместо шаблонных функций и длинных конструкций (Что,
я что ли буду объявлять очевидную ерунду). Будет время — прикручу AST
модуля. А просто лямбда-функции мне просто не нужны — для этого есть
TMethod. Не говорите, что для этого нужен объект. А так, конечно
LISP/Scheme — но я не нашёл пока себе набор библиотеки+компилятор, чтобы
можно было с комфортом делать не только вычисления (в широком смысле).
Posted via RSDN NNTP Server 2.0 beta
Re[21]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 12:09
Оценка:
Здравствуйте, raskin, Вы писали:

R>Добавлю в язык — можно будет.


Это как? Свой язык создавать предлагаете?

R>Если нет — то что Вы называете

R>мета-программированием? (я не утверждаю, что у меня есть хорошее
R>определение; это вопрос с целью узнать)

Я не готов дать определение термину "метапрограммирование" в его широком смысле — это непростая задача. Но у меня есть определение термину "compile-time метапрограммирование". Это возможность с помощью определенных языковых конструкций изменять поведение компилятора. Подчеркиваю — изменять поведение компилятора, а не конечной программы! Изменение конечного кода это только эффект от изменения поведения компилятора. В C++ этого добиваются операциями над типами.

R>Пока — да, генерация кода. Но

R>разные мелочи вроде упомянутых в теме позволяет сделать с меньшей моей
R>работой (а в чём ещё цель? надёжность тоже уменьшает работу). Я это, как
R>правило, использую вместо шаблонных функций и длинных конструкций (Что,
R>я что ли буду объявлять очевидную ерунду). Будет время — прикручу AST
R>модуля.

Здесь куда-то в сторону уехали.

R>А просто лямбда-функции мне просто не нужны — для этого есть

R>TMethod. Не говорите, что для этого нужен объект.

Хорошо, не буду.

R>А так, конечно

R>LISP/Scheme — но я не нашёл пока себе набор библиотеки+компилятор, чтобы
R>можно было с комфортом делать не только вычисления (в широком смысле).

Каждой задаче — свой инструмент.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: raskin Россия  
Дата: 06.07.05 12:28
Оценка:
CrystaX wrote:

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

>
> R>Добавлю в язык — можно будет.
>
> Это как? Свой язык создавать предлагаете?
Хотя бы препроцессор. Или диалект Паскаль. Тем, кто не поддержит идею —
отдавать сгенерированный код, если надо.
>
> R>Если нет — то что Вы называете
> R>мета-программированием? (я не утверждаю, что у меня есть хорошее
> R>определение; это вопрос с целью узнать)
>
> Я не готов дать определение термину "метапрограммирование" в его широком
> смысле — это непростая задача. Но у меня есть определение термину
> "compile-time метапрограммирование". Это возможность с помощью
> определенных языковых конструкций изменять поведение компилятора.
> Подчеркиваю — изменять поведение компилятора, а не конечной программы!
> Изменение конечного кода это только эффект от изменения поведения
> компилятора. В C++ этого добиваются операциями над типами.

Если честно, не очень понял. Я могу сделать что-то вроде list of
myobject — это считается? Могу описать алгоритм с
параметром-подпроцедурой. Могу из перегруженных функций собрать
перегруженный алгоритм (без усилий). А что для счастья надо? Новые
ключевые слова?
Если можно, приведите пример, что Вы считаете compile-time metaprogramming

> R>Пока — да, генерация кода. Но

> R>разные мелочи вроде упомянутых в теме позволяет сделать с меньшей моей
> R>работой (а в чём ещё цель? надёжность тоже уменьшает работу). Я это, как
> R>правило, использую вместо шаблонных функций и длинных конструкций (Что,
> R>я что ли буду объявлять очевидную ерунду). Будет время — прикручу AST
> R>модуля.
>
> Здесь куда-то в сторону уехали
Про AST? Ну, иногда создавать обобщённый код в его терминах приятней.

> R>А просто лямбда-функции мне просто не нужны — для этого есть

> R>TMethod. Не говорите, что для этого нужен объект.
>
> Хорошо, не буду.
>
> R>А так, конечно
> R>LISP/Scheme — но я не нашёл пока себе набор библиотеки+компилятор, чтобы
> R>можно было с комфортом делать не только вычисления (в широком смысле).
>
> Каждой задаче — свой инструмент.
Да, конечно.. Просто язык удобен, компилятор есть — а stand-alone ещё
подумай, как собрать, и окошко для ввода-выводы подумай, как нарисовать.
Лень. Пока что.
Posted via RSDN NNTP Server 2.0 beta
Re[17]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 06.07.05 12:41
Оценка:
А ещё Пролог и Форт.
Re[10]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 06.07.05 12:45
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

AVC>>>>Еще иногда требуется проверка динамического типа переменной. Для этого в Обероне достаточно одного сравнения.

ГВ>>>А это вообще часто называется ошибкой проектирования.
СГ>>Наоборот. Это такой способ проектирования.
ГВ>Да, есть такой способ. Правда он слегка не LSP-compliant.
Это почему-же?
ГВ>Из того, что пользуясь им Вирт иллюстрирует программирование на Обероне следует только то, что Вирт таким образом иллюстрирует программирование на Обероне. Не стоит обобщать.
А из того, что таким образом спроектирована Оберон-система следует только то, что таким образом спроектирована Оберон-система.
Re[11]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.07.05 12:58
Оценка:
Здравствуйте, Трурль, Вы писали:

AVC>>>>>Еще иногда требуется проверка динамического типа переменной. Для этого в Обероне достаточно одного сравнения.

ГВ>>>>А это вообще часто называется ошибкой проектирования.
СГ>>>Наоборот. Это такой способ проектирования.
ГВ>>Да, есть такой способ. Правда он слегка не LSP-compliant.
Т>Это почему-же?
Сейчас ссылки поднимать некогда, закину завтра. Пока что, посмотри в инете по ключевому слову LSP или Liskov's Substitution Principle. Можно даже поиском по RSDN.

ГВ>>Из того, что пользуясь им Вирт иллюстрирует программирование на Обероне следует только то, что Вирт таким образом иллюстрирует программирование на Обероне. Не стоит обобщать.

Т>А из того, что таким образом спроектирована Оберон-система следует только то, что таким образом спроектирована Оберон-система.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 06.07.05 13:06
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Я не готов дать определение термину "метапрограммирование" в его широком смысле — это непростая задача.

Подумаешь, бином Ньютона. Вот, пожалуйста:

Метапрограммирование- написание программ, которые используют программы в качестве данных.


CX>Но у меня есть определение термину "compile-time метапрограммирование". Это возможность с помощью определенных языковых конструкций изменять поведение компилятора. Подчеркиваю — изменять поведение компилятора, а не конечной программы!

А использование прагм — это "compile-time метапрограммирование"?
Re[19]: Что толку в Ада если Ариан 5 все равно упал
От: Oleg A. Bachin Украина  
Дата: 06.07.05 13:06
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Было преобразование (причем контролируемое!) между 64-битной переменной

C>и знаковой 16-битной. Диапазона значений 16-битный переменной хватало
C>для оригинального датчика, но не для измененного. Из-за переполнения
C>вылетело исключение, которое весело распечаталось в поток управления
C>(узнаю адски-паскалевские решения).

только не надо передергивать! если уж спорите — так спорьте честно!
в делфях стандарное решение — на базе синглетона application на верхнем уровевне ловить ИС и обрабатывать назначенной для этого дела процедуркой ApplicationException.
а вот на сишные привычки — это оооочень смахивает! пихать на стек текст и переменные, а потом разбирайся как хочешь! кроме как в поток через printf с этим мало чего полезного сделаешь.

PS против плюсов ничего не имею, но иногда приходится с плоскими либами работать — наследие еще то!
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re[23]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 13:13
Оценка:
Здравствуйте, Трурль, Вы писали:

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


CX>>Я не готов дать определение термину "метапрограммирование" в его широком смысле — это непростая задача.

Т>Подумаешь, бином Ньютона. Вот, пожалуйста:
Т>

Метапрограммирование- написание программ, которые используют программы в качестве данных.


В общем смысле да. Но как всегда и во всем, есть нюансы.

CX>>Но у меня есть определение термину "compile-time метапрограммирование". Это возможность с помощью определенных языковых конструкций изменять поведение компилятора. Подчеркиваю — изменять поведение компилятора, а не конечной программы!

Т>А использование прагм — это "compile-time метапрограммирование"?

Нет. Так как а) они не являются языковыми конструкциями и б) жестко задают поведение компилятора без возможности выбора.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[12]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 06.07.05 13:16
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Сейчас ссылки поднимать некогда, закину завтра. Пока что, посмотри в инете по ключевому слову LSP или Liskov's Substitution Principle. Можно даже поиском по RSDN.

Кажется, Вы не так поняли вопрос. Я не просил объяснить, что такое LSP. Мне интересно где там incompliance?
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: Oleg A. Bachin Украина  
Дата: 06.07.05 13:17
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>
СГ>MODULE Test;

СГ>  IMPORT StdLog;

СГ>  PROCEDURE Do*;
СГ>    VAR i16: SHORTINT; i64: LONGINT;
СГ>  BEGIN
СГ>    i64 := 1000000000000001L;

СГ>    i16 := SHORT(SHORT(i64));  (* Вот так кастуются от LONGINT к SHORTINT *)

СГ>    StdLog.Int(i64); StdLog.Ln;
СГ>    StdLog.Int(i16); StdLog.Ln
СГ>  END Do;

СГ>END Test.
СГ>

.............
СГ>(* В Oberon 2 типы чуток подругому называются, там HUGEINT — 64, LONGINT — 32, INTEGER — 16, SHORTINT — 8 битов *)

а это что было? если паскаль, то так кастуют только параноики — людям одного каста хватает.
кстати, людям хватаит и без каста, просто будет варнинг. если нужно точное совпадение типов (или каст) специально при объявлении типа указывается что он "строго типизированный" по аналогии explicit в сях.

ЗЫ шо за прывычка по 10 операторов в строку... фе.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re[9]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.07.05 13:18
Оценка:
Здравствуйте, AVC, Вы писали:

ГВ>>Это наследие C и, кроме того, остаётся открытым вопрос: как конкретно должен быть реализован массив? std::vector<> — то частное решение, хоть и стандартизированное.

AVC>Пока не изобретен лучший вариант, меня вполне устраивает виртовское решение.

Именно поэтому оно должно быть внесено в C++ на уровне языка?

AVC>>>Кроме индекса массива, в Обероне проверяются на NIL указатели и процедурные переменные. (Если они имеют значение, отличное от NIL, то их валидность гарантируется. В том числе — сборщиком мусора.)

ГВ>>Опять таки, проверки на NULL (NIL) по месту вызова нужны не всегда. Точно так же, как и с массивами. Зачастую гораздо проще проверить валидность структур перед началом выполнения алгоритма, чем проверять их при каждом использовании.

AVC>Существует понятие программирования по контракту. (Мейер)

AVC>Главный принцип: не доверяй клиенту (вызывающему коду).

Всё хорошо в своём месте и в своё время. ООП само по себе тоже не всегда адекватно задачам. Так что, принцип программирования по контракту тоже не стоит распространять на все случаи программирования.

AVC>>>Еще иногда требуется проверка динамического типа переменной. Для этого в Обероне достаточно одного сравнения.

ГВ>>А это вообще часто называется ошибкой проектирования.
AVC>Это смотря как и где этим пользоваться.
AVC>В Си++ также есть соответствующие "касты".
Которыми нужно пользоваться с тройной оглядкой.

AVC>В самом первом виртовском Обероне не было присоединенных процедур (=виртуальных функций).

AVC>Полиморфизм работал исключительно благодаря динамическому приведению типа.
AVC>Наверное, поэтому динамическое приведение типа реализовано так эффективно.
AVC>Например (опустив все лишнее):
[...]

Ну, я так понимаю, здесь влияет ещё и модель объектов паскаля, конкретно — строго одиночное наследование.

AVC>>>Вот, пожалуй, и все необходимые проверки в Обероне. Можете видеть сами — все они связаны с безопасностью типов и требуют не более одного-двух (для индекса массива) сравнений.

ГВ>>Угу, но каждый раз...
AVC>Опять-таки оптимизатор может устранить некоторые лишние проверки.
Здесь согласен. Хотя я бы не стал полагаться на оптимизатор...

AVC>>>Этого достаточно, чтобы компилятор гарантировал обращение с переменными только в соответствии с их типом (type safety).

AVC>>>Для исключения ошибок в вычислениях иногда желательны проверки на переполнение и т.п. В этом Оберон не отличается от других языков. Оберон позволяет как использовать, так и отключать подобные проверки. (Лично я против такого отключения.)
ГВ>>В отладочных версиях такие проверки полезны, спору нет. В не-отладочных такие проверки очень круто сажают производительность, особенно при большом количестве разыменований.
AVC>Измерения производительности этого не подтверждают.
Что именно они не подтверждают? Падение производительности? Т.е., цепочка инструкций:

inline T *operator->()
{
  if (!p_) throw IllegalPointer;
    return p_;
}


отработает в общем быстрее, чем:

inline T *operator->()
{
    return p_;
}


?

ГВ>>Средствами C++ можно обойти type safety. Разумность такого решения — отдельный вопрос. Если голова на плечах есть — всмё будет в порядке, если с этим проблема, то runtime проверками дела не поправишь. Приведённый пример с NASA свидетельствует, скорее, не о бенефитах типобезопасности, а о том, что всем в NASA было настолько страшно взять ответственность на себя, что спихнули всё на "неправильную" фичу языка. Т.е., проблема не в языке, а в головах.


AVC>Согласен, что проблема — в головах.

AVC>Потому что именно из голов она попадает в языки.

В огороде бузина, а в трюме акулы...

AVC>Забавно читать, что "средствами C++ можно обойти type safety".

AVC>Где бы найти в Си++ эту самую type safety...
Да есть она там, что тут можно сказать...
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[23]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 13:23
Оценка:
Здравствуйте, raskin, Вы писали:

>> Это как? Свой язык создавать предлагаете?

R>Хотя бы препроцессор. Или диалект Паскаль. Тем, кто не поддержит идею —
R>отдавать сгенерированный код, если надо.

В экую степь унесло! Речь ведь идет о существующих языках.

R>Если можно, приведите пример, что Вы считаете compile-time metaprogramming


Пример приведу на C++ — им владею намного лучше, чем функциональными языками.

template <int A, size_t N>
struct power
{
    static int const result = A * power<A, N - 1>::result;
};

template <int A>
struct power<A, 0> {static int const result = 1;};

int a = power<4, 5>::result;


Пример очень упрощенный, но основная идея в нем видна — вычисления происходит в compile-time, при этом с помощью частичной специализации введено условие, при совпадении с которым компилятор прекращает рекурсию (т.е. изменяет поведение). Ни один аспект этого поведения не попадает в конечный код, вся работа производится компилятором.

>> Здесь куда-то в сторону уехали

R>Про AST? Ну, иногда создавать обобщённый код в его терминах приятней.

Да нет, просто это уже вообще не о метапрограммировании.

>> Каждой задаче — свой инструмент.

R>Да, конечно.. Просто язык удобен, компилятор есть — а stand-alone ещё
R>подумай, как собрать, и окошко для ввода-выводы подумай, как нарисовать.
R>Лень. Пока что.

... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[13]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.07.05 13:23
Оценка:
Здравствуйте, Трурль, Вы писали:

ГВ>>Сейчас ссылки поднимать некогда, закину завтра. Пока что, посмотри в инете по ключевому слову LSP или Liskov's Substitution Principle. Можно даже поиском по RSDN.

Т>Кажется, Вы не так поняли вопрос. Я не просил объяснить, что такое LSP. Мне интересно где там incompliance?

А... извини, плз.

Например, код, аналогичный вот такому анализу:

    IF msg IS DrawMsg THEN (*draw rectangle r*)
    ELSIF msg IS MarkMsg THEN MarkRectangle(r, msg(MarkMsg).on)
    ELSIF msg IS MoveMsg THEN


часто приводится в описаниях LSP как пример LSP-incompliancy.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[10]: Что толку в Ада если Ариан 5 все равно упал
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 06.07.05 13:26
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ> ... этих "если" может быть вагон помимо индексов


Но почему вагон, ведь всего две (и обе уже решены):
1) Проверка индексов массивов;
2) Проверка правильности приведения/преобразования типов;
что еще-то???

Например, повисшие указатели отсутствуют по причине наличия автоматической сборки мусора, автоматической инициализации (новых) указателей NIL-овым значением, невозможности присвоить указателю неправильное значение. Это же, за исключением сборки мусора, относится и к процедурным переменным.
Re[21]: Что толку в Ада если Ариан 5 все равно упал
От: Oleg A. Bachin Украина  
Дата: 06.07.05 13:28
Оценка:
Здравствуйте, AlexEagle, Вы писали:

E>>>Теперь объясни мне, где же я ошибся в определении причины катастрофы? Главное, что исключение возникло там, где его не ждали.


K_O>>А мне кажется, что главное, что исключение возникло. Потому что софт содержал ошибку.


AE>Категорически не согласен... В делфе легко можно получить исключение сфокусирован невидимый контрол средствами VCL... Бред... Причем апи тоже ругается, но тихо и свою работу все же выполняет...

да, встречал такие програмки... а потом любимое OleDb исключение — Multistep error. потому как эксепшены не кидаем, а коды возврата проверять лень.


AE>Из-за этого я избегаю VCL-ных функций, так как они создают проблемы на пустом месте своими дебильнымим исключениями


бред — твое высказывание! не нравятся исключение — проверяй коды возврата. тут народ за нормальный ООП агитирует, а ты назад в пещеры.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re[14]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 06.07.05 13:43
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Например, код, аналогичный вот такому анализу:


ГВ>
ГВ>    IF msg IS DrawMsg THEN (*draw rectangle r*)
ГВ>    ELSIF msg IS MarkMsg THEN MarkRectangle(r, msg(MarkMsg).on)
ГВ>    ELSIF msg IS MoveMsg THEN
ГВ>


ГВ>часто приводится в описаниях LSP как пример LSP-incompliancy.


Думаю, не совсем аналогичный.
IF msg IS DrawMsg THEN (* это выполняется для DrawMsg и всех его потомков*)
Re[11]: Что толку в Ада если Ариан 5 все равно упал
От: Cyberax Марс  
Дата: 06.07.05 13:43
Оценка: +3
Сергей Губанов wrote:

> ГВ> ... этих "если" может быть вагон помимо индексов

> Но почему вагон, ведь всего две (и обе уже решены):
> 1) Проверка индексов массивов;
> 2) Проверка правильности приведения/преобразования типов;
> что еще-то???

3) Гонки в MT
4) Deadlock'и в MT
5) Неосвобождение ресурсов
6) Неправильная обработка исключений
7) ....

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[24]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 06.07.05 13:57
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Пример приведу на C++ — им владею намного лучше, чем функциональными языками.


CX>
CX>template <int A, size_t N>
CX>struct power
CX>{
CX>    static int const result = A * power<A, N - 1>::result;
CX>};

CX>template <int A>
CX>struct power<A, 0> {static int const result = 1;};

CX>int a = power<4, 5>::result;
CX>


А теперь вопрос. В какую максимальную степень можно возвести 4?
Re[25]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 14:03
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>А теперь вопрос. В какую максимальную степень можно возвести 4?


Если речь о глубине рекурсии, то implementation defined. По стандарту (насколько я помню), ограничений нет.
Но какое это имеет отношение к разговору?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[12]: Что толку в Ада если Ариан 5 все равно упал
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 06.07.05 14:03
Оценка:
Здравствуйте, Cyberax, Вы писали:

>> что еще-то???


C>3) Гонки в MT

C>4) Deadlock'и в MT
C>5) Неосвобождение ресурсов
C>6) Неправильная обработка исключений

Спасибо, но порчи памяти от этого не происходит.

Порча памяти может произойти из-за неправильного индекса массива (1) и из-за неправильного преобразования/приведения типа (2). Остальные причины могут быть полностью устранены проверками во время компиляции. Итого мне известны всего 2 причины порчи памяти. Есть ли что-то еще?

А, ну да, в принципе еще бывает такая неприятность как кончилось место для стека...
Re[13]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 06.07.05 14:22
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, Cyberax, Вы писали:


>>> что еще-то???


C>>3) Гонки в MT

C>>4) Deadlock'и в MT
C>>5) Неосвобождение ресурсов
C>>6) Неправильная обработка исключений

СГ>Спасибо, но порчи памяти от этого не происходит.


Сергей, а ты многопоточностью-то точно занимался?

СГ>Порча памяти может произойти из-за неправильного индекса массива (1) и из-за неправильного преобразования/приведения типа (2).


3. Из-за того, что нить A начинает писать данные в разделяемую переменную, ее вытесняет нить B, которая пишет свои данные в туже самую переменную. Причина проблемы в том, что A и B не были правильно синхронизированны.

СГ> Остальные причины могут быть полностью устранены проверками во время компиляции. Итого мне известны всего 2 причины порчи памяти.


Кто-то из древних мудрецов сказал: "Я знаю, что ничего не знаю". Ведь он был прав, ты не находишь?
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
LSP, ДК, Вирт - поехали...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.07.05 14:34
Оценка:
Здравствуйте, Трурль, Вы писали:

ГВ>>Например, код, аналогичный вот такому анализу:


ГВ>>
ГВ>>    IF msg IS DrawMsg THEN (*draw rectangle r*)
ГВ>>    ELSIF msg IS MarkMsg THEN MarkRectangle(r, msg(MarkMsg).on)
ГВ>>    ELSIF msg IS MoveMsg THEN
ГВ>>


ГВ>>часто приводится в описаниях LSP как пример LSP-incompliancy.


Т>Думаю, не совсем аналогичный.

Т>
Т>IF msg IS DrawMsg THEN (* это выполняется для DrawMsg и всех его потомков*)
Т>


Однако, если сугубо формально, то анализ типа сообщения всё равно остаётся. Тем-то, кстати, и хорош LSP, что его нарушение можно определить по сугубо формальным признакам. Дизъюнктивная когерентность метода тоже присутствует (естественно!). Для справки, "дизъюнктивная когерентность", грубо говоря, это когда функция выполняет разные алгоритмы под влиянием значения входного параметра. Например, функция FormatMessage из Win32 — ни что иное, как ДК-функция из-за наличия параметра dwFlags, который определяет способы извлечения строк, способы форматирования и т.п.

Дальше в любом случае нужно анализировать саму задачу и её реализацию. В данный момент я оспариваю обобщение, сформулированное Сергеем Губановым:

AVC>>Еще иногда требуется проверка динамического типа переменной. Для этого в Обероне достаточно одного сравнения.
ГВ>А это вообще часто называется ошибкой проектирования.
Наоборот. Это такой способ проектирования.
http://www.inr.ac.ru/~info21/wirth/programming_in_oberon.pdf


Нет ничего удивительного в том, что для иллюстрации использования IS Вирт пользуется таким приёмом, в конце концов, иллюстрация есть иллюстрация. Никто же не заставляет, например, "в лоб" переносить объектные модели из книг Буча/Шлеера/и т.д. в реальные проекты (хотя некоторые горячие головы могут)!

Вроде бы и да, можно воспользоваться такой техникой в случае, если тег типа (имя типа) употребляется как переключатель. Но фактически, это почти то же самое, что и:


struct message {
  int type;
    // ...
};

#define DRAW_MESSAGE 12345
#define MARK_MESSAGE 67890
// ...

class Handler {

void handle(const message &msg)
{
  switch(msg.type)
    {
      case DRAW_MESSAGE: // ...
        case MARK_MESSAGE: // ...
    }
}

};


А такая техника обработки сообщений в общем-то, противоречит объектному стилю. Здесь причина зарыта достаточно глубоко и, ИМХО, начинается с того, что методы объектов сами по себе являются сообщениями, а внесение дублирующей структуры типа "сообщение" становится э... чем-то вроде тавтологии. Соответственно, нарушение фундаментального принципа тащит за собой нарушения и кучи других: архитектура смешивается, зависимости становятся неявными и т.п.

Так что, хотя такой "способ проектирования" и есть, но я бы не стал заявлять о нём, как о чём-то, имеющем ценность большую, чем сугубо иллюстративную.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[14]: Что толку в Ада если Ариан 5 все равно упал
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 06.07.05 14:40
Оценка:
Здравствуйте, eao197, Вы писали:

E>3. Из-за того, что нить A начинает писать данные в разделяемую переменную, ее вытесняет нить B, которая пишет свои данные в туже самую переменную. Причина проблемы в том, что A и B не были правильно синхронизированны.


Вы правы. Я об этом позабыл. Хорошо. Итого, теперь мы знаем три причины по которым можно испортить память:

1) неправильный индекс массива
2) неправильное приведение типа
3) неправильная синхронизация потоков, изменяющих одну и туже переменную

Две из них решаются с помощью проверок во время исполнения, от третьей, видимо, в принципе нет защиты, кроме аккуратного проектирования.

Есть ли еще?
Re[11]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.07.05 14:44
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

ГВ>> ... этих "если" может быть вагон помимо индексов

СГ>Но почему вагон, ведь всего две (и обе уже решены):
СГ>1) Проверка индексов массивов;
СГ>2) Проверка правильности приведения/преобразования типов;
СГ>что еще-то???

Можно обобщить: любые проверки допустимости значений параметров. Между прочим, это немаловажная часть "программирования по контракту" — формулирование самого контракта в явном, машиночитаемом виде.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[24]: Что толку в Ада если Ариан 5 все равно упал
От: Кодт Россия  
Дата: 06.07.05 14:49
Оценка: +1
Здравствуйте, CrystaX, Вы писали:

CX>>>Но у меня есть определение термину "compile-time метапрограммирование". Это возможность с помощью определенных языковых конструкций изменять поведение компилятора. Подчеркиваю — изменять поведение компилятора, а не конечной программы!

Т>>А использование прагм — это "compile-time метапрограммирование"?
CX>Нет. Так как а) они не являются языковыми конструкциями и б) жестко задают поведение компилятора без возможности выбора.

Э! Любая программа, поданная на вход компилятора, "меняет" его поведение, потому что "обычное" поведение компилятора — в основном это лежать на диске и никого не трогать

Прагмы как раз влияют на компилятор, в бОльшей степени, чем compile-time программирование.

Compile-time означает, что некоторую часть действий компилятор берёт на себя:
— парсинг (по сравнению со скриптовыми языками)
— порождение объектного кода (по сравнению с интерпретаторами)
— вычисление констант (некоторые дубовые компиляторы вполне могут родить код, перевычисляющий 2*2 каждый раз)
— сопоставление типов (нетипизированные языки откладывают это на время исполнения)
— воплощение шаблонов (альтернатива — нетипизированные конструкции и сопоставление в рантайме)
Всё это поведение является штатным, разной степени затейливости.
Перекуём баги на фичи!
Re[11]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.07.05 14:50
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

ГВ>> ... этих "если" может быть вагон помимо индексов

СГ>Но почему вагон, ведь всего две (и обе уже решены):
СГ>1) Проверка индексов массивов;
СГ>2) Проверка правильности приведения/преобразования типов;
СГ>что еще-то???

А что, порчей памяти и зависанием ссылок проблемы ограничиваются? Почему тогда им такое предпочтение? По моим наблюдениям, куда как больше неприятностей в конечном итоге вызывают неправильные алгоритмы и их неправильное использование. Те же неприятности в MT могут принести ничуть не меньше секса.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[23]: Что толку в Ада если Ариан 5 все равно упал
От: Кодт Россия  
Дата: 06.07.05 14:52
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB>Здравствуйте, Сергей Губанов, Вы писали:


СГ>>
СГ>>    i16 := SHORT(SHORT(i64));  (* Вот так кастуются от LONGINT к SHORTINT *)
СГ>>

OAB>.............
СГ>>(* В Oberon 2 типы чуток подругому называются, там HUGEINT — 64, LONGINT — 32, INTEGER — 16, SHORTINT — 8 битов *)

OAB>а это что было? если паскаль, то так кастуют только параноики — людям одного каста хватает.


Я так понял, что SHORT — это перегруженная функция, берущая младшую половинку числа. Поскольку SHORTINT — это четверть от LONGINT, пришлось вызвать дважды.
Перекуём баги на фичи!
Re[14]: Что толку в Ада если Ариан 5 все равно упал
От: WFrag США  
Дата: 06.07.05 14:54
Оценка: +1 :)
Здравствуйте, CrystaX, Вы писали:

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


Да, настолько убогого механизма вычислений на этапе компиляции нет ни в одном языке

Вот, например, по LISP-у есть книжка.

Уж как минимум LISP и его мета-возможности должен знать каждый уважающий себя программист! Чтоб потом не говорить, что вычисление на этапе компиляции есть только в C++ (хотя признаюсь, после прочтения Александреску я тоже восторгался шаблонами). Без обид.
... << RSDN@Home 1.1.4 beta 6a rev. 438>>
Re[25]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 14:58
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Э! Любая программа, поданная на вход компилятора, "меняет" его поведение, потому что "обычное" поведение компилятора — в основном это лежать на диске и никого не трогать




К>Прагмы как раз влияют на компилятор, в бОльшей степени, чем compile-time программирование.


Это как? Разве можно в прагму запихнуть условие? Я всегда воспринимал прагмы как прямое указание к действие, но не условие.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[24]: Что толку в Ада если Ариан 5 все равно упал
От: Oleg A. Bachin Украина  
Дата: 06.07.05 15:00
Оценка:
Здравствуйте, Кодт, Вы писали:

СГ>>>
СГ>>>    i16 := SHORT(SHORT(i64));  (* Вот так кастуются от LONGINT к SHORTINT *)
СГ>>>

OAB>>.............
СГ>>>(* В Oberon 2 типы чуток подругому называются, там HUGEINT — 64, LONGINT — 32, INTEGER — 16, SHORTINT — 8 битов *)

OAB>>а это что было? если паскаль, то так кастуют только параноики — людям одного каста хватает.


К>Я так понял, что SHORT — это перегруженная функция, берущая младшую половинку числа. Поскольку SHORTINT — это четверть от LONGINT, пришлось вызвать дважды.


в случае signed типов просто взять младшую половинку не совсем красивое решение... потеря знака гарантированна. интересненький каст тогда получается...
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re[15]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 15:01
Оценка:
Здравствуйте, WFrag, Вы писали:

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


WF>Да, настолько убогого механизма вычислений на этапе компиляции нет ни в одном языке


Не буду спорить, механизм не самый удобный.

WF>Вот, например, по LISP-у есть книжка.


WF>Уж как минимум LISP и его мета-возможности должен знать каждый уважающий себя программист! Чтоб потом не говорить, что вычисление на этапе компиляции есть только в C++ (хотя признаюсь, после прочтения Александреску я тоже восторгался шаблонами). Без обид.


Да ладно, какие обиды.
Вот только мы же не о лиспе говорим. Согласись, это язык совсем другого уровня.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[8]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.07.05 15:11
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Это не хак и не кряк, а непонимание того, как устроен CString.

Кодт, спасибо за поправку. На самом деле я имел ввиду именно приведение типа такого:

Header *p = &((Header*)m_Data)[-1];


К>У него нет "минус-первого" элемента массива (хотя бы потому, что элементы массива — это символы — CHAR/WCHAR, а служебная информация там явно не однобайтная).

Да, естественно.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[24]: Что толку в Ада если Ариан 5 все равно упал
От: WFrag США  
Дата: 06.07.05 15:15
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Пример приведу на C++ — им владею намного лучше, чем функциональными языками.


Шаблоны имеют много общего с функциональными языками

CX>
CX>template <int A, size_t N>
CX>struct power
CX>{
CX>    static int const result = A * power<A, N - 1>::result;
CX>};

CX>template <int A>
CX>struct power<A, 0> {static int const result = 1;};

CX>int a = power<4, 5>::result;
CX>


CX>Пример очень упрощенный, но основная идея в нем видна — вычисления происходит в compile-time, при этом с помощью частичной специализации введено условие, при совпадении с которым компилятор прекращает рекурсию (т.е. изменяет поведение). Ни один аспект этого поведения не попадает в конечный код, вся работа производится компилятором.


(define (pow x n)
    (define (pow1 n t)
        (if (= n 0)
            t
            (pow1 (- n 1) (* t x))))
    (pow1 n 1))


(define-syntax pow-ct
    (lambda (x)
        (syntax-case x ()
            ((_ a n) (pow (syntax-object->datum (syntax a)) (syntax-object->datum (syntax n)))))))

(define-macro (pow-ct2 a n)
    (pow a n))


(print (pow-ct 2 3))

(print (pow-ct2 3 4))


8 и 81 будут вычислены при компиляции (или при интерпретации ). Первый макрос в стиле Scheme, второй в стиле LISP (код написан на Scheme).

Заметь, функция pow — обычная функция. Вместо нее могла быть функция рейтрейсинга и я так же спокойно мог бы использовать ее в compile-time (ну, например, чтобы встроить в свой код красивый логотип в виде битмапа ). А у тебя "функция" power во время исполнения абсолютно бесполезна. Вот это и есть убожество C++ с точки зрения метапрограммирования.
... << RSDN@Home 1.1.4 beta 6a rev. 438>>
Re[16]: Что толку в Ада если Ариан 5 все равно упал
От: WFrag США  
Дата: 06.07.05 15:18
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Вот только мы же не о лиспе говорим. Согласись, это язык совсем другого уровня.


Ну да, и что? Как можно говорить о вычислениях на этапе компиляции, не зная макросов LISP? Есть, конечно, уйма других подходов, но LISP — это однозначно один из самых значительных.
... << RSDN@Home 1.1.4 beta 6a rev. 438>>
Re[15]: Что толку в Ада если Ариан 5 все равно упал
От: WFrag США  
Дата: 06.07.05 15:28
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>1) неправильный индекс массива

СГ>2) неправильное приведение типа
СГ>3) неправильная синхронизация потоков, изменяющих одну и туже переменную

СГ>Две из них решаются с помощью проверок во время исполнения, от третьей, видимо, в принципе нет защиты, кроме аккуратного проектирования.


Либо использование другой модели взаимодействия процессов (потоков), например, основанных на Пи-исчислении.
... << RSDN@Home 1.1.4 beta 6a rev. 438>>
Re[17]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 06.07.05 16:17
Оценка:
Здравствуйте, WFrag, Вы писали:

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


CX>>Вот только мы же не о лиспе говорим. Согласись, это язык совсем другого уровня.


WF>Ну да, и что? Как можно говорить о вычислениях на этапе компиляции, не зная макросов LISP? Есть, конечно, уйма других подходов, но LISP — это однозначно один из самых значительных.


Стоп-стоп-стоп. Изначально речь шла о безопасных и небезопасных традиционных языках. Зашла речь о метапрограммировании, которое доступно в C++ и недоступно в других языках, которые приводились как его главные противники.
Причем здесь лисп? Да ни причем. Ежу понятно, что C++ с функциональными языками в сфере метапрограммирования конкурировать не может. Ну так и не нужно. Разве ж этого кто добивался?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[24]: Что толку в Ада если Ариан 5 все равно упал
От: raskin Россия  
Дата: 06.07.05 18:42
Оценка:
CrystaX wrote:
>> > Это как? Свой язык создавать предлагаете?
> R>Хотя бы препроцессор. Или диалект Паскаль. Тем, кто не поддержит идею —
> R>отдавать сгенерированный код, если надо.
>
> В экую степь унесло! Речь ведь идет о *существующих* языках.
Я на этом пишу! На том, что уже реализовал. Супер-убого — но лучше,
нежели ничего (для меня). Велосипед на десяток килобайт — уже препроцессор.
>
> R>Если можно, приведите пример, что Вы считаете compile-time metaprogramming
>
> Пример приведу на C++ — им владею намного лучше, чем функциональными
> языками.
>
> template <int A, size_t N>
> struct power
> {
> static int const result = A * power<A, N — 1>::result;
> };
>
> template <int A>
> struct power<A, 0> {static int const result = 1;};
>
> int a = power<4, 5>::result;
>
>
>
> Пример очень упрощенный, но основная идея в нем видна — вычисления
> происходит в compile-time, при этом с помощью частичной специализации
> введено условие, при совпадении с которым компилятор прекращает рекурсию
> (т.е. изменяет поведение). Ни один аспект этого поведения не попадает в
> конечный код, вся работа производится компилятором.
При аккуратной генерации тоже такое используется. Включая (если надо)
использование обычно run-time функций из модулей проекта. Ну, правда,
зависимости ловить надо.
>
>> > Здесь куда-то в сторону уехали
> R>Про AST? Ну, иногда создавать обобщённый код в его терминах приятней.
>
> Да нет, просто это уже вообще не о метапрограммировании.
Формально говоря разные compile-time вычисления можно описать в терминах
замены символов в AST на их значения в compile-time среде.
Posted via RSDN NNTP Server 2.0 beta
Re[26]: Что толку в Ада если Ариан 5 все равно упал
От: raskin Россия  
Дата: 06.07.05 18:44
Оценка:
CrystaX wrote:
> Здравствуйте, Кодт, Вы писали:
>
> К>Э! Любая программа, поданная на вход компилятора, "меняет" его
> поведение, потому что "обычное" поведение компилятора — в основном это
> лежать на диске и никого не трогать
>
>
>
> К>Прагмы как раз влияют на компилятор, в бОльшей степени, чем
> compile-time программирование.
>
> Это как? Разве можно в прагму запихнуть условие? Я всегда воспринимал
> прагмы как прямое указание к действие, но не условие.
Зато можно очень резко поменять его отношение к некоторым конструкциям.
Posted via RSDN NNTP Server 2.0 beta
Re[18]: Что толку в Ада если Ариан 5 все равно упал
От: raskin Россия  
Дата: 06.07.05 18:47
Оценка:
CrystaX wrote:
> WF>Ну да, и что? Как можно говорить о вычислениях на этапе компиляции,
> не зная макросов LISP? Есть, конечно, уйма других подходов, но LISP —
> это однозначно один из самых значительных.
>
> Стоп-стоп-стоп. Изначально речь шла о безопасных и небезопасных
> традиционных языках. Зашла речь о метапрограммировании, которое доступно
> в C++ и недоступно в других языках, которые приводились как его главные
> противники.
> Причем здесь лисп? Да ни причем. Ежу понятно, что C++ с функциональными
> языками в сфере метапрограммирования конкурировать не может. Ну так и не
> нужно. Разве ж этого кто добивался?

Функциональный ли язык LISP зависит от того, как им пользоваться, в
конце концов. Императивные оптимизации у него обычно плохие — но писать
императивно можно.
Posted via RSDN NNTP Server 2.0 beta
Re: LSP, ДК, Вирт - поехали...
От: AVC Россия  
Дата: 06.07.05 19:09
Оценка: +1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Дальше в любом случае нужно анализировать саму задачу и её реализацию. В данный момент я оспариваю обобщение, сформулированное Сергеем Губановым:


ГВ>

AVC>>>Еще иногда требуется проверка динамического типа переменной. Для этого в Обероне достаточно одного сравнения.
ГВ>>А это вообще часто называется ошибкой проектирования.
ГВ>Наоборот. Это такой способ проектирования.
ГВ> http://www.inr.ac.ru/~info21/wirth/programming_in_oberon.pdf


ГВ>Нет ничего удивительного в том, что для иллюстрации использования IS Вирт пользуется таким приёмом, в конце концов, иллюстрация есть иллюстрация. Никто же не заставляет, например, "в лоб" переносить объектные модели из книг Буча/Шлеера/и т.д. в реальные проекты (хотя некоторые горячие головы могут)!


Я — такая "горячая голова".
Я использовал на практике метод Шлеер (мне кажется, это дама) и Меллора практически "в лоб".
И, как мне кажется, весьма успешно.
Дальнейшее развитие этого метода привело к генерации программного кода прямо из UML (это называется xUML).

ГВ>Вроде бы и да, можно воспользоваться такой техникой в случае, если тег типа (имя типа) употребляется как переключатель. Но фактически, это почти то же самое, что и:


ГВ>

ГВ>struct message {
ГВ>  int type;
ГВ>    // ...
ГВ>};

ГВ>#define DRAW_MESSAGE 12345
ГВ>#define MARK_MESSAGE 67890
ГВ>// ...

ГВ>class Handler {

ГВ>void handle(const message &msg)
ГВ>{
ГВ>  switch(msg.type)
ГВ>    {
ГВ>      case DRAW_MESSAGE: // ...
ГВ>        case MARK_MESSAGE: // ...
ГВ>    }
ГВ>}

ГВ>};

ГВ>


ГВ>А такая техника обработки сообщений в общем-то, противоречит объектному стилю. Здесь причина зарыта достаточно глубоко и, ИМХО, начинается с того, что методы объектов сами по себе являются сообщениями, а внесение дублирующей структуры типа "сообщение" становится э... чем-то вроде тавтологии. Соответственно, нарушение фундаментального принципа тащит за собой нарушения и кучи других: архитектура смешивается, зависимости становятся неявными и т.п.


ГВ>Так что, хотя такой "способ проектирования" и есть, но я бы не стал заявлять о нём, как о чём-то, имеющем ценность большую, чем сугубо иллюстративную.


В некоторых случаях этому методу нет альтернативы.
Он используется независимо от языка, как на Обероне, так и на Си.
Как например, Вы предложили бы реализовать рассылку сообщений в Windows?
Приведенный Сергеем пример из книги Вирта просто демонстрирует, что в Обероне это делается безопасным путем.
(В этом огромное отличие от того кода, что привели Вы.)
ИМХО, рассуждения о принципе подстановки Барбары Лисков в данном случае выглядят наивными.
Здесь мы имеем дело с задачей двойной диспетчеризации, и это — ее самое простое (и универсальное) решение.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[18]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 06.07.05 19:29
Оценка: +4
Здравствуйте, CrystaX, Вы писали:

CX>Причем здесь лисп? Да ни причем. Ежу понятно, что C++ с функциональными языками в сфере метапрограммирования конкурировать не может. Ну так и не нужно. Разве ж этого кто добивался?


Дмитрий, мне кажется эта ветка флейма началась с твоего утверждения:

Согласен. Сильно. Скажу тогда чуток послабже: "Из всех известных мне языков шаблонное, compile-time программирование присуще только C++". Но если я неправ и есть язык, поддерживающий эту концепцию столь же хорошо, как C++, покажите мне его. Я таких не нашел.

Народ понял тебя буквально.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[24]: Что толку в Ада если Ариан 5 все равно упал
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 06.07.05 19:34
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Я так понял, что SHORT — это перегруженная функция, берущая младшую половинку числа. Поскольку SHORTINT — это четверть от LONGINT, пришлось вызвать дважды.


В принципе верно, но не совсем функция и не совсем половину. SHORT — это предопределенная инструкция языка, такая же как, например, INC, DEC, ASL, ASR, LEN, BITS, ORD,...

Семантика инструкции SHORT:

1) укоротить число на одно как бы поколение:
LONGINT -> INTEGER -> SHORTINT -> BYTE
REAL -> SHORTREAL
Все числа знаковые (беззнаковых чисел не существует вообще).

аналогично с символами
CHAR -> SHORTCHAR

3) С массивами: например переделать строку типа ARRAY OF CHAR в строку типа ARRAY OF SHORTCHAR
Re[25]: Что толку в Ада если Ариан 5 все равно упал
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 06.07.05 19:36
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB>в случае signed типов просто взять младшую половинку не совсем красивое решение... потеря знака гарантированна. интересненький каст тогда получается...


Она берет по умному. Кстати, все числовые типы в Обероне со знаком. Беззнаковых числовых типов нет вообще.
Re[10]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.07.05 19:59
Оценка: 1 (1) :))
Здравствуйте, CrystaX, Вы писали:

CX>Все примеры, что ты приводил, относятся к той самой части языка, которая не type-safety и досталась в наследие от C. И конечно же, ты можешь неявно привести массив к указателю, обратиться за границы массива и т.д. и т.п. Компилятор тебе этого не запретит. Но кто тебя заставляет это делать? Никто.


О, какя логика замечательная. Дык меня и на ассемблере никто не заставляет память портить. Пиши себе окуратно. Соблюдай паттерны и будет тебе счастье. Подтверждение тоже как у С++ есть программы написанные на асме которые работают.

CX> Это как раз пример той самой "запретительной" конвенции, о которой я говорил чуть раньше. Не используй массивы — есть много им альтернатив, начиная с std::vector.


От жаль, что большая часть их релизации в релизе выход за границы не контролирует. А в VC6 и в дебаге не контролировала.

CX> Не используй голые указатели — смарт-пойнтеров огромное множество.


Логично. Но как? Все АПИ вокруг требуют их. Можно произвести смелый эксперемент. Поищем на этом сайте (тут же одни гурья, значит хоть тут должны писать грамотно!), например, такой код &amp;v[0]. Ой! 36 документов! Откуда?!

CX> Type safety будет почти 100%.


О! Почти. Т.е. ты и сам в это не веришь? Ну, оно и логично. Кто же поверит в такую фигню. Безопасность типов в плюсах целиком лежит на плечах программиста. Он сам должен контролировать себя.

Спасибо хоть последние компиляторы вставляют проверки повреждения памяти. Ну, и спасибо разным Баундчекерам. Без них вообще жить было бы страшно.

CX> И глядишь, все станет радужнее и приятнее.


А что при этом осталось от хваленого С++? Указатели нельзя... массивы тоже... функции с переменным числом параметров тоже нельзя. Даже переменную примитивного типа в классе лучше не объявлять. А то ведь не дай бог забудешь проинициализировать! Что у нас дальше? А, ну, да. Память тоже руками выделять нельзя. Неравен час забудешь delete вызвать, а кругом исключения так и кишат. Вот и видишь в коде вот такие приколы:
if (iid == IID_IUnknown || iid == IID_ICallInterceptor)
    hr = CComPtr<ICallInterceptor>(this).CopyTo(
        (ICallInterceptor**)ppvObject);
else if (iid == IID_ICallUnmarshal)
    hr = CComPtr<ICallUnmarshal>(this).CopyTo((ICallUnmarshal**)ppvObject);
else if (iid == m_iid)
    hr = CComPtr<IUnknown>((IUnknown*)&m_thunk).CopyTo(
        (IUnknown**)ppvObject);

И ведь даже обоснование этом делу разумное — "Вопрос стиля. Избегаю ручного управления ресурсами в том числе и прямых вызовов AddRef, Release и т.п. ".

CX>Все эти низкоуровневые элементы есть смысл использовать только при реализации высокоуровневых примитивов и/или в критичных по производительности местах (хотя и тут надо смотреть внимательно — зачастую высокоуровневые средства типа тех же смарт-пойнтеров никакого run-time оверхеда в себе не несут).


О! Хорошая оговорка. А так как хочется по быстрее, то такими местами становится пол программы.

CX> Конечно, если ты начнешь направо и налево указатели разбрасывать да массивы к указателям приводить, ничего путного не получится. Но не надо, пожалуйста, приводить это в качестве довода — никто не заставляет тебя их использовать где попало.


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

Так може вместо этого чуда-языка в котором половину нельзя взять язык где есть только то что можно, а то что нельзя прямо помечается как опасное? Зачем над собой то издеваться? Скорости это не дает. Выигрывается только память. Неуже ли она настолько дорога?
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.07.05 19:59
Оценка: 6 (2) :)
Здравствуйте, CrystaX, Вы писали:

CX>Ну почему же — отличается. Прежде всего тем, что в моем случае, если понадобится, я смогу использовать и голые указатели, и прочее.


Как я понимаю и в Обероне есть указатели. Ну, не голые, но скорость та же. И в Шарпе тоже есть. В небезопасном режиме, но есть. Так зачем плюсы то? Ради СТЛ? Да напиши ты ее для шарпа и живи спокойно.

CX> Кроме того, отказавшись от C++, я потеряю мощнейшую вещь, которой нет пока ни в одном другом языке — шаблонное метапрограммирование.


О. Оно есть без шаблонов. Поставь себе тот же R# и "шаблонное метапрограммирование" покажется тебе детской забавой.

Ну, или если тебе больше нравятся компилируемые в машинный код языки без серьезного рантайма, то возьми Ocaml. Его препроцессор, да и встроенные возможности тоже рвет С++-ные шаблоны как тузик грелку.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.07.05 19:59
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Наверное стоит изобрести совершенно новый язык принципиально основанный на шаблонах но не имеющий к С++ ни какого отношения. Вот тогда программисты наконец-то бросят С++...


А зачем тогда шаблоны то? Человек же ясно сказал "шаблонное метапрограммирование".
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.07.05 19:59
Оценка: -1
Здравствуйте, CrystaX, Вы писали:

CX>Вряд ли. Сила C++ не в отдельных парадигмах, а в тесной их взаимосвязи в рамках одного языка.


Ну, ты лично только что так смешал его с дерьмом, что теперь слова про силу звучат крайне не убедительно.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.07.05 19:59
Оценка: :)
Здравствуйте, eao197, Вы писали:

E>А так же из-за невообразимо большого количество унаследованного кода и огромного количества активных проектов, выполняющихся на C++.


Эта проблема решаема.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.07.05 19:59
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>Наверное, лет через 10 рекомендации будут звучать примерно так:

Т>

Не используй шаблоны — есть много им альтернатив, начиная с мегафичи X...


Да чё уж через 10 лет? Лет 30 назад был Лисп с его макросами. Так вот он и тогда всех рвал в области метапрограммирования и обобщенных алгоритмов и сейчас рвет. Думаю через 10 лет может уже не будет. Но будет еще более качественная альтернатива.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.07.05 19:59
Оценка: -1
Здравствуйте, CrystaX, Вы писали:

CX>Не буду спорить, механизм не самый удобный.


Тогда не рекламируй эту убогость больше.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.07.05 19:59
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Стоп-стоп-стоп. Изначально речь шла о безопасных и небезопасных традиционных языках. Зашла речь о метапрограммировании, которое доступно в C++ и недоступно в других языках, которые приводились как его главные противники.

CX>Причем здесь лисп?

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


Это не твои случаем слова?
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 06.07.05 20:15
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>>>Это наследие C и, кроме того, остаётся открытым вопрос: как конкретно должен быть реализован массив? std::vector<> — то частное решение, хоть и стандартизированное.

AVC>>Пока не изобретен лучший вариант, меня вполне устраивает виртовское решение.

ГВ>Именно поэтому оно должно быть внесено в C++ на уровне языка?


Бесполезно.
Как сказал Вирт:

некоторые вещи следует продумывать до, а не после.


AVC>>>>Кроме индекса массива, в Обероне проверяются на NIL указатели и процедурные переменные. (Если они имеют значение, отличное от NIL, то их валидность гарантируется. В том числе — сборщиком мусора.)

ГВ>>>Опять таки, проверки на NULL (NIL) по месту вызова нужны не всегда. Точно так же, как и с массивами. Зачастую гораздо проще проверить валидность структур перед началом выполнения алгоритма, чем проверять их при каждом использовании.

AVC>>Существует понятие программирования по контракту. (Мейер)

AVC>>Главный принцип: не доверяй клиенту (вызывающему коду).

ГВ>Всё хорошо в своём месте и в своё время. ООП само по себе тоже не всегда адекватно задачам. Так что, принцип программирования по контракту тоже не стоит распространять на все случаи программирования.


Разве принцип программирования по контракту применим только к ООП?
Это универсальный принцип, развитие идеи защитного программирования.

AVC>>В самом первом виртовском Обероне не было присоединенных процедур (=виртуальных функций).

AVC>>Полиморфизм работал исключительно благодаря динамическому приведению типа.
AVC>>Наверное, поэтому динамическое приведение типа реализовано так эффективно.
AVC>>Например (опустив все лишнее):
ГВ>[...]

ГВ>Ну, я так понимаю, здесь влияет ещё и модель объектов паскаля, конкретно — строго одиночное наследование.


В Обероне (и других модульных языках) единица инкапсуляции не класс, а модуль.
Это существенно влияет на проектные решения.
Множественное наследование в Обероне просто не нужно (и рассматривается как вредное).
Модули позволяют естественно реализовывать целые паттерны проектирования.
Множественное наследование в Си++ — заплата на отсутствии нормальных модулей.
Вот и пишут на Си++ программы, обращаясь сразу к "человеку и пароходу". (c) Маяковский

AVC>>>>Вот, пожалуй, и все необходимые проверки в Обероне. Можете видеть сами — все они связаны с безопасностью типов и требуют не более одного-двух (для индекса массива) сравнений.

ГВ>>>Угу, но каждый раз...
AVC>>Опять-таки оптимизатор может устранить некоторые лишние проверки.
ГВ>Здесь согласен. Хотя я бы не стал полагаться на оптимизатор...

В руководстве по компилятору XDS (в разделе об оптимизации) говорится:

It is possible not to turn run-time checks off in the product versions of your programs,
because the code generator usually removes redundant checks. A typical
program runs only 10-15% faster with all run-time checks turned off (but the code
size is usually significantly smaller).

Здесь указана цена проверок: программа на 10-15% медленнее.
Разница в размере кода больше.

ГВ>>>Средствами C++ можно обойти type safety. Разумность такого решения — отдельный вопрос. Если голова на плечах есть — всмё будет в порядке, если с этим проблема, то runtime проверками дела не поправишь. Приведённый пример с NASA свидетельствует, скорее, не о бенефитах типобезопасности, а о том, что всем в NASA было настолько страшно взять ответственность на себя, что спихнули всё на "неправильную" фичу языка. Т.е., проблема не в языке, а в головах.


AVC>>Согласен, что проблема — в головах.

AVC>>Потому что именно из голов она попадает в языки.

ГВ>В огороде бузина, а в трюме акулы...


Которые съели дядьку в Киеве?
А что, я сказал глупость?
Может, я чего не знаю, и Си++ создавался не посредством головы?

AVC>>Забавно читать, что "средствами C++ можно обойти type safety".

AVC>>Где бы найти в Си++ эту самую type safety...
ГВ>Да есть она там, что тут можно сказать...

Ну разве что правду — что ее там нет.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[2]: LSP, ДК, Вирт - поехали...
От: Кодт Россия  
Дата: 06.07.05 20:49
Оценка: 25 (3)
Здравствуйте, AVC, Вы писали:

AVC>ИМХО, рассуждения о принципе подстановки Барбары Лисков в данном случае выглядят наивными.

AVC>Здесь мы имеем дело с задачей двойной диспетчеризации, и это — ее самое простое (и универсальное) решение.

Стопудов, что это оно.
Насчёт того, самое ли это простое и безопасное — у меня остаются сомнения. Пару лет назад меня очень занимали мультиметоды и, в частности, случай мультиметода с двумя полиморфными аргументами... результат скорее пессимистический...

Диспетчеризация — т.е. вызов окончательной ветки — выполняет некий pattern matching.
В случае единственного полиморфного аргумента есть две стратегии:
— выбор наиболее производного класса (далее MDC, most derived class); так устроены обычные виртуальные функции — и это наиболее удовлетворяет LSP
— выбор первого из списка (далее IO, in-order) — серия проверок "obj IS type".

В случае двух и более полиморфных аргументов — стратегий гораздо больше.
Практически применяются:
— 1 — IO пар аргументов (на какой паре произошло сопоставление, так тому и быть)
— 2 — двойная диспетчеризация в стиле обработки сообщений: MDC первого аргумента (вызов callback-функции) и оттуда IO второго аргумента (серия проверок)
— 3' — двойная диспетчеризация на наследовании: MDС первого аргумента находит статический тип из некоего известного подмножества базовых, тем самым сведя задачу к семейству методов с единственным полиморфным параметром; оттуда выполняем MDC-выбор
— 3" — то же самое, но сперва фиксируется база второго аргумента
Изощрения:
— 4 — тройная диспетчеризация: IO-выбор, по какому пути (3' или 3") выполнять двойную диспетчеризацию; такая необходимость возникает при создании мультиметода над двумя расширяемыми иерархиями (выбираем "наиболее осведомлённый о напарнике" класс).
И ещё можно напридумывать.

IO — это не нечто искусственное. Хорошо известный пример IO: когда оконная функция не смогла обработать сообщение, она вызывает дефолтную (предыдущую) функцию, отдавая сообщение дальше. Очевидно, что даже если в ней самой проверки идут в MDC-порядке, то суммарный порядок оказывается произвольным.

Поскольку любой выбор (MDC, а особенно IO) упрощает знания о типе, то в зависимости от стратегий диспетчеризации можно потерять информацию разными способами, совершив неверный выбор.

Например, некий диалог получает нотификации от контролов; каждый контрол идентифицирован своим ID'ом. Всё хорошо до тех пор, пока диалог не был субклассирован, а субкласс обрабатывает нотификации от "контролов вообще". Очевидно, контрол-вообще — это более широкий класс, чем контрол-по-номеру; но благодаря IO-выбору второго аргумента в паре (диалог, контрол) функциональность нарушилась.
Это было MDC диалога, затем IO контрола.

Другой пример с тем же диалогом. Некоторые контролы (субклассированные), вместо того чтобы посылать нотификацию (вызвать оконную функцию), вызывают другие callback-функции диалога (зарегистрированные, например, как свойства окна). Субкласс диалога о таких изысках не знает и по-прежнему ловит нотификации от "контролов вообще". Ото всех, кроме некоторых.
Это было MDC контрола, MDC диалога, далее IO контрола.
Перекуём баги на фичи!
Re[12]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.07.05 22:35
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>3) Гонки в MT

C>4) Deadlock'и в MT

Решены в ФЯ сто лет назад.

C>5) Неосвобождение ресурсов


Решены в управляемых средах.

C>6) Неправильная обработка исключений


Ну, так можно дойти до неправильного задания условий в if-ах.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: LSP, ДК, Вирт - поехали...
От: AVC Россия  
Дата: 06.07.05 22:41
Оценка: 1 (1) +1
Здравствуйте, Кодт, Вы писали:

AVC>>ИМХО, рассуждения о принципе подстановки Барбары Лисков в данном случае выглядят наивными.

AVC>>Здесь мы имеем дело с задачей двойной диспетчеризации, и это — ее самое простое (и универсальное) решение.

К>Стопудов, что это оно.

К>Насчёт того, самое ли это простое и безопасное — у меня остаются сомнения. Пару лет назад меня очень занимали мультиметоды и, в частности, случай мультиметода с двумя полиморфными аргументами... результат скорее пессимистический...

Я впечатлен Вашим постом.
Хотелось бы его еще обдумать.
Интересен разбор двух базовых стратегий (MDC и IO) и их вариаций.
Но какие могут быть сомнения в том, что, применительно к ситуации из книги Вирта, стратегия IO является самой простой?
Ведь, в случае использования MDC, каждый из взаимодействующих объектов обязан иметь виртуальные функции, и я не знаю, сколько их потребуется.
(BTW, вряд ли можно уйти от стратегии IO полностью. Пример: порядок перебора типа исключений в последовательности блоков catch.)
А здесь достаточно одной виртуальной функции в объектах только одного типа.
Поэтому я думаю, что это — самое простое решение.
Конечно, могут оставаться сомнения в универсальности такого подхода.
Но применительно к той задаче, которую решал Вирт в упомянутом Сергеем примере, я не вижу другого разумного решения.
Вирт пишет:

The particular flexibility of this technique using handlers and messages – sometimes identified as
polymorphism – as well as its extensibility stems from the fact that “unknown” messages are simply
ignored. They “fall through” the cascade of if – elsif statements in the handlers of objects to which the
message does not apply.

Конечно, это решение уже старое, оно не изобретено Виртом. (Хотя, ИМХО, именно в сочетании с обероновской type safety оно приобретает завершенную форму.)
И разве не такое решение используют практически все объектно-ориентированные операционные системы?
Именно благодаря такому способу двойной диспетчеризации, например, старые "виндовые" программы работают под новой версией Windows, хотя они и понятия не имеют о новых типах сообщений. Они их просто игнорируют.
Кроме того, Вирт при проектировании и написании Оберона стремился избегать чрезмерного роста числа классов (типов записей). Это было одной из причин того, что в первом Обероне не было присоединенных процедур (виртуальных функций). Ведь зачастую можно было просто переустановить процедурную переменную, не заводя нового типа.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[9]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 06.07.05 23:17
Оценка: +1 :)
Трурль,

> ПК> Отсюда какой должен следовать вывод у человека, которому надежность работы его программ небезразлична? На мой взгляд простой: не передавать массивы в C++ через указатели.


> Или не использовать C++. Тоже вариант.


Да, естественно, вариант. Нюанс в том, что кроме передачи массивов через указатели надежности и корректности программ угрожает огромное количество других ошибок, и с некоторыми из них C++ позволяет бороться заметно удачнее, чем другие языки. Соответственно, при выборе языка разумно учитывать и эти аспекты тоже. Если же не использовать эти возможности C++, безусловно, есть намного более подходящие альтернативы.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[36]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 06.07.05 23:47
Оценка:
raskin,

>> К сожалению, в отличие от C++, поддержки сколько-нибудь сложных

>> вычислений при таком подходе не выйдет, т.к. в процессе вычислений и L^4
>> (квадрат площади), и L^5 (площать * объем), и L / T (скорость), и L^2 /
>> T^2 (квадрат скорости), и M * L / T (импульс), и M * L^2 / T^2
>> (энергия), и M^2 * L^4 / T^4 (квадрат энергии), и т.п. легко получаются...

> Это детали реализации. Можно сгенерировать модуль с типами, названными в

> духе t3l_2m1e1 (размерность Кл*кг*с*с*с/(м*м)).

Проблема в том, что этих модулей нужно сгенерировать на все мыслимые комбинации всех используемых степеней основных и дополнительных единиц системы счисления. Т.е., скажем в Си, это 7 + 2 = 9 единиц. Степени от -3 до 3 используются даже в именованных единицах. Если учесть наличие промежуточных вычислений, то нужен хоть какой-то запас. Скажем, хотя бы двукратный (т.е. промежуточные вычисления, включающие квадрат именованных единиц). Т.е. больше десятка степеней. Пусть хотя бы десяток. Итого получаем порядка 10^9 производных единиц (модулей?). Еще хуже, что можно перемножать любую из производных единиц на любую другую. Т.е. нужно еще и определить все используемые операции (хотя бы * / + -, я уж молчу о большем...) для всех попарных сочетаний всех производных единиц... В общем, по-моему, многовато генерировать получится. Нет?
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[10]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 07.07.05 02:24
Оценка:
P.S.

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


Предупреждая вопросы, вот один из возможных примеров
Автор: Павел Кузнецов
Дата: 07.07.05
того, о чем идет речь.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[16]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 07.07.05 05:51
Оценка:
Здравствуйте, VladD2, Вы писали:

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


E>>А так же из-за невообразимо большого количество унаследованного кода и огромного количества активных проектов, выполняющихся на C++.


VD>Эта проблема решаема.


Как?
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[13]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 07.07.05 05:51
Оценка:
Здравствуйте, VladD2, Вы писали:

C>>6) Неправильная обработка исключений


VD>Ну, так можно дойти до неправильного задания условий в if-ах.


Влад, здесь, имхо, все не так просто, как кажется. Вот в Java, например, методы специфицируют порождаемые ими исключения. Поэтому в Java хотя бы компилятор позволяет понять, с какими исключениями ты можешь столкнуться. Но даже в Java я видел кучу багов, когда по наивности в finally подряд выполнялись несколько операций, каждая из которых могла порождать исключения.

В C++ же по декларации метода/функции может быть вообще не понятно, порождаются ли исключения и, если порождаются, то какие. Поэтому можно запросто "прозевать" исключение, совершенно не зная о его возможности.

А в C# с этим как дела обстоят?
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[11]: Что толку в Ада если Ариан 5 все равно упал
От: WFrag США  
Дата: 07.07.05 06:33
Оценка: 20 (2)
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>P.S.


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


ПК>Предупреждая вопросы, вот один из возможных примеров
Автор: Павел Кузнецов
Дата: 07.07.05
того, о чем идет речь.


Заметно удачнее? Я может что-то недопонял, но есть и более удачные решения упомянутой проблемы. Код на OCaml (не ООП, но идея, думаю, понятна):

type communicatorAnswer =
    Cancel
  | Overwrite
  | Skip

type path = Path of string

let fileExists p = (* Некая имплементация... *)
        match p with
            Path "cancel_path" -> Cancel
          | Path "overwrite_path" -> Overwrite
          | Path _ -> Skip

let answerToString a = 
    match a with
            Cancel -> "Cancel"
          | Overwrite -> "Overwrite"
          | Skip -> "Skip" (* Ну-ка, попробуй тут пропустить хоть одно из значений или сравнить с другим типом! *)

let main () =
        print_string (answerToString (fileExists Communicator (Path "cancel_path")));;

main()


Re[25]: Что толку в Ада если Ариан 5 все равно упал
От: Oleg A. Bachin Украина  
Дата: 07.07.05 06:42
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Семантика инструкции SHORT:


СГ>1) укоротить число на одно как бы поколение:

СГ>LONGINT -> INTEGER -> SHORTINT -> BYTE
СГ>REAL -> SHORTREAL
СГ>Все числа знаковые (беззнаковых чисел не существует вообще).

СГ>аналогично с символами

СГ>CHAR -> SHORTCHAR

СГ>3) С массивами: например переделать строку типа ARRAY OF CHAR в строку типа ARRAY OF SHORTCHAR


куда еще шортее чара! )
или это желание выпендриться? типа это у вас вайды всякие, а у нас просто чары, а выши чары у нас шорт?

и еще, я так понял char->byte преобразование невозможно? а как же битовые операции? а как же совместимость на уровне АПИ!?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re[37]: Что толку в Ада если Ариан 5 все равно упал
От: raskin Россия  
Дата: 07.07.05 07:05
Оценка:
Павел Кузнецов wrote:
> raskin,
>
>> > К сожалению, в отличие от C++, поддержки сколько-нибудь сложных
>> > вычислений при таком подходе не выйдет, т.к. в процессе вычислений и L^4
>> > (квадрат площади), и L^5 (площать * объем), и L / T (скорость), и L^2 /
>> > T^2 (квадрат скорости), и M * L / T (импульс), и M * L^2 / T^2
>> > (энергия), и M^2 * L^4 / T^4 (квадрат энергии), и т.п. легко
> получаются...
>
>> Это детали реализации. Можно сгенерировать модуль с типами, названными в
>> духе t3l_2m1e1 (размерность Кл*кг*с*с*с/(м*м)).
>
> Проблема в том, что этих модулей нужно сгенерировать на все мыслимые
> комбинации всех используемых степеней основных и дополнительных единиц
> системы счисления. Т.е., скажем в Си, это 7 + 2 = 9 единиц. Степени от
> -3 до 3 используются даже в именованных единицах. Если учесть наличие
> промежуточных вычислений, то нужен хоть какой-то запас. Скажем, хотя бы
> двукратный (т.е. промежуточные вычисления, включающие квадрат
> именованных единиц). Т.е. больше десятка степеней. Пусть хотя бы
> десяток. Итого получаем порядка 10^9 производных единиц (модулей?). Еще
> хуже, что можно перемножать любую из производных единиц на любую другую.
> Т.е. нужно еще и определить все используемые операции (хотя бы * / + -,
> я уж молчу о большем...) для всех попарных сочетаний всех производных
> единиц... В общем, по-моему, многовато генерировать получится. Нет?
Реально будет использовано меньше. Длинные произведения делаются
inline-функциями. Поэтому небольшая автоматизация изврата — и
генерируются только используемые размерности. Хотя, конечно, получится
многовато, но искусство требует жертв. Благо, не человеческих, и даже не
усилий.
Posted via RSDN NNTP Server 2.0 beta
Re: LSP, ДК, Вирт - поехали...
От: Трурль  
Дата: 07.07.05 07:21
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Однако, если сугубо формально, то анализ типа сообщения всё равно остаётся. Тем-то, кстати, и хорош LSP, что его нарушение можно определить по сугубо формальным признакам.

Как раз по сугубо формальным признакам нарушений не видно.

ГВ>А такая техника обработки сообщений в общем-то, противоречит объектному стилю. Здесь причина зарыта достаточно глубоко и, ИМХО, начинается с того, что методы объектов сами по себе являются сообщениями, а внесение дублирующей структуры типа "сообщение" становится э... чем-то вроде тавтологии. Соответственно, нарушение фундаментального принципа тащит за собой нарушения и кучи других: архитектура смешивается, зависимости становятся неявными и т.п.


Я бы не стал отождествлять методы объектов и сообщения. Методы — реакции на сообщения. А в крайнем случае реакция на любое сообщение может быть одной и той же (ignore, например.
Re[14]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 07.07.05 07:39
Оценка: 1 (1)
Здравствуйте, CrystaX, Вы писали:

CX> Сила C++ не в отдельных парадигмах, а в тесной их взаимосвязи в рамках одного языка.


У меня прямо противоположное отношение. Есть в C++ ряд интересных и полезных особенностей, но как раз их сочетание — .
Re[26]: Что толку в Ада если Ариан 5 все равно упал
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 07.07.05 08:17
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB>куда еще шортее чара! )

OAB>или это желание выпендриться? типа это у вас вайды всякие, а у нас просто чары, а выши чары у нас шорт?

Это Component Pascal.

CHAR — 2 байта, SHORTCHAR — 1 байт.

(Идентификаторы можно писать хоть на русском, хоть на китайском языке.)

OAB>и еще, я так понял char->byte преобразование невозможно? а как же битовые операции? а как же совместимость на уровне АПИ!?


Да, совершенно верно. Мухи и котлеты отдельно. Буквы это буквы, числа это числа, а множества это множества.

Впрочем, буквы упорядочены, так что их можно сравнивать >, <, <=, >=, =, #. Можно узнать порядковый номер буквы int := ORD(char), и наоборот, по порядковому номеру получить букву char := CHR(int). ORD и CHR — это стандартные предопределенные инструкции.

Про битовые операции отдельная история.

В математике есть объект — множество. Множества можно объединять, строить пересечение множеств, дополнение и т.д. Так вот в Обероне есть специальный тип SET, он представляет собой математическую абстракцию множества (из элементов: 0, 1, 2,..., MAX(SET)).
http://www.inr.ac.ru/~info21/cpascal/cp_report_1.4_rus.htm

8.2.3 Операции над множествами
+ объединение
— разность (x — y = x * (-y))
* пересечение
/ симметричная разность (x / y = (x-y) + (y-x))

Операции над множествами применимы к операндам типа SET и дают результат типа SET. Одноместный минус обозначает дополнение множества x, т.е. -x обозначает множество целых от 0 до MAX(SET), которые не являются элементами множества x. Операции над множествами не являются ассоциативными ((a+b)-c # a+(b-c)).

Конструктор множества определяет значение множества перечислением его элементов между фигурными скобками. Элементы должны быть целыми в диапазоне 0..MAX(SET). Диапазон a..b обозначает все целые i такие, что i >= a и i <= b.

Кстати, симметричная разность множеств c := a / b; — это то, что в других, менее математизированных, языках называется по простому — xor.

Все множества перенумерованы, так что можно превращать множества в числа просто по их номеру int := ORD(set); существует обратное преобразование: set := BITS(int); Причем, 0 соответствует пустому множеству {},



{} = BITS(0)
{0} = BITS(1)
{1} = BITS(2)
{0, 1} = BITS(3)
{2} = BITS(4)
{0, 2} = BITS(5)
{1, 2} = BITS(6)
{0..2} = BITS(7)
{3} = BITS(8)
{0, 3} = BITS(9)
{1, 3} = BITS(10)
{0, 1, 3} = BITS(11)
{2, 3} = BITS(12)
{0, 2, 3} = BITS(13)
{1..3} = BITS(14)
{0..3} = BITS(15)
{4} = BITS(16)
...

и т.д. не зависимо от платформы (little- или big- endian), что делает "битовые операции" не зависимыми от платформы.

Добавление i-того элемента во множество s записывается так: INCL(s, i)
Исключение i-того элемента из множества s записывается так: EXCL(s, i)
Проверить существование элемента i во множестве s можно так: IF i IN s THEN ... END

Например инструкция: if(i & 0x00ff0000 == 0){...}, записывается так: IF BITS(i) * BITS(00FF0000H) = {} THEN ... END.

Вобщем так, в Обероне буквы, числа, булевы значения, множества - это 4 совершенно разных типа.
Re[27]: Что толку в Ада если Ариан 5 все равно упал
От: Oleg A. Bachin Украина  
Дата: 07.07.05 09:05
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

OAB>>и еще, я так понял char->byte преобразование невозможно? а как же битовые операции? а как же совместимость на уровне АПИ!?

СГ>Да, совершенно верно. Мухи и котлеты отдельно. Буквы это буквы, числа это числа, а множества это множества.
...

СГ>Впрочем, буквы упорядочены, так что их можно сравнивать >, <, <=, >=, =, #. Можно узнать порядковый номер буквы int := ORD(char), и наоборот, по порядковому номеру получить букву char := CHR(int). ORD и CHR — это стандартные предопределенные инструкции.

и давно у нас chr(1), например, это буква?

СГ>Про битовые операции отдельная история.

отдельных историй много выходит — общей кртинки чет не видно...

СГ>В математике есть объект — множество. Множества можно объединять, строить пересечение множеств, дополнение и т.д. Так вот в Обероне есть специальный тип SET, он представляет собой математическую абстракцию множества (из элементов: 0, 1, 2,..., MAX(SET)).

мы только что говорили о битовых операциях! я разве спрашивал что-то про множества?
или это типа "у рыб есть чешуя, в чешуе не водятся блохи! строение блохи ... и поехали"!

СГ>Конструктор множества определяет значение множества перечислением его элементов между фигурными скобками. Элементы должны быть целыми в диапазоне 0..MAX(SET). Диапазон a..b обозначает все целые i такие, что i >= a и i <= b.

ой как гениально! ну стандартный паскалевкий сет. и назвать его чем-то полезным довольно таки трудно из-за тех же ограничений на инт, из-за невозможности дублирования значений, из-за... короче, реальное применение это фигни одно:
type
    option = (opt1, opt2 ... optn);
    options = set of option;

но по правде сказать довольно таки распространенное...

одна просьба, паскаль и делфи я знаю великолепно, хотелось бы услышать, чем так уникален Оберон, кроме как глупейшие ограничения?
меня например в делфи больше всего напрягает отсутствие темплейтов. потому как часто стандартные задачи приходится решать через опасные преобразования Pointer -> PMyType.
если запретить рассматривать блок памяти так как требует того моя задача — мне каждый раз ручками новый класс писать!?

СГ>Кстати, симметричная разность множеств c := a / b; — это то, что в других, менее математизированных, языках называется по простому — xor.

Оберон! где Оберон!!!??? это все сперто!!! а то мне нравится сравнение "в Джава все как в Обероне", а то что это все уперли из Object Pascal — молчек.

СГ>Добавление i-того элемента во множество s записывается так: INCL(s, i)

да, сперли...
СГ>Исключение i-того элемента из множества s записывается так: EXCL(s, i)
да, сперли...
СГ>Проверить существование элемента i во множестве s можно так: IF i IN s THEN ... END
да, сперли...

СГ>Вобщем так, в Обероне буквы, числа, булевы значения, множества - это 4 совершенно разных типа.

вобщем понятно... советую ознакомиться и осмыслить http://russian.joelonsoftware.com/Articles/BacktoBasics.html .

с этой твоей точки зрения что плюсы, что делфи действительно мертвы — в них есть возможность понимания того что ты пишешь на низком уровне. хотя (к сожаления) делфи дает массу возможностей писать кривой код, но думаю здесь черь шла не об этом...
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re[27]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 07.07.05 09:34
Оценка:
Здравствуйте, raskin, Вы писали:

R>Зато можно очень резко поменять его отношение к некоторым конструкциям.


Как бы то ни было, прагма — это директива, а не условие.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[19]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 07.07.05 09:34
Оценка:
Здравствуйте, AVC, Вы писали:

CX>>Причем здесь лисп? Да ни причем. Ежу понятно, что C++ с функциональными языками в сфере метапрограммирования конкурировать не может. Ну так и не нужно. Разве ж этого кто добивался?


AVC>Дмитрий, мне кажется эта ветка флейма началась с твоего утверждения:

AVC>

AVC>Согласен. Сильно. Скажу тогда чуток послабже: "Из всех известных мне языков шаблонное, compile-time программирование присуще только C++". Но если я неправ и есть язык, поддерживающий эту концепцию столь же хорошо, как C++, покажите мне его. Я таких не нашел.

AVC>Народ понял тебя буквально.

Ага, я уже понял. Вообще-то я говорил не о специализированных языках. Так что моя недоработка.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: WFrag США  
Дата: 07.07.05 09:43
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Ага, я уже понял. Вообще-то я говорил не о специализированных языках. Так что моя недоработка.


Common LISP, Nemerle, Java Syntactic Extender — языки общего назначения. Хотя последние два, конечно, не мейнстрим (но генерируют код для .NET CLR и JVM соответственно).
Re[28]: Что толку
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 07.07.05 10:20
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB>мы только что говорили о битовых операциях! я разве спрашивал что-то про множества?


Извините, забыл явно упомянуть, что битовые операции осуществляются над множествами битов.
SET — множество битов 0, 1, 2, ..., MAX(SET). Я думал это очевидно.

OAB>Оберон! где Оберон!!!??? это все сперто!!! а то мне нравится сравнение "в Джава все как в Обероне", а то что это все уперли из Object Pascal — молчек.


Это не правда потому, что Object Pascal появился в девяностых годах, но Модула 2 уже была в 1979 году.
Оберон появившийся в 1987 году "упер" всё из Модулы 2.
Re[21]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 07.07.05 10:22
Оценка:
Здравствуйте, WFrag, Вы писали:

WF>Common LISP, Nemerle, Java Syntactic Extender — языки общего назначения. Хотя последние два, конечно, не мейнстрим (но генерируют код для .NET CLR и JVM соответственно).


Видимо, наше понимание языков общего назначения различается. Насчет последних двух не скажу (не знаю их), но Common LISP, в моем представлении, языком общего назначения не является. Я понимаю, что следующим вопросом, обращенным ко мне, будет просьба предоставить определение "языка общего назначения". В данный момент не готов его предоставить. Но к выходным, надеюсь (когда немного от работы отвлекусь), смогу это сделать. Тогда и продолжим разговор.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[23]: Что толку в Ада если Ариан 5 все равно упал
От: Privalov  
Дата: 07.07.05 10:23
Оценка: :)
Здравствуйте, Трурль, Вы писали:

Т>Подумаешь, бином Ньютона. Вот, пожалуйста:

Т>

Метапрограммирование- написание программ, которые используют программы в качестве данных.


Из этого определения следует, что огромная масса вирусов, заражающих исполняемые файлы, тоже являются метапрограммами.
Re[17]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.07.05 11:28
Оценка:
Здравствуйте, eao197, Вы писали:

E>>>А так же из-за невообразимо большого количество унаследованного кода и огромного количества активных проектов, выполняющихся на C++.

VD>>Эта проблема решаема.
E>Как?

1. По возможности заменять библиотечный код на управлеемый.
2. То что заменить нельзя обертывать или использовать через интероп.

В том же Янусе куча неуправляемогокода кода используемого через интероп.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 07.07.05 11:32
Оценка:
Здравствуйте, VladD2, Вы писали:

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


E>>>>А так же из-за невообразимо большого количество унаследованного кода и огромного количества активных проектов, выполняющихся на C++.

VD>>>Эта проблема решаема.
E>>Как?

VD>1. По возможности заменять библиотечный код на управлеемый.

VD>2. То что заменить нельзя обертывать или использовать через интероп.

Фактически "ползучее" переписывание. И на какой язык ориентироваться? Вероятно, на Java, ведь аналогичную кроссплатформенную поддержку C# и .Net вряд ли получит (я подразумеваю не только сам язык, но и основные framework-и).

VD>В том же Янусе куча неуправляемогокода кода используемого через интероп.


Боюсь, что Янус слишком мелкий проект, чтобы быть показателем.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[11]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 07.07.05 15:51
Оценка: +3 -1
Здравствуйте, VladD2, Вы писали:

CX>>Все примеры, что ты приводил, относятся к той самой части языка, которая не type-safety и досталась в наследие от C. И конечно же, ты можешь неявно привести массив к указателю, обратиться за границы массива и т.д. и т.п. Компилятор тебе этого не запретит. Но кто тебя заставляет это делать? Никто.


VD>О, какя логика замечательная. Дык меня и на ассемблере никто не заставляет память портить. Пиши себе окуратно. Соблюдай паттерны и будет тебе счастье.


В отличие от C++ на ассемблере нет способа сделать так, чтоб компилятор ловил ошибки типизации. В C++ такие способы есть, так что аналогия некорректна.

VD> Скорости это не дает. <...>


Дело-то не в скорости, а в возможности добавлять к встроенным проверкам свои, которые контролируют далеко не только тривиальные ошибки выхода за границы массивов, но и (частично) семантическую корректность программы. Ну-ка, сделай на C# такое
Автор: Павел Кузнецов
Дата: 07.07.05
... Только не надо про R#: он совершенно не контролирует характер изменений AST
Автор: Павел Кузнецов
Дата: 16.06.05
, так что в случае его использования о какой-либо безопасности говорить (пока?) сложно...
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: LSP, ДК, Вирт - поехали...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 07.07.05 18:06
Оценка:
Здравствуйте, AVC, Вы писали:

ГВ>>Нет ничего удивительного в том, что для иллюстрации использования IS Вирт пользуется таким приёмом, в конце концов, иллюстрация есть иллюстрация. Никто же не заставляет, например, "в лоб" переносить объектные модели из книг Буча/Шлеера/и т.д. в реальные проекты (хотя некоторые горячие головы могут)!


AVC>Я использовал на практике метод Шлеер (мне кажется, это дама) и Меллора практически "в лоб".

Э! Я не о методе самом по себе, о конкретных моделях, приводимых как иллюстрации.

ГВ>>Так что, хотя такой "способ проектирования" и есть, но я бы не стал заявлять о нём, как о чём-то, имеющем ценность большую, чем сугубо иллюстративную.


AVC>В некоторых случаях этому методу нет альтернативы.

AVC>Он используется независимо от языка, как на Обероне, так и на Си.
Не надо путать C и С++. Аналогичное решение на C++ выглядело бы как класс с чисто виртуальными методами. В общем-то, это надёжнее, поскольку была бы возможна группировка методов по целевому назначению и была бы гарантия того, что реализующий объект реализует _все_ методы некоторой группы. По крайней мере — он о них знает.

AVC>Как например, Вы предложили бы реализовать рассылку сообщений в Windows?

AVC>Приведенный Сергеем пример из книги Вирта просто демонстрирует, что в Обероне это делается безопасным путем.
В смысле опасности некорректности приведения типов — да. В смысле опасности пропуска необходимых сообщений — нет.

AVC>(В этом огромное отличие от того кода, что привели Вы.)

+/-1

AVC>ИМХО, рассуждения о принципе подстановки Барбары Лисков в данном случае выглядят наивными.

Не согласен. В данном случае при проектировании функции диспетчеризации мы используем знание о наборе поступающих сообщений. Если источник сообщений добавит ещё одно-два, то придётся модифицировать клиентский код, который придётся разыскивать через search и т.п. Не есть бест солюшн на мой взгляд. Вариант с группировкой обработчиков по интерфейсам я полагаю более надёжным.

AVC>Здесь мы имеем дело с задачей двойной диспетчеризации, и это — ее самое простое (и универсальное) решение.

Ну... можно обобщить до ДД. Разумеется, если объекты сообщений сами содержат реализацию некоторой функциональности. Я же говорю, что дальнейший анализ нужно делать на основании конкретной задачи.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[2]: LSP, ДК, Вирт - поехали...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 07.07.05 18:06
Оценка:
Здравствуйте, Трурль, Вы писали:

ГВ>>Однако, если сугубо формально, то анализ типа сообщения всё равно остаётся. Тем-то, кстати, и хорош LSP, что его нарушение можно определить по сугубо формальным признакам.

Т>Как раз по сугубо формальным признакам нарушений не видно.

Ну, здравствуйте! А цепочка IS — это что?

ГВ>>А такая техника обработки сообщений в общем-то, противоречит объектному стилю. Здесь причина зарыта достаточно глубоко и, ИМХО, начинается с того, что методы объектов сами по себе являются сообщениями, а внесение дублирующей структуры типа "сообщение" становится э... чем-то вроде тавтологии. Соответственно, нарушение фундаментального принципа тащит за собой нарушения и кучи других: архитектура смешивается, зависимости становятся неявными и т.п.


Т>Я бы не стал отождествлять методы объектов и сообщения. Методы — реакции на сообщения. А в крайнем случае реакция на любое сообщение может быть одной и той же (ignore, например.

Это верно только для случая, когда есть диспетчер сообщений, который сопоставляет структурам данных-сообщениям конкретные методы целевого объекта. Но само наличие диспетчера не всегда оправдано, ИМХО, за исключением таких случаев, как согласование с message-based-API типа Windows-API.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[38]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 07.07.05 18:06
Оценка: 1 (1) +2
Здравствуйте, raskin, Вы писали:

R>Реально будет использовано меньше. Длинные произведения делаются

R>inline-функциями. Поэтому небольшая автоматизация изврата — и
R>генерируются только используемые размерности. Хотя, конечно, получится
R>многовато, но искусство требует жертв. Благо, не человеческих, и даже не
R>усилий.

Ну-ксь, поверим гармонию алгеброй. Для 10^9 комбинаций, даже если на генерацию уходит 1 ms (оптимистично), то получим... 10^6 секунд на один проход генерации... Это... что-то около 11 дней на заход. Объём выходного файла при 50 символах на экземпляр ~50 ГБ.

Даже если срезать три порядка — всё равно невесело. А если ещё тестирование...

"Эх, не хило быть духовным!" (c)
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 07.07.05 19:17
Оценка:
Здравствуйте, CrystaX, Вы писали:

AVC>>Дмитрий, мне кажется эта ветка флейма началась с твоего утверждения:

AVC>>

AVC>>Согласен. Сильно. Скажу тогда чуток послабже: "Из всех известных мне языков шаблонное, compile-time программирование присуще только C++". Но если я неправ и есть язык, поддерживающий эту концепцию столь же хорошо, как C++, покажите мне его. Я таких не нашел.

AVC>>Народ понял тебя буквально.

CX>Ага, я уже понял. Вообще-то я говорил не о специализированных языках. Так что моя недоработка.


Прости меня, но со стороны было несколько забавно наблюдать, как тебе за это "досталось".
Насколько я понимаю, ты видишь достоинство Си++ не в отдельных его "фичах" (которые могут уступать аналогичным "фичам" других языков), а в их сочетании.
Не знаю, с кем я согласен больше — с тобой или Трурлем.
Скорее, с Трурлем.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[3]: LSP, ДК, Вирт - поехали...
От: AVC Россия  
Дата: 07.07.05 20:37
Оценка: 9 (1)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>>>Нет ничего удивительного в том, что для иллюстрации использования IS Вирт пользуется таким приёмом, в конце концов, иллюстрация есть иллюстрация. Никто же не заставляет, например, "в лоб" переносить объектные модели из книг Буча/Шлеера/и т.д. в реальные проекты (хотя некоторые горячие головы могут)!

AVC>>Я использовал на практике метод Шлеер (мне кажется, это дама) и Меллора практически "в лоб".
ГВ>Э! Я не о методе самом по себе, о конкретных моделях, приводимых как иллюстрации.

А я сразу и не понял.
Действительно, было бы странно, если бы я использовал "в лоб" модель завода по производству соков.

ГВ>>>Так что, хотя такой "способ проектирования" и есть, но я бы не стал заявлять о нём, как о чём-то, имеющем ценность большую, чем сугубо иллюстративную.


AVC>>В некоторых случаях этому методу нет альтернативы.

AVC>>Он используется независимо от языка, как на Обероне, так и на Си.

ГВ>Не надо путать C и С++. Аналогичное решение на C++ выглядело бы как класс с чисто виртуальными методами. В общем-то, это надёжнее, поскольку была бы возможна группировка методов по целевому назначению и была бы гарантия того, что реализующий объект реализует _все_ методы некоторой группы. По крайней мере — он о них знает.


Предположим, Вам предложили переписать Windows заново на Си++.
Сколько чисто виртуальных методов Вы поместите в абстрактный класс "Окно"?
Примите во внимание, что, решив впоследствии добавить еще один виртуальный метод, Вы можете столкнуться с неразрешимой проблемой.

AVC>>Как например, Вы предложили бы реализовать рассылку сообщений в Windows?

AVC>>Приведенный Сергеем пример из книги Вирта просто демонстрирует, что в Обероне это делается безопасным путем.
ГВ>В смысле опасности некорректности приведения типов — да. В смысле опасности пропуска необходимых сообщений — нет.

Совершенно правильно.
Возможность игнорировать сообщение — достоинство такого подхода.
Опасность пропуска нужного сообщения тоже есть.
Равно как и опасность пропустить нужную ветку if в алгоритме.

AVC>>ИМХО, рассуждения о принципе подстановки Барбары Лисков в данном случае выглядят наивными.

ГВ>Не согласен. В данном случае при проектировании функции диспетчеризации мы используем знание о наборе поступающих сообщений. Если источник сообщений добавит ещё одно-два, то придётся модифицировать клиентский код, который придётся разыскивать через search и т.п. Не есть бест солюшн на мой взгляд. Вариант с группировкой обработчиков по интерфейсам я полагаю более надёжным.

Интересно, как именно будет выглядеть этот вариант?
И опять же, сколько интерфейсов Вы намерены заложить в систему?

AVC>>Здесь мы имеем дело с задачей двойной диспетчеризации, и это — ее самое простое (и универсальное) решение.

ГВ>Ну... можно обобщить до ДД. Разумеется, если объекты сообщений сами содержат реализацию некоторой функциональности. Я же говорю, что дальнейший анализ нужно делать на основании конкретной задачи.

Когда я упомянул ДД, я имел в виду, что функциональность зависит сразу от двух типов.
Необязательно снабжать каждый из типов виртуальными функциями.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[39]: Что толку в Ада если Ариан 5 все равно упал
От: Кодт Россия  
Дата: 07.07.05 21:29
Оценка: +1
Здравствуйте, Геннадий Васильев, Вы писали:

R>>Реально будет использовано меньше. Длинные произведения делаются

R>>inline-функциями. Поэтому небольшая автоматизация изврата — и
R>>генерируются только используемые размерности. Хотя, конечно, получится
R>>многовато, но искусство требует жертв. Благо, не человеческих, и даже не
R>>усилий.

Искусство требует нечеловеческих жертв!
((с) Ленин после прослушивания Лунной Сонаты)

ГВ>Ну-ксь, поверим гармонию алгеброй. Для 10^9 комбинаций, даже если на генерацию уходит 1 ms (оптимистично), то получим... 10^6 секунд на один проход генерации... Это... что-то около 11 дней на заход. Объём выходного файла при 50 символах на экземпляр ~50 ГБ.


ГВ>Даже если срезать три порядка — всё равно невесело. А если ещё тестирование...


Причём самое обидное, что из всего этого многообразия потребуются ну сто, ну двести разных сочетаний. Правда, забодаешься вручную их выявлять...
Перекуём баги на фичи!
Re[18]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 08.07.05 05:15
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Стоп-стоп-стоп. Изначально речь шла о безопасных и небезопасных традиционных языках. Зашла речь о метапрограммировании, которое доступно в C++ и недоступно в других языках, которые приводились как его главные противники.

CX>Причем здесь лисп? Да ни причем. Ежу понятно, что C++ с функциональными языками в сфере метапрограммирования конкурировать не может. Ну так и не нужно. Разве ж этого кто добивался?

А что Вы скажете насчет PL/1? Вполне себе традиционный язык.
Re[12]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 08.07.05 05:19
Оценка: 26 (2)
Здравствуйте, Павел Кузнецов, Вы писали:


ПК>В отличие от C++ на ассемблере нет способа сделать так, чтоб компилятор ловил ошибки типизации.

Это, смотря какой ассемблер.
Re[21]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 08.07.05 05:31
Оценка: +1 :)
Здравствуйте, AVC, Вы писали:

AVC>Прости меня, но со стороны было несколько забавно наблюдать, как тебе за это "досталось".


Да уж, прежде чем постить что-либо на RSDN, надо тщательно продумывать формулировки, иначе тут же накинутся. А я слишком работой был занят, не уделил должного внимания формулировкам.

AVC>Насколько я понимаю, ты видишь достоинство Си++ не в отдельных его "фичах" (которые могут уступать аналогичным "фичам" других языков), а в их сочетании.

AVC>Не знаю, с кем я согласен больше — с тобой или Трурлем.
AVC>Скорее, с Трурлем.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: LSP, ДК, Вирт - поехали...
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 08.07.05 06:21
Оценка: +1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ> Не согласен. В данном случае при проектировании функции диспетчеризации мы используем знание о наборе поступающих сообщений. Если источник сообщений добавит ещё одно-два, то придётся модифицировать клиентский код, который придётся разыскивать через search и т.п.


Нет не придется модифицировать. Все новые сообщения будут просто проигнорированы. В этом-то и вся суть. Разных типов сообщений потенциально не ограниченное количество (так как их можно расширять). Один раз написанный код воспринимает ограниченное количество сообщений, а все остальные игнорирует. Так что при добавлении новых типов сообщений старый код продолжает оставаться в силе.

ГВ> Не есть бест солюшн на мой взгляд. Вариант с группировкой обработчиков по интерфейсам я полагаю более надёжным.


А вот с интерфейсами наоборот. В однажды написанный интерфейс еще один новый метод уже не добавишь. Можно только по разному реализовывать существующие методы, но нового еще одного метода добавить уже нельзя.
Re[4]: LSP, ДК, Вирт - поехали...
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 08.07.05 06:28
Оценка: 8 (2)
Здравствуйте, AVC, Вы писали:

ГВ>>Не надо путать C и С++. Аналогичное решение на C++ выглядело бы как класс с чисто виртуальными методами. В общем-то, это надёжнее, поскольку была бы возможна группировка методов по целевому назначению и была бы гарантия того, что реализующий объект реализует _все_ методы некоторой группы. По крайней мере — он о них знает.


AVC>Предположим, Вам предложили переписать Windows заново на Си++.

AVC>Сколько чисто виртуальных методов Вы поместите в абстрактный класс "Окно"?
AVC>Примите во внимание, что, решив впоследствии добавить еще один виртуальный метод, Вы можете столкнуться с неразрешимой проблемой.

Алексей, Геннадий, здесь вы затронули такую интересную тему, как "расширяемость", "совместимость" и "прозрачность". Буквально совсем недавно она уже всплывала в Re[25]: Функциональные типы (параллельная ветка)
Автор: gbear
Дата: 30.06.05
и Re[10]: Формат конфигов
Автор: Геннадий Васильев
Дата: 29.06.05
(в последнем случае мы с тобой, Геннадий, достигли взаимопонимания).

Я это к тому, что в последнее время я пришел к мнению, что строгие интерфейсы и четко определенными сигнатурами гораздо менее гибки и расширяемы (к этому же можно отнести и виртуальные методы), чем message-based схемы. Например, был у меня метод:
ret_code_t
wait_event( event_t *& evt );

который засыпал до наступления какого-либо события. Естественно, что вскоре потребовалось добавить еще один параметр -- тайм-аут. После чего сигнатура метода изменилась на:
ret_code_t
wait_event( event_t *& evt, unsigned int timeout );

Вроде ничего сложного, такие модификации, к счастью, выявляются в процессе прототипирования. Но уже в процессе эксплуатации появляются новые требования:
— ожидать не указанное число миллисекунд, а до указанного абсолютного времени. Либо, что еще хуже, ждать либо указанного абсолютного времени, либо указанное количество миллисекунд (что быстрее произойдет);
— задавать фильтры событий, например, автоматом отбраковывать события, которые нас не интересуют или не разрешены к обработке в данном состоянии. Самое важное, что фильтрация должна осуществляться внутри wait_event, чтобы не пересчитывать тайм-ауты после возврата из wait_event.

Уже настройка под такие требования потребует появления нескольких методов wait_event с разными сигнатурами. Но развитие wait_event, его использование и сопровождение всего, что с wait_event связано, могло бы быть проще, если бы wait_event изначально имел вид:
ret_code_t
wait_event( event_t *& evt, wait_event_params_t & params );

поскольку структура wait_event_params_t могла бы расширятся гораздо проще, чем сигнатура wait_event. Но и возможности расширения wait_event_params_t так же могут оказаться ограниченными. Особенно, если wait_event_params_t будет представлена в виде интерфейса и использовать нужно будет его конкретные реализации. Поэтому еще более гибким подходом, имхо, является такой:
class    wait_event_traits_t
    {
    public :
        // Возвращает уникальный идентификатор свойства.
        virtual traits_id_t
        id() const = 0;
        
        // Возвращает true, если свойство нельзя проигнорировать.
        virtual bool
        must_understand() const = 0;
        ...
    };

ret_code_t
wait_event( event_t *& evt, const wait_event_traits_map_t & traits );

где wait_event_traits_map_t -- это некий объект, который позволяет получать указатели на wait_event_traits_t по traits_id (в простейшем случае обычный std::map).

Применяя метод wait_event(evt,traits) мы получаем единую точку входа в сервис с расширяемой функциональностью.

Имхо, еще более удобным такой подход становится при создании распределенных приложений (а может быть и компонентных). Ведь тогда заранее точно не известно, какой объем функциональности поддерживается удаленной стороной (компонентом). И запрос сервиса путем передачи объекта-сообщения (а не вызова удаленного метода с жесткой сигнатурой) становится более простым делом в плане расширяемости и поддержки совместимости с предыдущими версиями.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[3]: LSP, ДК, Вирт - поехали...
От: Трурль  
Дата: 08.07.05 07:03
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>>>Однако, если сугубо формально, то анализ типа сообщения всё равно остаётся. Тем-то, кстати, и хорош LSP, что его нарушение можно определить по сугубо формальным признакам.

Т>>Как раз по сугубо формальным признакам нарушений не видно.
ГВ>Ну, здравствуйте! А цепочка IS — это что?

Принцип подстановки ничего не говорит об анализе типа и т.п. Требуется только, чтобы вместо объектов некоторого типа можно было подставлять объекты его подтипа, не изменяя существенных свойств программы. В данном случае это условие выполняется.
Re[19]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 08.07.05 07:13
Оценка: 1 (1) +2
Здравствуйте, Трурль, Вы писали:

Т>А что Вы скажете насчет PL/1? Вполне себе традиционный язык.


А разве речь шла о нем в данном топике? Давайте не будем уводить беседу в другое русло. Я не утверждаю и никогда не утверждал, что C++ лучше и круче всех остальных языков (ну ладно, было мое высказывание о "других языках", но я уже поправился здесь
Автор: CrystaX
Дата: 08.07.05
). Я приводил определенные аргументы в пользу C++. Я не отрицаю его недостатков. Моя позиция состоит в том, что в C++, несмотря на множество недостатков, есть также множество достоинств, и эти достоинства перевешивают его недостатки (для меня).
На самом деле основное отличие C++ от его главных оппонентов в этой ветке (Оберон, C#, Java) в плане безопасности заключается не в том, что на нем нельзя писать безопасные программы (множество примеров говорит о том, что можно), а в том, что он не мешает писать небезопасные программы. Выводы же из этого его свойства мы делаем разные. Спорить дальше не вижу смысла. Вывод — он и есть вывод, каждый делает его сам для себя.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 08.07.05 07:34
Оценка: 1 (1) +2 :)
Здравствуйте, CrystaX, Вы писали:

CX>На самом деле основное отличие C++ от его главных оппонентов в этой ветке (Оберон, C#, Java) в плане безопасности заключается не в том, что на нем нельзя писать безопасные программы (множество примеров говорит о том, что можно), а в том, что он не мешает писать небезопасные программы.


Если цель — написать небезопасноу программу, ни один язык не может мне помешать в ее достижении.
Re[21]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 08.07.05 07:39
Оценка: 1 (1) +2
Здравствуйте, Трурль, Вы писали:

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


CX>>На самом деле основное отличие C++ от его главных оппонентов в этой ветке (Оберон, C#, Java) в плане безопасности заключается не в том, что на нем нельзя писать безопасные программы (множество примеров говорит о том, что можно), а в том, что он не мешает писать небезопасные программы.


Т>Если цель — написать небезопасноу программу, ни один язык не может мне помешать в ее достижении.

+1

Проблема-то в C++ в том, что для написания небезопасной программы не нужно прикладывать особых усилий. Фактически, любая наивная реализация чего-нибудь сложного (без использования специальных приемов и STL) уже будет представлять из себя небезопасную программу.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[40]: Что толку в Ада если Ариан 5 все равно упал
От: raskin Россия  
Дата: 08.07.05 09:46
Оценка: 1 (1)
Кодт wrote:
> R>>Реально будет использовано меньше. Длинные произведения делаются
> R>>inline-функциями. Поэтому небольшая автоматизация изврата — и
> R>>генерируются только используемые размерности. Хотя, конечно, получится
> R>>многовато, но искусство требует жертв. Благо, не человеческих, и даже не
> R>>усилий.
>
> Искусство требует нечеловеческих жертв!
> ((с) Ленин после прослушивания Лунной Сонаты)
>
> ГВ>Ну-ксь, поверим гармонию алгеброй. Для 10^9 комбинаций, даже если на
> генерацию уходит 1 ms (оптимистично), то получим... 10^6 секунд на один
> проход генерации... Это... что-то около 11 дней на заход. Объём
> выходного файла при 50 символах на экземпляр ~50 ГБ.
>
> ГВ>Даже если срезать три порядка — всё равно невесело. А если ещё
> тестирование...
>
> Причём самое обидное, что из всего этого многообразия потребуются ну
> сто, ну двести разных сочетаний. Правда, забодаешься вручную их выявлять...

Так про то и речь. При объявлении переменной пишется ссылка на процедуру
— генератор (не знаю, как это принято говорить.. Вроде PHP-островков в
HTML, только Pascal в Pascal), которая и проверяет существование нужного
типа (вроде grep) и по необходимости дописывает в файл программы
объявление, а в модуль типов — полное описание типа. Я имел в виду
такую генерацию. И будет 200 типов * 1000 байт = 200 кБ, за несколько
секунд. у меня генерируется 10*4*2000 в некотором месте (используется
меньше, но оптимизировать лень) — это не так долго
генерируется/компилируется, кроме того пересоздание/перекомпиляция редка.
Posted via RSDN NNTP Server 2.0 beta
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 08.07.05 10:07
Оценка: 2 (2) +3
Здравствуйте, CrystaX, Вы писали:

CX>На самом деле основное отличие C++ от его главных оппонентов в этой ветке (Оберон, C#, Java) в плане безопасности заключается не в том, что на нем нельзя писать безопасные программы (множество примеров говорит о том, что можно), а в том, что он не мешает писать небезопасные программы. Выводы же из этого его свойства мы делаем разные. Спорить дальше не вижу смысла. Вывод — он и есть вывод, каждый делает его сам для себя.


Все правильно: "Каждый выбирает для себя..." (из песни)
Мне показалось (может, и ошибочно), что ты немного разочарован результатом — каждый остался "при своем".
Но главное назначение дискуссии — расширить представления участников о предмете.
Я узнал для себя много нового, меня даже понравились некоторые примеры кода на Си++.
(Просто мне немного трудно их "принять". Наверное, это дело практики, времени, привычки. Буду понемногу разбираться в новых возможностях Си++.)
Поэтому я, в принципе, удовлетворен.
Дискуссии (если они касаются не совсем уж легких предметов) всегда развиваются по спирали и возвращаются на прежнее место, но уже на другом уровне.
Надеюсь, что мы обсудим и неязыковые причины ненадежности программ. Мне кажется, что в основном они связаны с трудностями моделирования реального мира. А это тоже очень интересная тема.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[21]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 08.07.05 10:17
Оценка: 1 (1)
Здравствуйте, AVC, Вы писали:

AVC>Все правильно: "Каждый выбирает для себя..." (из песни)

AVC>Мне показалось (может, и ошибочно), что ты немного разочарован результатом — каждый остался "при своем".

Нет, не разочарован. Честно говоря, вообще не припоминаю случаев, когда в споре вдруг кому-то "неожиданно открылась истина, ослепляя своим блеском".
Цель не в этом. Цель в другом — дать пищу для размышлений и, возможно, подтолкнуть к действию. Я вот, например, решил на Оберон посмотреть более внимательно, а также лиспом на досуге заняться (тем же emacs-ом для начала) — чем не результат?

AVC>Но главное назначение дискуссии — расширить представления участников о предмете.

AVC>Я узнал для себя много нового, меня даже понравились некоторые примеры кода на Си++.

+1

AVC>(Просто мне немного трудно их "принять". Наверное, это дело практики, времени, привычки. Буду понемногу разбираться в новых возможностях Си++.)

AVC>Поэтому я, в принципе, удовлетворен.

+1

AVC>Дискуссии (если они касаются не совсем уж легких предметов) всегда развиваются по спирали и возвращаются на прежнее место, но уже на другом уровне.

AVC>Надеюсь, что мы обсудим и неязыковые причины ненадежности программ. Мне кажется, что в основном они связаны с трудностями моделирования реального мира. А это тоже очень интересная тема.

Да, вот это хотелось бы обсудить.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 08.07.05 11:41
Оценка: 21 (1)
Здравствуйте, CrystaX, Вы писали:

CX>Я вот, например, решил на Оберон посмотреть более внимательно


Не сочтите за коммерческую рекламу, но в июльском номере журнала "Мир ПК" на компакт диске в разделе "Студия программирования" обещают поместить соответсвующие материалы (BlackBox). Это я на тот случай сообщаю, если Вы вдруг по модему чего из интернета скачивать надумаете, так лучше сначала там посмотреть.
Re[23]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 08.07.05 11:45
Оценка: 1 (1)
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Не сочтите за коммерческую рекламу, но в июльском номере журнала "Мир ПК" на компакт диске в разделе "Студия программирования" обещают поместить соответсвующие материалы (BlackBox). Это я на тот случай сообщаю, если Вы вдруг по модему чего из интернета скачивать надумаете, так лучше сначала там посмотреть.


Спасибо, но BlackBox и XDS я уже скачал и начал щупать. У меня, слава богу, ADSL.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[12]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.05 14:36
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>В отличие от C++ на ассемблере нет способа сделать так, чтоб компилятор ловил ошибки типизации. В C++ такие способы есть, так что аналогия некорректна.


Нет в С++ такого способа. Всегда можно взять и сделать все что душе угодно. А в том же МАСМ-е были макросы которые тоже позволяли делать безопасные конструкции. Так что аналогия более чем уместна.

VD>> Скорости это не дает. <...>


ПК>Дело-то не в скорости,


А, ну, значит я читаль не умею.

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


Ясно очерденая попытка подмены темы.

ПК>Ну-ка, сделай на C# такое
Автор: Павел Кузнецов
Дата: 07.07.05
...


Долго смотрел, много думал... Как бы это сказать по мягче... Не обижайся, но у тебя уже какой-то не совсем нормальный дизайн появляется. Я не понял чем обусловлены вот эти замечательные выводы:

Однако теперь видны другие недостатки: 1) в месте объявления функций-членов ICommunicator совершенно неочевидно, какие из вариантов ответов они могут возвращать; 2) в точке использования неясно, учтены ли все варианты ответов, или же по ошибке о каком-то из них забыли.

Я бы просто объявил два перечисления (C#):
enum FileExistsAnswer
{
    Cancel,
    Overwrite,
    Skip,
}

enum FolderDoesNotExistsAnswer
{
    Cancel,
    Continue,
}


Ну, и использовал бы в этом интерфейсе:
interface ICommunicator
{
  FileExistsAnswer FileExists(Path path);
  FolderDoesNotExistsAnswer FolderDoesNotExists(Path path);
  . . .
};


Код получается короче и читабельнее:
if (file_exists(path))
{
  switch (communicator.FileExists(path))
  {
        case FileExistsAnswer.Cancel:    . . .
        case FileExistsAnswer.Overwrite: . . .
        case FileExistsAnswer.Skip:      . . .
        default:                         throw UnexpectedCommunicatorAnswer();
  }
}
...


Ну, и никакого метапрограммирования тут не нужно.

В общем, это очередная демонстрация стрельбы из пушки по воробям.

ПК>Только не надо про R#: он совершенно не контролирует характер изменений AST
Автор: Павел Кузнецов
Дата: 16.06.05
, так что в случае его использования о какой-либо безопасности говорить (пока?) сложно...


Это твои тараканы. Меня они не интересуют. Я как то не видел подобных проблем используя R#. Бороться же с твоими домыслами у меня желания нет.

Что же до пенисометрии, то я тебе просто устану приводить примеры тог что можно сдедалать на R# и нельзя на С++ (без внешних средств).
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 08.07.05 15:10
Оценка: +1
Здравствуйте, VladD2, Вы писали:

ПК>>Ну-ка, сделай на C# такое
Автор: Павел Кузнецов
Дата: 07.07.05
...


VD>Долго смотрел, много думал... Как бы это сказать по мягче... Не обижайся, но у тебя уже какой-то не совсем нормальный дизайн появляется. Я не понял чем обусловлены вот эти замечательные выводы:

VD>

Однако теперь видны другие недостатки: 1) в месте объявления функций-членов ICommunicator совершенно неочевидно, какие из вариантов ответов они могут возвращать; 2) в точке использования неясно, учтены ли все варианты ответов, или же по ошибке о каком-то из них забыли.

VD>Я бы просто объявил два перечисления (C#): <...>
VD>Ну, и использовал бы в этом интерфейсе:
VD>
VD>interface ICommunicator
VD>{
VD>  FileExistsAnswer FileExists(Path path);
VD>  FolderDoesNotExistsAnswer FolderDoesNotExists(Path path);
VD>  . . .
VD>};
VD>


VD>Код получается короче и читабельнее:

VD>
VD>if (file_exists(path))
VD>{
VD>  switch (communicator.FileExists(path))
VD>  {
VD>        case FileExistsAnswer.Cancel:    . . .
VD>        case FileExistsAnswer.Overwrite: . . .
VD>        case FileExistsAnswer.Skip:      . . .
VD>        default:                         throw UnexpectedCommunicatorAnswer();
VD>  }
VD>}
VD>...
VD>


Когда будет добавлен новый вариант в FileExistsAnswer, данный код будет-по прежнему компилироваться, хотя и не учитывает этот новый вариант. Данная ошибка легко может пройти незамеченной, что и происходит на практике. Подход, продемонстрированный в примере по ссылке -- следствие двух вещей: 1) реакция на ощутимое количество исправляемых ошибок в коде, использующем communicators; 2) необходимость значительно изменить иерархию communicators, и желание сделать так, чтобы была гарантия, что в ходе изменений нигде не будут внесены ошибки с забытыми возвращаемыми значениями и т.п. Возможность ввести enum для каждой из функций рассматривалось, но было отвергнуто из-за того, что такой подход не ловит большинство реально наблюдаемых ошибок, связанных с изменениями communicators.

Подробнее:
http://rsdn.ru/Forum/Message.aspx?mid=1261795&amp;only=1
Автор: Павел Кузнецов
Дата: 07.07.05

http://rsdn.ru/Forum/Message.aspx?mid=1261535&amp;only=1
Автор: Павел Кузнецов
Дата: 07.07.05

http://rsdn.ru/Forum/Message.aspx?mid=1261749&amp;only=1
Автор: Павел Кузнецов
Дата: 07.07.05
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[41]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 08.07.05 17:45
Оценка:
raskin,

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


> Так про то и речь. При объявлении переменной пишется ссылка на процедуру — генератор (не знаю, как это принято говорить.. Вроде PHP-островков в HTML, только Pascal в Pascal), которая и проверяет существование нужного типа (вроде grep) и по необходимости дописывает в файл программы объявление, а в модуль типов — полное описание типа. <...>


Ну, там намного сложнее получится, т.к. это уже, фактически, неявное инстанцирование со всеми вытекающими: ODR и т.п. Собственно, если идти по этому пути, то, по крайней мере для Ады, не нужно выдумывать свои велосипеды: "Адские" расширения для автоматического инстанцирования существуют, можно взять одно из них.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[14]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.05 18:25
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

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


Это параноя уже.

ПК> Подход, продемонстрированный в примере по ссылке -- следствие двух вещей: 1) реакция на ощутимое количество исправляемых ошибок в коде, использующем communicators; 2) необходимость значительно изменить иерархию communicators, и желание сделать так, чтобы была гарантия, что в ходе изменений нигде не будут внесены ошибки с забытыми возвращаемыми значениями и т.п. Возможность ввести enum для каждой из функций рассматривалось, но было отвергнуто из-за того, что такой подход не ловит большинство реально наблюдаемых ошибок, связанных с изменениями communicators.


Чтобы поймать такую ошибку достаточно написать запрос на R#-е. А можно вообще превратить подобную фигню в диекларативную с ватоматической проверкой при инициализации.

Ну, и что самое главное в твоем случае я вообще не заметил никакого контроля. Или рассчитывается, что кто-то особо зоркий будет сидеть и сравнивать if-ы с объявлениями переменных?

ЗЫ

Вообще странно слышать от человека который постоянно твердит, что "дело в классе разработчика..." о таких примитивных ошибках.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Что толку в Ада если Ариан 5 все равно упал
От: Gaperton http://gaperton.livejournal.com
Дата: 08.07.05 18:38
Оценка:
Здравствуйте, CrystaX, Вы писали:

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


AVC>>Дмитрий, конечно, я согласен с тобой в том, что "надо делать хорошо и не надо плохо".

AVC>>Но мне вот подумалось, что твой совет мало отличается от совета Трурля не использовать Си++ вообще.

CX>Ну почему же — отличается. Прежде всего тем, что в моем случае, если понадобится, я смогу использовать и голые указатели, и прочее. Кроме того, отказавшись от C++, я потеряю мощнейшую вещь, которой нет пока ни в одном другом языке — шаблонное метапрограммирование.


ЛОЛ . Навскидку — из тех, что на слуху. Dylan. Lisp. OCaml. Clean. Haskell. Возможности шаблонов С++ по сравнению с системами типов каждого из этих языков — децкий лепет. Стоит также заметить, что при большей гибкости они на порядок проще в понимании и использовании чем великий и могучий "modern C++" ((С) Александреску).

Из них, OCaml и Clean сравнимы по скорости с С++. Dylan и Lisp — с Java/C# (примерно вдвое медленнее С++). Haskell у нас в аутсайдерах — в лучшем случае втрое медленнее С++.

Кстати, стоит упомянуть еще и Smalltalk — по гибкости он тоже значительно превосходит систему типов С++ (по скорости выполнения сравним с Java).

При этом, из этого списка — только Lisp обладает такими возможностями метапрограммирования, которые реально отсутствуют в любом другом языке. Lisp-программисту нет необходимости дожидаться, пока то или иное расширение языка войдет в стандарт — поправить самому минутное дело.
Re[13]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 08.07.05 18:43
Оценка:
Здравствуйте, Gaperton, Вы писали:

Все таки читать всю ветку, прежде чем катать двухстраничный ответ, бывает нелишним.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[15]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 08.07.05 19:25
Оценка: +2 :)
VladD2,

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


> Это параноя уже.


Это повседневная реальность: эти ошибки появляются, и тестированием адекватно не отлавливаются. И о чем, собственно, периодически и заходит речь: C++ позволяет программисту сделать так, что такие ошибки будут отлавливаться компилятором. Тут Трурль интересный пример на OCaml показал (раньше не знал, что pattern matching в OCaml требует проверки всех возможных результатов — в общем-то, это логично, но я как-то об этом не задумывался); так что противопоставление на примере данного случая с другими языками, там, где оно делалось, следует сузить до языков, которые чаще всего противопоставляются в данном форуме C++ (C#, Java, Оберон, Ада, Delphi).

> Чтобы поймать такую ошибку достаточно написать запрос на R#-е.


R# здесь отдыхает: 1) тянуть только из-за этого его никто в проект не будет; 2) запросы, как я понимаю, писать нелегко, так что для каждой функции их просто-напросто никто писать не будет, что и происходит со всякими другими анализаторами кода и средствами, подобными Lint — обычно там ограничиваются достаточно общими правилами, аналогичными соглашениям по кодированию и т.п.

> А можно вообще превратить подобную фигню в диекларативную с ватоматической проверкой при инициализации.


Вот там как раз и есть "декларативная с автоматической проверкой при инициализации". Проверка, что в данном случае принципиально, происходит во время компиляции. Проверки во время исполнения недостаточны, т.к., как уже описывалось, сценарии, в которых возникают исключительные ситуации, очень разнообразны, и "в полевых условиях" протестировать все случаи, где это происходит, фактически, нереально. А unit-тесты в данном случае не спасают, т.к. порождение случаев для новых возвращаемых значений в них само собой тоже происходить не будет.

> Ну, и что самое главное в твоем случае я вообще не заметил никакого контроля. Или рассчитывается, что кто-то особо зоркий будет сидеть и сравнивать if-ы с объявлениями переменных?


Контроль происходит в момент, когда возникла ошибка компиляции по поводу недостающего значения. Этого (для наших целей) достаточно; главное не пропустить само место, где не ожидают нового возвращаемого значения.

> Вообще странно слышать от человека который постоянно твердит, что "дело в классе разработчика..." о таких примитивных ошибках.


Дык, класс разработчика, применительно к C++, в моем понимании как раз и выражается в стремлении и умении сделать так, чтобы очень большое количество потенциальных ошибок отлавливалось компилятором. Именно об этом я все время и говорю, подчеркивая возможность делать C++ более строгим контролером ошибок, чем C# или Java.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[15]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 08.07.05 20:27
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Вообще странно слышать от человека который постоянно твердит, что "дело в классе разработчика..." о таких примитивных ошибках.


Имхо, в данном конкретном случае класс проявляется как раз в том, чтобы заставить компилятор отлавливать подобные ошибки. А не использовать для этого кучу внешних вспомогательных инструментов (которые легко можно забыть применить).
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 08.07.05 20:32
Оценка:
Здравствуйте, CrystaX, Вы писали:

AVC>>Все правильно: "Каждый выбирает для себя..." (из песни)

AVC>>Мне показалось (может, и ошибочно), что ты немного разочарован результатом — каждый остался "при своем".

CX>Нет, не разочарован. Честно говоря, вообще не припоминаю случаев, когда в споре вдруг кому-то "неожиданно открылась истина, ослепляя своим блеском".

CX>Цель не в этом. Цель в другом — дать пищу для размышлений и, возможно, подтолкнуть к действию. Я вот, например, решил на Оберон посмотреть более внимательно, а также лиспом на досуге заняться (тем же emacs-ом для начала) — чем не результат?

Вряд ли можно требовать большего от дискуссии.
Хочу предупредить. Оберон может не произвести впечатления на первый взгляд.
По этому поводу я не поленился перепечатать свою любимую китайскую притчу.

Из книги "Ле-цзы"

Циньский князь Мугун сказал конюшему Бо Лэ:
— Ты уже стар годами. Нет ли кого-нибудь в твоем роду, кто умел бы отбирать лошадей?
— Доброго коня можно узнать по стати, мускулам и костяку. Однако у Первого Коня в Поднебесной все это — словно бы стерто и смыто, скрыто и спрятано. Такой конь мчится, не поднимая пыли, не оставляя следов. Сыновья же мои малоспособны: они сумеют найти хорошего коня, но не смогут найти Первого Коня в Поднебесной. Когда-то я таскал вязанки дров и связки овощей совместно с неким Цзюфан Гао. Он разбирался в лошадях не хуже вашего слуги. Пригласите его.
Князь принял Цзюфан Гао и немедля отправил его за конем. Через три месяца Цзюфан Гао вернулся и доложил:
— Отыскал. В Песчаных Холмах.
— А что за конь? — спросил Мугун.
— Гнедая кобыла.
Послали за кобылой, а это оказался вороной жеребец.
Князь, опечалившись, позвал Бо Лэ и сказал ему:
— Ничего не получилось! Тот, кого ты прислал отбирать коней, не способен разобраться даже в масти, не умеет отличить кобылу от жеребца — какой уж из него лошадник!
— Неужели он этого достиг! — сказал Бо Лэ, вздохнув в глубоком восхищении. — Да после этого тысячи и тьмы таких, как я, — ничто в сравнении с ним! Ведь Гао видит природную суть. Отбирает зерно, отметая мякину, проникает внутрь, забывая о внешнем. Видит то, что нужно видеть, а ненужного не — замечает. Смотрит на то, на что следует смотреть, пренебрегая тем, на что смотреть не стоит. Да такое умение — дороже всяких коней!
Когда жеребца привели, это и впрямь оказался первый конь в Поднебесной!


Отбирает зерно, отметая мякину — точная характеристика Вирта.
Большинство же современных "гуру программирования" — всего лишь циркачи, способные разве что удивить парой трюков.
Но трюки на самом деле не повышают качества программ, а только отвлекают внимание от действительно важных вещей.

AVC>>Надеюсь, что мы обсудим и неязыковые причины ненадежности программ. Мне кажется, что в основном они связаны с трудностями моделирования реального мира. А это тоже очень интересная тема.


CX>Да, вот это хотелось бы обсудить.


Надеюсь, в ближайшее время нам это удастся.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[23]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 08.07.05 20:45
Оценка: +1
Здравствуйте, AVC, Вы писали:

AVC>Вряд ли можно требовать большего от дискуссии.

AVC>Хочу предупредить. Оберон может не произвести впечатления на первый взгляд.

Ты прав. Не впечатляет, по крайней мере пока что. Ну да посмотрим, что будет дальше.

AVC>По этому поводу я не поленился перепечатать свою любимую китайскую притчу.

[skipped]

Притча красивая.

AVC>Отбирает зерно, отметая мякину — точная характеристика Вирта.

AVC>Большинство же современных "гуру программирования" — всего лишь циркачи, способные разве что удивить парой трюков.
AVC>Но трюки на самом деле не повышают качества программ, а только отвлекают внимание от действительно важных вещей.

Утверждение на грани фола. Вот так и хочется опять вскочить и ринуться в драку. Осталось только уточнить, кто эти самые гуру и какие это трюки, а затем флейм может начаться сначала. Поэтому я тебя очень прошу — не называй имен и не приводи примеры трюков! Драться-то не хочется.

AVC>>>Надеюсь, что мы обсудим и неязыковые причины ненадежности программ. Мне кажется, что в основном они связаны с трудностями моделирования реального мира. А это тоже очень интересная тема.


CX>>Да, вот это хотелось бы обсудить.


AVC>Надеюсь, в ближайшее время нам это удастся.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[16]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.05 20:48
Оценка: -3
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Это повседневная реальность:...до языков, которые чаще всего противопоставляются в данном форуме C++ (C#, Java, Оберон, Ада, Delphi).


Повседневная реальность показывает, что радикально сократить количество ошибок можно только путем выкидывания С++ на помойку.

>> Чтобы поймать такую ошибку достаточно написать запрос на R#-е.


ПК>R# здесь отдыхает:


Отдыхают плюсы. Причем чем дальше тем больше. И сознание у людей меняется. Тут вот между делом у нас случился забавный факт. Количество голосов за дотнет превысило количество голосов за С++ http://rsdn.ru/poll/1181.aspx
Автор: csharper
Дата: 20.06.05
Вопрос: Допустим, Вы одинаково хорошо (или одинаково плохо :) ) знаете .NET/C# и C++(с сопутвующим). Вам предлагают работу в обеих направлениях, с одинаковой зарплатой и условиями. Что Вы выберете?
. Раньше такое и представить себе было сложно. И то ли еще будет.

ПК> 1) тянуть только из-за этого его никто в проект не будет;


Ненадо обощать себя со всеми.

ПК> 2) запросы, как я понимаю, писать нелегко,


Ну, ты всегда все понимашь так как нужно чтобы обосновать свое мнение. Запрос пишется довольно просто. Достаточно изучить XPath запустить CodeAnalizer. Потом такой запрос можно вставить в юнит-етст.

ПК> так что для каждой функции их просто-напросто никто писать не будет,


Запрос типовой. Меняй имя типа и радуйся.

>> А можно вообще превратить подобную фигню в диекларативную с ватоматической проверкой при инициализации.


ПК>Вот там как раз и есть "декларативная с автоматической проверкой при инициализации".


Вот "там" как раз есть ужасный копипыст.

>> Ну, и что самое главное в твоем случае я вообще не заметил никакого контроля. Или рассчитывается, что кто-то особо зоркий будет сидеть и сравнивать if-ы с объявлениями переменных?


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


Может быть я что-то не понял, но в твоем примере был банальный if. И никакие шаблоны не заставят компилятор проверить, что у этого if-а нужное количество else if-ов содержащее нужные проверки.

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


Пластинка больно заезженная. Это самовнушение уже даже не смешит.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: LSP, ДК, Вирт - поехали...
От: Павел Кузнецов  
Дата: 08.07.05 20:50
Оценка: +1
Сергей Губанов,

> ГВ> Не согласен. В данном случае при проектировании функции диспетчеризации мы используем знание о наборе поступающих сообщений. Если источник сообщений добавит ещё одно-два, то придётся модифицировать клиентский код, который придётся разыскивать через search и т.п.

>
> Нет не придется модифицировать. Все новые сообщения будут просто проигнорированы.

В таком случае нужно проанализировать функцию диспетчеризации, чтобы убедиться, что данный вид новых сообщений можно безопасно игнорировать.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[24]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 08.07.05 21:35
Оценка: 23 (3) :)
Здравствуйте, CrystaX, Вы писали:

AVC>>Вряд ли можно требовать большего от дискуссии.

AVC>>Хочу предупредить. Оберон может не произвести впечатления на первый взгляд.

CX>Ты прав. Не впечатляет, по крайней мере пока что. Ну да посмотрим, что будет дальше.


AVC>>По этому поводу я не поленился перепечатать свою любимую китайскую притчу.

CX>[skipped]

CX>Притча красивая.


AVC>>Отбирает зерно, отметая мякину — точная характеристика Вирта.

AVC>>Большинство же современных "гуру программирования" — всего лишь циркачи, способные разве что удивить парой трюков.
AVC>>Но трюки на самом деле не повышают качества программ, а только отвлекают внимание от действительно важных вещей.

CX>Утверждение на грани фола. Вот так и хочется опять вскочить и ринуться в драку. Осталось только уточнить, кто эти самые гуру и какие это трюки, а затем флейм может начаться сначала. Поэтому я тебя очень прошу — не называй имен и не приводи примеры трюков! Драться-то не хочется.


Драться и правда не хочется. Мы и не будем.
Имен называть также не стану.
Хотя мне трудно молча снести заявления о каких-то там потенциальных возможностях Си++ в отношении контроля типов, тогда как каждый из нас знает, что в 99,9% случаев Си++ используется совсем иначе.
Тезис о "возможностях" языка в отношении type safety не выдерживает критики.
Язык должен гарантировать столько type safety, сколько он может, а не заманивать какими-то "возможностями".
Но я вот сижу и молчу.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[25]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 08.07.05 21:58
Оценка: 1 (1)
Здравствуйте, AVC, Вы писали:

AVC>Драться и правда не хочется. Мы и не будем.

AVC>Имен называть также не стану.
AVC>Хотя мне трудно молча снести заявления о каких-то там потенциальных возможностях Си++ в отношении контроля типов, тогда как каждый из нас знает, что в 99,9% случаев Си++ используется совсем иначе.

Но откуда же это знание взялось-то о 99%? Веришь, я как раз эти возможности C++ и использую (контроль типов). В моем нынешнем проекте эта его возможность используется на полную катушку — семантические проблемы превращаются в синтаксические и поэтому компилятор их не пропускает. Вот ты компиляторы разрабатываешь, а у меня как раз парсер в проекте используется. Сделан на основе template-ов с возможностью отлавливать все несогласованные изменения в грамматике как несоответствия типов. Если хочешь, могу показать, но это уже не в public форум.

AVC>Тезис о "возможностях" языка в отношении type safety не выдерживает критики.

AVC>Язык должен гарантировать столько type safety, сколько он может, а не заманивать какими-то "возможностями".
AVC>Но я вот сижу и молчу.

Да-да, я заметил.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[17]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 08.07.05 21:58
Оценка:
VladD2,

> ПК>Это повседневная реальность:...до языков, которые чаще всего противопоставляются в данном форуме C++ (C#, Java, Оберон, Ада, Delphi).

>
> Повседневная реальность показывает, что радикально сократить количество ошибок можно только путем выкидывания С++ на помойку.

Тише-тише... Мы ж конкретный пример обсуждаем. Если ты хочешь показать, что проблема решена неудачно, достаточно продемонстрировать, насколько лихо это можно было сделать по-другому. Если хочешь порекламировать C#/R#, давай, сейчас хорошая возможность: я весь — внимание Скажем, пример на OCaml, приведенный Трурль, для меня оказался достаточным, чтобы существенно изменить свое отношение к данному языку.

> ПК> 2) запросы, как я понимаю, писать нелегко,

>
> Ну, ты всегда все понимашь так как нужно чтобы обосновать свое мнение. Запрос пишется довольно просто. Достаточно изучить XPath запустить CodeAnalizer. Потом такой запрос можно вставить в юнит-етст.

Так все-таки, примерчик можно? А то я пока не вполне понимаю, о чем речь идет: мне мерещатся всякие ужасы с достаточно серьезным анализом AST и т.п...

>>> А можно вообще превратить подобную фигню в диекларативную с ватоматической проверкой при инициализации.

>
> ПК>Вот там как раз и есть "декларативная с автоматической проверкой при инициализации".
>
> Вот "там" как раз есть ужасный копипыст.

Гм... По-моему, достаточно близко к минимуму (который мы имели удовольствие наблюдать на примере OCaml). Всего один лишний раз повторяется имя константы, обозначающей выбранный вариант.

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

>
> Может быть я что-то не понял, но в твоем примере был банальный if.

Точно. А перед ним явное указание списка ожидаемых значений, совмещенное с вызовом функции. Вот там-то и зарыта потенциальная ошибка: набор ожидаемых значений не соответствуют реально возвращаемым. Все, что после — ее следствия. Нарушено предусловие последующего блока кода (значение принадлежит определенному набору); когда нарушается предусловие, рассуждать о правильности кода смысла не имеет. В случае приведенного примера соблюдение данного предусловия контролируется компилятором. Определять предусловия своего кода — ответственность программиста.

> И никакие шаблоны не заставят компилятор проверить, что у этого if-а нужное количество else if-ов содержащее нужные проверки.


Это уже несущественно: наличие всех веток тоже не гарантирует правильности обработки. Для меня достаточно того, что ни один вызов функции-члена communicator не может быть случайно сделан так, что будет получено неожиданное значение.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[26]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 08.07.05 22:34
Оценка: 1 (1) +1
Здравствуйте, CrystaX, Вы писали:

AVC>>Драться и правда не хочется. Мы и не будем.

AVC>>Имен называть также не стану.
AVC>>Хотя мне трудно молча снести заявления о каких-то там потенциальных возможностях Си++ в отношении контроля типов, тогда как каждый из нас знает, что в 99,9% случаев Си++ используется совсем иначе.

CX>Но откуда же это знание взялось-то о 99%? Веришь, я как раз эти возможности C++ и использую (контроль типов). В моем нынешнем проекте эта его возможность используется на полную катушку — семантические проблемы превращаются в синтаксические и поэтому компилятор их не пропускает. Вот ты компиляторы разрабатываешь, а у меня как раз парсер в проекте используется. Сделан на основе template-ов с возможностью отлавливать все несогласованные изменения в грамматике как несоответствия типов. Если хочешь, могу показать, но это уже не в public форум.


Мне действительно интересно будет посмотреть.
Конечно я частенько спорю с тобой, но и учусь тоже.
В "новом" Си++ мне следует освоить прежде всего приемы работы с шаблонами.
А насчет 99%... Вряд ли это большое преувеличение. Возможно, этот процент будет понемногу меняться в сторону более осторожного и грамотного использования языка.

AVC>>Тезис о "возможностях" языка в отношении type safety не выдерживает критики.

AVC>>Язык должен гарантировать столько type safety, сколько он может, а не заманивать какими-то "возможностями".
AVC>>Но я вот сижу и молчу.

CX>Да-да, я заметил.


Да это я так... шепотом.
Но заметь, я не говорил, что в Си++ нет таких возможностей, а говорил только о типовом применении Си++.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[27]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 08.07.05 23:14
Оценка: +2
Здравствуйте, AVC, Вы писали:

AVC>Мне действительно интересно будет посмотреть.


Ок, может тогда пообщаемся в аське? Вышли на e-mail в профиле свой ICQ# или я свой могу выслать.

AVC>Конечно я частенько спорю с тобой, но и учусь тоже.


Я тоже.

AVC>В "новом" Си++ мне следует освоить прежде всего приемы работы с шаблонами.

AVC>А насчет 99%... Вряд ли это большое преувеличение. Возможно, этот процент будет понемногу меняться в сторону более осторожного и грамотного использования языка.

Не буду спорить — большинство C++ программистов использует его очень небезопасным способом, но тут уж ничего не поделаешь. Очень уж C++ сложен. Усилий на его изучение приходится приложить значительно больше, чем на изучение других языков (специально для любителей придраться к формулировке: "других языков" следует читать как "языков, противопоставляемых C++ в этой ветке, а именно C#, Java, Oberon, Ada"). Но зато если уж использовать его самые сильные стороны, все недостатки с лихвой окупаются (это мое частное мнение и я никому его не навязываю).

AVC>>>Но я вот сижу и молчу.


CX>>Да-да, я заметил.


AVC>Да это я так... шепотом.

AVC>Но заметь, я не говорил, что в Си++ нет таких возможностей, а говорил только о типовом применении Си++.

... << RSDN@Home 1.1.4 stable rev. 510>>
Re[28]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.07.05 00:58
Оценка: +1 :)
Здравствуйте, CrystaX, Вы писали:

CX>Не буду спорить — большинство C++ программистов использует его очень небезопасным способом, но тут уж ничего не поделаешь.


Вот хоть раз с таким пообщаться. А то как не глянь на форум, так на нем таких нет. А как залезь в код, так там... мам дорогая...
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[27]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 09.07.05 00:59
Оценка: 3 (3) +2
AVC,

> AVC>> Тезис о "возможностях" языка в отношении type safety не выдерживает критики. Язык должен гарантировать столько type safety, сколько он может, а не заманивать какими-то "возможностями".


Это очень верно. К сожалению, при выборе из обсуждаемых языков приходится выбирать между гарантированной type safety и отсутствием "возможностей" и негарантированной type safety и наличием "возможностей". Если бы в каком-либо из обсуждаемых языков было бы и то, и другое в большей мере, чем у альтернативных вариантов, то и обсуждать бы было нечего. Наверное

> Но заметь, я не говорил, что в Си++ нет таких возможностей, а говорил только о типовом применении Си++.


И в таком случае спорить, имхо, бессмысленно. С другой стороны, кому из присутствующих интересно типовое применение, если есть возможность применения более привлекательного, пусть и не совсем типового?
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[28]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 09.07.05 07:48
Оценка: :))
Здравствуйте, CrystaX, Вы писали:

AVC>>Мне действительно интересно будет посмотреть.


CX>Ок, может тогда пообщаемся в аське? Вышли на e-mail в профиле свой ICQ# или я свой могу выслать.


OK. В понедельник "реанимирую" аську на работе (заодно и номер вспомню).
А то я совсем ее, бедную, забросил после переустановки системы.
Потому что все сводилось к полуденной переписке коллег, вроде:

Че, ты уже на работе? В такую рань?
А я вот все думаю — может еще поспать?
Ну лады, шеф будет меня спрашивать — скажи, мол, только что был здесь.


AVC>>Конечно я частенько спорю с тобой, но и учусь тоже.


CX>Я тоже.


Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[28]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 09.07.05 16:27
Оценка: 7 (2)
Здравствуйте, Павел Кузнецов, Вы писали:

>> Но заметь, я не говорил, что в Си++ нет таких возможностей, а говорил только о типовом применении Си++.


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


Павел, я знаю, что Вы знаток Си++, но совсем не фанатик.
Но все же Вы — идеалист.
Неужели Вы не видите того препятствия, которое находится на пути грамотного программирования на Си++?
Это препятствие — сложность.

Посмотрите на что стали похожи современные программы на Си++. Их ведь практически нельзя читать!
Недавно Cyberax родил смешную фразу о "марсианском синтаксисе" Оберона.
Я и правда долго смеялся.

Поясню примером.
Обычно я говорю, что моим первым языком был Си. (Я не беру в расчет языки, на которых я выполнял студенческие работы — Фортран, PL/1, автокод БЭСМ-6. )
Так оно и было. На моей самой первой работе я писал на Си. (Это был сначала Microsoft C 5.0, затем 5.1.)
Но как я осваивал Си? Я брал какую-нибудь программу из книги Вирта "Алгоритмы + структуры данных = программы", желательно с достаточно детальным алгоритмом, выжидал, пока алгоритм немного подзабудется, а затем писал его на Си, опираясь уже только на общую идею алгоритма. (Подобный метод, оказывается, использовал Франклин, когда вырабатывал у себя литературный стиль. )
И вот только недавно до меня дошло — а ведь Паскаль-то я вообще не изучал!
Просто брал книгу Вирта и читал с листа без проблем.
Это я к тому, какой именно синтаксис здесь "марсианский".
Но от чтения современного исходного кода на Си++ просто становится физически плохо (без шуток).
Если код нечитабелен, то его никакие возможности по выработке рукодельной type safety не спасут: его не возможно будет сопровождать.

Поэтому я не верю ((c) Станиславский), что "программистские массы" когда-либо будут писать на Си++ грамотно.

Что же касается того, что Оберон — "небезопасен в отношении типов", так за все время дискуссии нашли только один пункт, к которому можно "прицепиться" — гетерогенность коллекций из-за отсутствия темплитов.
По тем или иным причинам обероновское сообщество не стало вводить параметрический полиморфизм (хотя простое решение было предложено еще в 1990-х годах Роу и Шиперски).
Может быть, и правильно? Где-то в соседней ветке обсуждается статья Generics considered harmful.
Но эту проблему не сравнить с проблемами достижения безопасности на Си++!
Даже если решать эту проблему вручную (надстроив вспомогательный интерфейс), то это гораздо проще, чем городить кучу классов на Си++ для решения простейших задач.
Можно использовать малюсенькую программку, которая автоматически сделает "обертку" для коллекции.
Можно явно добавить в коллекцию отладочную функцию проверки типа.
А можно сделать это неявно, использовав метапрограммирование.
Ведь в Оберон-системе информация о типах доступна в рантайме.
Например, в BlackBox (в модуле Kernel) есть тип Type и процедура-функция TypeOf:
    PROCEDURE TypeOf* (IN rec: ANYREC): Type;
    BEGIN
        RETURN S.VAL(Type, S.TYP(rec))
    END TypeOf;

А в модуле Services куча вспомогательных процедур, помогающих этим пользоваться.
Так что, можно "научить" спискм, деревья и проч. контролировать тип записей и указателей.
А после этого, написал что-нибудь вроде
  VAR r: MyRec;
    list: Lists.List;
BEGIN
  ...
  Lists.NewList(list, r);

сидишь и радуешься — неправильная переменная в список не пролезет.
Вообще, с помощью метапрограммирования в Обероне можно решать разные задачи.
Например, с помощью метапрограммирования легко реализуется обработка исключений, не требующая никаких дополнительных расходов в рантайме (ни одной дополнительной инструкции!), если исключение не случилось
(здесь).
Библиотечная процедура Exceptions.Raise сама найдет обработчик требуемого типа, но этот поиск производится только в случае вызова Raise. Никакого расширения языка не требуется. (Так сделано в ETH Oberon. Кстати такое решение применимо и к Java, и к C#.) А вот программа на Си++ заметно "тяжелеет" при использовании try и catch, даже если исключение не было выброшено. Кроме того, семантика обработки исключений в Обероне богаче.

А к чему еще в Обероне можно придраться с точки зрения контроля типов?

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[29]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 09.07.05 21:23
Оценка: 39 (3) +2
Здравствуйте, AVC, Вы писали:

AVC>Поэтому я не верю ((c) Станиславский), что "программистские массы" когда-либо будут писать на Си++ грамотно.


Мне "массы" интересны исчезающе мало. Мне интересен язык, позволяющий относительно небольшой команде квалифицированных программистов работать, эффективно помогая друг другу. По моим впечатлениям при определенном подходе C++ становится очень эффективным инструментом, подходящим как раз для таких целей. Имхо, главным аспектом C++ в этом отношении является достаточно широкий диапазон средств, доступных автору класса или функции, для того, чтобы влиять на их использование. Т.е. автор компонента может относительно много сделать для того, чтобы облегчить, а иногда и частично автоматизировать использование его класса или функции, равно как и использовать возможности компилятора для диагностики неправильных их использований. Но т.к. само по себе так не происходит, то в случае использования в проекте "масс", C++ подходит, действительно, значительно хуже, чем Java, C#, Ada, Oberon и т.п., т.к. при беззаботном подходе к программированию C++ позволяет наломать очень много дров, и, равно как позволяет авторам компонентов облегчать жизнь своим пользователям, также легко позволяет и обратное.

AVC>По тем или иным причинам обероновское сообщество не стало вводить параметрический полиморфизм (хотя простое решение было предложено еще в 1990-х годах Роу и Шиперски).

AVC>Может быть, и правильно? Где-то в соседней ветке обсуждается статья Generics considered harmful.
AVC>Но эту проблему не сравнить с проблемами достижения безопасности на Си++!
AVC>Даже если решать эту проблему вручную (надстроив вспомогательный интерфейс), то это гораздо проще, чем городить кучу классов на Си++ для решения простейших задач.
AVC>Можно использовать малюсенькую программку, которая автоматически сделает "обертку" для коллекции.
AVC>Можно явно добавить в коллекцию отладочную функцию проверки типа.
AVC>А можно сделать это неявно, использовав метапрограммирование.
AVC>Ведь в Оберон-системе информация о типах доступна в рантайме.

Ключевым для меня здесь является смещение контроля на время исполнения. Естественно, это дело личных предпочтений, но я отношусь как раз к той части программистов, которые предпочитают максимум проверок во время компиляции.

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


То же самое можно сделать и для исключений C++. Technical Report on C++ Performance: 5.4.1.2 The "Table" Approach (стр. 36 и далее):

The primary advantage of this method is that no stack or run-time costs are associated with managing the try/catch or object bookkeeping. Unless an exception is thrown, no run-time overhead is incurred.

Там же описаны и недостатки такого подхода.

AVC> А вот программа на Си++ заметно "тяжелеет" при использовании try и catch, даже если исключение не было выброшено.


Это особенности конкретных реализаций.

AVC> Кроме того, семантика обработки исключений в Обероне богаче.


Там можно возобновлять исполнение после исключения или еще что-то? Если первое, то я так и не видел примеров, где бы это было полезно.

AVC>А к чему еще в Обероне можно придраться с точки зрения контроля типов?


Речь идет не о недостаточной строгости Оберона в отношении контроля типов, которые он позволяет описать, а о том, что если бы он позволял описать больший диапазон свойств типов, то его с большей эффективностью можно было бы использовать для делегирования компилятору диагностики некоторых нарушений логики программы: const-correctness, использование generic programming и compile-time meta-programming для контроля правильности программы, использование четких правил времени жизни и детерминированного разрушения для организации транзакций на уровне языка и т.п.

Один из примеров с перечислениями уже приводился
Автор: Павел Кузнецов
Дата: 07.07.05
, приведу другой. Хотя я далеко не всегда согласен с таким решением, на мой взгляд, оно является хорошим примером использования возможностей C++ для документации в коде и контроля некоторых контрактов во время компиляции.

Во всех обсуждаемых языках, вне зависимости от "силы типизации", есть одна и та же проблема передачи нулевых ссылки/указателя в функцию, к этому не готовую. При этом подчас "отловить" место, где формируется нулевой указатель или ссылка нелегко, т.к. это может происходить далеко от места попытки использования. Решение может быть простым: создать шаблон указателя, явно указывающий одним из своих аргументов на то, принимает функция нулевые указатели или нет:
void f( ptr<T, !0> p ); // сюда можно передавать только ненулевые указатели
void g( ptr<T, 0> p );  // а сюда подойдут и нулевые

при этом контроль передачи потенциально нулевого указателя в функцию, требующую ненулевого, будет происходить во время компиляции, обращая внимание программиста на потенциальное нарушение контракта.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[30]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 10.07.05 00:34
Оценка: 44 (1) :)
Здравствуйте, Павел Кузнецов, Вы писали:

AVC>>Поэтому я не верю ((c) Станиславский), что "программистские массы" когда-либо будут писать на Си++ грамотно.


ПК>Мне "массы" интересны исчезающе мало. Мне интересен язык, позволяющий относительно небольшой команде квалифицированных программистов работать, эффективно помогая друг другу. По моим впечатлениям при определенном подходе C++ становится очень эффективным инструментом, подходящим как раз для таких целей. Имхо, главным аспектом C++ в этом отношении является достаточно широкий диапазон средств, доступных автору класса или функции, для того, чтобы влиять на их использование. Т.е. автор компонента может относительно много сделать для того, чтобы облегчить, а иногда и частично автоматизировать использование его класса или функции, равно как и использовать возможности компилятора для диагностики неправильных их использований. Но т.к. само по себе так не происходит, то в случае использования в проекте "масс", C++ подходит, действительно, значительно хуже, чем Java, C#, Ada, Oberon и т.п., т.к. при беззаботном подходе к программированию C++ позволяет наломать очень много дров, и, равно как позволяет авторам компонентов облегчать жизнь своим пользователям, также легко позволяет и обратное.


В отношении непригодности языка для "масс" (или "масс" для языка?) мы, кажется, пришли к "консенсусу".
А ведь, между тем, что-то я не видел на книжках по Си++ надписей вроде: "Минздрав предупреждает".
Напротив: от "Освой Си++ за 21 день" до "Си++ для чайников".

AVC>>Ведь в Оберон-системе информация о типах доступна в рантайме.


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


Это я давно заметил.
Возможно, это и правда вопрос личных предпочтений.
У меня это вызывает впечатление, что народ пытается исключить потенциальные ошибки из простого кода, нагромоздив гору сложного. А отсюда у меня сомнения в логической состоятельности такого подхода.

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


ПК>То же самое можно сделать и для исключений C++. Technical Report on C++ Performance: 5.4.1.2 The "Table" Approach (стр. 36 и далее):

ПК>

ПК>The primary advantage of this method is that no stack or run-time costs are associated with managing the try/catch or object bookkeeping. Unless an exception is thrown, no run-time overhead is incurred.

ПК>Там же описаны и недостатки такого подхода.

AVC>> А вот программа на Си++ заметно "тяжелеет" при использовании try и catch, даже если исключение не было выброшено.


ПК>Это особенности конкретных реализаций.


AVC>> Кроме того, семантика обработки исключений в Обероне богаче.


ПК>Там можно возобновлять исполнение после исключения или еще что-то? Если первое, то я так и не видел примеров, где бы это было полезно.


Да, там можно возобновлять исполнение после исключения, если удалось исправить ситуацию, приведшую к исключению.

AVC>>А к чему еще в Обероне можно придраться с точки зрения контроля типов?


ПК>Речь идет не о недостаточной строгости Оберона в отношении контроля типов, которые он позволяет описать, а о том, что если бы он позволял описать больший диапазон свойств типов, то его с большей эффективностью можно было бы использовать для делегирования компилятору диагностики некоторых нарушений логики программы: const-correctness, использование generic programming и compile-time meta-programming для контроля правильности программы, использование четких правил времени жизни и детерминированного разрушения для организации транзакций на уровне языка и т.п.


Не совсем понятно, какие проблемы с const-correctness, например, в Компонентном Паскале?
Экспорт переменных только для чтения, передача параметров по значению или по ссылке только для чтения (IN).
Например, компилятор не позволит изменить значение строки в следующем примере:
    PROCEDURE Get(OUT a: ARRAY OF CHAR);
    BEGIN
        a := "QWERTY";
    END Get;

    PROCEDURE Set(IN a: ARRAY OF CHAR);
    BEGIN
        a := "QWERTY"; (* здесь компилятор скажет, что параметр read-only *)
        Get(a);        (* здесь тоже *)
    END Set;



ПК>Один из примеров с перечислениями уже приводился
Автор: Павел Кузнецов
Дата: 07.07.05
, приведу другой. Хотя я далеко не всегда согласен с таким решением, на мой взгляд, оно является хорошим примером использования возможностей C++ для документации в коде и контроля некоторых контрактов во время компиляции.


ПК>Во всех обсуждаемых языках, вне зависимости от "силы типизации", есть одна и та же проблема передачи нулевых ссылки/указателя в функцию, к этому не готовую. При этом подчас "отловить" место, где формируется нулевой указатель или ссылка нелегко, т.к. это может происходить далеко от места попытки использования. Решение может быть простым: создать шаблон указателя, явно указывающий одним из своих аргументов на то, принимает функция нулевые указатели или нет:

ПК>
ПК>void f( ptr<T, !0> p ); // сюда можно передавать только ненулевые указатели
ПК>void g( ptr<T, 0> p );  // а сюда подойдут и нулевые
ПК>

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

Что, кажется, не избавляет от ошибки (исключения) в рантайме на этапе создания такого ненулевого указателя (при вызове конструктора).
Справиться со всеми потенциальными исключениями все равно не удастся.
Грамотное использование ASSERT в данном случае не менее эффективно позволяет выявлять и предупреждать ошибки.
А вот использовать ASSERT гораздо проще, а значит — применять его будут чаще и охотнее.
Кроме того, разве в Си++ достаточно проконтролировать указатель на 0? Ведь в Си++ он может быть просто "мусором".
Например:
int *p; // здесь мусор: забыли инициализировать или обнулить после delete
...
ptr<int, !0> *p_not_zero = p; // да, здесь не 0. Ну и что?

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[23]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 10.07.05 16:54
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Не сочтите за коммерческую рекламу, но в июльском номере журнала "Мир ПК" на компакт диске в разделе "Студия программирования" обещают поместить соответсвующие материалы (BlackBox). Это я на тот случай сообщаю, если Вы вдруг по модему чего из интернета скачивать надумаете, так лучше сначала там посмотреть.


Сергей, спасибо за информацию (и "рекламу" )!
Увидел новый "Мир ПК" в киоске и купил.
И теперь страшно доволен, т.к. кроме и без того любимого Оберона там куча интересных материалов, и особенно — головоломки (в том числе замечательные книги Смаллиана) и сборники шахматных задач. Ловлю кайф!

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[9]: Что толку в Ада если Ариан 5 все равно упал
От: Шахтер Интернет  
Дата: 10.07.05 17:15
Оценка: +2
Здравствуйте, AVC, Вы писали:

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


AVC>>>Что это — хак, кряк? Или хрюк? Применительно к Страуструпу — скорее последнее.

AVC>>>(Ничего не могу с собой поделать. Я его очень не люблю. Я вообще не люблю жуликов.

E>>Ребята, давайте Страуструпа оставим в покое. Он сделал то, что сделал. А мы можем либо пользоваться результатами его труда, либо нет. Но я уверен, что разработок масштаба достижений Страуструпа (язык программирования которым пользуются уже 20 лет и пару книг-бестселлеров) никто на данном форуме не достиг и, имхо, далеко не всем суждено достигнуть. Так что "Don't shot pianist...".


AVC>Евгений, мне жаль, что я огорчил тебя.

AVC>Но ведь у каждого своя точка зрения.
AVC>Достижения бывают разными. Мне кажется, если у человека нет достижений вроде тех, которыми отличились Герострат или Гитлер, то это хорошо.
AVC>Поэтому аргумент о достижениях вообще не убеждает.
AVC>Для меня не является аргументом, что кто-то написал бестселлер. Это чисто коммерческий аргумент, применимый не всегда и не во всех обстоятельствах.
AVC>Поэтому аргумент о бестселлерах не принимается, по крайней мере — в абстрактном виде.
AVC>Я бы принял его во внимание, если бы был книготорговцем.
AVC>По поводу самих книг я хочу сказать, что они написаны действительно хорошо, и они гораздо лучше языка, которому они посвящены. Я и не думал отрицать наличие у Страуструпа таланта.
AVC>Гораздо хуже обстоит с языком, которым "пользуются уже 20 лет".
AVC>Наш мир вообще очень опасен и нестабилен.
AVC>Но некоторые люди делают его еще опаснее.
AVC>Ты говоришь, что надо оставить в покое Страуструпа. А он оставит меня в покое?
AVC>Все в мире взаимосвязано.
AVC>Во-первых, неправда, что у нас есть свобода "не пользоваться результатами его труда".
AVC>Если ты обыкновенный программист, тебе, вероятно, придется иногда писать на Си++. В случае твоего гордого отказа другой программист "воспользуется результатами его труда", а тебе будет нечем кормить семью.
AVC>Разумеется, в тех случаях, когда у меня есть выбор, я не стану пользоваться Си++. (Я так и делаю, и ни разу не ощутил, что мне не хватает каких-либо "фич" Си++. Поэтому я полагаю, что Си++ — сильно раздутый миф. Конечно, я стараюсь внимательно слушать оппонентов, опасаясь собственных заблуждений. При такой собственной пристрастности мне очень важно иметь возможность услышать и другую точку зрения.)
AVC>Во-вторых, я никак не могу понять аргументов, что чрезмерно сложный и раздутый язык, не позволяющий даже в отладочном режиме обеспечить контроль типов, является вершиной человеческой мысли и результатом непосильного труда.
AVC>Скорее, я склонен видеть в нем результат халтурной работы.

Это твоя личная точка зрения. А для меня С++ -- очень удачный удобный и полезный инструмент, которым я пользуюсь уже много лет.

Что до сложности -- а мне он кажется недостаточно сложным. Я бы оценил ряд добавлений в язык.

AVC>В-третьих, меня действительно очень волнуют вопросы безопасности.

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

Нет, не прощу. Дураков не прощаю. Будь умным, тогда можешь расчитывать на прощение.



:
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[31]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 10.07.05 17:49
Оценка: 1 (1)
Здравствуйте, AVC, Вы писали:

ПК>>Там можно возобновлять исполнение после исключения или еще что-то? Если первое, то я так и не видел примеров, где бы это было полезно.


AVC>Да, там можно возобновлять исполнение после исключения, если удалось исправить ситуацию, приведшую к исключению.


В "Дизайне и эволюции Си++" есть описание длительных споров в комитете как раз на эту тему, и приведены убедительные (для меня) обоснования, почему именно для исключений была выбрана семантика завершения. Всю главу мне перепечатывать лень, напечатаю лишь два небольших фрагмента.

Последний довод был подкреплен еще и теоретическим рассуждением Флавия Кристиана (Flaviu Cristian), который доказал, что при наличии завершениия семантика возобновления не нужна [Cristian, 1998].

Потратив два года на споры, я вынес впечатление, что можно привести убедительные логические доводы в пользу любой точки зрения. Они имелись даже в специальной работе [Goodenough, 1975] по обработке исключений. Мы оказались в положении все тех же античных философов, которые так яростно и умно спорили о природе Вселенной, что как-то забыли о ее изучении. Поэтому я просил любого, кто имел реальный опыт работы с большими системами, представить конкретные факты.


Свое утверждение Митчелл подкрепил рассказом о работе над несколькими операционными системами. Самым главным был пример системы Cedar/Mesa, которую написали программисты, любившие и умевшие пользоваться семантикой возобновления. Однако через десять лет в системе из полумиллиона строк остался лишь один случай использования возобновления — в запросе контекста. Поскольку и в данной ситуации оно фактически было не нужно, механизм возобновления исключили полностью, после чего скорость работы этой части системы значительно возросла. Во всех тех случаях, когда применялась операция возобновления (а это более десяти лет эксплуатации), появлялись определенные проблемы и приходилось искать более подходящий механизм. По сути дела, все применения возобновления были связаны с неумением отделить друг от друга различные уровни абстракции.


AVC>Не совсем понятно, какие проблемы с const-correctness, например, в Компонентном Паскале?

AVC>Экспорт переменных только для чтения, передача параметров по значению или по ссылке только для чтения (IN).

А как это взаимодействует с типами, определенными пользователем? Можно ли разделить методы класса на те, которые изменяют состояиние его объектов, и на те, которые состояине объектов не изменяют?

AVC>Что, кажется, не избавляет от ошибки (исключения) в рантайме на этапе создания такого ненулевого указателя (при вызове конструктора).


Это делает создание объекта ptr<T,!0> явным, обращая внимание программиста на потенциальную проблему в момент инициализации этого объекта.

AVC>Кроме того, разве в Си++ достаточно проконтролировать указатель на 0? Ведь в Си++ он может быть просто "мусором".


Это совсем другая проблема. Речь не идет о создании системы, не позволяющей ошибиться. Речь идет о создании системы, обращающей внимание программиста на места потенциальных ошибок.

AVC>
AVC>ptr<int, !0> *p_not_zero = p; // да, здесь не 0. Ну и что?
AVC>


Так этот указатель проинициализировать нельзя. Можно так:
ptr<int,!0> p_not_zero = ptr_cast<int,!0>( p );

делая невозможным неосознанное создание объекта ptr<int,!0> из потенциально нулевого указателя.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[18]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.07.05 18:01
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Тише-тише... Мы ж конкретный пример обсуждаем. Если ты хочешь показать, что проблема решена неудачно, достаточно продемонстрировать, насколько лихо это можно было сделать по-другому. Если хочешь порекламировать C#/R#, давай, сейчас хорошая возможность: я весь — внимание Скажем, пример на OCaml, приведенный Трурль, для меня оказался достаточным, чтобы существенно изменить свое отношение к данному языку.


Я вообще не свитаю твое решение решением. Проблему он не решает. Он создает новую проблему — необходимость бегать по году и менять имя типа. С тем же успехом я мог бы просто предложить менять имя перечисления при добавлении в него новых значений. Можно даже почти так же как ты, т.е. закладывая в имя перечисления (или в пространство имен, чтбы было удобнее) все его члены.

ПК>Так все-таки, примерчик можно? А то я пока не вполне понимаю, о чем речь идет: мне мерещатся всякие ужасы с достаточно серьезным анализом AST и т.п...


Паш, ты уже дастал своим вымогательством работы. Пойми даже довольно простые вещи которыми не занимашся в данный момент нехило напрягают.

В общем, в этот раз считай, что ты взял меня "на слабо". Но в будущем не обессуть... Вот подобный запрос:
//RSwitchStatement[Sections/RSwitchSection/Labels/RMemberReferenceExpression[
    TargetObject[@VariableName='A'] ] 
    and not 
    (
        Sections/RSwitchSection/Labels/RMemberReferenceExpression[TargetObject[@VariableName='A'] and MemberName[@VariableName='A'] ] 
        and Sections/RSwitchSection/Labels/RMemberReferenceExpression[TargetObject[@VariableName='A'] and MemberName[@VariableName='B'] ] 
        and Sections/RSwitchSection/Labels/RMemberReferenceExpression[TargetObject[@VariableName='A'] and MemberName[@VariableName='C'] ]
    )
]


Этот запрос отлавливает все switch-и в одном из case-ов которых встречается ссылка на 'A' и при условии что switch не содержит case-ы для элементов A, B и C. Я к сожалению не силен в XPath. Наверно можно как-то написать этот запрос более универсально. Но даже с этим можно написать небольшой скриптик автоматизирующий создание этого запроса. Далее останется включить этот скрипт в список тестов и будет тебе контроль.

Кстати, в отличии от твоего решения — это действительно найдет ошибку, а не просто укажет места где применялся данный тип.

ПК>Гм... По-моему, достаточно близко к минимуму (который мы имели удовольствие наблюдать на примере OCaml).


А по моему копипжст есть, а толку нет.

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


Не один, а столько раз сколько встречается тип. Чем это будет отличаться от например вот такого решения:
namespace FileExists.Cancel.Overwrite.Skip
{
    enum Answer
    {
            Cancel,
            Overwrite,
            Skip,
    }
}

interface ICommunicator
{
  FileExists.Cancel.Overwrite.Skip FileExists(Path path);
  . . .
};

?

В общем, это не решение. Это понты.

>> Может быть я что-то не понял, но в твоем примере был банальный if.


ПК>Точно. А перед ним явное указание списка ожидаемых значений, совмещенное с вызовом функции.


Вот выше я тебе привел подобное "решение".

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


Ты перевернул все вверх ногами. У тебя не предусловие не выполняется, а код в switch-е не отвечает требованиям прикладной логики.

ПК>рассуждать о правильности кода смысла не имеет. В случае приведенного примера соблюдение данного предусловия контролируется компилятором. Определять предусловия своего кода — ответственность программиста.


Ты с помощью компилятора лишь нашел места где используется данный тип. И все! С тем же успехом можно просто изменить имя перечисления. При наличии приличной среды разработки такие места ищутся одним кликом мыши.

>> И никакие шаблоны не заставят компилятор проверить, что у этого if-а нужное количество else if-ов содержащее нужные проверки.


ПК>Это уже несущественно: наличие всех веток тоже не гарантирует правильности обработки. Для меня достаточно того, что ни один вызов функции-члена communicator не может быть случайно сделан так, что будет получено неожиданное значение.


Гы. Не существнно? Да только это и стоит контролировать. И то если это действительно критичный код. А так ничего страшного нет в том, чтобы подождать исключения на дефолте.

ЗЫ

В общем, это именно что бессмысленное решение не решающее проблемы. Если уж боросться за минимизацию ошибок, то нужно принципиально устранять код который нужно менять в двух и более местах. В шарпе на базе декларативного подхода или ООП.

В данном случае я бы вместо изращений с перечислениями и темболее символами просто создал бы интерфейс или абстрактный класс и заставли бы клиентов создать его реализацию. Вот тут уж действительно наличие обработчика было бы гарантированно компилятором:
interface IFileExistsAnswer
{
    void OnCancel();
    void OnOverwrite();
    void OnSkip();
}

interface IFolderDoesNotExistsAnswer
{
    void OnCancel();
    void OnContinue();
}

class Communicator
{
    bool FileExists(string path, IFileExistsAnswer answer)
    {
        ...
        communicator.FileExists(path, answer);
        ...
    }
        
    bool FolderExists(string path, IFolderDoesNotExistsAnswer answer) { ... }
}


Попробуй теперь не реализовать рекцию на один из элементов.
Решение, кстати, из разряда "для первокласников", так как это всего лишь использование паттерна стратегия, так и напрашивающегося в данном случае.

Кстати, характерно, что ты вместо того чтобы применить этот тривиальный паттерн занялся написанием "крутого кода который нельзя повторить на Шарпе". Это что назывется и есть "пусть С++".
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 10.07.05 18:21
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Этот запрос отлавливает все switch-и в одном из case-ов которых встречается ссылка на 'A' и при условии что switch не содержит case-ы для элементов A, B и C.


Этого недостаточно. Еще нужно отлавливать все if, равно как и переходить по вызовам внутрь функций, т.к. обработка может быть разбита на две функции. Полагаю, если подумать, найдутся и другие случаи, где этой проверки будет недостаточно. Навскидку: обработка ветвления через массив указателей на функции/делегатов/объектов-обработчиков.

VD>Не один, а столько раз сколько встречается тип. Чем это будет отличаться от например вот такого решения:

VD>
VD>namespace FileExists.Cancel.Overwrite.Skip
VD>{
VD>    enum Answer
VD>    {
VD>            Cancel,
VD>            Overwrite,
VD>            Skip,
VD>    }
VD>}

VD>interface ICommunicator
VD>{
VD>  FileExists.Cancel.Overwrite.Skip FileExists(Path path);
VD>  . . .
VD>};
VD>

VD>?

Я уже писал: такие типы нельзя объединять и передавать в третью функцию для совместной обработки разных исключительных ситуаций.

VD> В данном случае я бы вместо изращений с перечислениями и темболее символами просто создал бы интерфейс или абстрактный класс и заставли бы клиентов создать его реализацию. Вот тут уж действительно наличие обработчика было бы гарантированно компилятором:


Да, об этом тоже думали. Объем работы очень большой получается.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[32]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 10.07.05 19:58
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>>>Там можно возобновлять исполнение после исключения или еще что-то? Если первое, то я так и не видел примеров, где бы это было полезно.


AVC>>Да, там можно возобновлять исполнение после исключения, если удалось исправить ситуацию, приведшую к исключению.


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


ПК>

ПК>Последний довод был подкреплен еще и теоретическим рассуждением Флавия Кристиана (Flaviu Cristian), который доказал, что при наличии завершениия семантика возобновления не нужна [Cristian, 1998].

ПК>Потратив два года на споры, я вынес впечатление, что можно привести убедительные логические доводы в пользу любой точки зрения. Они имелись даже в специальной работе [Goodenough, 1975] по обработке исключений. Мы оказались в положении все тех же античных философов, которые так яростно и умно спорили о природе Вселенной, что как-то забыли о ее изучении. Поэтому я просил любого, кто имел реальный опыт работы с большими системами, представить конкретные факты.


ПК>

ПК>Свое утверждение Митчелл подкрепил рассказом о работе над несколькими операционными системами. Самым главным был пример системы Cedar/Mesa, которую написали программисты, любившие и умевшие пользоваться семантикой возобновления. Однако через десять лет в системе из полумиллиона строк остался лишь один случай использования возобновления — в запросе контекста. Поскольку и в данной ситуации оно фактически было не нужно, механизм возобновления исключили полностью, после чего скорость работы этой части системы значительно возросла.


Хочу напомнить, что обероновское решение с помощью метапрограммирования не приводит к оверхеду.
Статья так и называлась: Zero-overhead exception handling.

ПК>

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


Вполне возможно. Я подумаю.
Но повторю еще раз, что эта дополнительная возможность не приводит к оверхеду.

AVC>>Не совсем понятно, какие проблемы с const-correctness, например, в Компонентном Паскале?

AVC>>Экспорт переменных только для чтения, передача параметров по значению или по ссылке только для чтения (IN).

ПК>А как это взаимодействует с типами, определенными пользователем? Можно ли разделить методы класса на те, которые изменяют состояиние его объектов, и на те, которые состояине объектов не изменяют?


Да, конечно.
Ведь в присоединенных процедурах Компонентного Паскаля объект указывается явно.
Следовательно его можно снабдить соотвествующим квалификатором, как и любой другой параметр.
    PROCEDURE (IN self: ObjectDesc) SetName* (name: ARRAY OF CHAR), NEW;
    BEGIN
        self.name := name$; (* компилятор опять ругается :) *)
    END Do;


AVC>>Кроме того, разве в Си++ достаточно проконтролировать указатель на 0? Ведь в Си++ он может быть просто "мусором".


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


Ясно.
Хотя по некоторым заявлениям сторонников Си++ у меня сложилось впечатление, что они все проблемы рещают в compile-time.
Но вот что характерно — в Обероне такой потенциальной ошибки нет.

AVC>>
AVC>>ptr<int, !0> *p_not_zero = p; // да, здесь не 0. Ну и что?
AVC>>


ПК>Так этот указатель проинициализировать нельзя. Можно так:

ПК>
ПК>ptr<int,!0> p_not_zero = ptr_cast<int,!0>( p );
ПК>

ПК>делая невозможным неосознанное создание объекта ptr<int,!0> из потенциально нулевого указателя.

Конечно, это имеет значение.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.07.05 20:10
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Этого недостаточно. Еще нужно отлавливать все if, равно как и переходить по вызовам внутрь функций, т.к. обработка может быть разбита на две функции. Полагаю, если подумать, найдутся и другие случаи, где этой проверки будет недостаточно. Навскидку: обработка ветвления через массив указателей на функции/делегатов/объектов-обработчиков.


Это намного ольше чем можешь предложить ты. Да и другие варианты тоже решаемы. Я все же не предлагаю использовать именно R# для этого случая. Я говорю, о возможности.

ПК>Я уже писал: такие типы нельзя объединять и передавать в третью функцию для совместной обработки разных исключительных ситуаций.


Объеденять значения? Да вообще-то можно. А типы просто не нужно.

VD>> В данном случае я бы вместо изращений с перечислениями и темболее символами просто создал бы интерфейс или абстрактный класс и заставли бы клиентов создать его реализацию. Вот тут уж действительно наличие обработчика было бы гарантированно компилятором:


ПК>Да, об этом тоже думали. Объем работы очень большой получается.


Что же там большого? В отличии от твоего "решения" "Стратегия" действительно решает проблему. Что-то мне кажется, что у тебя получился хороший пример того как не нужно проектировать.

Кстати, на шарпе реализация интерфейсов вообще в одно движение мыши вылевается. И описывать/исползовать его проще. Так что надо признать, что он в отличии от плюсов еще и к грамотному ОО-дизайну подталкивает.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.07.05 20:10
Оценка:
Просьба, уменьшить объем цитирования.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[33]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 10.07.05 20:18
Оценка: :)
Здравствуйте, AVC, Вы писали:

AVC>>>Кроме того, разве в Си++ достаточно проконтролировать указатель на 0? Ведь в Си++ он может быть просто "мусором".


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


AVC>Ясно.

AVC>Хотя по некоторым заявлениям сторонников Си++ у меня сложилось впечатление, что они все проблемы рещают в compile-time.
AVC>Но вот что характерно — в Обероне такой потенциальной ошибки нет.

Если для тебя так принципиально, чтобы указатель был проинициализирован нулем, обертка с нулевым оверхедом, которая просто при инициализации заносит 0 в инкапсулируемый указатель, пишется за 1 минуту и потом используется сколько угодно раз. Это, кстати, относится все к той же теме — не используй голые указатели, если только это тебе не нужно. Ты же все равно пытаешся их использовать. Вот скажи мне, какая разница для меня как программиста — использовать голый указатель или использовать объект с семантикой указателя, но обладающий дополнительными проверками/иницализацией? Почему нужно обязательно использовать именно голый указатель везде, где только вздумается? Только потому, что такая возможность есть в языке? Топором, например, можно себе ногу отрубить, но ведь нормальный человек никогда не станет этого делать. Откуда же это стремление использовать язык максимально опасным способом?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[33]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.07.05 21:55
Оценка:
Просьба, уменьшить объем цитирования.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[33]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 11.07.05 01:26
Оценка:
Здравствуйте, AVC, Вы писали:

AVC>Хочу напомнить, что обероновское решение с помощью метапрограммирования не приводит к оверхеду.

AVC>Статья так и называлась: Zero-overhead exception handling.

Производительность в этом деле стоит на одном из последних мест. Я даже хотел выбросить предложение с упоминанием производительности, чтоб не уводить дискуссию в сторону. Собственно, вся остальная глава об этом молчит. Упор на удобство использования и т.п. Производительность -- только бонус. А обработка исключительных ситуаций обычно все-таки приводит к замедлению, но, в "zero-overhead" реализациях, не в случае, когда исключение не возникает, а в случае, когда оно таки возникает. В случае, описанном в цитате, исключения, насколько я понимаю, использовались для управления логикой программы. Т.е. когда не было контекста, возникало исключение, в обработке которого контекст инициализировался и выполнение возобновлялось. Т.е. исключение возникало в "нормальной" ситуации.

ПК>>А как это взаимодействует с типами, определенными пользователем? Можно ли разделить методы класса на те, которые изменяют состояиние его объектов, и на те, которые состояине объектов не изменяют?


AVC>Да, конечно.

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

А можно снабдить таким квалификатором элементы массива, возвращаемое значение, переменную-член класса, глобальную переменную, статическую переменную класса и т.п.?

AVC>>>Кроме того, разве в Си++ достаточно проконтролировать указатель на 0? Ведь в Си++ он может быть просто "мусором".


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


AVC>Ясно.

AVC>Хотя по некоторым заявлениям сторонников Си++ у меня сложилось впечатление, что они все проблемы рещают в compile-time.



AVC>Но вот что характерно — в Обероне такой потенциальной ошибки нет.


А как там с контролем нулевых ссылок справляются?
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[32]: Что толку в Ада если Ариан 5 все равно упал
От: faulx  
Дата: 11.07.05 10:54
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>>>Там можно возобновлять исполнение после исключения или еще что-то? Если первое, то я так и не видел примеров, где бы это было полезно.


AVC>>Да, там можно возобновлять исполнение после исключения, если удалось исправить ситуацию, приведшую к исключению.


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


Разрешите полюбопытствовать, "возобновление исполнения после исключения" — это как-то связано с Лисповской системой condition'ов и restart'ов? Если да, то любопытно было бы послушать возражения против этой системы. Сам я ее не использовал, но приведенные по ссылке примеры весьма впечатляют.

ПК>

ПК>Свое утверждение Митчелл подкрепил рассказом о работе над несколькими операционными системами. Самым главным был пример системы Cedar/Mesa, которую написали программисты, любившие и умевшие пользоваться семантикой возобновления. Однако через десять лет в системе из полумиллиона строк остался лишь один случай использования возобновления — в запросе контекста. Поскольку и в данной ситуации оно фактически было не нужно, механизм возобновления исключили полностью, после чего скорость работы этой части системы значительно возросла. Во всех тех случаях, когда применялась операция возобновления (а это более десяти лет эксплуатации), появлялись определенные проблемы и приходилось искать более подходящий механизм. По сути дела, все применения возобновления были связаны с неумением отделить друг от друга различные уровни абстракции.


Безотносительно к тому, о чем идет речь, и оправдано ли было такое решение, хочу сказать, что такие примеры меня всегда умиляют. Решения о включении того или иного свойства в язык принимают на основе того, что кто-то когда-то где-то смотрел на какие-то проекты "из полмиллиона строк" (присутствующие могут оценить представительность статистики) и пришел к тому или иному выводу, который отныне будет почитаться за аксиому. Такое впечатление, что старые проекты (существовавшие до создания языка) — это некое "священное писание", и там все безгрешно. Попробуй сейчас кто-нибудь сказать: а вот мы в нашем проекте из 100 млн. строк ни разу не использовали свойство X какого-либо языка программирования, давайте исключим это свойство. Сразу поднимется шум и возникнет куча людей, которые жить не могут без свойства X. А священные старые проекты, определившие дизайн языка, под сомнение ставить нельзя — ересь.

Извините, наболело.
Re[14]: Что толку в Ада если Ариан 5 все равно упал
От: Gaperton http://gaperton.livejournal.com
Дата: 11.07.05 12:59
Оценка: +1
Здравствуйте, CrystaX, Вы писали:

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


CX>Все таки читать всю ветку, прежде чем катать двухстраничный ответ, бывает нелишним.

Не, это совершенно лишее. Ничего интересного в ветке не сказано, и отвечаю я не на всю ветку, а на одну вполне конкретную вашу фразу. Вот она, ключевое выделено:

отказавшись от C++, я потеряю мощнейшую вещь, которой нет пока ни в одном другом языке — шаблонное метапрограммирование


Я возражаю по поводу выделения.
Re[15]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 11.07.05 13:09
Оценка:
Здравствуйте, Gaperton, Вы писали:

CX>>Все таки читать всю ветку, прежде чем катать двухстраничный ответ, бывает нелишним.

G>Не, это совершенно лишее. Ничего интересного в ветке не сказано, и отвечаю я не на всю ветку, а на одну вполне конкретную вашу фразу. Вот она, ключевое выделено:

G>

G>отказавшись от C++, я потеряю мощнейшую вещь, которой нет пока ни в одном другом языке — шаблонное метапрограммирование


G>Я возражаю по поводу выделения.


Если бы прочитал немного больше, понял бы, что возражаешь в пустоту. Этот вопрос уже был рассмотрен и я уже пояснял здесь
Автор: CrystaX
Дата: 07.07.05
и здесь
Автор: CrystaX
Дата: 07.07.05
, что имелось в виду. Так что все-таки читать ветку нелишне.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[16]: Что толку в Ада если Ариан 5 все равно упал
От: Gaperton http://gaperton.livejournal.com
Дата: 11.07.05 13:34
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Если бы прочитал немного больше, понял бы, что возражаешь в пустоту. Этот вопрос уже был рассмотрен и я уже пояснял здесь
Автор: CrystaX
Дата: 07.07.05
и здесь
Автор: CrystaX
Дата: 07.07.05
, что имелось в виду. Так что все-таки читать ветку нелишне.


Хе-хе . Хорошо, ты прав . Но все-таки

Но если я неправ и есть язык, поддерживающий эту концепцию столь же хорошо, как C++, покажите мне его. Я таких не нашел.


Ну, чтоль-же хорошо показать не смогу, а вот лучше — это запросто. То есть, я вычеркну из своего списка лишнее Dylan. Lisp.
Re[17]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 11.07.05 13:39
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>

G>Но если я неправ и есть язык, поддерживающий эту концепцию столь же хорошо, как C++, покажите мне его. Я таких не нашел.


G>Ну, чтоль-же хорошо показать не смогу, а вот лучше — это запросто. То есть, я вычеркну из своего списка лишнее Dylan. Lisp.


Видимо, ты все-таки невнимательно прочитал. C++ противопоставлялся в этой ветке языкам C#, Java, Oberon, Ada. Не лиспу! Вот еще один линк
Автор: CrystaX
Дата: 06.07.05
. На этом тему считаю закрытой.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[33]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 11.07.05 13:45
Оценка:
Здравствуйте, faulx, Вы писали:

F> Безотносительно к тому, о чем идет речь, и оправдано ли было такое решение, хочу сказать, что такие примеры меня всегда умиляют. Решения о включении того или иного свойства в язык принимают на основе того, что кто-то когда-то где-то смотрел на какие-то проекты "из полмиллиона строк" <...>


Ну, все-таки use cases анализировать надо... Если use case для некоторой языковой возможности не находится, то я слабо представляю, как ее можно спроектировать так, чтоб она в итоге оказалась удобной в использовании. По-моему, лучше отложить включение этой возможности до того, когда возникнет конкретный use case, не покрывающийся/покрывающийся плохо существующими возможностями языка, и вот тогда уже спроектировать ее как следует, чтоб она, действительно, выполняла свое предназначение.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[30]: Что толку в Ада если Ариан 5 все равно упал
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 11.07.05 14:44
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Во всех обсуждаемых языках, вне зависимости от "силы типизации", есть одна и та же проблема передачи нулевых ссылки/указателя в функцию, к этому не готовую. При этом подчас "отловить" место, где формируется нулевой указатель или ссылка нелегко, т.к. это может происходить далеко от места попытки использования. Решение может быть простым: создать шаблон указателя, явно указывающий одним из своих аргументов на то, принимает функция нулевые указатели или нет:

ПК>
ПК>void f( ptr<T, !0> p ); // сюда можно передавать только ненулевые указатели
ПК>void g( ptr<T, 0> p );  // а сюда подойдут и нулевые
ПК>

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

Тогда надо будет еще создать дополнительный контроль для функций возвращающих указатели. А то вдруг функция возвращающая указатель вернет нулевой указатель, а мы его отдаем другой процедуре внутрь которой нулевые указатели отдавать нельзя. Во время компиляции проверить это, в общем случае, не реально...

Для отлова подобных вещей (на как только можно более ранней стадии) повсеместно используется ASSERT
PROCEDURE f(a: MyPtr);
BEGIN
  ASSERT(a # NIL, 20);  
  ...
END f;
Re[31]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 11.07.05 14:58
Оценка: +2
Здравствуйте, Сергей Губанов, Вы писали:

ПК>>
ПК>>void f( ptr<T, !0> p ); // сюда можно передавать только ненулевые указатели
ПК>>void g( ptr<T, 0> p );  // а сюда подойдут и нулевые
ПК>>

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

СГ>Тогда надо будет еще создать дополнительный контроль для функций возвращающих указатели. А то вдруг функция возвращающая указатель вернет нулевой указатель, а мы его отдаем другой процедуре внутрь которой нулевые указатели отдавать нельзя. Во время компиляции проверить это, в общем случае, не реально...


Так в том-то и фокус, что если у нас есть:
T * get_some_object();

То компилятор нам не даст записать:
f( get_some_object() );

поскольку T* не подходит в качестве ptr<T,!0>. В то же время, если у нас есть:
ptr< T, !0 > create_some_object();

То мы вполне можем записать:
f( create_some_object() );
// И даже, если захотеть и поколдовать над ptr<>:
g( create_some_object() );


И, что самое замечательное, проверкой всего этого дела занимается компилятор.

СГ>Для отлова подобных вещей (на как только можно более ранней стадии) повсеместно используется ASSERT

СГ>
СГ>PROCEDURE f(a: MyPtr);
СГ>BEGIN
СГ>  ASSERT(a # NIL, 20);  
СГ>  ...
СГ>END f;
СГ>


Проблема в ASSERT-ах в том, что их видит автор f. Но не пользователь f! А предложенный Пашей подход как раз позволяет показать клиенту, что такой ASSERT внутри f присутствует.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[5]: LSP, ДК, Вирт - поехали...
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 11.07.05 14:59
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Сергей Губанов,


>> ГВ> Не согласен. В данном случае при проектировании функции диспетчеризации мы используем знание о наборе поступающих сообщений. Если источник сообщений добавит ещё одно-два, то придётся модифицировать клиентский код, который придётся разыскивать через search и т.п.

>>
>> Нет не придется модифицировать. Все новые сообщения будут просто проигнорированы.

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


Это было понятно с самого начала — в момент ее написания. Таким образом повторная ревизия уже не нужна. Всё что нужно было написать уже было написано.
Re[4]: LSP, ДК, Вирт - поехали...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 11.07.05 15:04
Оценка: 1 (1)
Здравствуйте, AVC, Вы писали:

На реплики по отдельности отвечать не буду, отвечаю в общем.

Главный вопрос — сколько методов и интерфейсов.

Сейчас не буду вдаваться глубоко в анализ, но тем не менее, ответ примерно такой:

Группируем методы по их семанитике. Например: группа управления граничными размерами окна, группа управления размерами, группа управления Z-порядком. Соответственно, предполагая, что API поддерживает свободную функцию ::RegisterPolicyUser(void*, int):

template<typename T>
struct PolicyTrait
{
  // enum PolicyTrait
};

#define PT(itf, code) template<> struct PolicyTrait<class itf> { enum pc {policy_code = code}; };

template<typename T>
class PolicyRegistrar {
        HANDLE handle_;
  public:
      inline PolicyRegistrar(T *user) { handle_ = ::RegisterPolicyUser(this, (int)PolicyTrait<T>::policy_code) }
        inline ~PolicyRegistrar() { ::CloseHandle(handle_); }
};

PT(BoundarySizes, 11)

class BoundarySizes : private PolicyRegistrar<BoundarySizes> {
  public:
        BoundarySizes() : PolicyRegistrar(this){}
      virtual void minimize() = 0;
        virtual void maximize() = 0;
};

PT(FloatingSizes, 12)

class FloatingSizes : private PolicyRegistrar<FloatingSizes> {
  public:
        FloatingSizes() : PolicyRegistrar(this){}
      virtual void change_width(int delta) = 0;
        virtual void change_hegth(int delta) = 0;
        virtual void move(int dx, int dy) = 0;
};

PT(ZOrderMgmt, 13)

class ZOrderMgmt : private PolicyRegistrar<ZOrderMgmt> {
  public:
        ZOrderMgmt() : PolicyRegistrar(this){}
      virtual void move_top() = 0;
        virtual void move_bottom() = 0;
        virtual void move_relative(int steps) = 0;
};


Суть, думаю, понятна. Естественно, что интерфейсы, ожидаемые системой не должны меняться часто — должны вводиться новые, типа FloatingSizesAdvanced и т.п. Сколько конкретно их будет? Ну, не знаю, прямо скажем, здесь нужно много посчитать. Но даже если окажется больше сотни-двух, особой проблемы я здесь не вижу.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[4]: LSP, ДК, Вирт - поехали...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 11.07.05 15:04
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

ГВ>> Не есть бест солюшн на мой взгляд. Вариант с группировкой обработчиков по интерфейсам я полагаю более надёжным.

СГ>А вот с интерфейсами наоборот. В однажды написанный интерфейс еще один новый метод уже не добавишь. Можно только по разному реализовывать существующие методы, но нового еще одного метода добавить уже нельзя.

Да, и это правильно. Именно поэтому такой вариант более надёжен, чем с отдельными сообщениями.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[5]: LSP, ДК, Вирт - поехали...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 11.07.05 15:04
Оценка:
Здравствуйте, eao197, Вы писали:

[skip]
E>Имхо, еще более удобным такой подход становится при создании распределенных приложений (а может быть и компонентных). Ведь тогда заранее точно не известно, какой объем функциональности поддерживается удаленной стороной (компонентом). И запрос сервиса путем передачи объекта-сообщения (а не вызова удаленного метода с жесткой сигнатурой) становится более простым делом в плане расширяемости и поддержки совместимости с предыдущими версиями.

Следующим шагом мы вставляем XML в межмодульный интерфейс и пишем язык описания всего-что-угодно. И ничего хорошего не выходит. Требования надо предварительно анализировать и прорабатывать, а то мы получим бесконечно усложняющийся контракт для одних и тех же методов, стабильность, есессно, полетит к чёртовым родственникам и никаких ресурсов на анализ очередного соглашения не хватит. Для твоего случая, можно сходу ввести абстракцию: ждать указанное время или ждать наступления некоторого события, например:


class some_event {
  public:
      virtual bool present() = 0;
        virtual void add_listener(event_listener *) = 0;
        virtual void remove_listener(event_listener *) = 0;
};

ret_code_t wait_event(event_t *&t, unsigned timeout, some_event *or_when_this_event);


Такая сигнатура позволяет засунуть под интерфейс "событие" всё, что угодно, включая схему приоретизации событий, очередь событий, анализ на одновременность, анализ характеристик и т.п., а клиенту требуется только слушать некоторый интерфейс.

Чтобы разобраться с необходимостью анализа характеристик события "изнутри" фнукции wait_event нужно посмотреть на конкретный случай. По своему опыту могу сказать, что я обычно перепроектировал иерархии, когда такие случаи происходили.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[4]: LSP, ДК, Вирт - поехали...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 11.07.05 15:04
Оценка:
Здравствуйте, Трурль, Вы писали:

ГВ>>>>Однако, если сугубо формально, то анализ типа сообщения всё равно остаётся. Тем-то, кстати, и хорош LSP, что его нарушение можно определить по сугубо формальным признакам.

Т>>>Как раз по сугубо формальным признакам нарушений не видно.
ГВ>>Ну, здравствуйте! А цепочка IS — это что?

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


Согласно контракта тип входного сообщения является подтипом типа Object. Продолжать?
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 11.07.05 15:04
Оценка: +1
Здравствуйте, eao197, Вы писали:

Ключевое слово "наивная":
E>Проблема-то в C++ в том, что для написания небезопасной программы не нужно прикладывать особых усилий. Фактически, любая наивная реализация чего-нибудь сложного (без использования специальных приемов и STL) уже будет представлять из себя небезопасную программу.

А наивные реализации как правило, потому и называютяс наивными, что представляют собой опасность в том или ином смысле.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[6]: LSP, ДК, Вирт - поехали...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 11.07.05 15:23
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

>>> ГВ> Не согласен. В данном случае при проектировании функции диспетчеризации мы используем знание о наборе поступающих сообщений. Если источник сообщений добавит ещё одно-два, то придётся модифицировать клиентский код, который придётся разыскивать через search и т.п.

>>>
>>> Нет не придется модифицировать. Все новые сообщения будут просто проигнорированы.

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


СГ>Это было понятно с самого начала — в момент ее написания. Таким образом повторная ревизия уже не нужна. Всё что нужно было написать уже было написано.


У... это уже даже не самовнушение, это уже сферокони начались...
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[6]: LSP, ДК, Вирт - поехали...
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 11.07.05 15:25
Оценка: +1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Следующим шагом мы вставляем XML в межмодульный интерфейс и пишем язык описания всего-что-угодно. И ничего хорошего не выходит.


Да, если довести до абсурда, то так и произойдет. А иногда и происходит, что характерно

ГВ>Такая сигнатура позволяет засунуть под интерфейс "событие" всё, что угодно, включая схему приоретизации событий, очередь событий, анализ на одновременность, анализ характеристик и т.п., а клиенту требуется только слушать некоторый интерфейс.


Имхо, если под event_listener-ами будет пониматься такой широкий спектр понятий, то some_event будет всего лишь напоминать тот же самый wait_event_traits_map_t из моего примера. Только в моем случае some_event может быть скрыт от программиста и программист будет знать, что ему нужно сделать своего event_listener-а и поместить его в traits_map. Собственно то же самое, только traits_map, имхо, остается все же более гибким подходом. Чем-то напоминающим динамические языки программирования.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[11]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 11.07.05 15:44
Оценка:
Здравствуйте, AVC, Вы писали:

AVC>Бесполезно.

AVC>Как сказал Вирт:
AVC>

AVC>некоторые вещи следует продумывать до, а не после.


Это много кто говорил. Собственно, C++ как раз этой парадигме соответствует: вместо конкретных решений даётся инструмент создания решений. Т.е., варианты применения продуманы "до" и выведена некая более или менее общая языковая основа. Что не так?

[skip про проверки]
AVC>>>Существует понятие программирования по контракту. (Мейер)
AVC>>>Главный принцип: не доверяй клиенту (вызывающему коду).
ГВ>>Всё хорошо в своём месте и в своё время. ООП само по себе тоже не всегда адекватно задачам. Так что, принцип программирования по контракту тоже не стоит распространять на все случаи программирования.
AVC>Разве принцип программирования по контракту применим только к ООП?
AVC>Это универсальный принцип, развитие идеи защитного программирования.

Да, он применим где угодно. Вопрос только в конечной цене применения.

AVC>>>В самом первом виртовском Обероне не было присоединенных процедур (=виртуальных функций).

AVC>>>Полиморфизм работал исключительно благодаря динамическому приведению типа.
AVC>>>Наверное, поэтому динамическое приведение типа реализовано так эффективно.
AVC>>>Например (опустив все лишнее):
ГВ>>[...]

ГВ>>Ну, я так понимаю, здесь влияет ещё и модель объектов паскаля, конкретно — строго одиночное наследование.


AVC>В Обероне (и других модульных языках) единица инкапсуляции не класс, а модуль.

AVC>Это существенно влияет на проектные решения.
AVC>Множественное наследование в Обероне просто не нужно (и рассматривается как вредное).

ИМХО — это глобальная парадигматическая ошибка. В ДНК.

AVC>Модули позволяют естественно реализовывать целые паттерны проектирования.

AVC>Множественное наследование в Си++ — заплата на отсутствии нормальных модулей.
AVC>Вот и пишут на Си++ программы, обращаясь сразу к "человеку и пароходу". (c) Маяковский

Э... высокая риторика, спору нет. Слог хорош! Кратко напоминаю содержание предыдущих серий: динамическое приведение типов в Обероне эффективно работает отчасти из-за строго одиночного наследования.

AVC>>>Опять-таки оптимизатор может устранить некоторые лишние проверки.

ГВ>>Здесь согласен. Хотя я бы не стал полагаться на оптимизатор...
AVC>В руководстве по компилятору XDS (в разделе об оптимизации) говорится:
AVC>

AVC>It is possible not to turn run-time checks off in the product versions of your programs,
AVC>because the code generator usually removes redundant checks. A typical
AVC>program runs only 10-15% faster with all run-time checks turned off (but the code
AVC>size is usually significantly smaller).

AVC>Здесь указана цена проверок: программа на 10-15% медленнее.
AVC>Разница в размере кода больше.

Ключевая фраза вот эта: "A typical program". Можно это загадочное определение раскрыть полнее? Почему цепляюсь — потому что уже где-то слышал про эти пресловутые 10-15%, вот и стало интересно.

ГВ>>>>Средствами C++ можно обойти type safety. Разумность такого решения — отдельный вопрос. Если голова на плечах есть — всмё будет в порядке, если с этим проблема, то runtime проверками дела не поправишь. Приведённый пример с NASA свидетельствует, скорее, не о бенефитах типобезопасности, а о том, что всем в NASA было настолько страшно взять ответственность на себя, что спихнули всё на "неправильную" фичу языка. Т.е., проблема не в языке, а в головах.

AVC>>>Согласен, что проблема — в головах.
AVC>>>Потому что именно из голов она попадает в языки.
ГВ>>В огороде бузина, а в трюме акулы...
AVC>Которые съели дядьку в Киеве?
AVC>А что, я сказал глупость?
Ага.

AVC>Может, я чего не знаю, и Си++ создавался не посредством головы?

И ещё одну. Потому что попытался применить "передёргивание". Вернее — приведение аргументов на основании одной только лексической аналогии (голова — голова). Забавно, спору нет, но это уже надоедает.

AVC>>>Забавно читать, что "средствами C++ можно обойти type safety".

AVC>>>Где бы найти в Си++ эту самую type safety...
ГВ>>Да есть она там, что тут можно сказать...
AVC>Ну разве что правду — что ее там нет.

Хм. Всё чудесатее и чудесатее. От повторения тезиса его истинность увеличивается? Не знал.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[7]: LSP, ДК, Вирт - поехали...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 11.07.05 15:44
Оценка: +1
Здравствуйте, eao197, Вы писали:

ГВ>>Такая сигнатура позволяет засунуть под интерфейс "событие" всё, что угодно, включая схему приоретизации событий, очередь событий, анализ на одновременность, анализ характеристик и т.п., а клиенту требуется только слушать некоторый интерфейс.

E>Имхо, если под event_listener-ами будет пониматься такой широкий спектр понятий, то some_event будет всего лишь напоминать тот же самый wait_event_traits_map_t из моего примера. Только в моем случае some_event может быть скрыт от программиста и программист будет знать, что ему нужно сделать своего event_listener-а и поместить его в traits_map. Собственно то же самое, только traits_map, имхо, остается все же более гибким подходом. Чем-то напоминающим динамические языки программирования.

Я бы резюимровал так: нужно покопаться в самой задаче и постановочных документах. Иной раз появление таких архитектурных решений позволяет найти глубокие глюки в постановочной части.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[8]: LSP, ДК, Вирт - поехали...
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 11.07.05 16:02
Оценка: +1
Здравствуйте, Геннадий Васильев, Вы писали:

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


ГВ>>>Такая сигнатура позволяет засунуть под интерфейс "событие" всё, что угодно, включая схему приоретизации событий, очередь событий, анализ на одновременность, анализ характеристик и т.п., а клиенту требуется только слушать некоторый интерфейс.

E>>Имхо, если под event_listener-ами будет пониматься такой широкий спектр понятий, то some_event будет всего лишь напоминать тот же самый wait_event_traits_map_t из моего примера. Только в моем случае some_event может быть скрыт от программиста и программист будет знать, что ему нужно сделать своего event_listener-а и поместить его в traits_map. Собственно то же самое, только traits_map, имхо, остается все же более гибким подходом. Чем-то напоминающим динамические языки программирования.

ГВ>Я бы резюимровал так: нужно покопаться в самой задаче и постановочных документах. Иной раз появление таких архитектурных решений позволяет найти глубокие глюки в постановочной части.


Да, Геннадий, в принципе, все так и есть. Это очень здавый подход, когда при достижении органичений текущей версии архитектуры происходит перепроектирование и появляется новый набор согласованных, понятных, минималистических интерфейсов. Очень здорово, когда такая возможность есть. Тут главное, что появление новой архитектуры, как правило, делает старый код несовместимым с новыми версиями. Если затраты на правку старого кода вполне приемлимы, то перепроектирование -- самый разумный выход.

Но мне вот что интересно в последнее время. Мы у себя активно используем собственную технологию агентно-ориентированного программирования, в которой взаимодействие между агентами проиходит за счет обмена сообщениями. Причем отправитель сообщения даже не знает, какой точно интерфейс у агента-получателя сообщения. Чем-то это напоминает Smalltalk. Так же, после небольшого опыта использования Ruby, мне понравилась возможность, которую предоставляют динамические языки: в метод объекта нужно передать строгоопределенное количество аргументов, но их типы фикированны. Поэтому со временем, можно научить объект получать совсем другие аргументы, но и поддержать старую функциональность одновременно. Да, при разаботке такого метода трудозатраты несколько увеличиваются (хотя это сильно зависит, как говорится). Но вот у пользователей такого метода никакой головной боли -- очень прозрачный переход на новые версии. Частично эту тему я затрагивал вот здесь: Re[51]: Почему нельзя преподавать C#
Автор: eao197
Дата: 06.04.05
.

Т.е. я не говорю, что это однозначно хорошо. Но интересно, по крайней мере.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[31]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 11.07.05 16:33
Оценка: 1 (1) +3
Здравствуйте, AVC, Вы писали:

AVC>В отношении непригодности языка для "масс" (или "масс" для языка?) мы, кажется, пришли к "консенсусу".

AVC>А ведь, между тем, что-то я не видел на книжках по Си++ надписей вроде: "Минздрав предупреждает".
AVC>Напротив: от "Освой Си++ за 21 день" до "Си++ для чайников".

Ключевое слово "Маркетинг".

AVC>>>Ведь в Оберон-системе информация о типах доступна в рантайме.

ПК>>Ключевым для меня здесь является смещение контроля на время исполнения. Естественно, это дело личных предпочтений, но я отношусь как раз к той части программистов, которые предпочитают максимум проверок во время компиляции.
AVC>Это я давно заметил.
AVC>Возможно, это и правда вопрос личных предпочтений.
AVC>У меня это вызывает впечатление, что народ пытается исключить потенциальные ошибки из простого кода, нагромоздив гору сложного. А отсюда у меня сомнения в логической состоятельности такого подхода.

На самом деле, глубокая логическая ошибка зарыта в такой оценке самой по себе. Её суть — использование примитивного противопоставления "простой код — сложный код". Прикол здесь в том, что "простые вещи" зачастую оказываются простыми только на поверхностный взгляд. Ну, вот такой, отвлечённый пример. Возбмём стакан. Казалось бы, что может быть проще? Однако, артефакт стакан удовлетворяет таким требованиям:
— емкость;
— прочность стенок;
— вес в пределах от ... до ...;
— термостойкость;
— безопасность в смысле химической инертности.
И т.д., и т.п.

И когда дело доходит до "простейшего стакана" в коде, то выясняется, что представления о, например, параметре "прочность стенок" находятся у разных людей в разных, иной раз не пересекающихся областях. Всё бы ничего, об этом можно договориться. Но всё становится много хуже, когда под высказыванием "какой-нибудь стакан" подразумевается вполне конкретный набор допусков и ограничений. Ergo, их нужно уметь оговаривать, вот отсюда и "сложности". Вернее — вагоны конструкторской документации на простейшие, казалось бы, вещи.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[32]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 11.07.05 20:02
Оценка: 5 (2) +1
Здравствуйте, Геннадий Васильев, Вы писали:

AVC>>В отношении непригодности языка для "масс" (или "масс" для языка?) мы, кажется, пришли к "консенсусу".

AVC>>А ведь, между тем, что-то я не видел на книжках по Си++ надписей вроде: "Минздрав предупреждает".
AVC>>Напротив: от "Освой Си++ за 21 день" до "Си++ для чайников".

ГВ>Ключевое слово "Маркетинг".


Ключевое слово — "вранье" (в данном случае — маркетологов и издателей).
Я ничего не имею против авторов таких книг. Ясно, что начинающим Си++программистам тоже нужны книги.
К сожалению, современная цивилизация во многом стоит на вранье.
Конечно, сказанное — мое ИМХО. Но, черт побери, мне уже 41 год! Я могу еще многому научиться, но вряд ли сильно поумнею...
Я вырос в другой политической системе, пережил ряд политических и экономических потрясений, растил детей при пустых прилавках.
У меня есть своя точка зрениях на эти вопросы.
(Прошу прощения за, может быть, излишнюю эмоциональность. Но иначе я бы врал.)
Вот уже далекие студенческие годы. Гайдар пишет в своих воспоминаниях, что он ходил разгружать вагоны за деньги.
А к нам приходили в общежитие (ВМиК МГУ) и говорили: ребята, кто может, в Москве вагоны стоят неразгруженные, помогите. И мы шли и разгружали ночью вагоны бесплатно и считали, что это нормально. (Возможно, деньги шли Универу?)
И кто выручал Москву — "единоличники", вроде Гайдара, за деньги, или те, кто приходили целым курсом, бесплатно?
А, получается, Гайдар в своих воспоминаииях ставит себя в пример: вот я мужик, зарабатывал копейку, спасал Москву.
Сам не знаю, зачем я о наболевшем, очевидна ли связь? Просто вранье — везде вранье. Самые страшные беды — от вранья.
Никакой безопасности (ни ПО, ни в "большом мире") не будет, пока всякие там "маркетологи" будут врать.

AVC>>>>Ведь в Оберон-системе информация о типах доступна в рантайме.

ПК>>>Ключевым для меня здесь является смещение контроля на время исполнения. Естественно, это дело личных предпочтений, но я отношусь как раз к той части программистов, которые предпочитают максимум проверок во время компиляции.
AVC>>Это я давно заметил.
AVC>>Возможно, это и правда вопрос личных предпочтений.
AVC>>У меня это вызывает впечатление, что народ пытается исключить потенциальные ошибки из простого кода, нагромоздив гору сложного. А отсюда у меня сомнения в логической состоятельности такого подхода.

ГВ>На самом деле, глубокая логическая ошибка зарыта в такой оценке самой по себе. Её суть — использование примитивного противопоставления "простой код — сложный код". Прикол здесь в том, что "простые вещи" зачастую оказываются простыми только на поверхностный взгляд. Ну, вот такой, отвлечённый пример. Возбмём стакан. Казалось бы, что может быть проще? Однако, артефакт стакан удовлетворяет таким требованиям:

ГВ>- емкость;
ГВ>- прочность стенок;
ГВ>- вес в пределах от ... до ...;
ГВ>- термостойкость;
ГВ>- безопасность в смысле химической инертности.
ГВ>И т.д., и т.п.

ГВ>И когда дело доходит до "простейшего стакана" в коде, то выясняется, что представления о, например, параметре "прочность стенок" находятся у разных людей в разных, иной раз не пересекающихся областях. Всё бы ничего, об этом можно договориться. Но всё становится много хуже, когда под высказыванием "какой-нибудь стакан" подразумевается вполне конкретный набор допусков и ограничений. Ergo, их нужно уметь оговаривать, вот отсюда и "сложности". Вернее — вагоны конструкторской документации на простейшие, казалось бы, вещи.


Во многом Вы правы.
Не всегда простое "просто".
Именно к обсуждению этих вопросов и хочется, наконец, перейти.
Что мы все "ломаем копья" вокруг явных дефектов Си++?!
Я не спорю с тем, что в Си++ много интересных идей. Но на базе совместимости с Си никогда не получится надежного языка. А тема legacy code — почти сплошное вранье. Старый код на Си и Си++ (если он действительно ценный, что редко) вполне можно использовать в DLL.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[34]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 11.07.05 20:17
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Если для тебя так принципиально, чтобы указатель был проинициализирован нулем, обертка с нулевым оверхедом, которая просто при инициализации заносит 0 в инкапсулируемый указатель, пишется за 1 минуту и потом используется сколько угодно раз. Это, кстати, относится все к той же теме — не используй голые указатели, если только это тебе не нужно. Ты же все равно пытаешся их использовать. Вот скажи мне, какая разница для меня как программиста — использовать голый указатель или использовать объект с семантикой указателя, но обладающий дополнительными проверками/иницализацией? Почему нужно обязательно использовать именно голый указатель везде, где только вздумается? Только потому, что такая возможность есть в языке? Топором, например, можно себе ногу отрубить, но ведь нормальный человек никогда не станет этого делать. Откуда же это стремление использовать язык максимально опасным способом?


Дмитрий, помнишь, как у Чехова?
Если в первом акте на сцене висит ружье, в последнем оно выстрелит.

P.S. Моя "аська", оказывается, 228-705-993.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[12]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 11.07.05 22:07
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

AVC>>Бесполезно.

AVC>>Как сказал Вирт:
AVC>>

AVC>>некоторые вещи следует продумывать до, а не после.


ГВ>Это много кто говорил. Собственно, C++ как раз этой парадигме соответствует: вместо конкретных решений даётся инструмент создания решений. Т.е., варианты применения продуманы "до" и выведена некая более или менее общая языковая основа. Что не так?


Да все не так.
Не было продумывания "до", а был язык Си, Страуструпу ничем не обязанный.
Или его он тоже продумал "до" его создания?

ГВ>[skip про проверки]

AVC>>>>Существует понятие программирования по контракту. (Мейер)
AVC>>>>Главный принцип: не доверяй клиенту (вызывающему коду).
ГВ>>>Всё хорошо в своём месте и в своё время. ООП само по себе тоже не всегда адекватно задачам. Так что, принцип программирования по контракту тоже не стоит распространять на все случаи программирования.
AVC>>Разве принцип программирования по контракту применим только к ООП?
AVC>>Это универсальный принцип, развитие идеи защитного программирования.

ГВ>Да, он применим где угодно. Вопрос только в конечной цене применения.


Насчет цены. За годы с 1998 по 2002 годы число ЧП, вызванных ненадежностью ПО, выросло в 20 раз.

AVC>>>>В самом первом виртовском Обероне не было присоединенных процедур (=виртуальных функций).

AVC>>>>Полиморфизм работал исключительно благодаря динамическому приведению типа.
AVC>>>>Наверное, поэтому динамическое приведение типа реализовано так эффективно.
AVC>>>>Например (опустив все лишнее):
ГВ>>>[...]

ГВ>>>Ну, я так понимаю, здесь влияет ещё и модель объектов паскаля, конкретно — строго одиночное наследование.


AVC>>В Обероне (и других модульных языках) единица инкапсуляции не класс, а модуль.

AVC>>Это существенно влияет на проектные решения.
AVC>>Множественное наследование в Обероне просто не нужно (и рассматривается как вредное).

ГВ>ИМХО — это глобальная парадигматическая ошибка. В ДНК.


В разных местах на RSDN я говорил, что Си++программисты все объясняют двумя причинами: "кривыми ручками" и "ошибками в ДНК".
Вот очередное подтверждение.

AVC>>Модули позволяют естественно реализовывать целые паттерны проектирования.

AVC>>Множественное наследование в Си++ — заплата на отсутствии нормальных модулей.
AVC>>Вот и пишут на Си++ программы, обращаясь сразу к "человеку и пароходу". (c) Маяковский

ГВ>Э... высокая риторика, спору нет. Слог хорош! Кратко напоминаю содержание предыдущих серий: динамическое приведение типов в Обероне эффективно работает отчасти из-за строго одиночного наследования.


А еще в Обероне есть модульность, которой нет в Си++.
И поэтому нет кентавров.

AVC>>>>Опять-таки оптимизатор может устранить некоторые лишние проверки.

ГВ>>>Здесь согласен. Хотя я бы не стал полагаться на оптимизатор...
AVC>>В руководстве по компилятору XDS (в разделе об оптимизации) говорится:
AVC>>

AVC>>It is possible not to turn run-time checks off in the product versions of your programs,
AVC>>because the code generator usually removes redundant checks. A typical
AVC>>program runs only 10-15% faster with all run-time checks turned off (but the code
AVC>>size is usually significantly smaller).

AVC>>Здесь указана цена проверок: программа на 10-15% медленнее.
AVC>>Разница в размере кода больше.

ГВ>Ключевая фраза вот эта: "A typical program". Можно это загадочное определение раскрыть полнее? Почему цепляюсь — потому что уже где-то слышал про эти пресловутые 10-15%, вот и стало интересно.


Вопрос разумный.
Если Вы не доверяете данным Excelsior (XDS), то надо заниматься измерениями самостоятельно.
Найду время — "погоняю" разные программы, откомпилированные с разными опциями.
Пока что лично у меня получалось, что при полной оптимизации XDS (90-х годов) в три раза крыл Visual C++ 6.0.
Предположим, в "нетипичном" случае на проверки уйдет не 10-15%, а 20-30%. Это принципиально?

ГВ>>>>>Средствами C++ можно обойти type safety. Разумность такого решения — отдельный вопрос. Если голова на плечах есть — всмё будет в порядке, если с этим проблема, то runtime проверками дела не поправишь. Приведённый пример с NASA свидетельствует, скорее, не о бенефитах типобезопасности, а о том, что всем в NASA было настолько страшно взять ответственность на себя, что спихнули всё на "неправильную" фичу языка. Т.е., проблема не в языке, а в головах.

AVC>>>>Согласен, что проблема — в головах.
AVC>>>>Потому что именно из голов она попадает в языки.
ГВ>>>В огороде бузина, а в трюме акулы...
AVC>>Которые съели дядьку в Киеве?
AVC>>А что, я сказал глупость?
ГВ>Ага.

Выбор языка — уже проектное решение.
Проектные решения, надеюсь, предполагают наличие головы?
В чем же глупость?

AVC>>Может, я чего не знаю, и Си++ создавался не посредством головы?

ГВ>И ещё одну. Потому что попытался применить "передёргивание". Вернее — приведение аргументов на основании одной только лексической аналогии (голова — голова). Забавно, спору нет, но это уже надоедает.

Ну, тогда "акулы в трюме" — неотразимый аргумент.
Поздравляю, Вас, Геннадий, с заслуженной победой.

AVC>>>>Забавно читать, что "средствами C++ можно обойти type safety".

AVC>>>>Где бы найти в Си++ эту самую type safety...
ГВ>>>Да есть она там, что тут можно сказать...
AVC>>Ну разве что правду — что ее там нет.

ГВ>Хм. Всё чудесатее и чудесатее. От повторения тезиса его истинность увеличивается? Не знал.


Это Вы о своем утверждении, что в Си++ есть (а не может быть при некоторых исключительных обстоятельствах) type safety?
А пока что самые разные источники твердят одно: в программах на Си++ ошибок больше, чем в программах на Си.
Уж если в Си++ есть type safety, то Си, наверное, — просто скала!

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[33]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.07.05 23:28
Оценка: :)
Здравствуйте, AVC, Вы писали:

AVC>Во многом Вы правы.

AVC>Не всегда простое "просто".
AVC>Именно к обсуждению этих вопросов и хочется, наконец, перейти.
AVC>Что мы все "ломаем копья" вокруг явных дефектов Си++?!
AVC>Я не спорю с тем, что в Си++ много интересных идей. Но на базе совместимости с Си никогда не получится надежного языка. А тема legacy code — почти сплошное вранье. Старый код на Си и Си++ (если он действительно ценный, что редко) вполне можно использовать в DLL.

+1000
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[32]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.07.05 23:28
Оценка: :)
Здравствуйте, eao197, Вы писали:

E>Проблема в ASSERT-ах в том, что их видит автор f. Но не пользователь f! А предложенный Пашей подход как раз позволяет показать клиенту, что такой ASSERT внутри f присутствует.


Вот на столь важные вопросы и тратят время С++-программисты.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.07.05 23:28
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Видимо, ты все-таки невнимательно прочитал. C++ противопоставлялся в этой ветке языкам C#, Java, Oberon, Ada. Не лиспу! Вот еще один линк
Автор: CrystaX
Дата: 06.07.05
. На этом тему считаю закрытой.


Ну, почему же? В области типобезопасности действительно C#, Java, Oberon, Ada, а в области метапрограммирования ему противопоставляются R#, Java Syntactic Extender... и как раз ФЯ с мощьными препроцессорами вроде Lisp-а или Ocaml-а.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Что толку в Ада если Ариан 5 все равно упал
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.07.05 23:28
Оценка: 1 (1) +1
Здравствуйте, AVC, Вы писали:

AVC>Да все не так.

AVC>Не было продумывания "до", а был язык Си, Страуструпу ничем не обязанный.
AVC>Или его он тоже продумал "до" его создания?

Согласен. Но 20 лет назад, когда С был на пике популярности обратная совместимость с С был очень здравый шаг.

Глупосью было завоевав олимп придерживаться этой совместимости и дальше. Разумным шагом было бы выделение опасных конструкций в уровень совместимости, и развитие языка в русло упрощения и типобезопасности.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[34]: Что толку в Ада если Ариан 5 все равно упал
От: faulx  
Дата: 12.07.05 03:43
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

F>> Безотносительно к тому, о чем идет речь, и оправдано ли было такое решение, хочу сказать, что такие примеры меня всегда умиляют. Решения о включении того или иного свойства в язык принимают на основе того, что кто-то когда-то где-то смотрел на какие-то проекты "из полмиллиона строк" <...>


ПК>Ну, все-таки use cases анализировать надо... Если use case для некоторой языковой возможности не находится, то я слабо представляю, как ее можно спроектировать так, чтоб она в итоге оказалась удобной в использовании. По-моему, лучше отложить включение этой возможности до того, когда возникнет конкретный use case, не покрывающийся/покрывающийся плохо существующими возможностями языка, и вот тогда уже спроектировать ее как следует, чтоб она, действительно, выполняла свое предназначение.


Когда "use case" возникнет, может быть уже поздно. Вспоминается в связи с этим история с утилитой make. (Ссылку сейчас не найду). Автор изначальной версии make написал ее "на коленке" для друзей. Он спешил, и поэтому принял простое решение — использовать символы табуляции для обозначения начала команд (синтаксис Makefile'ов все знают и, надеюсь, понимают, о чем идет речь). Буквально через несколько дней он избавился от этого "хака" — но было уже поздно. Пользователи (их было не больше десятка) уже успели написать Makefile'ы с табуляциями и поленились переписывать их. И вот до сих пор, спустя десятиления, все ругаются, разбираясь, почему make собирает что-нибудь неправильно и обнаружив, что дело в том, что вместо табуляции каким-то образом оказались пробелы.

Что касается конкретной темы обсуждения, то речь о той странной ситуации, когда "use cases" из какого-либо языка программирования рассматриваются как аксиомы для совсем другого языка программирования. При этом совершенно неизвестно, насколько правильны и всеобъемлющи эти "use cases".

PS. А все-таки, неужели это правда, что в C++ могли быть Лисповские condition'ы?
Re[13]: Что толку в Ада если Ариан 5 все равно упал
От: FR  
Дата: 12.07.05 06:53
Оценка: +1
Здравствуйте, AVC, Вы писали:


ГВ>>Ключевая фраза вот эта: "A typical program". Можно это загадочное определение раскрыть полнее? Почему цепляюсь — потому что уже где-то слышал про эти пресловутые 10-15%, вот и стало интересно.


AVC>Вопрос разумный.

AVC>Если Вы не доверяете данным Excelsior (XDS), то надо заниматься измерениями самостоятельно.
AVC>Найду время — "погоняю" разные программы, откомпилированные с разными опциями.
AVC>Пока что лично у меня получалось, что при полной оптимизации XDS (90-х годов) в три раза крыл Visual C++ 6.0.

А можно посмотреть на этот пример где оберон в три раза обгоняет плюсы?
Re[19]: Что толку в Ада если Ариан 5 все равно упал
От: FR  
Дата: 12.07.05 06:53
Оценка: +2 :))) :)
Здравствуйте, VladD2, Вы писали:

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


CX>>Видимо, ты все-таки невнимательно прочитал. C++ противопоставлялся в этой ветке языкам C#, Java, Oberon, Ada. Не лиспу! Вот еще один линк
Автор: CrystaX
Дата: 06.07.05
. На этом тему считаю закрытой.


VD>Ну, почему же? В области типобезопасности действительно C#, Java, Oberon, Ada, а в области метапрограммирования ему противопоставляются R#, Java Syntactic Extender... и как раз ФЯ с мощьными препроцессорами вроде Lisp-а или Ocaml-а.


Угу семеро на одного.
Re[14]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 12.07.05 08:42
Оценка:
Здравствуйте, FR, Вы писали:

ГВ>>>Ключевая фраза вот эта: "A typical program". Можно это загадочное определение раскрыть полнее? Почему цепляюсь — потому что уже где-то слышал про эти пресловутые 10-15%, вот и стало интересно.


AVC>>Вопрос разумный.

AVC>>Если Вы не доверяете данным Excelsior (XDS), то надо заниматься измерениями самостоятельно.
AVC>>Найду время — "погоняю" разные программы, откомпилированные с разными опциями.
AVC>>Пока что лично у меня получалось, что при полной оптимизации XDS (90-х годов) в три раза крыл Visual C++ 6.0.

FR>А можно посмотреть на этот пример где оберон в три раза обгоняет плюсы?


Уф! Специально прошелся по старым постам, чтобы вспомнить, откуда "ноги растут".
На этот факт я случайно наткнулся еще в январе:
http://www.rsdn.ru/Forum/Message.aspx?mid=994706&amp;only=1
Автор: AVC
Дата: 19.01.05

и был удивлен (потому что в литературе где-то указывались 40% преимущества XDS над Visual C++ и 15% — над Watcom.).
Затем на вопрос, который задал Cyberax я дал ссылку, где взять XDS и тест drystone(это и есть ответ на Ваш вопрос, можно ли посмотреть и где):
http://www.rsdn.ru/Forum/Message.aspx?mid=994783&amp;only=1
Автор: AVC
Дата: 19.01.05

Затем у нас с Cyberax случилась, к сожалению, перепалка:
http://www.rsdn.ru/Forum/Message.aspx?mid=995194&amp;only=1
Автор: AVC
Дата: 19.01.05

http://www.rsdn.ru/Forum/Message.aspx?mid=1002684&amp;only=1
Автор: AVC
Дата: 25.01.05

Был задан вопрос о ключах компиляции:
http://www.rsdn.ru/Forum/Message.aspx?mid=1002993&amp;only=1
Автор: AVC
Дата: 25.01.05

Дальше "дедушка" Cyberax рассказывал сказки о Visual C++ 8 (beta), а я ему не верил:
http://www.rsdn.ru/Forum/Message.aspx?mid=1003033&amp;only=1
Автор: AVC
Дата: 25.01.05

http://www.rsdn.ru/Forum/Message.aspx?mid=1054838&amp;only=1
Автор: AVC
Дата: 03.03.05


Если у Вас дойдут руки проверить этот пример на Вашем компьютере и на Вашем компиляторе Си++, сообщите мне о результатах, пожалуйста.
А то они меня самого смущают (3 раза все-таки! ), но неизменно подтверждаются при запуске drystone.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[15]: Что толку в Ада если Ариан 5 все равно упал
От: Трурль  
Дата: 12.07.05 09:17
Оценка:
Здравствуйте, AVC, Вы писали:

AVC>Если у Вас дойдут руки проверить этот пример на Вашем компьютере и на Вашем компиляторе Си++, сообщите мне о результатах, пожалуйста.

AVC>А то они меня самого смущают (3 раза все-таки! ), но неизменно подтверждаются при запуске drystone.

3 раза — это слишком . Просто XDS слишком уж оптимизирует — выбрасывает нафиг большую часть кода. Весь смысл теста теряется.
Re[16]: drystone
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 12.07.05 12:05
Оценка:
Здравствуйте, Трурль, Вы писали:

Т> Просто XDS слишком уж оптимизирует — выбрасывает нафиг большую часть кода. Весь смысл теста теряется.


Если я не ошибаюсь, но если попробовать вручную "распутать" оригинальный тест drystone, то должен получиться пустой цикл.

То есть смысл этого теста как раз в том и состоит — хватит компилятору ума додуматься до этого или не очень...
Re[15]: Что толку в Ада если Ариан 5 все равно упал
От: FR  
Дата: 12.07.05 12:15
Оценка: 1 (1)
Здравствуйте, AVC, Вы писали:

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



FR>>А можно посмотреть на этот пример где оберон в три раза обгоняет плюсы?


AVC>Уф! Специально прошелся по старым постам, чтобы вспомнить, откуда "ноги растут".

AVC>На этот факт я случайно наткнулся еще в январе:
AVC>http://www.rsdn.ru/Forum/Message.aspx?mid=994706&amp;only=1
Автор: AVC
Дата: 19.01.05

AVC>и был удивлен (потому что в литературе где-то указывались 40% преимущества XDS над Visual C++ и 15% — над Watcom.).
AVC>Затем на вопрос, который задал Cyberax я дал ссылку, где взять XDS и тест drystone(это и есть ответ на Ваш вопрос, можно ли посмотреть и где):
AVC>http://www.rsdn.ru/Forum/Message.aspx?mid=994783&amp;only=1
Автор: AVC
Дата: 19.01.05

AVC>Затем у нас с Cyberax случилась, к сожалению, перепалка:
AVC>http://www.rsdn.ru/Forum/Message.aspx?mid=995194&amp;only=1
Автор: AVC
Дата: 19.01.05

AVC>http://www.rsdn.ru/Forum/Message.aspx?mid=1002684&amp;only=1
Автор: AVC
Дата: 25.01.05

AVC>Был задан вопрос о ключах компиляции:
AVC>http://www.rsdn.ru/Forum/Message.aspx?mid=1002993&amp;only=1
Автор: AVC
Дата: 25.01.05

AVC>Дальше "дедушка" Cyberax рассказывал сказки о Visual C++ 8 (beta), а я ему не верил:
AVC>http://www.rsdn.ru/Forum/Message.aspx?mid=1003033&amp;only=1
Автор: AVC
Дата: 25.01.05

AVC>http://www.rsdn.ru/Forum/Message.aspx?mid=1054838&amp;only=1
Автор: AVC
Дата: 03.03.05


AVC>Если у Вас дойдут руки проверить этот пример на Вашем компьютере и на Вашем компиляторе Си++, сообщите мне о результатах, пожалуйста.

AVC>А то они меня самого смущают (3 раза все-таки! ), но неизменно подтверждаются при запуске drystone.

В общем я посмотрел этот dry.c кошмар какой-то, написан на K&R си, много вещей (типа пустых циклов) которые просто выкидываются современными компиляторами в общем результаты тестирования такие:

XDS:
Dhrystone time for 40000000 passes = 12
This machine benchmarks at 3333333 dhrystones/second

vc6(cl /GX /O2 Dry_c.c):
Dhrystone time for 40000000 passes = 24
This machine benchmarks at 1666666 dhrystones/second

vc7.1(cl /GX /O2 Dry_c.c + #pragma auto_inline(on)):
Dhrystone time for 40000000 passes = 16
This machine benchmarks at 2500000 dhrystones/second

Два раза есть, но мне кажется тест полная подстава, меня очень смущают сообщения которые в процессе компиляции выдает XDS компилятор redundant code eliminated (к тому же внутри циклов). Мое мнение этот тест подстава, реально он не выполняет работу для которой предназначен. Вообще конечно я восхищен умением XDS выкидывать не влияющие на результат куски кода, но для реальных приложений которые все таки что-то считают это не дает преимуществ, что показывает рядом лежащий тест LINPACK на котором XDS уже немного отстает от VC.
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: Gaperton http://gaperton.livejournal.com
Дата: 12.07.05 12:18
Оценка:
Здравствуйте, FR, Вы писали:

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


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


CX>>>Видимо, ты все-таки невнимательно прочитал. C++ противопоставлялся в этой ветке языкам C#, Java, Oberon, Ada. Не лиспу! Вот еще один линк
Автор: CrystaX
Дата: 06.07.05
. На этом тему считаю закрытой.


VD>>Ну, почему же? В области типобезопасности действительно C#, Java, Oberon, Ada, а в области метапрограммирования ему противопоставляются R#, Java Syntactic Extender... и как раз ФЯ с мощьными препроцессорами вроде Lisp-а или Ocaml-а.


FR>Угу семеро на одного.

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

Видимо, ты все-таки невнимательно прочитал. C++ противопоставлялся в этой ветке языкам C#, Java, Oberon, Ada. Не лиспу!

Re[16]: drystone
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 12.07.05 12:26
Оценка:
Здравствуйте, FR, Вы писали:

FR> Мое мнение этот тест подстава, реально он не выполняет работу для которой предназначен.


Нет-нет, как раз смысл теста drystone в проверке способности компилятора распутывать запутанный код.

Попробуйте распутать код вручную, там (кажется) должен получится просто пустой цикл.
Re[21]: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 12.07.05 12:26
Оценка: +3 :))) :)
Здравствуйте, Gaperton, Вы писали:

FR>>Угу семеро на одного.

G>А что делать — приходится шапками закидвать — с Лиспом или Диланом вы почему-то тягаться отказываетесь принципиально . И что интересно, даже про "низкую производительность" в этот раз никто не вспомнил — сразу кверху лапками.

G>

G>Видимо, ты все-таки невнимательно прочитал. C++ противопоставлялся в этой ветке языкам C#, Java, Oberon, Ada. Не лиспу!


Да, в свете последних событий (Metaprogramming et al
Автор:
Дата: 09.07.05
) Lisp вообще лучше не трогать -- он ведь круче всех! Только нам, сирым C++-программерам это, увы недоступно!
А вы, дотнетчики, чего смеетесь! Думаете, что вы круче Lisp-а?
Или вы, презренные Python-исты, Ruby-исты и Perl-исты -- вообще ничего не понимаете в этой жизни!

Lisp -- наше все!





Сторонникам Lisp-а просьба не обижаться
Просто слишком часто в последнее время про него говорят в неизменно превосходной форме.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[17]: drystone
От: FR  
Дата: 12.07.05 12:35
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, FR, Вы писали:


FR>> Мое мнение этот тест подстава, реально он не выполняет работу для которой предназначен.


СГ>Нет-нет, как раз смысл теста drystone в проверке способности компилятора распутывать запутанный код.


СГ>Попробуйте распутать код вручную, там (кажется) должен получится просто пустой цикл.


Предупреждать надо
Только все равно показывать такой тест как пример того что XDS лучше оптимизирует чем VC не корректно, я уверен что при желании можно написать тест который будет намного медленее на XDS чем на VC.
Re[21]: Что толку в Ада если Ариан 5 все равно упал
От: CrystaX Россия https://crystax.me/
Дата: 12.07.05 12:54
Оценка: +2
Здравствуйте, Gaperton, Вы писали:

G>А что делать — приходится шапками закидвать — с Лиспом или Диланом вы почему-то тягаться отказываетесь принципиально . И что интересно, даже про "низкую производительность" в этот раз никто не вспомнил — сразу кверху лапками.


Хмм... Нежелание спорить на очевидные темы — не есть признак слабости. Как и обвинение в слабости не есть признак силы.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[17]: drystone
От: Трурль  
Дата: 12.07.05 12:55
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:


СГ>Если я не ошибаюсь, но если попробовать вручную "распутать" оригинальный тест drystone, то должен получиться пустой цикл.


СГ>То есть смысл этого теста как раз в том и состоит — хватит компилятору ума додуматься до этого или не очень...


Нет. Смысл теста — мерить производительность железа. Просто, когда его писали, компиляторы не были такими наглыми.
Re[35]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 12.07.05 13:26
Оценка: +3
Здравствуйте, faulx, Вы писали:

ПК>>Ну, все-таки use cases анализировать надо... Если use case для некоторой языковой возможности не находится, то я слабо представляю, как ее можно спроектировать так, чтоб она в итоге оказалась удобной в использовании. <...>


F>Когда "use case" возникнет, может быть уже поздно. Вспоминается в связи с этим история с утилитой make. (Ссылку сейчас не найду). Автор изначальной версии make написал ее "на коленке" для друзей. Он спешил, и поэтому принял простое решение — использовать символы табуляции для обозначения начала команд (синтаксис Makefile'ов все знают и, надеюсь, понимают, о чем идет речь). Буквально через несколько дней он избавился от этого "хака" — но было уже поздно. Пользователи (их было не больше десятка) уже успели написать Makefile'ы с табуляциями и поленились переписывать их.


Это пример, как раз подтверждающий нежелательность введения возможностей "чтоб были". Когда/если появятся веские основания для введения семантики возобновления, ничто не помешает ее ввести в том виде, каком она нужна будет для поддержки как раз тех use cases. А вот если бы семантику возобновления ввели "чтоб была", то получился бы как раз случай с табуляциями: в том виде, как надо переделать нельзя, т.к. могут быть случаи использования в том виде, как уже есть.

F>Что касается конкретной темы обсуждения, то речь о той странной ситуации, когда "use cases" из какого-либо языка программирования рассматриваются как аксиомы для совсем другого языка программирования. При этом совершенно неизвестно, насколько правильны и всеобъемлющи эти "use cases".


Можно по-другому посмотреть: use cases просто не нашлись. Даже в других языках.

F>PS. А все-таки, неужели это правда, что в C++ могли быть Лисповские condition'ы?


Я не настолько разбираюсь в Лиспе, чтоб подтвердить или опровергнуть данную аналогию, поэтому на эту часть вопроса не отвечаю.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[17]: drystone
От: Cyberax Марс  
Дата: 12.07.05 13:55
Оценка:
Сергей Губанов wrote:

> FR> Мое мнение этот тест подстава, реально он не выполняет работу для

> которой предназначен.
> Нет-нет, как раз смысл теста drystone в проверке способности
> компилятора распутывать запутанный код.
> Попробуйте распутать код вручную, там (кажется) должен получится
> просто пустой цикл.

Я вроде бы тут приводил результаты тестов dhrystone на IntelC++ — он
вигрывал у XDS, причем значительно.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 12.07.05 14:31
Оценка: :)
Здравствуйте, eao197, Вы писали:

E>Сторонникам Lisp-а просьба не обижаться

E>Просто слишком часто в последнее время про него говорят в неизменно превосходной форме.

А никто, как я вижу, и не обижается. Ни разу не встречал священной войны "C++ vs. Lisp". Как-то они мирно уживаются. Беда C++ в том, что на него наезжает слишком много народу, который не слишком-то умеет/хочет его применять. Странная позиция, но что поделать! Lisp же, не будучи мэйнстримовым языком, в такой переплёт не попал. Хотя, и на мой взгляд, он куда как гибче C++ во многих отношениях, и уж тем более, гибче чем Oberon/Java/.Net/прочие наследники Algol и C.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[20]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 12.07.05 14:31
Оценка: +1 :)))
Здравствуйте, FR, Вы писали:

VD>>Ну, почему же? В области типобезопасности действительно C#, Java, Oberon, Ada, а в области метапрограммирования ему противопоставляются R#, Java Syntactic Extender... и как раз ФЯ с мощьными препроцессорами вроде Lisp-а или Ocaml-а.


FR>Угу семеро на одного.


Чем больше врагов — тем больше чести. (с) не-помню-кто. Короче — стоит подождать, пока могильщики промеж себя передерутся.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[13]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 12.07.05 15:12
Оценка:
Здравствуйте, AVC, Вы писали:

ГВ>>Это много кто говорил. Собственно, C++ как раз этой парадигме соответствует: вместо конкретных решений даётся инструмент создания решений. Т.е., варианты применения продуманы "до" и выведена некая более или менее общая языковая основа. Что не так?


AVC>Да все не так.

AVC>Не было продумывания "до", а был язык Си, Страуструпу ничем не обязанный.
AVC>Или его он тоже продумал "до" его создания?
Тут я с VladD2 согласен — совместимость с C — это была важная вещь во время создания C++. Но он даже самим Страуструпом не позиционировался, как "расширение C", но выставляется как другой язык.

ГВ>>Да, он применим где угодно. Вопрос только в конечной цене применения.

AVC>Насчет цены. За годы с 1998 по 2002 годы число ЧП, вызванных ненадежностью ПО, выросло в 20 раз.
А насколько выросло число программистов? А в какой примерно период времени появился фразеологизм "индусский код"? Спрашивается — при чём тут C++?

AVC>>>В Обероне (и других модульных языках) единица инкапсуляции не класс, а модуль.

AVC>>>Это существенно влияет на проектные решения.
AVC>>>Множественное наследование в Обероне просто не нужно (и рассматривается как вредное).
ГВ>>ИМХО — это глобальная парадигматическая ошибка. В ДНК.
AVC>В разных местах на RSDN я говорил, что Си++программисты все объясняют двумя причинами: "кривыми ручками" и "ошибками в ДНК".
AVC>Вот очередное подтверждение.
К сожалению, почти все неадекватности ПО (читай — ошибки) объясняются двумя вещами — кривизной рук и/или мозгов. "Ошибка в ДНК" — это просто оборот такой. Устойчивый.

AVC>>>Модули позволяют естественно реализовывать целые паттерны проектирования.

AVC>>>Множественное наследование в Си++ — заплата на отсутствии нормальных модулей.
AVC>>>Вот и пишут на Си++ программы, обращаясь сразу к "человеку и пароходу". (c) Маяковский
ГВ>>Э... высокая риторика, спору нет. Слог хорош! Кратко напоминаю содержание предыдущих серий: динамическое приведение типов в Обероне эффективно работает отчасти из-за строго одиночного наследования.
AVC>А еще в Обероне есть модульность, которой нет в Си++.
AVC>И поэтому нет кентавров.
Надо смотреть конкретные примеры. "Модульность" на C++ обычно достигается не то, чтобы легко, а очень легко. Основные сложности не в отсутсвии ключевого слова module, а в сложностях, связанных с жизненными циклами, согласованием интерфейсов и т.п.

AVC>>>>>Опять-таки оптимизатор может устранить некоторые лишние проверки.

ГВ>>>>Здесь согласен. Хотя я бы не стал полагаться на оптимизатор...
AVC>>>В руководстве по компилятору XDS (в разделе об оптимизации) говорится:
AVC>>>

AVC>>>It is possible not to turn run-time checks off in the product versions of your programs,
AVC>>>because the code generator usually removes redundant checks. A typical
AVC>>>program runs only 10-15% faster with all run-time checks turned off (but the code
AVC>>>size is usually significantly smaller).

AVC>>>Здесь указана цена проверок: программа на 10-15% медленнее.
AVC>>>Разница в размере кода больше.

ГВ>>Ключевая фраза вот эта: "A typical program". Можно это загадочное определение раскрыть полнее? Почему цепляюсь — потому что уже где-то слышал про эти пресловутые 10-15%, вот и стало интересно.


AVC>Вопрос разумный.

AVC>Если Вы не доверяете данным Excelsior (XDS),
Если судить по соседней ветке с обсуждением drystone, то не доверяю.

AVC>то надо заниматься измерениями самостоятельно.

Не хочу.

AVC>Найду время — "погоняю" разные программы, откомпилированные с разными опциями.

AVC>Пока что лично у меня получалось, что при полной оптимизации XDS (90-х годов) в три раза крыл Visual C++ 6.0.
Конкретику, плз. На каких конкретно тестах?

AVC>Предположим, в "нетипичном" случае на проверки уйдет не 10-15%, а 20-30%. Это принципиально?

В некотором роде — да.

ГВ>>>>>>Средствами C++ можно обойти type safety. Разумность такого решения — отдельный вопрос. Если голова на плечах есть — всмё будет в порядке, если с этим проблема, то runtime проверками дела не поправишь. Приведённый пример с NASA свидетельствует, скорее, не о бенефитах типобезопасности, а о том, что всем в NASA было настолько страшно взять ответственность на себя, что спихнули всё на "неправильную" фичу языка. Т.е., проблема не в языке, а в головах.

AVC>>>>>Согласен, что проблема — в головах.
AVC>>>>>Потому что именно из голов она попадает в языки.
ГВ>>>>В огороде бузина, а в трюме акулы...
AVC>>>Которые съели дядьку в Киеве?
AVC>>>А что, я сказал глупость?
ГВ>>Ага.

AVC>Выбор языка — уже проектное решение.

AVC>Проектные решения, надеюсь, предполагают наличие головы?
AVC>В чем же глупость?
Как эта фраза связана связана с: "Потому что именно из голов она попадает в языки. " ? Ладно, ладно, не буду докапываться дальше. Я и так всё понял.

AVC>>>Может, я чего не знаю, и Си++ создавался не посредством головы?

ГВ>>И ещё одну. Потому что попытался применить "передёргивание". Вернее — приведение аргументов на основании одной только лексической аналогии (голова — голова). Забавно, спору нет, но это уже надоедает.

AVC>Ну, тогда "акулы в трюме" — неотразимый аргумент.

AVC>Поздравляю, Вас, Геннадий, с заслуженной победой.
Спасибо, только "акулы в трюме" — суть иллюстрация, приведённая для того, чтобы показать некорректность аргументации. Рад, что тебе понравилось.

AVC>>>>>Забавно читать, что "средствами C++ можно обойти type safety".

AVC>>>>>Где бы найти в Си++ эту самую type safety...
ГВ>>>>Да есть она там, что тут можно сказать...
AVC>>>Ну разве что правду — что ее там нет.
ГВ>>Хм. Всё чудесатее и чудесатее. От повторения тезиса его истинность увеличивается? Не знал.
AVC>Это Вы о своем утверждении, что в Си++ есть (а не может быть при некоторых исключительных обстоятельствах) type safety?
А по моему опыту — её нет в некоторых исключительных ситуациях. Что из этого следует?

AVC>А пока что самые разные источники твердят одно: в программах на Си++ ошибок больше, чем в программах на Си.

Да нет же. C++ вполне себе предполагает type safety, просто её обход — тривиальнейшее занятие (например — static_cast, dynamic_cast, const_cast, c-style-cast-over-void*). Отсюда и стоны о граблях и прочей белиберде. Ну и кто виноват? Кстати, разные же источники утверждают, что "дураков всегда больше". И что теперь?

Или ты предполагаешь, что "наличие type-safety" должно трактоваться как: "typesafe, только typesafe и ничего кроме typesafe"? Я отношусь к подобным утверждениям проще — возможно или нет. Если возможно, то ответ на вопрос "есть ли X в чём-нибудь?" утвердительный. Если не возможно — то отрицательный. На C++ type-safe программы писать вполне возможно, он прямо апеллирует к такому стилю. Таким образом, в C++ type-safety есть. Её обход — целиком на совести конкретных товарисчей. И неча тут на зеркало пенять.

AVC>Уж если в Си++ есть type safety, то Си, наверное, — просто скала!

Нет, разумеется. C, например, позволяет передавать константные строки как аргумент типа char*, а не только const char*. Посмотри в файл stdio.h — это как раз файл для C. Правда, сейчас уже заголовки почти везде переделаны под C++-стиль, а лет десять назад на Watcom С++ был как раз sprintf(char *, ...);
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[35]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 12.07.05 15:12
Оценка: +1 :)
Здравствуйте, AVC, Вы писали:

CX>>Если для тебя так принципиально, чтобы указатель был проинициализирован нулем, обертка с нулевым оверхедом, которая просто при инициализации заносит 0 в инкапсулируемый указатель, пишется за 1 минуту и потом используется сколько угодно раз. Это, кстати, относится все к той же теме — не используй голые указатели, если только это тебе не нужно. Ты же все равно пытаешся их использовать. Вот скажи мне, какая разница для меня как программиста — использовать голый указатель или использовать объект с семантикой указателя, но обладающий дополнительными проверками/иницализацией? Почему нужно обязательно использовать именно голый указатель везде, где только вздумается? Только потому, что такая возможность есть в языке? Топором, например, можно себе ногу отрубить, но ведь нормальный человек никогда не станет этого делать. Откуда же это стремление использовать язык максимально опасным способом?

AVC>Дмитрий, помнишь, как у Чехова?
AVC>Если в первом акте на сцене висит ружье, в последнем оно выстрелит.

Алексей, если бы каждый программист был Чеховым, жизнь была бы прекрасна.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[33]: Что толку в Ада если Ариан 5 все равно упал
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 12.07.05 15:15
Оценка: +1
Здравствуйте, AVC, Вы писали:

ГВ>>Ключевое слово "Маркетинг".


AVC>Ключевое слово — "вранье" (в данном случае — маркетологов и издателей).

[...]
AVC>(Прошу прощения за, может быть, излишнюю эмоциональность. Но иначе я бы врал.)
Да нет, наоброт. Спасибо за честность.

[...]
AVC>Сам не знаю, зачем я о наболевшем, очевидна ли связь? Просто вранье — везде вранье. Самые страшные беды — от вранья.
AVC>Никакой безопасности (ни ПО, ни в "большом мире") не будет, пока всякие там "маркетологи" будут врать.

У них работа такая. Вот покупаются люди на маркетинг C#, Java и т.п.! А вот C++ как-то без особого маркетинга разошёлся. Ну так, и "Где правда, брат"?

[...]
ГВ>>И когда дело доходит до "простейшего стакана" в коде, то выясняется, что представления о, например, параметре "прочность стенок" находятся у разных людей в разных, иной раз не пересекающихся областях. Всё бы ничего, об этом можно договориться. Но всё становится много хуже, когда под высказыванием "какой-нибудь стакан" подразумевается вполне конкретный набор допусков и ограничений. Ergo, их нужно уметь оговаривать, вот отсюда и "сложности". Вернее — вагоны конструкторской документации на простейшие, казалось бы, вещи.

AVC>Во многом Вы правы.

AVC>Не всегда простое "просто".
AVC>Именно к обсуждению этих вопросов и хочется, наконец, перейти.
AVC>Что мы все "ломаем копья" вокруг явных дефектов Си++?!

Копья мы ломаем вокруг формулировки "дефект" и некорректного использования логики.

AVC>Я не спорю с тем, что в Си++ много интересных идей. Но на базе совместимости с Си никогда не получится надежного языка. А тема legacy code — почти сплошное вранье. Старый код на Си и Си++ (если он действительно ценный, что редко) вполне можно использовать в DLL.


Ну и какое конструктивное обсуждение может получиться, если твой базовый тезис: "С++ — дефективный язык"?
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[22]: Что толку в Ада если Ариан 5 все равно упал
От: Gaperton http://gaperton.livejournal.com
Дата: 12.07.05 16:17
Оценка: +2
Здравствуйте, CrystaX, Вы писали:

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


G>>А что делать — приходится шапками закидвать — с Лиспом или Диланом вы почему-то тягаться отказываетесь принципиально . И что интересно, даже про "низкую производительность" в этот раз никто не вспомнил — сразу кверху лапками.


CX>Хмм... Нежелание спорить на очевидные темы — не есть признак слабости. Как и обвинение в слабости не есть признак силы.


Респект, сильный ответ
Re[16]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 12.07.05 19:32
Оценка:
Здравствуйте, Трурль, Вы писали:

AVC>>Если у Вас дойдут руки проверить этот пример на Вашем компьютере и на Вашем компиляторе Си++, сообщите мне о результатах, пожалуйста.

AVC>>А то они меня самого смущают (3 раза все-таки! ), но неизменно подтверждаются при запуске drystone.

Т>3 раза — это слишком . Просто XDS слишком уж оптимизирует — выбрасывает нафиг большую часть кода. Весь смысл теста теряется.


Вот и у меня возникло такое подозрение.
Если это действительно так, то (конечно, хвала оптимизатору XDS) смысл теста действительно теряется.
К чести Excelsior, они никогда не говорили о трехкратном преимуществе.
Это я в январе взял тест, откомпилировал и, по наивности, очень удивился результату.
И, возможно, породил миф.

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[16]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 12.07.05 19:33
Оценка:
Здравствуйте, FR, Вы писали:

AVC>>Если у Вас дойдут руки проверить этот пример на Вашем компьютере и на Вашем компиляторе Си++, сообщите мне о результатах, пожалуйста.

AVC>>А то они меня самого смущают (3 раза все-таки! ), но неизменно подтверждаются при запуске drystone.

FR>В общем я посмотрел этот dry.c кошмар какой-то, написан на K&R си, много вещей (типа пустых циклов) которые просто выкидываются современными компиляторами в общем результаты тестирования такие:


FR>XDS:

FR>Dhrystone time for 40000000 passes = 12
FR>This machine benchmarks at 3333333 dhrystones/second

FR>vc6(cl /GX /O2 Dry_c.c):

FR>Dhrystone time for 40000000 passes = 24
FR>This machine benchmarks at 1666666 dhrystones/second

FR>vc7.1(cl /GX /O2 Dry_c.c + #pragma auto_inline(on)):

FR>Dhrystone time for 40000000 passes = 16
FR>This machine benchmarks at 2500000 dhrystones/second

FR>Два раза есть, но мне кажется тест полная подстава, меня очень смущают сообщения которые в процессе компиляции выдает XDS компилятор redundant code eliminated (к тому же внутри циклов). Мое мнение этот тест подстава, реально он не выполняет работу для которой предназначен. Вообще конечно я восхищен умением XDS выкидывать не влияющие на результат куски кода, но для реальных приложений которые все таки что-то считают это не дает преимуществ, что показывает рядом лежащий тест LINPACK на котором XDS уже немного отстает от VC.


Спасибо за то, что потратили время и постарались в этом разобраться.
У меня тоже какие-то сомнения. Может, и правда подстава?

Для LINPACK наши результаты почему-то расходятся.
Вот что получилось у меня для XDS:

LINPACK benchmark, Double precision.
Machine precision: 14 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
16 0.55 79.63% 0.00% 20.37% 50589.767
32 0.83 86.59% 7.32% 6.10% 56502.857
64 1.42 80.85% 0.00% 19.15% 76328.421
128 2.75 63.97% 8.09% 27.94% 88790.204
256 5.61 71.71% 6.49% 21.80% 80197.604
512 11.09 94.08% 1.55% 4.37% 66296.686
1024 22.29 91.39% 2.27% 6.34% 67355.123
2048 44.49 80.93% 5.31% 13.76% 73294.572


А вот что для Visual C++ 6.0 с оптимизацией (cl /GX /O2 linnew.c + #pragma_inline(on)):

LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
8 0.71 100.00% 0.00% 0.00% 15474.178
16 0.77 87.01% 6.49% 6.49% 30518.519
32 1.54 90.26% 3.25% 6.49% 30518.519
64 3.13 92.65% 1.60% 5.75% 29794.350
128 6.26 92.49% 2.56% 4.95% 29543.978
256 12.53 89.70% 3.19% 7.10% 30203.895
512 25.04 91.09% 2.96% 5.95% 29857.608
1024 49.98 90.90% 2.62% 6.48% 30087.577

Это лучший результат Visual C++, который у меня получился.
Уж не знаю почему, но XDS на моем компьютере все время кроет Visual C++ как бык овцу.
Но, пока есть сомнения, не буду на этом настаивать.
Принципиально (для меня) здесь лишь то, что код на Модуле/Обероне (у них в XDS один кодогенератор, хотя разные подсистемы управления динамической памятью) может быть эффективным. (Не зря все-таки Excelsior создал систему программирования для нашего космического ведомства. Эта система программирования и использовалась для написания ПО для "Глонасс-М" и т.д.)

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[17]: Что толку в Ада если Ариан 5 все равно упал
От: FR  
Дата: 12.07.05 20:23
Оценка:
Здравствуйте, AVC, Вы писали:



AVC>Спасибо за то, что потратили время и постарались в этом разобраться.

AVC>У меня тоже какие-то сомнения. Может, и правда подстава?

Можно сказать что авторы грамотно выбрали тест для рекламы своего компилятора

AVC>Для LINPACK наши результаты почему-то расходятся.

---------------------------
AVC>Это лучший результат Visual C++, который у меня получился.
AVC>Уж не знаю почему, но XDS на моем компьютере все время кроет Visual C++ как бык овцу.
AVC>Но, пока есть сомнения, не буду на этом настаивать.

угу с этими тестами просто беда, вот мои результаты:
XDS:
LINPACK benchmark, Double precision.
Machine precision:   14 digits.
Array size  200 X  200.
Average rolled and unrolled performance:

    Reps Time(s) DGEFA   DGESL  OVERHEAD    KFLOPS
----------------------------------------------------
      64   0.54  69.81%  16.98%  13.21% 189161.739
     128   0.98  82.47%   3.09%  14.43% 209673.253
     256   1.95  84.97%   1.55%  13.47% 208417.725
     512   3.84  78.68%   4.74%  16.58% 219594.700
    1024   7.76  78.26%   5.21%  16.54% 217196.630
    2048  16.25  83.16%   3.48%  13.36% 199746.112
    4096  35.05  80.95%   4.96%  14.09% 186813.875
    8192  65.24  82.69%   3.05%  14.26% 201116.706


vc6:
LINPACK benchmark, Double precision.
Machine precision:  15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

    Reps Time(s) DGEFA   DGESL  OVERHEAD    KFLOPS
----------------------------------------------------
     128   1.00  82.83%   3.99%  13.17%  202053.640
     256   1.99  81.94%   2.51%  15.55%  208896.811
     512   3.97  86.16%   3.77%  10.06%  196684.382
    1024   8.13  82.27%   4.55%  13.18%  199191.690
    2048  16.10  84.51%   3.99%  11.51%  197374.503
    4096  33.19  83.92%   3.43%  12.65%  194031.711
    8192  66.61  84.85%   3.37%  11.78%  191469.190


vc7.1:
LINPACK benchmark, Double precision.
Machine precision:  15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

    Reps Time(s) DGEFA   DGESL  OVERHEAD    KFLOPS
----------------------------------------------------
     128   0.89  94.39%   2.24%   3.37%  204165.699
     256   1.75  90.30%   2.28%   7.42%  216619.429
     512   3.66  81.34%   7.11%  11.55%  217490.463
    1024   7.43  84.10%   6.59%   9.30%  208679.824
    2048  14.09  85.37%   4.05%  10.59%  223238.881
    4096  28.09  85.34%   4.82%   9.84%  222110.611
    8192  60.02  86.45%   4.25%   9.30%  206674.872


В общем почти одинаковые результаты.


AVC>Принципиально (для меня) здесь лишь то, что код на Модуле/Обероне (у них в XDS один кодогенератор, хотя разные подсистемы управления динамической памятью) может быть эффективным. (Не зря все-таки Excelsior создал систему программирования для нашего космического ведомства. Эта система программирования и использовалась для написания ПО для "Глонасс-М" и т.д.)


Да хороший компилятор.
Хотя я не знаю не сажают ли производительность проверки которые как я понял есть в обероне и нет в модуле.
Re[18]: Что толку в Ада если Ариан 5 все равно упал
От: AVC Россия  
Дата: 12.07.05 22:02
Оценка:
Здравствуйте, FR, Вы писали:

FR>В общем почти одинаковые результаты.


Мне кажется, что примерно так и должно быть. (В смысле примерного равенства результатов.)
Но что тогда с моим компом?!

AVC>>Принципиально (для меня) здесь лишь то, что код на Модуле/Обероне (у них в XDS один кодогенератор, хотя разные подсистемы управления динамической памятью) может быть эффективным. (Не зря все-таки Excelsior создал систему программирования для нашего космического ведомства. Эта система программирования и использовалась для написания ПО для "Глонасс-М" и т.д.)


FR>Да хороший компилятор.

FR>Хотя я не знаю не сажают ли производительность проверки которые как я понял есть в обероне и нет в модуле.

Действительно, в Обероне есть ряд критических проверок в run-time, связанных с безопасностью типов:
1) проверка указателей и процедурных переменных на NIL при их разыменовании;
2) проверка динамического типа при переходе к более узкому типу;
3) проверка индекса массива при получении доступа к элементу.
Все вместе они (конечно, в совокупности со статическим контролем типов) обеспечивают полную безопасность типов (type safety). Это означает, что переменную можно использовать только в соответствии с ее типом.
Конечно, возникает вопрос о стоимости проверок.
Часть излишних (redudant) проверок может быть устранена оптимизатором, который, например, у XDS довольно сильный.
После чего, по данным XDS, разница в быстродействии составляет 10-15% (по сравнению с полной оптимизацией).
Эти сведения нуждаются в проверке.
При удобном случае я это сделаю. (Собственно, проблема только в том, чтобы выбрать достаточно "репрезентативный" исходник. )
Кроме того, есть и "бескомпромиссные" компиляторы Оберона/Компонентного Паскаля, не позволяющие отменять такие проверки. Например — BlackBox.
На дне Оберона в ЦЕРН (10 марта 2004 года, кажется здесь (pdf)) приводились данные (кажется, нашим физиком Ткачевым), что BlackBox без особой оптимизации и с проверками не уступает тому же Visual C++ с полной оптимизацией.
Глядя на то, какие результаты показывает на моем компе Visual C++ (хотя он у меня старенький, но ведь и XDS — тоже), я готов поверить и в более "сенсационные" цифры.
Для компиляторов вроде XDS есть возможность полностью отменить проверки. (Конечно, после отладки.)
Есть основания думать (хотя бы на основании результатов тестов XDS), что в таком случае эффективность оберновского кода в принципе не уступает эффективности кода на Си/Си++.
Но я предпочитаю оставлять проверки в коде (следуя "заветам" Хоара ).

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[36]: Что толку в Ада если Ариан 5 все равно упал
От: faulx  
Дата: 13.07.05 04:02
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Это пример, как раз подтверждающий нежелательность введения возможностей "чтоб были".


На мой взгляд, это пример, показывающий, что очень трудно отказаться от решений, принятых на ранней стадии развития, даже если их исправление элементарно и затрагивает не очень много людей.

ПК>Когда/если появятся веские основания для введения семантики возобновления, ничто не помешает ее ввести в том виде, каком она нужна будет для поддержки как раз тех use cases.


По-моему, то, что "ничто не помешает" — это иллюзия. Мешает очень многое, и чем дальше, тем больше.

ПК>А вот если бы семантику возобновления ввели "чтоб была", то получился бы как раз случай с табуляциями: в том виде, как надо переделать нельзя, т.к. могут быть случаи использования в том виде, как уже есть.


Если есть случаи использования, зачем убирать?

Вообще, я не знаю, что такое "семантика возобновления" в данном контексте, поэтому не могу судить, насколько легко было бы производить изменения.

F>>Что касается конкретной темы обсуждения, то речь о той странной ситуации, когда "use cases" из какого-либо языка программирования рассматриваются как аксиомы для совсем другого языка программирования. При этом совершенно неизвестно, насколько правильны и всеобъемлющи эти "use cases".


ПК>Можно по-другому посмотреть: use cases просто не нашлись. Даже в других языках.


Может, плохо искали? И потом, в программах на Ассемблере не так-то просто найти use case, который привел бы к появлению, скажем, Koenig lookup rule в С++

F>>PS. А все-таки, неужели это правда, что в C++ могли быть Лисповские condition'ы?


ПК>Я не настолько разбираюсь в Лиспе, чтоб подтвердить или опровергнуть данную аналогию, поэтому на эту часть вопроса не отвечаю.


Жаль, это самое интересное, а все остальное — просто болтовня для развлечения. Может, ты просто расскажешь, что они хотели сделать с исключениями (что такое семантика возобновления), а те, кто разбираются в Лиспе, сравнят?
Re[37]: Что толку в Ада если Ариан 5 все равно упал
От: Павел Кузнецов  
Дата: 13.07.05 11:26
Оценка: 2 (2) +1
Здравствуйте, faulx, Вы писали:

ПК>>Это пример, как раз подтверждающий нежелательность введения возможностей "чтоб были".


F>На мой взгляд, это пример, показывающий, что очень трудно отказаться от решений, принятых на ранней стадии развития, даже если их исправление элементарно и затрагивает не очень много людей.


Это аналогия. Некорректность ее легко увидеть, если обратить внимание на то, что в случае make-файлов изменения нельзя было сделать, т.к. существовал код пользователей, "завязанный" на использование табуляций. В случае семантики возобновления такой проблемы нет, т.к. существующий код по очевидным причинам ее использовать не может.

ПК>>Когда/если появятся веские основания для введения семантики возобновления, ничто не помешает ее ввести в том виде, каком она нужна будет для поддержки как раз тех use cases.


F>По-моему, то, что "ничто не помешает" — это иллюзия. Мешает очень многое, и чем дальше, тем больше.


Конкретно, что помешает ввести семантику возобновления, если появится такое желание?

ПК>>А вот если бы семантику возобновления ввели "чтоб была", то получился бы как раз случай с табуляциями: в том виде, как надо переделать нельзя, т.к. могут быть случаи использования в том виде, как уже есть.


F>Если есть случаи использования, зачем убирать?


Случаев использования нет, т.к. семантику возобновления не вводили. Если бы ввели -- ее могли бы начать использовать в тех местах, где вполне можно без этого обойтись.

F>Вообще, я не знаю, что такое "семантика возобновления" в данном контексте, поэтому не могу судить, насколько легко было бы производить изменения.


Это возможность продолжить исполнение в точке, где было выброшено исключение, если в одной из вызывающих функций исключительную ситуацию "исправили". (*)

ПК>>Можно по-другому посмотреть: use cases просто не нашлись. Даже в других языках.


F>Может, плохо искали? И потом, в программах на Ассемблере не так-то просто найти use case, который привел бы к появлению, скажем, Koenig lookup rule в С++


Опять аналогии... Давай ты приведешь конкретные use cases, если о них знаешь, а?

ПК>>Я не настолько разбираюсь в Лиспе, чтоб подтвердить или опровергнуть данную аналогию, поэтому на эту часть вопроса не отвечаю.


F>Жаль, это самое интересное, а все остальное — просто болтовня для развлечения. Может, ты просто расскажешь, что они хотели сделать с исключениями (что такое семантика возобновления), а те, кто разбираются в Лиспе, сравнят?


См. выше (*). Грубо говоря, примерно так:
void copy_file( path const& source, path const& destination )
{
  if ( file_exists( destination ) )
    throw FileExistsException( destination );
  do_copy_file( source, destination );
}

void f()
{
  . . .
  try {
    copy_file( source, destination );
  }
  catch ( FileExistsException& e )
  {
    delete_file( e.path() );
    resume; // в результате этой инструкции управление вернется обратно в функцию copy_file,
            // в точку, где было выброшено исключение
  }
}

При этом можно заметить, что в коде copy_file есть существенно ненадежный момент: т.к. исполнение может возобновиться после throw, то нужно снова проверить, действительно ли исправлена исключительная ситуация:
void copy_file( path const& source, path const& destination )
{
  while ( file_exists( destination ) )
    throw FileExistsException( destination );
  do_copy_file( source, destination );
}

Однако теперь ненадежность "переехала" в другое место: если вызывающая сторона "полагает", что исключительная ситуация исправлена, а с точки зрения copy_file это не так, то мы (неявно) получим "вечный цикл".

Соответственно, вопрос: почему бы вместо этого "спагетти" не сделать происходящее более явным, передав в copy_file некоторый call-back, позволяющий более организованно обработать данную ситуацию?
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[38]: Что толку в Ада если Ариан 5 все равно упал
От: faulx  
Дата: 14.07.05 04:20
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

F>>По-моему, то, что "ничто не помешает" — это иллюзия. Мешает очень многое, и чем дальше, тем больше.


ПК>Конкретно, что помешает ввести семантику возобновления, если появится такое желание?


Да хотя бы то, что компилятор стал настолько сложным, что вносить в него такие существенные изменения чрезвычайно дорого.

ПК>Случаев использования нет, т.к. семантику возобновления не вводили. Если бы ввели -- ее могли бы начать использовать в тех местах, где вполне можно без этого обойтись.


Это можно сказать о любом элементе языка. Я говорю о том, что решение о не-включении семантики возобновления было принято, исходя из анализа сравнительно небольшого объема программ, написанных на другом языке. Причем степень квалифицированноси и достоверности того анализа теперь очень трудно проверить. Возможно, в том языке эту семантику было сложно, неудобно или опасно использовать — но это лишь свойство того конкретного языка (кстати, какого?).

F>>Может, плохо искали? И потом, в программах на Ассемблере не так-то просто найти use case, который привел бы к появлению, скажем, Koenig lookup rule в С++


ПК>Опять аналогии... Давай ты приведешь конкретные use cases, если о них знаешь, а?


Чуть ниже. Пример из Practical Common Lisp, он же повторяется в Википедии.

ПК>См. выше (*). Грубо говоря, примерно так:

ПК>
ПК>void copy_file( path const& source, path const& destination )
ПК>{
ПК>  if ( file_exists( destination ) )
ПК>    throw FileExistsException( destination );
ПК>  do_copy_file( source, destination );
ПК>}

ПК>void f()
ПК>{
ПК>  . . .
ПК>  try {
ПК>    copy_file( source, destination );
ПК>  }
ПК>  catch ( FileExistsException& e )
ПК>  {
ПК>    delete_file( e.path() );
ПК>    resume; // в результате этой инструкции управление вернется обратно в функцию copy_file,
ПК>            // в точку, где было выброшено исключение
ПК>  }
ПК>}
ПК>

ПК>При этом можно заметить, что в коде copy_file есть существенно ненадежный момент: т.к. исполнение может возобновиться после throw, то нужно снова проверить, действительно ли исправлена исключительная ситуация:
ПК>
ПК>void copy_file( path const& source, path const& destination )
ПК>{
ПК>  while ( file_exists( destination ) )
ПК>    throw FileExistsException( destination );
ПК>  do_copy_file( source, destination );
ПК>}
ПК>

ПК>Однако теперь ненадежность "переехала" в другое место: если вызывающая сторона "полагает", что исключительная ситуация исправлена, а с точки зрения copy_file это не так, то мы (неявно) получим "вечный цикл".

ПК>Соответственно, вопрос: почему бы вместо этого "спагетти" не сделать происходящее более явным, передав в copy_file некоторый call-back, позволяющий более организованно обработать данную ситуацию?


Это действительно похоже на систему condition'ов и restart'ов в Лиспе, только там это, кажется, более упорядочено. Там при бросании исключения (condition'а) можно предоставить несколько способов исправления ситуации (они называются restart'ами, нечто похожее на предложенный callback, только таких сallback'ов может быть несколько, и определяет их функция нижнего уровня). Затем при возобновлении можно указать, какой именно restart выбирать.

Примеры:

1. Функция обработки записей в некотором логе. Иерархия функций следующая: функция log_analyzer получает список логов и анализирует каждый с помощью функции analyze_log. Функция analyze_log открывает файл лога, считывает оттуда записи с помощью функии parse_log_file и возвращает список этих записей, закрыв предварительно файл. Функция parse_log_file считывает строки из файла и обрабатывает каждую строку функцией parse_log_entry, которая возвращает объект, представляющий запись в логе. (Псевдо)графически это выглядит так:

log_analyzer
     |
     +---> analyze_log
               |
               +---> parse_log_file
                           |
                           +---> parse_log_entry


Что делать, если функция самого нижнего уровня, parse_log_entry, не может "распарсить" строку? Вариантов может быть несколько: остановить всю работу, пропустить строку (возможно, выдав предупреждение), вернуть NULL, вернуть специально выделенный объект, попросить пользователя исправить запись и т.д. Даже если в данном конкретном приложении можно ограничиться только одним вариантом, функцию parse_log_entry можно повторно использовать в другом контексте, где нужен другой вариант обработки (возможно, не один, в зависимости от настроек и пожеланий пользователя).

Далее, решение о выборе того или иного варианта обработки надо принимать на достаточно высоком уровне (возможно, на уровне функции log_analyzer). Но тащить на этот уровень детали реализации нижележащих функций — нарушение инкапсуляции, да и попросту некрасиво. Именно здесь-то и помогают restart'ы. Функция parse_log_entry определяет возможные виды возобновления, при возникновении ошибки бросает condition, и ждет, пока кто-нибудь вышестоящий не укажет, что ей делать дальше. Функция log_analyzer может получить список доступных restart'ов и, например, предоставить их выбор пользователю.

2. С помощью той же системы делаются предупреждения. Если по ходу работы функции надо выдать предупреждение, вместо того, чтобы самостоятельно вызывать printf, cout << или MessageBox, можно бросить предупреждение, которое поймает вышестоящая функция, которая уже знает, что делать с этими предупреждениями, а выполнение продолжится, как ни в чем не бывало.

3. Еще пример есть в другой главе, но ее я еще толком не читал и подробно объяснить подробно не смогу.

Собственно, примеров можно подобрать еще кучу. Признаюсь, что сам я эту систему никогда не использовал, поэтому личных впечатлений от нее не дам, но выглядит, кажется, довольно впечатляюще. Впрочем, едва ли ее могли в полном объеме реализовать в С++, так что, возможно, мы потеряли не так уж много.
Re: Что толку в Ада если Ариан 5 все равно упал
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 24.10.05 13:15
Оценка: 12 (1) +1 :)
Здравствуйте, eao197, Вы писали:

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


E>Что-то в этой ветке часто упоминается, что есть языки, в которых выход за пределы массива четко и точно отлавливается в run-time. И говорится, что это круто, и что из-за отсутствия таковой возможности C/C++ must die! При этом хотелось бы напомнить, что эта возможность Oberon/Java/C# хороша только при отладке. Если такая ошибка возникает во время эксплуатации, последствия от нее что в C/С++, что в Oberon/Java/C# будут КАТАСТРОФИЧЕСКИМИ.


Блин, сейчас читаю главу из книги Наука отладки
Автор: eao197
Дата: 24.10.05
и медленно выпадаю в осадок после каждого параграфа. Там не только собраны все примеры, перечисленые в этой теме, но и еще других добавлено. Сильная вещь.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
оффтоп
От: ie Россия http://ziez.blogspot.com/
Дата: 24.10.05 16:49
Оценка: 6 (1) :))
Здравствуйте, AVC, Вы писали:

AVC>Я не думаю, что C++ must die! Это Вы меня прямо оклеветали.

AVC>Я думаю, что C++ is dead.
AVC>Говорят, что если петуху отрубить голову, он еще может носиться по двору. Вот C++ и носится... А потом бряк — и уже вверх ногами!

Ага, был я свидетелем такого действа. Жили на базе отдыха в домике сторожей. Те держали всякую мерзкую и не очень живность. Как-то решили курицу аль петуха (не помню уже) завалить на обед. Пацаны (т.е. мы) прознали об этом и прибежали посмотреть, как над петухами суд вершится. Во всей красе описывать не буду, но как только голова отлетела, тело вырвалось и побежало. Да так побежало, как живые не бегают. Дядя Саша (так звали сторожа) схватился за ружье (а мы то не понимали, зачем он ружье с собой потащил) и начал целиться в удаляющееся в сторону водохранилища тело. Надо заметить тело бежало по достаточно извилистой, не слишком широкой тропинке с грациозностью горнолыжника огибая стоящие по краям тропинки деревья. Дядя Саша промазал, но и тело до берега так и не добежало, остановилось в метрах 15 от воды, опорожнилось и рухнуло наземь. Обедать я отказался

P.S. Все вышенаписаное к С++ и другим ЯП отношения не имеет
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.