о языках программирования
Dec. 21st, 2004 04:22 pm«Смолток просто-напросто непрактичен» — пишет
dz, наряду с другой ерундой, в своём сравнении Джавы и Смоллтока. Видно, что он просто не очень хорошо понимает, какая это качественная разница — действительное динамическое ООП — если думает, что «есть reflection API, который все ПРАКТИЧЕСКИЕ задачи - решает». Конечно, все практические задачи, которые могут возникнуть в системе, спроецированной статически, он решает, а другие задачи человеку, не понимающему Смоллток и динамическое ООП, и в голову не придут.
Мне это, впрочем, напомнило тему «супер-языков», о которой приходилось иногда размышлять. Под этим я понимаю вот что: иногда бывает так, что поклонники какого-то языка программирования утверждают, что использование их языка позволяет повысить эффективность написания тех или иных сложных программ в несколько раз (а то и больше). Вообще-то подобные утверждения то и дело высказывают поклонники чуть ли не любого языка программирования, но обычно их не стоит воспринимать всерьёз. Но это не значит, что такое в принципе невозможно, с другой стороны.
Как-то это сумбурно звучит, поэтому попробую зайти с другой стороны. Ясно, что есть области применения, в которых некоторые языки подходят куда лучше других. Ясно, что программисты разнятся по своим способностям, качеству и скорости работы, эффективности результата, и прямое сравнение тут невозможно. Если мы учтём все эти «ясно» и попытаемся всё же вынести из за скобки, останется ли внутри что-то объективное, зависящее от языка? И если останется, насколько оно влиятельно?
Во мне, когда я думаю об этом, борются два противоположных хода мысли. С одной стороны, мне хочется сказать, что язык и его особенности часто переоценивают. В конечном итоге всё решает сложность поставленной задачи, переходящая в сложность работы программиста, решающего эту задачу. Язык программирования как бы стоит посредине этого перехода, «амортизируя» часть сложности задачи и принимая её на себя; но использование разных языков хоть и меняет качество этой амортизации, но не слишком значительно, не во много раз. Использование очень разных языков программирования, основанных на разных подходах, может давать преимущество в тех или иных удобных для решения этими подходами задачах; но в случае, если таких удобств или специальных требований нет, их эффективность примерно одинакова, есть только иллюзия особенной эффективности того или иного языка, появляющаяся у программиста, который очень хорошо его знает, привык, притёрся к нему, и действительно для него лично он быстрее и эффективнее всего остального.
С другой стороны, мне хочется сказать, что всё наоборот. Метафора амортизации несостоятельна, т.к. не отражает тот факт, что, глядя на одну и ту же задачу с точки зрения очень разных языков и подходов к программированию, мы видим совершенно разные вещи, и исходная сложность поставленной задачи не является чем-то неизменным, она навязана нам тем взглядом, к которому мы привыкли; при смене языка/взгляда/подхода может оказаться, что всё стало во много раз легче, и это не какой-то особенный случай, вызванный специальными обстоятельствами исходной задачи, а самое обыденное дело. И может оказаться, что какие-то языки с этой точки зрения особенно эффективны, т.е. очень хорошо знающий такой язык программист сможет в среднем работать значительно эффективнее, чем очень хорошо знающий другой язык программист тех же способностей, при работе над той же не-специальной задачей общего направления (естественно, такая точка зрения должна опираться на предположение о возможности определить «задачу общего направления» и «примерно тех же способностей» так, чтобы не впасть в замкнутый круг, и, действительно, неочевидно, что можно это сделать).
В общем, я лично сохраняю скептицизм по этому поводу, и первая из вышеописанных точек зрения в целом побеждает во мне вторую. Ко второй, тем не менее (и вообще к теме разных подходов к программированию, и тому, насколько такие подходы влияют на результаты и эффективность работы программиста) сохраняется живой интерес. Так вот, наиболее убедительные и подтверждённые фактами претензии на особую эффективность любимого языка, которые мне приходилось встречать, проистекали из среды поклонников двух языков: Смоллток и Форт. Не знаю, почему именно эти два, возможно, это больше случайность моего личного знакомства с языками, программистами, и различными сетевыми обсуждениями этой темы, чем какая-то объективная реальность; и, как я написал выше, я вовсе не уверен в том, что такие претензии основаны на чём-то реальном. Но любопытно отметить, что общего в этих двух языках (вообще-то очень разных): именно концептуальная чистота языка («всё — объект» или «всё — макро») и ещё я бы отметил интеграцию языка внутри интерактивной системы, полностью написанной на этом же языке, что-то вроде мини-ОС для языка.
Мне это, впрочем, напомнило тему «супер-языков», о которой приходилось иногда размышлять. Под этим я понимаю вот что: иногда бывает так, что поклонники какого-то языка программирования утверждают, что использование их языка позволяет повысить эффективность написания тех или иных сложных программ в несколько раз (а то и больше). Вообще-то подобные утверждения то и дело высказывают поклонники чуть ли не любого языка программирования, но обычно их не стоит воспринимать всерьёз. Но это не значит, что такое в принципе невозможно, с другой стороны.
Как-то это сумбурно звучит, поэтому попробую зайти с другой стороны. Ясно, что есть области применения, в которых некоторые языки подходят куда лучше других. Ясно, что программисты разнятся по своим способностям, качеству и скорости работы, эффективности результата, и прямое сравнение тут невозможно. Если мы учтём все эти «ясно» и попытаемся всё же вынести из за скобки, останется ли внутри что-то объективное, зависящее от языка? И если останется, насколько оно влиятельно?
Во мне, когда я думаю об этом, борются два противоположных хода мысли. С одной стороны, мне хочется сказать, что язык и его особенности часто переоценивают. В конечном итоге всё решает сложность поставленной задачи, переходящая в сложность работы программиста, решающего эту задачу. Язык программирования как бы стоит посредине этого перехода, «амортизируя» часть сложности задачи и принимая её на себя; но использование разных языков хоть и меняет качество этой амортизации, но не слишком значительно, не во много раз. Использование очень разных языков программирования, основанных на разных подходах, может давать преимущество в тех или иных удобных для решения этими подходами задачах; но в случае, если таких удобств или специальных требований нет, их эффективность примерно одинакова, есть только иллюзия особенной эффективности того или иного языка, появляющаяся у программиста, который очень хорошо его знает, привык, притёрся к нему, и действительно для него лично он быстрее и эффективнее всего остального.
С другой стороны, мне хочется сказать, что всё наоборот. Метафора амортизации несостоятельна, т.к. не отражает тот факт, что, глядя на одну и ту же задачу с точки зрения очень разных языков и подходов к программированию, мы видим совершенно разные вещи, и исходная сложность поставленной задачи не является чем-то неизменным, она навязана нам тем взглядом, к которому мы привыкли; при смене языка/взгляда/подхода может оказаться, что всё стало во много раз легче, и это не какой-то особенный случай, вызванный специальными обстоятельствами исходной задачи, а самое обыденное дело. И может оказаться, что какие-то языки с этой точки зрения особенно эффективны, т.е. очень хорошо знающий такой язык программист сможет в среднем работать значительно эффективнее, чем очень хорошо знающий другой язык программист тех же способностей, при работе над той же не-специальной задачей общего направления (естественно, такая точка зрения должна опираться на предположение о возможности определить «задачу общего направления» и «примерно тех же способностей» так, чтобы не впасть в замкнутый круг, и, действительно, неочевидно, что можно это сделать).
В общем, я лично сохраняю скептицизм по этому поводу, и первая из вышеописанных точек зрения в целом побеждает во мне вторую. Ко второй, тем не менее (и вообще к теме разных подходов к программированию, и тому, насколько такие подходы влияют на результаты и эффективность работы программиста) сохраняется живой интерес. Так вот, наиболее убедительные и подтверждённые фактами претензии на особую эффективность любимого языка, которые мне приходилось встречать, проистекали из среды поклонников двух языков: Смоллток и Форт. Не знаю, почему именно эти два, возможно, это больше случайность моего личного знакомства с языками, программистами, и различными сетевыми обсуждениями этой темы, чем какая-то объективная реальность; и, как я написал выше, я вовсе не уверен в том, что такие претензии основаны на чём-то реальном. Но любопытно отметить, что общего в этих двух языках (вообще-то очень разных): именно концептуальная чистота языка («всё — объект» или «всё — макро») и ещё я бы отметил интеграцию языка внутри интерактивной системы, полностью написанной на этом же языке, что-то вроде мини-ОС для языка.
no subject
Date: 2004-12-21 02:38 pm (UTC)прекрасно сливается с
в одной магической фразе: 'right tool for the job' :)
Конечно, чтобы выбрать right tool, надо иметь о разных инструментах представление, а лучше -- и практический опыт использования. Это не всегда легко достижимо: обычно от программиста требуют опыта, потому надо вкладываться в некоторый набор всерьёз, а остальные приходится оставлять в рамках хобби.
no subject
Date: 2004-12-21 02:46 pm (UTC)По крайней мере у меня очень хорошее впечатление от LabView (http://www.ni.com/labview/). Да, для конкретных задач - но для множества инженерно-технически-контрольных...
Я просто писал одно и тоже почти, в разные времена, на Pascal, Delphi i LV - там правда в разы разница ;)
Хотя не все верят что LV- язык программирования..
no subject
Date: 2004-12-21 02:56 pm (UTC)Во первых - защищенноть от ошибок. Даже прекрасные программист, трезвенник и тп может устать, простыть и сделать ошибку. Хорошо если язык позволяет ее найти. Примеры удачных языков в этом отношении есть - например на Haskell очень тяжело сделать ошибку, которую не заметит компилятор. Естественно, это дается не бесплатно - программировать на этом языке часто бывает тяжело.
Во вторых язык не только сам "амортизирует", но и может предоставить возможность добавить свой "амортизатор". В простейшем случае это ограничевается повторным использованием (здесь Смоллток и Форт очень хорошо смотрятся), в общем возможна разработка domain-specific language (здесь преуспели OCaml и Lisp/Scheme).
Кроме того в сравнении Джавы и Смоллтока надо вспомнить про шаблоны. IMHO, основанная на шаблонах система типов позволяет решать все осмысленные задачи, которые решаются динамической типизацией (включая гнилой reflection/RTTI).
no subject
Date: 2004-12-21 02:58 pm (UTC)no subject
Date: 2004-12-21 03:02 pm (UTC)Я например уже давно хочу обкатать Ocaml в какой нибудь реальной задаче, но пока боюсь делать на нем что-то серьезное, просто потому что знаею его не досконально... Можно упереться в какую нибудь малознакомую мелочь. Хотя то что тривиально пишется на с/с++/перле я в состоянии написать и на окамле.
no subject
Date: 2004-12-21 03:05 pm (UTC)no subject
Date: 2004-12-21 03:11 pm (UTC)1. "Правильность" смолтока и форта - понятие чисто религиозное, и из правильности вовсе не следует что эти языки хороши.
2. Язык определяется не только его синтаксисом и грамматикой, но и определяемой этим языком культурой написания программ. так например, язык С(C++) сам по себе очень хороший, но будучи поставляем в комплекте с микрософтовской библиотекой, графомански написанной и омерзительно документированной, он становится плохим, ибо перед программистом встает дилемма - или сочинять АБСОЛЮТНО ВСЕ самому, или дружить с дурно пахнущим слоном. Промежуточного не дано, ибо модули микрософтовской библиотеки завязаны друг с другом как спагетти, и использование одного кусочка означает прмменение всего этого дерьма целиком.
3. Языки ФОРТ и Смоллток позволяют отдельно взятым талантливым хакерам определить свою среду (свою библиотеку, свои обозначения) с самого начала. Это хорошо когда ничего не создано, но отвратительно когда надо поддерживать крупную разработку длящуюся десятки лет. Ни у какого отдельно взятого хакера не хватит терпения изучать творения другого хакера - он скорее все перепишет сам. По сути дела каждая такая среда является Своим собственным языком программирования, а язык программирования - это нечто, что должно учиться не от формальных правил, а подсознательно - самое главное красота и естественность. Программист не может учить сотню языков - в какой-то момент он звереет и создает свой собственный.
4. Джава предлагает может быть и не самый оптимальный, но некоторый стиль программирования при котором наконец-то (!) программы могут жить долго, и одни программисты могут читать и пользоваться трудами других программистов. Преимущество состоит в "естественности стиля". В Джаве есть конечно тоже свои плюхи - например омерзительное EJB и J2EE и весьма сомнительная философия листенеров - но это все семечки по сравнению с тем количеством мерзости, которая налипла на другие языки за десятки лет насильственного внедрения графоманских идей крупными фирмами. Пока Джава пожалуй наилучший язык программирования, хотя и Джава рано или поздно умрет в конвульсиях, засорившись как C++, наносной дрянью.
no subject
Date: 2004-12-21 03:17 pm (UTC)no subject
Date: 2004-12-21 03:21 pm (UTC)Там к сожалению осталась только презентация
no subject
Date: 2004-12-21 03:23 pm (UTC)no subject
Date: 2004-12-21 03:24 pm (UTC)no subject
Date: 2004-12-21 03:26 pm (UTC)no subject
Date: 2004-12-21 03:29 pm (UTC)Я вот гляжу на поделие наших джавадевелоперов и думаю, а фигли не рассматривать любой диалог с пользователем как функцию 'a -> 'a, где 'a это некий элемент или кортеж данных. Хотя наверное это придумал до меня.
Раз уж про DSL разговор зашел
Date: 2004-12-21 03:34 pm (UTC)http://www.onboard.jetbrains.com/articles/04/10/lop/
no subject
Date: 2004-12-21 03:34 pm (UTC)То есть, тут заслуга, скорее, оболочки, чем собственно языка.
no subject
Date: 2004-12-21 03:35 pm (UTC)no subject
Date: 2004-12-21 03:36 pm (UTC)no subject
Date: 2004-12-21 03:45 pm (UTC)2. Культура программирования на Смоллток действительно выше (в массе своей)
3. Второй пункт означает, что смоллтокерам не так уж сложно изучать и поддерживать чужой код. Мнение, что все библиотеки пишутся с нуля - ошибочно, есть мощные промышленные среды разработки на Смоллток (visual works от cincom, visual age от ibm).
4. Средний знаменатель - это хорошо. Но это средний знаменатель. Зачем отказываться от лучшего?
А вообще, я столько написал в комментариям к 4-м последним постингам
Повторюсь, я не говорю, что Java - уж очень плохой язык. Но это - очень средненький язык.
no subject
Date: 2004-12-21 04:04 pm (UTC)dve veshi - pervaya -nabor bibliotek. Da, on specificheski optimizirovaqn - cho navernoe ne koncepciya. Hotya, ne uveren chto vstavka grafika v programmu v luboj drugoj srede budet proshe..
Vtoroe - i eto uje na koncepciyu tyanet - graficheskoe predstavlenie.
Svoi minusy tut est' - no est' i poleznye fichi: net imen peremennyh, kotorye mojno sputat', algorim viden glazu - men'she veroyanost' zaputat'sya v 3 sosnah.. A eto uje mojno nazvat' koncepciej, po-moemy...
no subject
Date: 2004-12-21 04:05 pm (UTC)no subject
Date: 2004-12-21 04:07 pm (UTC)1. Ну, начинается всё со стандартного наезда - обычно я его слышу из лагеря функциональщиков: dz типа не сечёт парадигмы, а если б сёк - пёрся бы, как всё круто.
Это всё офигенно, конечно, только я худо-бедно знаю, что такое смоллтоковская парадигма. Я вообще старый и с седыми яйцами, я языки программирования делаю на завтрак. Смолтокообразные в том числе. С абсолютной рефлексивностью в том числе.
"Если бы он втыкал в смолток, он бы придумал задачи для него".
Когда моя жизнь станет ТАК скучна, что мне придётся придумывать задачи - я повешусь. До сих пор задачи мне поставляет окружающий мир. И только это и есть задачи. А то, что ты придумал сам, называется УПРАЖНЕНИЕ или ЭТЮД. Языки Паскаль (оригинальный) и Смоллток (любой) для упражнений и этюдов очень хороши. Хоть и не для всех. (Типа наехал в ответ. Типа нефиг наезжать не по делу, это все умеют.)
Короче: на бочку задачу, для которой Смолток невероятно хорош. (Моя многолетняя практика общения на эти темы показывает, что задача или не появляется, или оказывается весьма академической.)
Конец пункта 1. Краткое содержание пункта 1: Люди, которые прутся от N, склонны считать, что только они по-настоящему понимают N. Они ошибаются.
2. В 1 сказано: есть такая тема - настоящие объектные языки. Завалишин не сечёт, как же они круты. А дальше сказано: правда, я сам не знаю, есть ли вообще между языками разница. Может и нет.
Бабка - ты определись. "dz не сечёт" или "я тут такой весь диалектический в душе, мудро размышляю, где ж истина.".
3. Right tool for the job, как тут уже сказано.
4. Товарищ. Коли ты уже добрался о мыслей о парадигмах и их применимости к конкретным задачам, различай и программистов.
Одним программистам нужны годы, чтобы въехать в новую парадигму, и они будут нуждаться в полном комплекте инструментов.
Другим требуется полчаса на понимание, а потом пара дней и ЛЮБОЙ язык программирования, чтобы эту парадигму воплотить.
Ты меня извини, но так неудачно получилось, я тут ровно вчера как раз оживил интерпретатор байткода для языка, чем-то (не парадигмой ли?) напоминающего смолток. Я примерно раз в пару лет какой-нибудь язычок делаю, как показывает практика. Из них пара применяется примерно полмиллиона раз в день.
Я - очень неудачный слушатель для того, чтобы учить меня парадигмам. Я могу такую парадигму выкатить, от которой самые экстремалы почувствуют себя либерально. Толку-то.
Я, знаешь, когда мне говорят "ты не понимаешь" раньше смеялся, а теперь уже просто оторопь берёт: вы ПРАВДА считаете, что ЭТО (парадигма смолтока) - какое-то откровение господне?
3.14здец. Яду мне.
ДЕТИ! Если дедушка не назвал вашу игрушку лучшей, то это не потому, что он не умеет играть. Он умеет. Отличайте же академическое от практического. Если я говорю "по России надо ездить на Жигулях", то это не потому, что я не видел машин лучше. Это ИМЕННО потому, что я видел.
Нет, б..дь, яду мне. Ну вот он лежит - вот, интерфейсы, методы, код, класс, голимый интеджер на... - ВСЁ ОБЪЕКТ. И фигли? Что ж, блядь (тут уже без точек надо), за магия такая в этом? Ну - Я-ТО ХОТЬ ЗНАЮ, ЗАЧЕМ МНЕ ЭТО. Это исследовательский проект. Есть свои причины. НО ВАМ-ТО ЗАЧЕМ!?
И - КАК ТОЛЬКО Я ПОЙМУ, КАК ИМЕННО ЭТО СДЕЛАТЬ - Я ЛИШУ ЕГО ЭТОЙ КРАСОТЫ РАДИ ПРАКТИЧНОСТИ!
Форт ещё. А что ж не Рефал? А где Плэннер? А на unix sed писать не пробовали? Это невероятно красивый язык - всё - строка. Бляд. Сил моих нет.
Страдания юных вертеров - отчего противные людшки на красивые автобусы только смотрят, а ездят на мерзких, но быстрых. Потому что красота - это чтоб смотреть и восторгаться, товарищ. И - вы удивитесь, сантехник, который чинит вам унитаз, тоже может слушать Ренуара, читать Баха и глядеть на полотна Пушкина взглядом истинного эстета.
Я рад, что всё больше и больше людей дошло до понимания и оценки красоты концепций. Теперь, раз уж вы это постигли, надо сделать усилие над собой и понять, что оптимизация идёт по многим факторам, и красота парадигмы в некоторые члены входит с минусом.
(Я не очень сегодня злой? Извини, если что. Не имел в виду обидеть.)
no subject
Date: 2004-12-21 04:11 pm (UTC)Собственно, куча листенеров и итераторов (или там компараторов) сделана именно так.
no subject
Date: 2004-12-21 04:13 pm (UTC)no subject
Date: 2004-12-21 04:14 pm (UTC)no subject
Date: 2004-12-21 04:21 pm (UTC)Мммм... продвинутй GUI? Вот, скажем, IDE какая-нибудь. Вроде на смоллтоке отлично выходит?
На форте многие embedded-программеры пишут оч. эффективно (знаком с людьми). Он и придумывался для таких вещей (телескопом управлять, iirc). Не хуже C во многих случаях. Да чего я объясняю :)