Автор Тема: Парадокс Блаба.  (Прочитано 33364 раз)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Парадокс Блаба.
« : Февраль 20, 2011, 10:48:17 pm »
Первоисточник тут: http://www.nestor.minsk.by/sr/2003/07/30710.html
Если лень читать всю цитату -- сама суть парадокса выделена жирным шрифтом, но я бы советовал таки прочитать целиком, иначе нюансы уловить не удастся.
Цитировать
Что же в Lisp'е такого прекрасного? Если он такой замечательный, почему его не используют все? Казалось бы, риторические вопросы, но на самом деле на них есть прямые ответы. Lisp настолько хорош не тем, что в нем есть некое волшебное качество, видимое только его приверженцам, а тем, что он — самый мощный язык программирования из существующих.
И причина того, что все вокруг пишут не на Lisp'е, заключается в том, что выбор языка программирования — вопрос не только технологии, но также и привычки, а ничто не меняется так медленно, как привычки. Конечно, оба эти тезиса требуют разъяснений.

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

Все языки одинаково мощные, если рассматривать их с точки зрения эквивалентности машине Тьюринга, но это не та мощь, которая важна программисту. (Никто ведь не хотел бы программировать машину Тьюринга). Мощь языка, в которой заинтересован программист, возможно, трудно определить формальными методами, однако одно из объяснений этого понятия заключается в свойствах, которые в менее мощном языке можно получить, только написав на нем интерпретатор для более мощного языка. Если в языке A есть оператор для удаления пробелов из строк, а в языке B его нет, это не делает A более мощным, чем B, так как в B можно написать процедуру, которая делала бы это.

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

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

Если вы пишете короткую программу, которую используете один раз и выбросите прочь, возможно, следует использовать тот язык, который имеет лучшие библиотечные функции для данной задачи.
Но в целом для программного обеспечения нужно использовать самый мощный (и приемлемо эффективный) язык из всех доступных. Отличный от этого выбор — это ошибка такого же рода, как упор на программирование в машинных кодах, хотя и с меньшими негативными последствиями.

Понятно, что уровень машинного языка очень низок. А высокоуровневые языки часто рассматриваются как одинаковые, по-крайней мере, так принято считать. Но это не так. Технический термин "язык программирования высокого уровня" не обозначает ничего определенного. Не существует четкой границы между множеством "машинных" языков с одной стороны, и множеством "высокоуровневых" с другой. Языки распределены в континууме (возможно, не просто континуум, а некая структура, уменьшающяяся кверху;
важна здесь не форма, а сама идея о том, что существует по крайней мере частичный порядок) абстрактности, начиная от самых мощных "языков высокого уровня" вниз к "машинным языкам", которые, в свою очередь, тоже отличаются друг от друга по мощности.

Возьмем Cobol. Cobol — язык высокого уровня, так как компилируется в машинный язык. Но станет ли кто-нибудь утверждать, что по мощности Cobol эквивалентен, скажем, Python'у? Возможно, он ближе к машинному языку, чем Python.

А как насчет Perl четвертой версии? В Perl 5 в язык были добавлены лексические замыкания (lexical closures). Большинство Perl хакеров согласятся, что Perl 5 мощнее, чем Perl 4. Но раз вы это признали, вы признали, что один высокоуровневый язык может быть мощнее другого. Из этого неизбежно следует, что использовать нужно самый мощный язык.

Впрочем, из этого утверждения редко делается вывод. Программисты старше определенного возраста редко меняют язык по своей воле. Они будут считать достаточно хорошим тот язык, к которому привыкли.

Программисты очень привязываются к своим любимым языкам, а я не хочу оскорбить ничьи чувства, поэтому я объясню свою позицию, используя гипотетический язык с названием Блаб.

Блаб попадает в середину континуума абстрактности. Это не самый мощный язык, но он мощнее, чем Cobol или машинный язык.
И на самом деле, наш гипотетический программист на Блабе не будет использовать ни Cobol, ни машинный код. Для машинных кодов есть компиляторы. Что же касается Cobol'а, наш программист не знает, как на этом языке вообще что-то можно сделать. В Cobol'е даже нет некой возможности X, присутствующей в Блабе.

