?

Log in

No account? Create an account
о языках программирования - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

о языках программирования [дек. 21, 2004|04:22 pm]
Anatoly Vorobey
«Смолток просто-напросто непрактичен» — пишет dz, наряду с другой ерундой, в своём сравнении Джавы и Смоллтока. Видно, что он просто не очень хорошо понимает, какая это качественная разница — действительное динамическое ООП — если думает, что «есть reflection API, который все ПРАКТИЧЕСКИЕ задачи - решает». Конечно, все практические задачи, которые могут возникнуть в системе, спроецированной статически, он решает, а другие задачи человеку, не понимающему Смоллток и динамическое ООП, и в голову не придут.

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

Как-то это сумбурно звучит, поэтому попробую зайти с другой стороны. Ясно, что есть области применения, в которых некоторые языки подходят куда лучше других. Ясно, что программисты разнятся по своим способностям, качеству и скорости работы, эффективности результата, и прямое сравнение тут невозможно. Если мы учтём все эти «ясно» и попытаемся всё же вынести из за скобки, останется ли внутри что-то объективное, зависящее от языка? И если останется, насколько оно влиятельно?

Во мне, когда я думаю об этом, борются два противоположных хода мысли. С одной стороны, мне хочется сказать, что язык и его особенности часто переоценивают. В конечном итоге всё решает сложность поставленной задачи, переходящая в сложность работы программиста, решающего эту задачу. Язык программирования как бы стоит посредине этого перехода, «амортизируя» часть сложности задачи и принимая её на себя; но использование разных языков хоть и меняет качество этой амортизации, но не слишком значительно, не во много раз. Использование очень разных языков программирования, основанных на разных подходах, может давать преимущество в тех или иных удобных для решения этими подходами задачах; но в случае, если таких удобств или специальных требований нет, их эффективность примерно одинакова, есть только иллюзия особенной эффективности того или иного языка, появляющаяся у программиста, который очень хорошо его знает, привык, притёрся к нему, и действительно для него лично он быстрее и эффективнее всего остального.

С другой стороны, мне хочется сказать, что всё наоборот. Метафора амортизации несостоятельна, т.к. не отражает тот факт, что, глядя на одну и ту же задачу с точки зрения очень разных языков и подходов к программированию, мы видим совершенно разные вещи, и исходная сложность поставленной задачи не является чем-то неизменным, она навязана нам тем взглядом, к которому мы привыкли; при смене языка/взгляда/подхода может оказаться, что всё стало во много раз легче, и это не какой-то особенный случай, вызванный специальными обстоятельствами исходной задачи, а самое обыденное дело. И может оказаться, что какие-то языки с этой точки зрения особенно эффективны, т.е. очень хорошо знающий такой язык программист сможет в среднем работать значительно эффективнее, чем очень хорошо знающий другой язык программист тех же способностей, при работе над той же не-специальной задачей общего направления (естественно, такая точка зрения должна опираться на предположение о возможности определить «задачу общего направления» и «примерно тех же способностей» так, чтобы не впасть в замкнутый круг, и, действительно, неочевидно, что можно это сделать).

В общем, я лично сохраняю скептицизм по этому поводу, и первая из вышеописанных точек зрения в целом побеждает во мне вторую. Ко второй, тем не менее (и вообще к теме разных подходов к программированию, и тому, насколько такие подходы влияют на результаты и эффективность работы программиста) сохраняется живой интерес. Так вот, наиболее убедительные и подтверждённые фактами претензии на особую эффективность любимого языка, которые мне приходилось встречать, проистекали из среды поклонников двух языков: Смоллток и Форт. Не знаю, почему именно эти два, возможно, это больше случайность моего личного знакомства с языками, программистами, и различными сетевыми обсуждениями этой темы, чем какая-то объективная реальность; и, как я написал выше, я вовсе не уверен в том, что такие претензии основаны на чём-то реальном. Но любопытно отметить, что общего в этих двух языках (вообще-то очень разных): именно концептуальная чистота языка («всё — объект» или «всё — макро») и ещё я бы отметил интеграцию языка внутри интерактивной системы, полностью написанной на этом же языке, что-то вроде мини-ОС для языка.
СсылкаОтветить

Comments:
From: 9000
2004-12-21 02:38 pm
есть области применения, в которых некоторые языки подходят куда лучше других

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

в одной магической фразе: 'right tool for the job' :)

