2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5, 6  След.
 
 
Сообщение20.03.2006, 19:04 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Далеко же мы отошли от стандарта С++, однако.

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

Я часто привожу пример: допустим у нас есть множество возможностей языка. Для выполнения прожекта мне нужно другое множество. Эти два множества, пересекаясь, дают три сегмента: возможности используемые в прожекте, возможности, отсутсвующие в языке, но нужные для прожекта, и возможности, не используемые в прожекте.

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

На неиспользуемые возможности языка обращают куда меньшее внимание. Хотя их влияние весьма многогранно. Первый -- статический аспект -- состоит в том, что компилятор считает правильной программой то, что человек зачастую считает ошибочной (вопросы такого типа часты у новичков -- а как это вообще скомпилировалось?!). В результате ошибка оказывается незамеченной, в лучшем случае до времени отладки (классический пример времен Фортрана-4: FOR 30 I = 1,5, где по ошибке запятая была заменена на точку, и оператор цикла стал операторм присваивания FOR30I = 1.5). С другой стороны, становяться менее понятными сообщения компилятора о синтаксических ошибках (если вообще понятными), поелику очень часто ошибка формулируется в терминах и конструкциях неизвестных программисту. В динамическом же плане неиспользуемые конструкции зачастую удорожают поведение используемых, причем иногда весьма заметно.

Поэтому идеальна ситуация, когда максимальна именно средняя часть. Когда мы минимум моделируем и максимум используем. Такого, понятно, не бывает, но к этому стремиться развитие. В частности, goto все таки уходит из програм. Не только и не столько потому, что вреден, а потому что его функция (там где он был полезен) теперь выполняется "структурными" операторами управления циклом (break, continue) и обработкой исключительных ситуаций. Да и то -- Вам никогда не нужно было прервать два цикла? И сколько это кода городило?

А сужение языка (оператор paradigm) так же нужны, как и описания int i -- то есть, не нужны вовсе. Как показывает практика, строгая типизация значений (но не переменных) работает очень хорошо, и не приводит к увеличению количества ошибок. Но декларации, подобные вышеприведенной, становятся не нужными. Программы, написанные нормальными людьми, остаются весьма читаемыми. По видимому, программисту нужно очень мало костылей (типа венгерской нотации).

 Профиль  
                  
 
 
Сообщение20.03.2006, 21:34 
Заслуженный участник
Аватара пользователя


16/03/06
406
Moscow
незванный гость писал(а):
:evil:
Ваша философия, по-видимому, что язык должен вести програмиста на помочах.

Не моя. Я просто констатирую реалии: языки развиваются в сторону "помочей". И мы не можем этому помешать.

Цитата:
ДА и то -- Вам никогда не нужно было прервать два цикла? И сколько это кода городило?

Да, вот и тут в Джаве имеется элегантное решение. Брейком можно прервать и два и 10 циклов.

 Профиль  
                  
 
 
Сообщение20.03.2006, 22:23 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Dims писал(а):
незванный гость писал(а):
:evil:
Ваша философия, по-видимому, что язык должен вести програмиста на помочах.

Не моя. Я просто констатирую реалии: языки развиваются в сторону "помочей". И мы не можем этому помешать.

Я по другому оцениваю реалии. Мне кажется, что языки задают скорее броуновское движение, а изменение практики -- лишь результат дрейфа. Языки закрепляют устоявшуюся практику, а не диктуют ее. Этот сайт -- тому пример. Хотите -- можно начать такой же проект для Java или любого другого языка.