Когда наш гипотетический Блаб-программист смотрит вниз на континуум мощности языков, он знает, что смотрит вниз. Менее мощные, чем Блаб, языки явно менее мощны, так как в них нет некой особенности, к которой привык программист. Но когда он смотрит в другом направлении, вверх, он не осознает, что смотрит вверх. То, что он видит, — это просто "странные" языки. Возможно, он считает их одинаковыми с Блабом по мощности, но со всяческими сложными штучками. Блаба для нашего программиста вполне достаточно, так как он думает на Блабе.

Когда мы поменяем точку обзора программиста, используя любой язык программирования выше по континууму мощности, мы обнаружим, что теперь программист смотрит на Блаб сверху вниз. "Как же можно что-то сделать, используя Блаб? В нем отсутствует даже конструкция Y!"

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


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

Пять языков, которые советует хакерам Эрик Реймонд, находятся в разных точках континуума мощности, и то, где они находятся относительно друг друга, — тонкий вопрос. Я скажу, что Lisp находится на вершине континуума. И чтобы поддержать это утверждение, я скажу о том, чего мне не хватает, когда я смотрю на остальные пять языков. Как же можно что-то сделать с ними, думаю я, без свойства Z? И самое большое Z — это макросы. (Рассматривать макросы как отдельное свойство — это немного неправильно. На практике их польза увеличивается такими свойствами Lisp'а, как лексические замыкания и частичная параметризация (rest parameters).

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

Дело не в том, что в Lisp'е странный синтаксис, скорее, его нет вообще. Программы пишутся в готовых синтаксических деревьях, которые в других языках генерируются парсером во время разбора исходного текста. Эти синтаксические деревья в Lisp'е полностью доступны вашим программам, и вы можете писать программы, которые изменяют эти деревья. В Lisp'е подобные программы называются макросы. Это программы, которые пишут программы.

Программы, которые пишут программы? И когда же такое может понадобиться?

Не очень часто, если вы думаете на Cobol'е. И постоянно, если вы думаете на Lisp'е. Было бы удобно, если бы я дал пример мощного макроса и сказал бы: "Вот! Смотрите!". Но если бы я и привел пример, для того, кто не знает Lisp, он выглядел бы не более чем белиберда. Рамки данной статьи не позволяют изложить все необходимое для понимания подобного примера. В книге Ansi Common Lisp я старался излагать материал как можно быстрее, но даже так я не добрался до макросов раньше страницы 160.
Однако мне кажется, что я могу дать убедительный аргумент. Исходный текст редактора Viaweb на 20-25 процентов состоял из макросов. Макросы сложнее писать, чем обычные функции Lisp'а, и считается дурным тоном использовать их там, где можно без них обойтись. Поэтому каждый макрос в той программе был необходим. Это значит, что примерно 20-25 процентов кода в программе делают то, что нельзя просто сделать на других языках.

Как бы скептически ни относился Блаб-программист к моим заявлениям о таинственной мощи Lisp'а, это должно его заинтересовать. Мы не писали этот код для своего собственного развлечения. Мы были маленькой компанией, и программировали так, как только могли, чтобы возвести технологический барьер между нами и нашими конкурентами.

Пытливый читатель может задаться вопросом, а нет ли здесь взаимосвязи? Некоторая большая часть кода делала нечто, что очень сложно сделать на других языках. Получившееся в результате программное обеспечение делало то, что программное обеспечение наших соперников делать не могло. Возможно, между этими фактами есть связь. Я советую вам подумать в этом направлении. Возможно, это все не просто старческие бредни.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #1 : Февраль 21, 2011, 03:54:01 am »
Не осилил  :)
Первое впечатление от уже прочитанного - у автора в голове "каша", и взгляд очень однобокий. Требуется время на осмысление.

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #2 : Февраль 21, 2011, 05:11:11 am »
Здесь уже обсуждали http://forum.oberoncore.ru/viewtopic.php?f=61&t=1914&hilit=%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81
Отрицательное отношение к макросам я с тех пор не изменил.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #3 : Февраль 21, 2011, 05:23:34 am »
Здесь уже обсуждали http://forum.oberoncore.ru/viewtopic.php?f=61&t=1914&hilit=%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81
Отрицательное отношение к макросам я с тех пор не изменил.
Скажите, в чём принципиальное отличие макросов от подпрограмм, кроме того, что макросы работают во время компиляции, а подпрограммы -- во время выполнения программы?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #4 : Февраль 21, 2011, 05:47:24 am »
Принципиальное отличие в том, что они должны сработать у меня в голове, чтобы я представлял себе текст программы.
Вам понравятся макросы, которые порождают другие макросы, которые порождают текст программы? Мне - нет. И даже один уровень не нравится.
А вообще, т.к. у меня по определению нет опыта работы с макросами, тут были бы крайне желательны примеры.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #5 : Февраль 21, 2011, 07:29:54 am »
Макросы это мелкая частность, пример по сути. Сам парадокс то поинтересней будет.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #6 : Февраль 21, 2011, 07:46:38 am »
А если уж заговорили зачем-то о лиспе.. Лисп действительно великий язык. Он стирает грань между разработчиком компилятора и прикладным программистом. Там нет этой дурацкого разделения, порога между тем и другим. И это правильно.