Конечно, чтобы выбрать right tool, надо иметь о разных инструментах представление, а лучше -- и практический опыт использования. Это не всегда легко достижимо: обычно от программиста требуют опыта, потому надо вкладываться в некоторый набор всерьёз, а остальные приходится оставлять в рамках хобби.
(Ответить) (Thread)
[User Picture]From: avnik
2004-12-21 03:02 pm
Иногда бывает надежнее писать на том языке, в котором имеешь больше опыта, просто потому что это надежнее....

Я например уже давно хочу обкатать Ocaml в какой нибудь реальной задаче, но пока боюсь делать на нем что-то серьезное, просто потому что знаею его не досконально... Можно упереться в какую нибудь малознакомую мелочь. Хотя то что тривиально пишется на с/с++/перле я в состоянии написать и на окамле.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: kalvado
2004-12-21 02:46 pm
Разрешите не согласиться с - не во много раз..
По крайней мере у меня очень хорошее впечатление от LabView (http://www.ni.com/labview/). Да, для конкретных задач - но для множества инженерно-технически-контрольных...
Я просто писал одно и тоже почти, в разные времена, на Pascal, Delphi i LV - там правда в разы разница ;)
Хотя не все верят что LV- язык программирования..
(Ответить) (Thread)
[User Picture]From: etonei
2004-12-21 03:34 pm
В данном слוучае я не уверен, что сравнение правомочно. avva, если я правильно понимаю, имеет в виду сравнение языков, в которых сильно отличается сама идея на которой язык построен. LabView - это, фактически, набор wrappers для удобного обращения к внешним устройствам + набор специфических controls для ввода-вывода информации (графики, там, тумблера и т.д.) + какие-то блоки, "клей", с помощью которого обеспечивается передача данных между первыми двумя. Так вот, если сравнивать именно языки, то этот самый "клей" ничего концептуально отличающегося по сравнению, например, с C не содержит - просто оформлен графически, а не текстом. Единственное, пожалуй, что выделяется - это что LabView, если ему по рукам вовремя не дать, все что угодно норовит сделать отдельным тредом, но я не думаю, что это может претендовать на звание концепции.

То есть, тут заслуга, скорее, оболочки, чем собственно языка.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: potan
2004-12-21 02:56 pm
Есть еще несколько аспектов, которые стоит расмотреть.
Во первых - защищенноть от ошибок. Даже прекрасные программист, трезвенник и тп может устать, простыть и сделать ошибку. Хорошо если язык позволяет ее найти. Примеры удачных языков в этом отношении есть - например на Haskell очень тяжело сделать ошибку, которую не заметит компилятор. Естественно, это дается не бесплатно - программировать на этом языке часто бывает тяжело.
Во вторых язык не только сам "амортизирует", но и может предоставить возможность добавить свой "амортизатор". В простейшем случае это ограничевается повторным использованием (здесь Смоллток и Форт очень хорошо смотрятся), в общем возможна разработка domain-specific language (здесь преуспели OCaml и Lisp/Scheme).

Кроме того в сравнении Джавы и Смоллтока надо вспомнить про шаблоны. IMHO, основанная на шаблонах система типов позволяет решать все осмысленные задачи, которые решаются динамической типизацией (включая гнилой reflection/RTTI).
(Ответить) (Thread)
[User Picture]From: avnik
2004-12-21 02:58 pm
Кстати -- а что есть domain-specific? А то на окамле пишу -- а про дмейн специфик впервые слышу ;)
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: pendelschwanz
2004-12-21 03:11 pm
Трудно объяснить почему джава лучше, равно как трудно объяснить в России почему демократия лучше. Но попробую.
1. "Правильность" смолтока и форта - понятие чисто религиозное, и из правильности вовсе не следует что эти языки хороши.
2. Язык определяется не только его синтаксисом и грамматикой, но и определяемой этим языком культурой написания программ. так например, язык С(C++) сам по себе очень хороший, но будучи поставляем в комплекте с микрософтовской библиотекой, графомански написанной и омерзительно документированной, он становится плохим, ибо перед программистом встает дилемма - или сочинять АБСОЛЮТНО ВСЕ самому, или дружить с дурно пахнущим слоном. Промежуточного не дано, ибо модули микрософтовской библиотеки завязаны друг с другом как спагетти, и использование одного кусочка означает прмменение всего этого дерьма целиком.
3. Языки ФОРТ и Смоллток позволяют отдельно взятым талантливым хакерам определить свою среду (свою библиотеку, свои обозначения) с самого начала. Это хорошо когда ничего не создано, но отвратительно когда надо поддерживать крупную разработку длящуюся десятки лет. Ни у какого отдельно взятого хакера не хватит терпения изучать творения другого хакера - он скорее все перепишет сам. По сути дела каждая такая среда является Своим собственным языком программирования, а язык программирования - это нечто, что должно учиться не от формальных правил, а подсознательно - самое главное красота и естественность. Программист не может учить сотню языков - в какой-то момент он звереет и создает свой собственный.
4. Джава предлагает может быть и не самый оптимальный, но некоторый стиль программирования при котором наконец-то (!) программы могут жить долго, и одни программисты могут читать и пользоваться трудами других программистов. Преимущество состоит в "естественности стиля". В Джаве есть конечно тоже свои плюхи - например омерзительное EJB и J2EE и весьма сомнительная философия листенеров - но это все семечки по сравнению с тем количеством мерзости, которая налипла на другие языки за десятки лет насильственного внедрения графоманских идей крупными фирмами. Пока Джава пожалуй наилучший язык программирования, хотя и Джава рано или поздно умрет в конвульсиях, засорившись как C++, наносной дрянью.