Концепции в языках -- либо устоявшиеся, либо те, что автор считает положительными. А дальше -- одно из трех. Они либо оказываются успешными, либо язык умирает, либо язык меняется (ну не было в Java ничего напоминавшего С'шные template, так появилось).

Хотите другой пример -- извольте. Рассмотрите концепцию обработки строк. Какой прогресс в С по сравнению с PL/1 (хи-хи :lol:, и весьма мерзко притом). Сколько переполненных буферов и индексов за границами массивов! Зато теперь мы медленно и мучительно избавляемся от этой ошибки 35-летней давности. (А может и не ошибки -- кто знает? Может, именно это и позволило нам оказаться сейчас там, где мы есть. А без этого бы костяшки на счетах гоняли. В любом случае, концепция строки в современных языках (а я считаю С++ устаревшим) куда ближе к PL/1, чем к С.)

А мешать? К чему? Мне не нравиться Perl, и я его избегаю. Мне нравиться Python, и я им пользуюсь. А организация рассматривает цену разработки (включая цену персонала и ресурсов), и тоже выбирает.

 Профиль  
                  
 
 
Сообщение20.03.2006, 22:38 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Dims писал(а):
Цитата:
ДА и то -- Вам никогда не нужно было прервать два цикла? И сколько это кода городило?

Да, вот и тут в Джаве имеется элегантное решение. Брейком можно прервать и два и 10 циклов.

Этому "элеганному" решению лет под 30. Я его видел в Автокоде Эльбрус (примерно 1976 год) под названием "структурный переход". Интересная элегантность -- вводить метки только ради операторов break и continue...

 Профиль  
                  
 
 
Сообщение21.03.2006, 11:01 
Заслуженный участник
Аватара пользователя


16/03/06
406
Moscow
Я не говорил, что Джава в этом нова. Просто там это есть. Это, фактически, не метки, а идентификаторы блоков. И break, например, переходит не на "метку", а за конец блока с указанным именем.

 Профиль  
                  
 
 
Сообщение21.03.2006, 11:06 
Заслуженный участник
Аватара пользователя


16/03/06
406
Moscow
незванный гость писал(а):
ну не было в Java ничего напоминавшего С'шные template, так появилось

Я об этом не слышал. На мой взгляд шаблон -- это базовый класс. Зачем Джаве такое явление, когда там уже есть базовые классы?

Цитата:
Хотите другой пример -- извольте. Рассмотрите концепцию обработки строк. Какой прогресс в С по сравнению с PL/1 (хи-хи :lol:, и весьма мерзко притом).

Не знаю PL/1. Но Си -- это, фактически, макроассемблер. Там можно было писать и видеть в уме машинный код, который получается. От того и такие строки.

И всё-таки, я не понял, как Вы аргументируете отсутствие стремления языков стать "помочами"?

 Профиль  
                  
 
 
Сообщение21.03.2006, 14:06 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Dims писал(а):
незванный гость писал(а):
ну не было в Java ничего напоминавшего С'шные template, так появилось

Я об этом не слышал. На мой взгляд шаблон -- это базовый класс. Зачем Джаве такое явление, когда там уже есть базовые классы?


Все-таки спрошу (хотя рискую выглядеть глупо :) ) : Чем базовые классы в Java отличаются от базовых классов С++ (но не шаблонов С++)? Я думал, что базовый класс - это класс, от которого можно производить потомков. В С++ шаблонный класс - это [b]параметризованный[\b] класс, т.е типы членов шаблонного класса и типы значений, принимаемых и возвращаемых функциями-членами класса могут быть неопределены до создания этого класса.
В Java базовые классы тоже могут иметь параметры?

 Профиль  
                  
 
 
Сообщение21.03.2006, 15:11 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Я готов сформулировать еще короче -- одной из основных идиом (pattern) применения шаблонов (template) является необходимость параметризации типом. В тех языках, где тип можно передать параметром, шаблоны отсутствуют. В Java шаблоны в большей степени соответствуют generics.

 Профиль  
                  
 
 
Сообщение21.03.2006, 15:20 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Dims писал(а):
Это, фактически, не метки, а идентификаторы блоков. И break, например, переходит не на "метку", а за конец блока с указанным именем.

1) Я не вижу глубокой разницы между именованием оператора (это не совсем корректно называть блоком) и меткой. Не идентифицирует ли метка место (оператор) в программе?

2) Хорошо, именнованные операторы. Скажите, Вы считаете элегантным введение именования операторов только ради break и continue? На мой взгляд, это скорее неуклюже.

3) Я не утверждал, что break эквивалентен goto. Я утверждал что break -- разновидность структурного перехода. Именно break, continue и обработка исключительных ситуаций (а совсем не if, for и while) сделали goto ненужным.

 Профиль  
                  
 
 
Сообщение21.03.2006, 15:31 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Dims писал(а):
Но Си -- это, фактически, макроассемблер

И С++ -- тоже, в общем, язык без особых претензий на высокий уровень. :lol: Так, макроассемблер... Потому и ++ постфиксный, что С изменяется, а возвращаемый язык остается :D

А заметили ли вы, господа, как тяжело и медленно меняются привычки людей? К началу 80х уже было понятно что операторы управления имеют скобочную структуру (куда уж дальше -- в VB попало!), а и Java, и С# в своем стремлении быть знакомыми среднему программисту тянут эти кривые (в переносном и в прямом -- фигурные) скобки. И ничего, акромя ошибок, они в программу не вносят. Велика сила привычки! (Только не говорите, что авторы этих языков не знали концепции рамочной структуры операторов. Я этих людей уважаю, и верю, что они вполне сознательно шли на компромис -- им нужно было избежать отчуждения языка. Они и так многое ломали.)

 Профиль  
                  
 
 
Сообщение21.03.2006, 16:06 
Заслуженный участник
Аватара пользователя


16/03/06
406
Moscow
Sanyok писал(а):
Чем базовые классы в Java отличаются от базовых классов С++ (но не шаблонов С++)? Я думал, что базовый класс - это класс, от которого можно производить потомков.

Ничем не отличаются. Точнее говоря, в Джаве базовые классы даже Уже (дарение на первую букву), чем в Си++. И именно это обнажает тот факт, что шаблоны, по сути выполняют ту же задачу, что и базовые классы.

Цитата:
В С++ шаблонный класс - это [b]параметризованный[\b] класс, т.е типы членов шаблонного класса и типы значений, принимаемых и возвращаемых функциями-членами класса могут быть неопределены до создания этого класса.
В Java базовые классы тоже могут иметь параметры?

Нет. Просто Джава решает ту же задачу объектными приёмами.

