о языках программирования
Dec. 21st, 2004 04:22 pm«Смолток просто-напросто непрактичен» — пишет
dz, наряду с другой ерундой, в своём сравнении Джавы и Смоллтока. Видно, что он просто не очень хорошо понимает, какая это качественная разница — действительное динамическое ООП — если думает, что «есть reflection API, который все ПРАКТИЧЕСКИЕ задачи - решает». Конечно, все практические задачи, которые могут возникнуть в системе, спроецированной статически, он решает, а другие задачи человеку, не понимающему Смоллток и динамическое ООП, и в голову не придут.
Мне это, впрочем, напомнило тему «супер-языков», о которой приходилось иногда размышлять. Под этим я понимаю вот что: иногда бывает так, что поклонники какого-то языка программирования утверждают, что использование их языка позволяет повысить эффективность написания тех или иных сложных программ в несколько раз (а то и больше). Вообще-то подобные утверждения то и дело высказывают поклонники чуть ли не любого языка программирования, но обычно их не стоит воспринимать всерьёз. Но это не значит, что такое в принципе невозможно, с другой стороны.
Как-то это сумбурно звучит, поэтому попробую зайти с другой стороны. Ясно, что есть области применения, в которых некоторые языки подходят куда лучше других. Ясно, что программисты разнятся по своим способностям, качеству и скорости работы, эффективности результата, и прямое сравнение тут невозможно. Если мы учтём все эти «ясно» и попытаемся всё же вынести из за скобки, останется ли внутри что-то объективное, зависящее от языка? И если останется, насколько оно влиятельно?
Во мне, когда я думаю об этом, борются два противоположных хода мысли. С одной стороны, мне хочется сказать, что язык и его особенности часто переоценивают. В конечном итоге всё решает сложность поставленной задачи, переходящая в сложность работы программиста, решающего эту задачу. Язык программирования как бы стоит посредине этого перехода, «амортизируя» часть сложности задачи и принимая её на себя; но использование разных языков хоть и меняет качество этой амортизации, но не слишком значительно, не во много раз. Использование очень разных языков программирования, основанных на разных подходах, может давать преимущество в тех или иных удобных для решения этими подходами задачах; но в случае, если таких удобств или специальных требований нет, их эффективность примерно одинакова, есть только иллюзия особенной эффективности того или иного языка, появляющаяся у программиста, который очень хорошо его знает, привык, притёрся к нему, и действительно для него лично он быстрее и эффективнее всего остального.
С другой стороны, мне хочется сказать, что всё наоборот. Метафора амортизации несостоятельна, т.к. не отражает тот факт, что, глядя на одну и ту же задачу с точки зрения очень разных языков и подходов к программированию, мы видим совершенно разные вещи, и исходная сложность поставленной задачи не является чем-то неизменным, она навязана нам тем взглядом, к которому мы привыкли; при смене языка/взгляда/подхода может оказаться, что всё стало во много раз легче, и это не какой-то особенный случай, вызванный специальными обстоятельствами исходной задачи, а самое обыденное дело. И может оказаться, что какие-то языки с этой точки зрения особенно эффективны, т.е. очень хорошо знающий такой язык программист сможет в среднем работать значительно эффективнее, чем очень хорошо знающий другой язык программист тех же способностей, при работе над той же не-специальной задачей общего направления (естественно, такая точка зрения должна опираться на предположение о возможности определить «задачу общего направления» и «примерно тех же способностей» так, чтобы не впасть в замкнутый круг, и, действительно, неочевидно, что можно это сделать).
В общем, я лично сохраняю скептицизм по этому поводу, и первая из вышеописанных точек зрения в целом побеждает во мне вторую. Ко второй, тем не менее (и вообще к теме разных подходов к программированию, и тому, насколько такие подходы влияют на результаты и эффективность работы программиста) сохраняется живой интерес. Так вот, наиболее убедительные и подтверждённые фактами претензии на особую эффективность любимого языка, которые мне приходилось встречать, проистекали из среды поклонников двух языков: Смоллток и Форт. Не знаю, почему именно эти два, возможно, это больше случайность моего личного знакомства с языками, программистами, и различными сетевыми обсуждениями этой темы, чем какая-то объективная реальность; и, как я написал выше, я вовсе не уверен в том, что такие претензии основаны на чём-то реальном. Но любопытно отметить, что общего в этих двух языках (вообще-то очень разных): именно концептуальная чистота языка («всё — объект» или «всё — макро») и ещё я бы отметил интеграцию языка внутри интерактивной системы, полностью написанной на этом же языке, что-то вроде мини-ОС для языка.
Мне это, впрочем, напомнило тему «супер-языков», о которой приходилось иногда размышлять. Под этим я понимаю вот что: иногда бывает так, что поклонники какого-то языка программирования утверждают, что использование их языка позволяет повысить эффективность написания тех или иных сложных программ в несколько раз (а то и больше). Вообще-то подобные утверждения то и дело высказывают поклонники чуть ли не любого языка программирования, но обычно их не стоит воспринимать всерьёз. Но это не значит, что такое в принципе невозможно, с другой стороны.
Как-то это сумбурно звучит, поэтому попробую зайти с другой стороны. Ясно, что есть области применения, в которых некоторые языки подходят куда лучше других. Ясно, что программисты разнятся по своим способностям, качеству и скорости работы, эффективности результата, и прямое сравнение тут невозможно. Если мы учтём все эти «ясно» и попытаемся всё же вынести из за скобки, останется ли внутри что-то объективное, зависящее от языка? И если останется, насколько оно влиятельно?
Во мне, когда я думаю об этом, борются два противоположных хода мысли. С одной стороны, мне хочется сказать, что язык и его особенности часто переоценивают. В конечном итоге всё решает сложность поставленной задачи, переходящая в сложность работы программиста, решающего эту задачу. Язык программирования как бы стоит посредине этого перехода, «амортизируя» часть сложности задачи и принимая её на себя; но использование разных языков хоть и меняет качество этой амортизации, но не слишком значительно, не во много раз. Использование очень разных языков программирования, основанных на разных подходах, может давать преимущество в тех или иных удобных для решения этими подходами задачах; но в случае, если таких удобств или специальных требований нет, их эффективность примерно одинакова, есть только иллюзия особенной эффективности того или иного языка, появляющаяся у программиста, который очень хорошо его знает, привык, притёрся к нему, и действительно для него лично он быстрее и эффективнее всего остального.
С другой стороны, мне хочется сказать, что всё наоборот. Метафора амортизации несостоятельна, т.к. не отражает тот факт, что, глядя на одну и ту же задачу с точки зрения очень разных языков и подходов к программированию, мы видим совершенно разные вещи, и исходная сложность поставленной задачи не является чем-то неизменным, она навязана нам тем взглядом, к которому мы привыкли; при смене языка/взгляда/подхода может оказаться, что всё стало во много раз легче, и это не какой-то особенный случай, вызванный специальными обстоятельствами исходной задачи, а самое обыденное дело. И может оказаться, что какие-то языки с этой точки зрения особенно эффективны, т.е. очень хорошо знающий такой язык программист сможет в среднем работать значительно эффективнее, чем очень хорошо знающий другой язык программист тех же способностей, при работе над той же не-специальной задачей общего направления (естественно, такая точка зрения должна опираться на предположение о возможности определить «задачу общего направления» и «примерно тех же способностей» так, чтобы не впасть в замкнутый круг, и, действительно, неочевидно, что можно это сделать).
В общем, я лично сохраняю скептицизм по этому поводу, и первая из вышеописанных точек зрения в целом побеждает во мне вторую. Ко второй, тем не менее (и вообще к теме разных подходов к программированию, и тому, насколько такие подходы влияют на результаты и эффективность работы программиста) сохраняется живой интерес. Так вот, наиболее убедительные и подтверждённые фактами претензии на особую эффективность любимого языка, которые мне приходилось встречать, проистекали из среды поклонников двух языков: Смоллток и Форт. Не знаю, почему именно эти два, возможно, это больше случайность моего личного знакомства с языками, программистами, и различными сетевыми обсуждениями этой темы, чем какая-то объективная реальность; и, как я написал выше, я вовсе не уверен в том, что такие претензии основаны на чём-то реальном. Но любопытно отметить, что общего в этих двух языках (вообще-то очень разных): именно концептуальная чистота языка («всё — объект» или «всё — макро») и ещё я бы отметил интеграцию языка внутри интерактивной системы, полностью написанной на этом же языке, что-то вроде мини-ОС для языка.
no subject
Date: 2004-12-22 06:32 am (UTC)Ява - очень многословный язык. поскольку человеческое восприятие ограничено, то чем меньше не необходимых деталей украшают ваш текст - тем лучше. отсутствие необходимости продумывать до мельчайших деталей тип ваших переменных, описывать их и менять это описание и использование консистентным образом по всему тексту - большое облегчение.
статическая типизация позволяет отлавливать некоторые ошибки, но далеко не все, и далеко не самые злобные или часто встречающиеся. ошибки типа вылавливаются в первые же несколько тестовых прогонов - они гораздо менее трудноуловимые, чем стрельба по памяти, например.
заслуга Явы в том, что она легитимизировала в массовом сознании несколько правильных вещей - сборку мусора, защищенную модель исполнения, виртуальную машину. в основном, все это относится к Яве, как среде исполнения, а не к языку или библиотекам. картину портит язык Ява, который многословен и невыразителен. есть идитотизмы и в виртуальной машине: стек - на кой хер? multithreaded execution - не знаю как сейчас, но в первых версиях он вел себя совсем по разному на разных машинах, да и как модель исполнения - очень низкоуровневая и опасная (некий концептуальный эквивалент goto).
в общем, у меня много претензий к Яве; основная и концептуальная - сделана она явно не для себя, а для идиотов, чтобы они не дай бог не порезались. и используют ее люди в основном именно в этом контексте - большой проект с постоянно меняющимся составом программистов, которыми надо управлять и которые ничего не решают, а только кодируют.
решают - супер-дупер архитекторы, которые получают много бабла за выпасание этого стада идиотов.
у фирмы тоже задница прикрыта: идеал менеджера - это возможность всех уволить нахер и набрать новую команду without losing a heartbeat.
если по простому, то Питон почти для всего лучше чем Ява, но это без учета конъюнктуры.
а, кстати, знакомы ли вы с 10-м законом Гринспуна?
"Any sufficiently complicated C or Fortran program contains an ad-hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp."
это я к тому, что многие называют Питон "Лисп без скобок". да и вообще, могут ли ошибаться такие люди, как Питер Норвиг и Брюс Экел ;-)
no subject
Date: 2004-12-22 07:07 am (UTC)Объектное программирование - это когда обращение к переменной (полю класса) локализовано в одном исходнике, а лучше - в группе из 2-4 методов. Поэтому "согласованно менять по всему коду" - нонсенс.
Стрельба по памяти - это к тонким ценителям С++.
Язык невыразителен: пример кода в студию.
"Лучше без учёта" - это клёво. Без учёта некоторых факторов я - безусловно лучший гомо сапиенс на планете. (Тсс - с учётом - тоже, но это секрет.)
Я не знаком с десятыми законами, а мысль, в нём изложенная, банальна и очевидна. Я её в этой дискуссии раз пять написал, и один раз отдельно. Гринспун кроме bug ridden и slow (на его совести и вопрос умения программировать) забыл сказать, что оно будет ещё и заточено под конкретную задачу. Кроме того, как я уже раз 30 сказал, во времена всех этих невероятных восхищений лиспом не было STL.
Ошибаться могут все люди. В частности - те, кто пытается промышленно программировать на экспериментальном языке. Авторы которого не ошибальсь - они просто оттягивались в своё удовольствие и решали свои собственные задачи.
А те самые идиоты, которые не порезались и задница прикрыта - и есть люди, выпускающие 99% софта в мире. И ровно для них вся каша. И ровно потому Ява успешна, что её создатели понимают, где промышленное программирование, а где - маргиналы.
no subject
Date: 2004-12-22 11:53 pm (UTC)> На дворе 2004-й. Почти 2005-й. Словарь и список давно есть везде. Как и алгоритмы.
Есть. Но гораздо менее удобны, чем в Питоне. Просто потому, что многословнее. А человеческое восприятие ограничено по количеству одновременно удерживаемых в памяти объектов, в том числе и количеству строк или других минимальных элементов, необходимых для выражения некоторой мысли. Причем, число это не очень большое, у нормальных людей 7 плюс-минус 2. У программистов, в силу специфики профессии и связанного с ней отбора, это число больше (мое личное подозрение, статистики на этом месте, насколько я знаю, нет), но все равно не надо доходить до этого предела без необходимости.
Может быть вы гений, и для вас число элементов - ограничение несерьезное. Я знал одного гения, за которым подчищал искусственно интеллектуальный код. За короткое время, пока я от кода отвлекался, он был способен наворотить 60кбайт кода на C без какой либо вообще структуры отступов. Набор абзацев. Видимо с тех пор у меня любовь к Питону, на котором без правильной индентации вообще мысль выразить нельзя.
Туплов нет, а они очень удобны для всяких ad hoc вещей, где включать предварительный дизайн на всю катушку просто overkill.
Мы вообще, насколько я понимаю, будучи разумными людьми не обсуждаем Turing completeness, а только человеческие факторы использования языков - компактность, выразительность, читаемость, удобство, ленинскую "экономию мышления" ;-).
> Объектное программирование - это когда обращение к переменной (полю класса) локализовано в одном исходнике, а лучше - в группе из 2-4 методов. Поэтому "согласованно менять по всему коду" - нонсенс.
Это в идеальном случае top-down OO programming. По моему опыту человек (не гений ;-) не может спроектировать все "правильно" наперед. Приходится уже "готовый" дизайн переделывать, "рефакторить" (как по-русски?). И хоть refactoring был придуман (или введен в дискурс) людьми, использующими Яву (Martin Fowler), на Питоне это делать гораздо проще, именно потому, что refactoring - это нелокальное изменение.
Есть и другие вещи, с трудом выражаемые на чистых ОО языках. Например, добавление нового метода в существующую иерархию классов требует глобальных изменений. Есть и подходы (AOP, multiple dispatch), но выглядят они корявовато.
> Стрельба по памяти - это к тонким ценителям С++.
А с темплейтами как быть прикажете? На мой взгляд, C++ сильно продлил срок своего существования с принятием текущей модели темплейтов. Появился новый стиль, не STL даже, а метатемплейтное программирование. При всей моей нелюбви к C++, это не только концептуально глубокй, но и практический стиль, не имеющий аналогов в других языках.
> Язык невыразителен: пример кода в студию.
Можно я пропущу, а? Надо домой бежать, гостей принимать, а это отдельная работа. Потом, если соберусь.
> "Лучше без учёта" - это клёво. Без учёта некоторых факторов я - безусловно лучший гомо сапиенс на планете. (Тсс - с учётом - тоже, но это секрет.)
Я этот ваш секрет уже понял ;-). Под конъюнктурой, а не под загадочными "некоторыми факторами" я имел в виду, что организовать проект на Питоне сложнее, чем на Яве в силу нескольких, не относящихся к свойствам языка аспектов. Как то: никого не уволят за решение делать проект на Яве; проще рулить бандой явовских кодеров, чем питоновских программистов; у Явы есть так называемый commercial support etc.
продолжение следует
no subject
Date: 2004-12-23 08:04 am (UTC)Рефакторинг - да, в реальности почти неизбежен. Я согласен - это - важное свойство языка.
Темплейты: ну - вот они приехали в Яву нынче. А С++ - конечно он ещё поразвивается. Это всегда так бывает, язык не умирает в ондочасье. Фортран вон сколько развивался. Чадит себе. И С++ будет.
А пример кода правда хочется.
Я, надо сказать честно, в этом разговоре преследую и весьма практическую цель. Концептуальных направлений много, но я не могу написать на каждом хорошем языке пару десятков тысяч строк, чтобы реально прочувствовать его плюсы и минусы. Поэтому чужой практический опыт - это чертовски интересно.
no subject
Date: 2004-12-22 11:53 pm (UTC)> Я не знаком с десятыми законами, а мысль, в нём изложенная, банальна и очевидна. Я её в этой дискуссии раз пять написал, и один раз отдельно. Гринспун кроме bug ridden и slow (на его совести и вопрос умения программировать) забыл сказать, что оно будет ещё и заточено под конкретную задачу. Кроме того, как я уже раз 30 сказал, во времена всех этих невероятных восхищений лиспом не было STL.
Знаете, у меня был в детстве знакомый, Миша Донской, который шахматную программу "Каисса" писал. Он мне пытался мозг парить (а я по молодости не мог отбиться), что если у тебя "в пальцах" не сидит двусвязный список, то ты не настоящий программист. Можно сказать, что умение программировать - на чьей-то там совести. Но ведь вы не апеллируете к своему необъятному мозгу (а, главное, к сморщенным мозгам ваших подчиненных) когда пользуетесь вместо явного уничтожения памяти сборкой мусора?
Высокоуровневые средства в языке не роскошь, а прагматизм, экономия сил.
> Ошибаться могут все люди. В частности - те, кто пытается промышленно программировать на экспериментальном языке. Авторы которого не ошибальсь - они просто оттягивались в своё удовольствие и решали свои собственные задачи.
Один из самых успешных интернетных проектов - Yahoo stores - был написан на Лиспе. Который далеко не экспериментален, стандартизован, и срок жизни которого сравним только с Фортраном.
И Orbitz, по-моему тоже на Лиспе, на другом диалекте, правда. И в Эрикссоновских коммутаторах работает Erlang, который им позволяет, кстати, код коммутатора менять без его остановки.
Пишут люди не на Яве и не на C++ коммерчиские успешные проекты. Да и у вас там в Яндекс-Маркет - собственный (т.е. экспериментальный, по вашей классификации) фунциональный язык.
> А те самые идиоты, которые не порезались и задница прикрыта - и есть люди, выпускающие 99% софта в мире. И ровно для них вся каша. И ровно потому Ява успешна, что её создатели понимают, где промышленное программирование, а где - маргиналы.
Да я с вами, в общем-то и не спорю. Это все - мое оправдание в основном для себя полного нежелания писать на эстетически неблизком мне языке.
Ява ведь написана (или прогнута потом) для комбинации архитектор/кодеры. Может быть и правда, что эта неприглядная комбинация выпускает 99% софта. Я (здесь эмфасиз) в ней участвовать не хочу.
У вас позиция здравая, вот только вы (как и я) все-таки любите argument for the argument's sake.
no subject
Date: 2004-12-23 07:54 am (UTC)Я абсолютно не против применения на практике Лиспа и Смолтока. Наверное, моя ошибка в применении слова "промышленное" - безусловно, написание алгоритмов для yahoo stores и свитча - промышленное программирование, "но есть нюанс". Я сам применил в промышленном софте язык, который не просто экпериментальный - который вообще больше нигде не применялся. И - на его месте мог бы быть Лисп, просто мне ОЧЕНЬ нужно было выжать 100% производительности.
Такие вещи бывают, но - они всегда оправданы именно что специальными условиями. Применяется _НЕ_ общецелевой язык - и для решения _НЕ_обычной задачи.
Собакер изначально расстраивался, что Смолток не рассматривают как язык для решения всех задач, как язык "по умолчанию". И действительно не рассматривают. Применение его в отдельных случаях ничего не меняет - даже если случаи мегабаксовые. Они все чем-то обусловлены. У кого-то во всех этих случаях возник вопрос "а почему не Ява/С++/С#", и кто-то смог объяснить, почему.
И - я считаю это нормальным. На сегодня. По сути - посмотрите - даже сегодня ещё есть люди, которые говорят:
- надо писать на ассемблере (видел сам, клянусь!)
- надо писать на С++
- GC сосёт, всем писать delete полчаса
Ява - это самая высокая горка, на которую было реально затащить человечество, не растеряв по дороге 90%. Это ни хорошо, ни плохо - это таковы сегодня люди.
no subject
Date: 2004-12-23 10:50 am (UTC)class Example: def __init__(self, param): self.param = paramПролезли.
мне самому было бы интересно написать некую апологию Питона (в этом, видимо, моя практическая цель) просто, чтобы аргументы в пользу не широкоизвестного языка были обкатаннее и убедительнее.
я, на самом деле, давно пытаюсь понять, чем меня так Питон зацепил. какое-то очень точное сочетание нужных, и отсутствие ненужных (ну, или, постепенное избавление от) свойств. писать на нем (особенно, после Си++ или, не дай Бог, перла) - это как свежий душ в жаркий день. извиняюсь за романтику ;-)
> Ява - это самая высокая горка, на которую было реально затащить человечество, не растеряв по дороге 90%. Это ни хорошо, ни плохо - это таковы сегодня люди.
О, это я очень хорошо понимаю. И за это очень Яве, как явлению, благодарен. После Явы и перла, на людей, пишущих на Питоне смотрят как на гораздо меньших придурков, чем до их появления. Я на Яве не очень много писал, так, больше пробовал. Апплет написал, когда Ява была в стадии alpha 2, еще что-то для Palm - есть такая VM - Waba. Маленькие вещички с простой графикой удобно писать. А большие - не приходилось, хотя код чужой разглядывал. Вещи типа EJB меня просто пугают, как в свое время MFC. Но, как я понял, вы не большой сторонник всего этого J2EE.
А про Смолток - у меня свой таракан в голове. И вообще, я больше в последнее время к фунциональному стилю склоняюсь. На Питоне это (с некоторыми небольшими ограничениями) вполне можно. Хотел попробовать Хаскель, но там пока текст скомпилируется (вернее, протайпчекится) с тебя семь потов сойдет.
Радует, что в Гугле интенсивно на Питоне пишут. Пустячок, а приятно, опять же - популяризуют Питон.
Кстати, (или уж совсем некстати), ваш Фантом (огрызок мечты) совсем уже заглох? Не хотите линк на форум на dz.narod.ru хоть в ЛЖ переставить (старый не работает)? Или совсем не до того? И еще, известен ли вам проект eros-os.org? Многое похоже, но проект, хоть и академический, и даже вроде финансируемый тоже как-то заглох. Не дождется человечество исполнения мечт, видимо.
no subject
Date: 2004-12-23 12:29 pm (UTC)А Фантом - http://dz.freezope.org/phantom/FrontPage - но там всё то же самое, только англ.
Я делал три попытки :), последняя дала работающий интерпретатор байткода, "ассемблер" байткода и hello world. Но это даже не основа - это экспериментальный стенд. К нему надо привинчивать язык, смотреть на проблемы и половину переделывать. Тварюшка умеет собрать из методов класс, родить объект этого класса, позвать метод, словить эксепшн, вот и всё - даже про наследование ничего не знает толком. Плоско-объектная.