(Ответить) (Thread)
[User Picture]From: dz
2004-12-21 03:17 pm
Отличный ответ. Спасибо за то, что я избавлен от необходимости это писать тут в сотый раз. :)
(Ответить) (Parent) (Thread)
[User Picture]From: avnik
2004-12-21 03:29 pm
Я наверное таки подпишусь под высказыванием товарища potan о domain-specific языках. Но добавлю от себя про то, что апологетам императивных языков и идеологии ООП неплохо было бы ознакомиться и с концепциями функционального программирования.

Я вот гляжу на поделие наших джавадевелоперов и думаю, а фигли не рассматривать любой диалог с пользователем как функцию 'a -> 'a, где 'a это некий элемент или кортеж данных. Хотя наверное это придумал до меня.
(Ответить) (Thread)
From: 9000
2004-12-21 04:13 pm
Ага, штука с кортежами была стандартной фишкой древнего турбопаскалевсеого TurboVision, где всякий диалог можно было слить в record и гаполнять из него. Типы генерились, конечно, не динамически (не умеет этого паскаль), но тулза для рисования диалогов выдавала весь нужный исходник (определение типа, сливалка, заливалка).
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: dz
2004-12-21 04:07 pm
0. Это ты правильно написал так, чтобы я не увидел. Но мне добрые люди сообщили. :)

1. Ну, начинается всё со стандартного наезда - обычно я его слышу из лагеря функциональщиков: dz типа не сечёт парадигмы, а если б сёк - пёрся бы, как всё круто.

Это всё офигенно, конечно, только я худо-бедно знаю, что такое смоллтоковская парадигма. Я вообще старый и с седыми яйцами, я языки программирования делаю на завтрак. Смолтокообразные в том числе. С абсолютной рефлексивностью в том числе.

"Если бы он втыкал в смолток, он бы придумал задачи для него".

Когда моя жизнь станет ТАК скучна, что мне придётся придумывать задачи - я повешусь. До сих пор задачи мне поставляет окружающий мир. И только это и есть задачи. А то, что ты придумал сам, называется УПРАЖНЕНИЕ или ЭТЮД. Языки Паскаль (оригинальный) и Смоллток (любой) для упражнений и этюдов очень хороши. Хоть и не для всех. (Типа наехал в ответ. Типа нефиг наезжать не по делу, это все умеют.)

Короче: на бочку задачу, для которой Смолток невероятно хорош. (Моя многолетняя практика общения на эти темы показывает, что задача или не появляется, или оказывается весьма академической.)

Конец пункта 1. Краткое содержание пункта 1: Люди, которые прутся от N, склонны считать, что только они по-настоящему понимают N. Они ошибаются.


2. В 1 сказано: есть такая тема - настоящие объектные языки. Завалишин не сечёт, как же они круты. А дальше сказано: правда, я сам не знаю, есть ли вообще между языками разница. Может и нет.

Бабка - ты определись. "dz не сечёт" или "я тут такой весь диалектический в душе, мудро размышляю, где ж истина.".

3. Right tool for the job, как тут уже сказано.

4. Товарищ. Коли ты уже добрался о мыслей о парадигмах и их применимости к конкретным задачам, различай и программистов.

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

Другим требуется полчаса на понимание, а потом пара дней и ЛЮБОЙ язык программирования, чтобы эту парадигму воплотить.

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

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

Я, знаешь, когда мне говорят "ты не понимаешь" раньше смеялся, а теперь уже просто оторопь берёт: вы ПРАВДА считаете, что ЭТО (парадигма смолтока) - какое-то откровение господне?