В Джаве все функции класса, что называется на языке Си++ -- виртуальны. То есть, вызвав её по отношению к объекту неизвестного класса (базового), мы вызовем фактически функцию того потомка, в котором она действительно определена.

Какова основная задача шаблонов в Си++? Мы пишем, допустим, алгоритм сортировки, не зная заранее, объекты какого типа будем сортировать. Мы описываем костяк алгоритма (шаблон), а потом указываем, для какого типа мы его воплощаем. То есть, задача шаблонов -- написать один и тот же алгоритм для разных классов.

В Джаве вы пишем алгоритм сортировки, но пишем его для объектов базового класса. Этот базовый класс содержит неинициализированную виртуальную функцию для сравнения. Именно её компилятор "видит", когда проверяет алгоритм. Потом, при реальной сортировке, мы передаём алгоритму массив не базовых классов, а их наследников. В результате сортировщик работает как надо.

Самый лучший пример -- стандартные библиотеки контейнеров и тому подобных вещей. В Си++ она реализована на шаблонах, в Джаве -- не классах.

 Профиль  
                  
 
 
Сообщение21.03.2006, 16:08 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Dims писал(а):
И всё-таки, я не понял, как Вы аргументируете отсутствие стремления языков стать "помочами"?

Я просто думаю, что Вы ставите телегу впереди лошади. Сначала определяется практика хорошего программирования, потом она закрепляется в языках.

Возьмите эволюцию goto. Он появился на самой заре использования компьютеров, в Фортране. Вот Фортран таки был фиговым листком на машинном коде (я не имею в виду современные его разновидности, типа Fortran2003. Я говорю о FORTRAN II). Уже Algol-58 (после пересмотра -- Algol-60) предложил лучшие структуры управления. Появилось структурное программирование. goto стал использоваться меньше. Но не перестал, поскольку существовало по крайней мере две ситуации, когда никакого другого предложения не было -- прерывание цикла и обработка ошибочной ситуации. В С++ обе эти проблемы уже решены, но goto еще никто не отменяет -- во первых, С++ пытается быть совместимым с С, а во вторых -- еще до конца не понятно, нужен ли он для чего-то еще. И Java делает вывод -- уже не нужен.

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

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

Беда состоит в том, что использование языка без goto еще не делает программирование структурным. А использование Java или Ruby -- объектно ориентированным. Язык -- всего лишь меню. Обед Вы заказываете сами.

 Профиль  
                  
 
 
Сообщение21.03.2006, 16:09 
Заслуженный участник
Аватара пользователя


16/03/06
406
Moscow
незванный гость писал(а):
2) Хорошо, именнованные операторы. Скажите, Вы считаете элегантным введение именования операторов только ради break и continue? На мой взгляд, это скорее неуклюже.

Вы забываете, что у нас уже есть два таких случая -- функции и классы. Это ведь тоже, ни что иное, как именованные блоки операторов. В сочетаниями с этими двумя случаями, картина становится стройней. break -- это просто return, который позволяет выйти из блока не в его конце, а в любом месте.

 Профиль  
                  
 
 
Сообщение21.03.2006, 16:20 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Dims писал(а):
Нет. Просто Джава решает ту же задачу объектными приёмами.

Зачем нужны шаблоны для сортировки -- вопрос большой, поскольку стандартная функция qsort() в библиотеке С свободно обходится без них.

Делать контейнер для базового класса и говорить, что это решает все задачи -- скажем тактично, неосторожно. Пример тому -- Collection в VB6. Которая была таким универсальным контейнером. И который было правилом хорошего тона оборачивать своим кодом для типизации.

Если же Вы считаете, что все было так хорошо, попытайтесь ответить на вопрос -- зачем же в Java были введены (поздно, далеко не в первой версии) generics?

И еще -- обратите внимание. Шаблоны появились после OO. Они добавлялись в ОО языки (в С++, в Java). Может ли это быть потому, что шаблоны -- пост-ОО концепция?

 Профиль  
                  
 
 
Сообщение21.03.2006, 16:22 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Dims писал(а):
незванный гость писал(а):
2) Хорошо, именнованные операторы. Скажите, Вы считаете элегантным введение именования операторов только ради break и continue? На мой взгляд, это скорее неуклюже.

Вы забываете, что у нас уже есть два таких случая -- функции и классы. Это ведь тоже, ни что иное, как именованные блоки операторов. В сочетаниями с этими двумя случаями, картина становится стройней. break -- это просто return, который позволяет выйти из блока не в его конце, а в любом месте.

И что, можно break функцию? Или класс?!?

break -- это не просто return. Заметьте, Вы не можете написать его вне цикла -- там он не нужен, есть и другие операторы. Хотя -- чем был бы плох такой код?
Код:
  label: if (cond1) {
     ...
     if (cond2) {
       ...
       if (cond3) break label;
       ...
     }
     ...
  }
Круто! И ничуть не отличается от цикла. Однако нет этого в языке. Неужели не догадались?

По моему, и методы и классы а) имеют другую семантическую нагрузку и б) имеют абсолютно другой синтаксис. Вы чего-то все перемешали...

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 87 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group