Благодаря тому, что когда программист на лиспе пишет программу, он непосредственно видит синтаксическое дерево, у него не возникает в последствии проблем с его модификацией/созданием програмным способом, т.е. макросами. В отличае от языков где наличиствует т.н. "синтаксис" (тот же Оберон например). В этих языках программист может писать программу и не догадываться что такое синтаксическое дерево вообще, и как оно выглядит на его языке. Поэтому, когда ему говорят про макросы, он сразу кричит "нихачу, нимагу, нинужны!".

Проверить работу макроса в лиспе очень просто -- запускаем  макрос и результат его работы распечатываем. Проверяем.

2Geniepro: Зефиров помнится критиковал лисп за то, что эти самые макросы-спецформы не являются нормальными функциями, т.е. их не передать в качестве аргумента в другую функцию. А выглядят они в точности также, т.е. синтаксически не отличимы от обычных функций.
« Последнее редактирование: Февраль 21, 2011, 07:51:42 am от valexey »
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

kemiisto

  • Jr. Member
  • **
  • Сообщений: 64
    • Просмотр профиля
    • kemiisto.ru
Re:Парадокс Блаба.
« Ответ #7 : Февраль 21, 2011, 09:42:39 am »
Лисп действительно великий язык. Он стирает грань между разработчиком компилятора и прикладным программистом. Там нет этой дурацкого разделения, порога между тем и другим. И это правильно.
И это совершенно НЕправильно. И вот почему.

Благодаря тому, что когда программист на лиспе пишет программу, он непосредственно видит синтаксическое дерево [...]
Нет, нет и ещё раз нет. Мопед не мой, как говорится. :P Info21 многократно декларировал это. Так что повторюсь, в каком то смысле. Программы пишут не только программисты. И даже не столько. На своём примере, я - химик. Поверьте на слово, когда, я пишу программу, я не вижу (и НЕ ХОЧУ видеть) никаких синтаксических деревьев и прочего, потому, что я не знаю, что это такое и знать НЕ ХОЧУ. У меня нет времени на всю эту ерунду. И смотрю я на все эти вещи не снизу-вверх, а эм... сбоку что-ли.

valexey, вот ты же программист? В смысле, работаешь программистом. Тогда, тебе трудно будет "кожей почувствовать", что значит "нет времени на ерунду". Но уж поверь, таки нет.

Собственно, Лисп именно поэтому никогда популярен и не будет. Не нужно никому ваше синтаксическое древо => и Лисп не нужен. ;)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #8 : Февраль 21, 2011, 09:53:58 am »
Таки да, я работаю программистом.

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

Если у нас есть специалист в некой предметной области который сам что-то программит, то ничто не мешает дать ему тот язык, который ему будет максимально удобен или к которому он просто привык. Все это делается элементарно на том же например лиспе. Посмотрите на Racket -- там реализован диалект Алгола-60. Думаю без проблем там можно и оберон реализовать. По сути ядро -- это например Лисп или иной мощный язык который позволяет быстро и просто создавать EDSL/DSL под задачу или даже под специалиста. Специалист предметной области счастлив, программисты тоже счастливы, ибо у них гибкий мощный инструмент позволивший быстро и максимально качественно осчастливить специалиста.

