Честно говоря, дальше с вам спорить не считаю нужным. Если вы помните, этот спор начался с того, что мне было интересно узнать про трудности с указателями. Я узнал, но не проникся, видимо мне они пока серьезных проблем не доставляли.
Если вам по какой-то причине нужен оберон, хорошо, что он есть, мне Оберон не нужен, может пока, может вообще.
P.S. Просто раздражает, когда Оберон (и иже с ними) выставляют в виде некой панацеи от всего. Но это не к вам.
Здравствуйте, RailRoadMan, Вы писали:
RRM>Честно говоря, дальше с вам спорить не считаю нужным. Если вы помните, этот спор начался с того, что мне было интересно узнать про трудности с указателями. Я узнал, но не проникся, видимо мне они пока серьезных проблем не доставляли.
Это совершенно нормально.
На самом деле, дискуссии должны просто вести к лучшему взаимопониманию.
(И нет никакой нужды доводить их до утрированных выводов вроде — X абсолютно прав, а Y окончательно и безнадежно неправ! Зачастую сам предмет и не допускает таких выводов.)
RRM>Если вам по какой-то причине нужен оберон, хорошо, что он есть, мне Оберон не нужен, может пока, может вообще.
OK.
Я с самого начала говорил, что и не собираюсь лишать программистов их любимых инструментов.
RRM>P.S. Просто раздражает, когда Оберон (и иже с ними) выставляют в виде некой панацеи от всего. Но это не к вам.
Согласен, это может раздражать.
Но, ради объективности, скажу, что некоторую "упертость" проявили обе стороны. (Я имею в виду обсуждение Оберона в целом. Увы, я и сам не исключение. )
Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, AVC, Вы писали:
AVC>>Правда, в Обероне таких проблем вообще нет. (Он просто грамотно сделан.) AVC>>Но ведь это такой скучный язык. AVC>>А вот Си++ — это романтика. К>На самом деле, указатели в Си — с одной стороны, крайне небезопасный, а с другой — очень выразительный механизм, в том числе — механизм абстракции. К>Как в языках со слабой типизацией абстрагируются от типа данных, так в Си (ещё не С++) — от размещения данных. К>В обоих случаях — это паттерн "простота (хуже воровства)", для слабо типизированных языков — получается более простой транслятор, для Си — облегчённый рантайм.
Мысль понятна.
Но согласиться с ней трудно.
Действительно, рантайм в Си "облегченный" (и "облегчается" он, похоже, в самых неожиданных местах оперативной памяти. ).
Но вот только компиляторы Си "весят" больше, чем компиляторы Оберона, и код в них — запутаннее. (Си++ я, по понятным причинам, вообще не упоминаю.)
К>Красивое развитие идеи указателей — это итераторы STL. Хотя с таким же, а то и с большим успехом можно было вместо итераторов ввести понятие "диапазон", и такие попытки делаются.
Согласен.
Вероятно, именно STL дала новую жизнь Си++.
На удивление, именно адресная арифметика и перегрузка операторов хорошо вписываются в STL.
(Здесь сишный синтаксис отпразновал незапланированный успех.)
Но, с другой стороны, это означает, что все соответствующие дефекты Си/Си++ проникли (как этакие синтаксические вирусы ) в STL, boost и т.д.
К>Оберон — да, действительно скучный язык. Типизацией по пальцам надавал, размещением по пальцам надавал, а средств абстракции — не надавал
Сорока-ворона кашу варила...
Почему же это вдруг не надавал?
Модули и расширение типов позволяют реализовать любую абстракцию.
Причем инкапсуляция не в пример лучше, чем в Си++.
(Дискуссию о плюсах и минусах перегрузки операторов пока разворачивать не будем. Я знаю диалекты Оберона, где такая перегрузка есть. Но вот хорошо ли это?)
Вообще, для меня в языках программирования очень важна возможность введения абстрактных типов данных.
Даже мое первый пост на RSDN был именно об АТД (и их связи с математическими моделями; я же все-таки прикладной математик).
Многие программисты почему-то думают, что настоящая абстракция возможна только на Си++.
Побывал недавно в своей старой конторе. (Там где все сидели в отладчике Watcom C++. ) Сказал, что увлекся Обероном. До драки дело не дошло (я всерьез опасался ). Но народ удивлялся и ссылался как раз на мою страсть к АТД и математизированному подходу. А я отвечал: в Обероне все есть (как в Греции ).
Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.
Здравствуйте, Дарней, Вы писали:
AVC>>Возможно. Важны факторы, принимаемые во внимание. Д>и как ни странно, в число этих факторов никогда не входили такие параметры, как "чистота", "стройность" языка, и прочие спорные вещи
А также такие спорные вещи как "простота" и "корректность".
AVC>>И какая, пардон, связь? AVC>>Вас же не удивляет компиляция в машинный код? AVC>>А теперь представьте себе, что какой-нибудь компьютер "понимает" Си++, Си или даже (вот ужас! ) Оберон. Д>Связь в том, что просто перевод с одного языка на другой не даст тебе работающую программу. Это — ничтожно малая часть работы, а дьявол — он совсем в другом. Д>Например, перенос программы с C++ под Windows на тот же C++, но под Linux — это очень большой объем работы. Странно, не правда ли?
В свое время я писал приличное по размерам графическое приложение под Windows.
Чтобы проверить, насколько я хорошо отделил представление от собственно модели, попросил товарища помочь с переносом под X-Windows (Linux).
Весь перенос заключался в замене реализации нескольких графических классов и занял 2 часа.
Странно, не правда ли?
AVC>>Т.к. я многодетный отец , то этот вопрос для меня не праздный. AVC>>Плюс — у моей жены есть медицинское образование. Д>А это уже смахивает на паранойю.
Что именно смахивает на паранойю? Дети? Медицинское образование? Образование в принципе?
AVC>>"Тешь себя, тешь себя" (поглаживает) (с) "Ирония судьбы" Д>Не смешите мои тапочки. Эта тема уже десять раз тут обсасывалась. Ключевые слова для поиска — "мощность языка"
Или "глюкавость".
Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.
Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.
Здравствуйте, AVC, Вы писали:
AVC>А также такие спорные вещи как "простота" и "корректность".
Простота — она нередко хуже воровства. А "корректность" в случае ЯП... приведите ка определение этого термина, пожалуйста
AVC>В свое время я писал приличное по размерам графическое приложение под Windows. AVC>Чтобы проверить, насколько я хорошо отделил представление от собственно модели, попросил товарища помочь с переносом под X-Windows (Linux). AVC>Весь перенос заключался в замене реализации нескольких графических классов и занял 2 часа. AVC>Странно, не правда ли?
Единственный вариант, который здесь есть — это написание собственной кроссплатформенной оболочки, и написание программы поверх нее.
Поэтому уточни еще — сколько времени ты затратил на разработку этой оболочки ДО этих двух часов?
AVC>Что именно смахивает на паранойю? Дети? Медицинское образование? Образование в принципе?
Утверждение, что некие большие компании намеренно портят людям здоровье. В нашей стране конечно всякое возможно, но не до такой степени. Пока что
AVC>Или "глюкавость".
Сергей Губанов пишет:
> C>А ты простестируй > Может еще и рабочий код приведете? > А то, знаете-ли, Ваш код: > >SomeObject *obj = new SomeObject(); >static int ref = (int)obj; > > в оберонах не компилируется.
А с помощью System.Move разве передвинуть 4 байта из указателя в int нельзя?
Здравствуйте, Кодт, Вы писали:
К>На самом деле, указатели в Си — с одной стороны, крайне небезопасный, а с другой — очень выразительный механизм, в том числе — механизм абстракции. К>Как в языках со слабой типизацией абстрагируются от типа данных, так в Си (ещё не С++) — от размещения данных. К>В обоих случаях — это паттерн "простота (хуже воровства)", для слабо типизированных языков — получается более простой транслятор, для Си — облегчённый рантайм.
В Обероне указатели есть (POINTER TO), но адресов и адресной арифметики нет. И именно из-за отсутствия адресов механизм абстракции не очень выразительный. Странно...
С другой стороны в оберонах есть элементарный тип "множество", которого нет в Си/Си++/Java/C#, а в языке Си даже нет булевского типа. А выразительность значит меньше. Опять странно...
Кстати про множества, а почему элементарный тип bool в языки C++/Java/C# все-таки ввели, а элементарный тип "множество" проигнорировали?
Как интересно в Си/Си++/Java/C# работают с битами? Наверное там битовые операции применяют прямо к числам? Вот несчастные программисты, как они там мучаются — ведь в Си/Си++/Java/C# множество битов и числа — это одно и тоже, хотя спроси любого математика так он ответит, что число — это одна математическая абстракция (теория чисел), а множество — совсем другая (теория множеств).
VAR s1, s2, s3: SET;
n, m: INTEGER;
BEGIN
s1 := {0,1,2,3}; (* Первые четыре бита = 1, остальные 32-4 = 28 битов равны 0 *)
s2 := s1;
n := 13;
m := 2;
INCL(s2, n); (* n-тый бит теперь равен 1 *)
EXCL(s2, m); (* m-тый бит теперь равен 0 *)
s3 := s1 + s2 + {25, 26}; (* Объединение трех множеств. В объединеном множестве присутсвуют все элементы присутсвующие во всех объединяемых множествах *)
s3 := s1 * s2; (* Пересечение множеств - остаются только элементы присутсвующие и в первом и во втором множестве *)
s3 := s1 - s2; (* Разность множеств. Из вычистаемого множества удаляются элементы присутсвующие в вычитаемом множестве *)
s3 := s1 / s2; (* Симметричная разность множеств. Объединение разностей множеств s1 / s2 = (s1 - s2) + (s2 - s1) *)
m := ORD(s3); (* Sum i IN s3: 2^i *)
s1 := BITS(n); (* {i | ODD(n DIV 2^i)} *)
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Как интересно в Си/Си++/Java/C# работают с битами? Наверное там битовые операции применяют прямо к числам? Вот несчастные программисты, как они там мучаются — ведь в Си/Си++/Java/C# множество битов и числа — это одно и тоже, хотя спроси любого математика так он ответит, что число — это одна математическая абстракция (теория чисел), а множество — совсем другая (теория множеств).
К тому же еще если для битовых операций использовать числа, то программа будет не переносимой между big и little endian архитектурами процессоров.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>К тому же еще если для битовых операций использовать числа, то программа будет не переносимой между big и little endian архитектурами процессоров.
Неправда. Логическая нумерация битов не зависит от xz-endian; операции "сдвиг вправо/влево" подразумевают логический порядок арабской записи чисел: старшие разряды слева, младшие справа.
Сложности переноса между платформами возникают из-за того, что различается байтовое представление длинных чисел.
Ну а если бы некоторый процессор использовал не IEEE-шный формат float и double, тогда что, по-твоему, и от плавающей арифметики откажемся?
Здравствуйте, Сергей Губанов, Вы писали:
К>>На самом деле, указатели в Си — с одной стороны, крайне небезопасный, а с другой — очень выразительный механизм, в том числе — механизм абстракции. К>>Как в языках со слабой типизацией абстрагируются от типа данных, так в Си (ещё не С++) — от размещения данных. К>>В обоих случаях — это паттерн "простота (хуже воровства)", для слабо типизированных языков — получается более простой транслятор, для Си — облегчённый рантайм.
СГ>В Обероне указатели есть (POINTER TO), но адресов и адресной арифметики нет. И именно из-за отсутствия адресов механизм абстракции не очень выразительный. Странно...
Сергей Губанов wrote:
> С другой стороны в оберонах есть элементарный тип "множество", которого нет в Си/Си++/Java/C#, а в языке Си даже нет булевского типа. А выразительность значит меньше. Опять странно... > > Кстати про множества, а почему элементарный тип bool в языки C++/Java/C# все-таки ввели, а элементарный тип "множество" проигнорировали?
Не такой уж он элементарный. В С++ есть куча шаблонов множеств для разных сценариев использования: std::bitset, boost::dynamic_bitset, std::vector<bool>, std::set и до кучи std::multiset — множество с повторениями.
> Как интересно в Си/Си++/Java/C# работают с битами? Наверное там битовые операции применяют прямо к числам?
По всякому. Иногда действительно битовыми операциями с числами, иногда с bitset, иногда с bit fields.
> Вот несчастные программисты, как они там мучаются — ведь в Си/Си++/Java/C# множество битов и числа — это одно и тоже, хотя спроси любого математика так он ответит, что число — это одна математическая абстракция (теория чисел), а множество — совсем другая (теория множеств). > >
> VAR s1, s2, s3: SET;
Эээ, а что, в Обероне множества не типизированы?
> n, m: INTEGER;
> BEGIN
> s1 := {0,1,2,3}; (* Первые четыре бита = 1, остальные 32-4 = 28 битов равны 0 *)
> s2 := s1;
> n := 13;
> m := 2;
> INCL(s2, n); (* n-тый бит теперь равен 1 *)
Эээ, а если написать INCL(s2, 4000000000), то будет поднят бит № четыре миллиарда?
> EXCL(s2, m); (* m-тый бит теперь равен 0 *)
> s3 := s1 + s2 + {25, 26}; (* Объединение трех множеств. В объединеном множестве присутсвуют все элементы присутсвующие во всех объединяемых множествах *)
> s3 := s1 * s2; (* Пересечение множеств - остаются только элементы присутсвующие и в первом и во втором множестве *)
> s3 := s1 - s2; (* Разность множеств. Из вычистаемого множества удаляются элементы присутсвующие в вычитаемом множестве *)
> s3 := s1 / s2; (* Симметричная разность множеств. Объединение разностей множеств s1 / s2 = (s1 - s2) + (s2 - s1) *)
> m := ORD(s3); (* Sum i IN s3: 2^i *)
> s1 := BITS(n); (* {i | ODD(n DIV 2^i)} *)
>
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Как интересно в Си/Си++/Java/C# работают с битами? Наверное там битовые операции применяют прямо к числам? Вот несчастные программисты, как они там мучаются — ведь в Си/Си++/Java/C# множество битов и числа — это одно и тоже, хотя спроси любого математика так он ответит, что число — это одна математическая абстракция (теория чисел), а множество — совсем другая (теория множеств).
Вот ты для разнообразия и спроси математика, какими способами можно представить множества...
Навскидку:
— предикат как чёрный ящик
— предикат как формула
— булев вектор (элементы универсума пронумерованы)
— упорядоченная последовательность (над элементами определено отношение порядка)
— неупорядоченная последовательность (над элементами определено отношение эквивалентности)
Паскалевское (sic! ещё паскалевское, а не обероновское) множество — это булев вектор размерности не более чем 256.
А теперь вопрос, почему нужно тащить в язык такую абстракцию, как множества (пусть даже в каком-то фиксированном виде), но забить на другие абстракции.
К примеру, матрицы. Не просто "двумерный массив", а именно матрицы со всей их алгеброй. Почему в Обероне нет матричной алгебры?
А между прочим, она уже давным-давно реализована на уровне языка: смотри APL, MatLab.
Я даже не прошу тензорную алгебру, бог с ней, она не часто нужна, да и размерности там офигительные. Хотя в минимальном виде (аффиноры) можно было бы.
А куда делись столь нужные 3D-моделистам кватернионы?
И после этого ты ещё осмеливаешься хвалить Оберон?
Кодт wrote:
> СГ>Как интересно в Си/Си++/Java/C# работают с битами? Наверное там битовые операции применяют прямо к числам? Вот несчастные программисты, как они там мучаются — ведь в Си/Си++/Java/C# множество битов и числа — это одно и тоже, хотя спроси любого математика так он ответит, что число — это одна математическая абстракция (теория чисел), а множество — совсем другая (теория множеств). > > Вот ты для разнообразия и спроси математика, какими способами можно представить множества... > Навскидку: > — предикат как чёрный ящик > — предикат как формула > — булев вектор (элементы универсума пронумерованы) > — упорядоченная последовательность (над элементами определено отношение порядка) > — неупорядоченная последовательность (над элементами определено отношение эквивалентности)
— еще порождающая функция — yield'ещая все элементы множества или выставляющая наружу итератор по элементам
Здравствуйте, Костя Ещенко, Вы писали:
>> Вот ты для разнообразия и спроси математика, какими способами можно представить множества... >> Навскидку: >> — предикат как чёрный ящик >> — предикат как формула >> — булев вектор (элементы универсума пронумерованы) >> — упорядоченная последовательность (над элементами определено отношение порядка) >> — неупорядоченная последовательность (над элементами определено отношение эквивалентности)
КЕ>- еще порождающая функция — yield'ещая все элементы множества или выставляющая наружу итератор по элементам
Это уже реализация (в общем случае неупорядоченной) последовательности... Из неё можно тоже наветвить разновидностей. По классификации STL, например
— разрушающее чтение (output iterator) — yield
— последовательный доступ (forward и bidirectional)
— произвольный доступ
Здравствуйте, Кодт, Вы писали:
К>А теперь вопрос, почему нужно тащить в язык такую абстракцию, как множества (пусть даже в каком-то фиксированном виде), но забить на другие абстракции. К>К примеру, матрицы. Не просто "двумерный массив", а именно матрицы со всей их алгеброй. Почему в Обероне нет матричной алгебры?
Справедливости ради, матричная алгебра на Обероне реализуется проще, чем на Си++.
Причина: отсутствие в Си++ многомерных гибких массивов.
В Обероне даже не требуются классы (записи), достаточно массивов.
Я и обратил впервые внимание на Оберон из-за того, что там легко было обобщить методы линейной алгебры для матриц разных размерностей.
Потом уже стало "доходить", что разница между Обероном и Си++ глубже, чем наличие или отсутствие тех или иных фич. Тогда заинтересовался всерьез.
К>А между прочим, она уже давным-давно реализована на уровне языка: смотри APL, MatLab. К>Я даже не прошу тензорную алгебру, бог с ней, она не часто нужна, да и размерности там офигительные. Хотя в минимальном виде (аффиноры) можно было бы. К>А куда делись столь нужные 3D-моделистам кватернионы? К>И после этого ты ещё осмеливаешься хвалить Оберон?
Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.
AVC пишет:
> Справедливости ради, матричная алгебра на Обероне реализуется проще, > чем на Си++.
Агащаз... А как насчет разреженных матриц, например? Причем с прозрачным
для пользователя механизмом переключения представления матрицы
(мультисписок->jagged array->flat array). Чего-то не вижу никакой особой
поддержки языка в этом.
> Причина: отсутствие в Си++ многомерных гибких массивов.
Нафиг они не нужны для библиотеки лин. алгебры.
> К>А между прочим, она уже давным-давно реализована на уровне языка: > смотри APL, MatLab. > К>Я даже не прошу тензорную алгебру, бог с ней, она не часто нужна, да > и размерности там офигительные. Хотя в минимальном виде (аффиноры) > можно было бы.
Еще один частный случай очень редко используемой фичи добавлять в язык?
Ну-ну...
> К>А куда делись столь нужные 3D-моделистам кватернионы? > К>И после этого ты ещё осмеливаешься хвалить Оберон? >
А в С++ это все можно
Здравствуйте, AVC, Вы писали:
AVC>Справедливости ради, матричная алгебра на Обероне реализуется проще, чем на Си++. AVC>Причина: отсутствие в Си++ многомерных гибких массивов. AVC>В Обероне даже не требуются классы (записи), достаточно массивов. AVC>Я и обратил впервые внимание на Оберон из-за того, что там легко было обобщить методы линейной алгебры для матриц разных размерностей. AVC>Потом уже стало "доходить", что разница между Обероном и Си++ глубже, чем наличие или отсутствие тех или иных фич. Тогда заинтересовался всерьез.
В С++, благодаря шаблонам, есть возможность контролировать размеры матриц на стадии компиляции
Кстати, я всё-таки не понял: ARRAY OF ARRAY (без фиксированного размера) — это прямоугольник или рваный край?
Если рваный край, то просто массивов недостаточно, потребуется обвеска хотя бы в виде функций инициалазации. Как и в случае vector<vector<>>.
А если прямоугольник — то действительно, раз — и готово!
Но опять же, в С++ можно сделать код, эквивалентный Обероновскому.
Введём только, с помощью шаблона, тип "двумерный массив".
template<class T>
class array2d
{
public:
int xsize() const;
int ysize() const;
array2d(); // 1*1
array2d(int x, int y);
array2d(const array2d& src);
array2d& operator=(const array2d& src);
T& at(int x, int y);
const T& at(int x, int y) const;
};
Минимально, этого достаточно. Дальше — вагон и маленькая тележка функций, таких же, как в Обероне.