3.14здец. Яду мне.

ДЕТИ! Если дедушка не назвал вашу игрушку лучшей, то это не потому, что он не умеет играть. Он умеет. Отличайте же академическое от практического. Если я говорю "по России надо ездить на Жигулях", то это не потому, что я не видел машин лучше. Это ИМЕННО потому, что я видел.

Нет, б..дь, яду мне. Ну вот он лежит - вот, интерфейсы, методы, код, класс, голимый интеджер на... - ВСЁ ОБЪЕКТ. И фигли? Что ж, блядь (тут уже без точек надо), за магия такая в этом? Ну - Я-ТО ХОТЬ ЗНАЮ, ЗАЧЕМ МНЕ ЭТО. Это исследовательский проект. Есть свои причины. НО ВАМ-ТО ЗАЧЕМ!?

И - КАК ТОЛЬКО Я ПОЙМУ, КАК ИМЕННО ЭТО СДЕЛАТЬ - Я ЛИШУ ЕГО ЭТОЙ КРАСОТЫ РАДИ ПРАКТИЧНОСТИ!

Форт ещё. А что ж не Рефал? А где Плэннер? А на unix sed писать не пробовали? Это невероятно красивый язык - всё - строка. Бляд. Сил моих нет.

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

Я рад, что всё больше и больше людей дошло до понимания и оценки красоты концепций. Теперь, раз уж вы это постигли, надо сделать усилие над собой и понять, что оптимизация идёт по многим факторам, и красота парадигмы в некоторые члены входит с минусом.

(Я не очень сегодня злой? Извини, если что. Не имел в виду обидеть.)
(Ответить) (Thread)
(Удалённый комментарий)
[User Picture]From: cmm
2004-12-21 05:06 pm

it's that time of the year

наверное.
вообще, непонятно чего это народ завёлся.
языки программирования делятся на языки узкого применения и языки широкого применения.
с языками узкого применения всё понятно, говорить не о чем.  если есть чётко поставленная задача и язык, под неё заточенный — ура.

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

и сразу всё становится просто:

. если босс идиот, а работники у него мазохисты, то коллектив пишет на C++ и тащится от собственной крутизны.  писать сегодня на языке без safe runtime могут только идиоты и мазохисты, и хватит о них.

. если босс умница, а работники у него индусы (условно), то коллектив пишет на Жабе или C#.  потому как на этих языках сложно написать так, чтобы было непонятно.  хотя и на них можно, конечно, но это надо уметь, а индусы (условно) не умеют.

. если босс сам себе работник, то тут зависит от его задвигов.  может на Smalltalk'e писать, может на ML, может на Питоне, anything goes, лишь бы с сетью и файлами работать умело.  может и на Жабе, почему нет?

P.S. для зануд: да, бывают ситуации, в которых языки с мусоросборщиками неприменимы.  в таком случае отсутствие мусоросборщика становится критическим свойством узкой применимости, смотри рисунок 1.
(Ответить) (Thread)
[User Picture]From: sobaker
2004-12-21 06:11 pm
Только я бы Смоллток включил в категорию 2a: босс умница, и программисты умницы и не индусы ;)
(Ответить) (Parent) (Thread)
[User Picture]From: samlazy
2004-12-21 08:12 pm
Можно расматривать язык программирования как инструмент обучения "парадигме" :). В этом случае, я думаю, больше людей согласиться с наличие более или менее эффективных языков.

Эх, помню в детстве, после глубокого погружения в Пролог, я такие конструкции на других языках закручивал, что сам потом долго удивлялся.
(Ответить) (Thread)
[User Picture]From: averros
2004-12-21 09:30 pm
Как-то зашёл разговор о языках, и я сообщил, что, наверно, десятка три пользовал, в разное время. Мне не поверили. Потом откопал своё resume и посчитал - насчиталось пять дюжин.

Вывод - всё это syntactic sugar. "If you can fly Camel, you can fly anything." [из Top Secret, хотя я могу и ошибаться]

На самом деле, задача языка - просто автоматизировать часто повторяющиеся куски. Вроде распределения регистров или проверки типов. Всё остальное - исключительно дело вкуса (и, в какой-то степени, эргономики).
(Ответить) (Thread)
[User Picture]From: sobaker
2004-12-22 06:18 am
В этих пяти дюжинах был Смоллток? :)
(Ответить) (Parent) (Thread)
From: ex_juan_gan
2004-12-21 10:23 pm
ДЗ нечего слушать, он никогда не был программистом, и знать достоверно не может.