Т.е. я не вижу никаких противоречий.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

kemiisto

  • Jr. Member
  • **
  • Сообщений: 64
    • Просмотр профиля
    • kemiisto.ru
Re:Парадокс Блаба.
« Ответ #9 : Февраль 21, 2011, 10:23:45 am »
Если у нас есть специалист в некой предметной области который сам что-то программит, то ничто не мешает дать ему тот язык, который ему будет максимально удобен или к которому он просто привык. Все это делается элементарно на том же например лиспе.
Так уже всё дадено. А кое-что было дадено аж до Лиспа. :D

Т.е. я не вижу никаких противоречий.
Противоречие в том, что это советы хакерам. Там даже есть явная отсылка на некого Реймонда. А программы пишут не только (и не столько) хакеры. Поэтому аргументы про какую-то там мощность Лиспа не совсем уместны. Это сферическая мощность в вакуууме, ей воспользуются единицы.

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #10 : Февраль 21, 2011, 10:26:56 am »
Проверить работу макроса в лиспе очень просто -- запускаем  макрос и результат его работы распечатываем. Проверяем.
Во-первых, я бы не сказал, что это просто. Кроме того, могут быть всякие нюансы.
Во-вторых, можете привести пример гениального использования макросов? Типа, а вот здесь языки без макросов сосут.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #11 : Февраль 21, 2011, 10:45:01 am »
Если у нас есть специалист в некой предметной области который сам что-то программит, то ничто не мешает дать ему тот язык, который ему будет максимально удобен или к которому он просто привык. Все это делается элементарно на том же например лиспе.
Так уже всё дадено. А кое-что было дадено аж до Лиспа. :D
Это фортран что-ли? :-)

Т.е. я не вижу никаких противоречий.
Противоречие в том, что это советы хакерам. Там даже есть явная отсылка на некого Реймонда. А программы пишут не только (и не столько) хакеры. Поэтому аргументы про какую-то там мощность Лиспа не совсем уместны. Это сферическая мощность в вакуууме, ей воспользуются единицы.
Моя не знать что такое "хакеры". Так что лучше подобрать какое-нибудь другое слово :-)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

kemiisto

  • Jr. Member
  • **
  • Сообщений: 64
    • Просмотр профиля
    • kemiisto.ru
Re:Парадокс Блаба.
« Ответ #12 : Февраль 21, 2011, 10:51:47 am »
Это фортран что-ли? :-)
;D Ога.

Моя не знать что такое "хакеры". Так что лучше подобрать какое-нибудь другое слово :-)
Это не ко мне, а к автору. У него там это словечко проскакивает. Ну, пускай будут "профессиональные программисты". "Профессиональность" означает здесь выбранную профессию, с помощью которой зарабатываешь на кусок хлеба.  :)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #13 : Февраль 21, 2011, 10:55:34 am »
Проверить работу макроса в лиспе очень просто -- запускаем  макрос и результат его работы распечатываем. Проверяем.
Во-первых, я бы не сказал, что это просто. Кроме того, могут быть всякие нюансы.
Гм. А какие проблемы в распечатке получившегося AST'a?

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

Ну-у, чтобы не быть голословным... Например наш любимый пример -- управление ресурсом. Т.e. семантика такова -- если сказал А (получил ресурс), то ты просто обязан как можно быстрее сказать и Б (освободить ресурс). Говорить Б вручную не предлагать -- обязательно кто-нибудь где-нибудь забудет сказать Б.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #14 : Февраль 21, 2011, 10:58:59 am »
Ну и еще пример -- описание конечных автоматов. Т.e. мы хотим на этапе компиляции проверить корректность конечного автомата.

Вообще эти самые макросы (или иной механизм выше уровнем чем банальное структурное программирование) полезны, всегда когда нужно нечто вроде EDSL соорудить.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"