Форт, конечно, идеальный язык - на нём мгновенно строится свой язык для приложения, ну и всё.

Но Джава, Джава тоже не мертва ещё. С дженериксами там очень даже можно писать красивые абстрактные вещи. Что и делаем-с.
(Ответить) (Thread)
[User Picture]From: rivig
2004-12-22 06:56 am
насколько я понимаю, они все-таки несколько неполноценны в жабе, поскольку реализованы не на уревне VM (побоялись трогать, а изначальный дизайн говеный, и таких глубоких изменений не допускает) а с помощью type elimination, т.е не видны адекватно через reflection. поправьте меня (я знаю, за вами не заржавеет) если не так.
(Ответить) (Parent) (Thread)
[User Picture]From: soonts
2004-12-28 09:30 am

Мои мысли на этот счёт:

Лексика + компилятор (вероятно это именно то что ты в тексте называешь "язык") не должны
рассматриваться как замкнутая система.

Есть ещё:
1. Терабайты написанного кода библиотек, доступных в исходниках для некоторых языков (С, С++). Эти библиотеки в разной степени подходят для повторного использования.
2. Скомпилированные (внешние) библиотеки, в том числе поставляющиеся с OS. Разные языки в разной степени подходят для их использования (VB[s] - best development speed, С[++] - best perfomance, Java - всё плохо). Это - сильная сторона мира windows (COM-объекты).
3. Тысячи людей в мире которые программируют, тестируют, общаются в форумах, задают вопросы и бесплатно получают ответы. Количество таких людей (=время на поиск решения если идеи "что бы ещё проверить" кончились) сильно различается от языку к языку.
3. Уже написанные OpenSource-продукты с подходящей лицензией. IMHO больше всего OpenSource пишется на С++. Это — сильная сторона клонов unix.
4. Инструментальные средства. Во-первых, поддержка со стороны разработчиков компилятора и IDE. Во-вторых, инструменты по профилированию, тестированию, и т.п.
5. Возможности для групповой работы нескольких людей над одним проектом (если актуально).
6. Разные языки в разной степени близки к комп. железу. Ещё не скоро появится коммерчески успешная ОС написанная в основном на Java, потому что разработчики железа всё равно будут использовать С[++] и ASM для написания драйверов.
7. Эффективность исполнения (если актуально). Покажи мне 3D игрушку движок которой написан на java или на скриптах.
(Ответить) (Thread)
[User Picture]From: homa
2004-12-28 08:58 pm
Ничего не могу сказать про Смолток, ни разу не сталкивался. Про Форт же скажу резко и не беспристрастно: несколько встретившихся мне энтузиастов Форта, а один из них — человек, от которого я в определенной мере завишу производственно, люди небесталанные и в большей или меньшей степени успешные в плане программирования, но вместе с тем весьма тяжелые партнеры в совместной программерской работе. Не знаю, следует ли соотносить (тем более, выводить) их недостатки из их увлечения Фортом или наоборот. Знаю только, что разные языке помимо своей разной эффективности в решении разных задач и неодинаковой элегантности несут в себе и некий идеологический элемент, иногда становящийся elemental'ом.

Последние несколько лет я работаю в команде, стандартом de facto которой стала перманентная борьба с языком. Не называю язык, ни род деятельности команды, чтобы не уходить в частности, забывая о главном. А главное состоит в том, что выбор инструментария вторичен, как вторичен и выбор аксиоматики. Первична, разумеется, практическая, а точнее, не побоюсь этого слова, коммерческая составляющая проекта. То есть, вложенные в инфраструктуру, лицензионный софт, железо, разработку собственного проекта и, last but not least, подготовку сотрудников и администраторов деньги. На фоне этих многолетних и немаленьких затрат переподготовка грамотного опытного специалиста (по контрасту с наймом новых специалистов) выглядит не слишком дорогостоящей.

Профессионал, который борется с языком, выглядит, конечно, глупо. Но заказчик, который настаивает на инструментарии, вынуждающем дорогостоящего профессионала непрерывно с ним бороться, выглядит еще глупее. А где золотая середина? Если проект уже поздно переделывать с нуля целиком?
(Ответить) (Thread)
From: mamamija
2004-12-29 08:29 pm

Что значит бороться с языком?

Как много разнородных моментов в одном посте. Да, Форт располагает к своего рода изоляционизму и трудности восприятия уже написанного другими. За эффективность надо платить необходимостью разобраться и создать собственную среду. Для больших проектов он врядли приемлем. Впрочем с уважением умолкаю. Широта темы превосходит мою компетенцию.
(Ответить) (Thread)