Лисп/Историософия: различия между версиями

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
грамматическая ошибка
Нет описания правки
Строка 1: Строка 1:
«Можно даже возомнить, будто Лисп выжил именно благодаря тому, что его программы суть списки, — что некогда всеми, включая меня, считалось за недостаток.»
Почему, несмотря на репутабельные доводы о полном превосходстве Лиспа над другими языками программирования, народ не пошёл следом за таким убеждением, не одарил Лисп всеобщей славой?
{{Подпись|Джон Маккарти<ref>{{wikipedia|Джон Маккарти}}Информатик, когнитолог, философ. Творец термина [[w:Искусственный интеллект|«искусственный интеллект»]] (1955), прародитель (1956) [[w:логическое программирование|логического программирования]], отец-основатель функционального программирования (одновременно с Лиспом, в 1958 году), лауреат премии Тьюринга (1971) и других.</ref>, «Ранняя история Лиспа»}}

«Мне кажется, что для многих задач Лисп, возможно, будет замещён языком, делающим с Лиспом то, что Лисп делает с машинным языком. […] Но в более высокоуровневом, чем Лисп, языке декларативная часть может оказаться столь большой, что тексты на нём могут не соответствовать программам. Если нечто, заменящее интерпретатор, достаточно умно́, то написанное пользователем будет скорее декларативным описанием фактов о некой цели и доступных для её достижения средств, чем программа как таковая.»
{{Подпись|Джон Маккарти, «Лисп: заметки о прошлом и будущем», 1980 год<ref>[http://www-formal.stanford.edu/jmc/lisp20th/node5.html ''Mysteries and other Matters'']</ref>}}


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


<span style="margin-left:-0.1em">Лисп</span> ничем таким похвастаться не может. Его изобрёл в 1958 году Джон Маккарти. <ref>{{wikipedia|Джон Маккарти}}Информатик, когнитолог, философ. Творец термина [[w:Искусственный интеллект|«искусственный интеллект»]] (1955), прародитель (1956) [[w:логическое программирование|логического программирования]], отец-основатель функционального программирования (одновременно с Лиспом), лауреат премии Тьюринга (1971) и других.</ref>
<span style="margin-left:-0.1em">Лисп</span> ничем таким похвастаться не может. Его изобрёл в 1958 году Джон Маккарти.


Вместо попыток некого соперничества <small>(да ведь и соперничать в середине века было особо не с кем)</small>, Лисп изначально не боялся испытывать всё новые приёмы исчисления и структурирования программм. Удивительно, но все из этих нововведений проникли в сознание программистской общественности лишь как последующие заимствования их в более популярных языках. Многие из этих заимствований были сразу приняты за стандарт (условные операторы, символьное исчисление, переменные как указатели), иные чуть погодя (рекурсия, сборка мусора, интерактивность, синтаксическое сокращение).
Вместо попыток некого соперничества <small>(да ведь и соперничать в середине века было особо не с кем)</small>, Лисп изначально не боялся испытывать всё новые приёмы исчисления и структурирования программм. Удивительно, но все из этих нововведений проникли в сознание программистской общественности лишь как последующие заимствования их в более популярных языках. Многие из этих заимствований были сразу приняты за стандарт (условные операторы, символьное исчисление, переменные как указатели), иные чуть погодя (рекурсия, сборка мусора, интерактивность, синтаксическое сокращение).

Версия от 06:08, 15 сентября 2008

«Можно даже возомнить, будто Лисп выжил именно благодаря тому, что его программы суть списки, — что некогда всеми, включая меня, считалось за недостаток.»

Джон Маккарти[1], «Ранняя история Лиспа»

«Мне кажется, что для многих задач Лисп, возможно, будет замещён языком, делающим с Лиспом то, что Лисп делает с машинным языком. […] Но в более высокоуровневом, чем Лисп, языке декларативная часть может оказаться столь большой, что тексты на нём могут не соответствовать программам. Если нечто, заменящее интерпретатор, достаточно умно́, то написанное пользователем будет скорее декларативным описанием фактов о некой цели и доступных для её достижения средств, чем программа как таковая.»

Джон Маккарти, «Лисп: заметки о прошлом и будущем», 1980 год[2]

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

Лисп ничем таким похвастаться не может. Его изобрёл в 1958 году Джон Маккарти.

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

Всё же, не в малой части нововведения Лиспа лишь теперь начинают обретать понимание среднего молодого программиста. Некоторые из них даже поныне остаются таинственным древним знанием, робкое применение которого в других языках тотчас объявляется отважным нововведением [бывшим в Лиспе один-два десятилетия]. Примеры: функциональная парадигма, метапрограммирование, родовые функции, именованные и условные параметры; программный код как структура из выражений и многое другое.

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

Отличия

В силу вышесказанного, даже бывалым программистам при изучении Лиспа порою прийдётся переучиваться:

  1. Отличать значения некоторых терминов в Лиспе от таковых в других языках, например: макрос, оператор, функция, определение функции, присвоение переменной.
  2. Изучать необычные заменители привычных приспособлений, например: макросы, родовые функции, условия, продолжения, обобщённые переменные.
  3. Привыкать к иной манере программирования, поощряемой уникальными свойствами Лиспа, — такими, например, как макросы.

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

А вот последнее требование — менять способ составления программ — отвратит от Лиспа многих программистов. Оно вовсе не обязательно: на Лиспе можно программировать в «джавном» или «сишном» стиле. Однако, безумной расточительностью будет это человеку, уже привыкшему к фортраноподобным языкам. Не переходить же на новый язык ради одних только «удобств» вроде родовых функций.

Восходящее программирование

Частный аспект этого нового способа назван «восходящим программированием» (по-английски — bottom-up programming[3] — «программирование со дна вверх»). Вообще-то любая программа составляется и «снизу», и «сверху», — если она, конечно, написана не прямо на автокоде. Программист на Фортране/Алголе/Си++/Джаве «восходит» по лестнице концептуальной сложности программы всякий раз, когда пишет библиотеку. Но целую программу не создашь на одних библиотеках, да и ограничения языка вскоре дают о себе знать. Так программист встаёт на более традиционный путь «нисходящего программирования»: начиная с наиболее общего взгляда на проектируемую систему, мысленно дробит её на такие части, какие легче всего представить средствами данного языка и существующими библиотеками.

Лисп же, будучи усвоен программистом, не торопит навязывать свои структуры и процедуры, а даёт все приспособления для творения новых, — творения, фактически, собственного языка. Опять же, библиотечные функции и классы делают подобное в других языках. Но Лисп идёт намного дальше, позволяя создавать «библиотечное что-угодно»: не только функции или классы, а любую абстракцию вычислительных процессов и структур данных. Например, КЛОС — система классового программирования в Общем Лиспе, — это лишь набор макросов. Это равно что на каком-нибудь Си-шарпе написать библиотеку… например, логического программирования. А вот на Лиспе целая реализация Пролога вместилась в 180 неторопливых строк.[4]

Информация

Одна из задач, предлагаемых в этом учебнике — придумать новую «парадигму» или «философию» программирования, затем реализовать её в Лиспе.

Так, Лисп позволяет программировать эффективнейшим способом: создать удобный набор понятий и составить из них решение вычислительной задачи. Или же наоборот: разделить задачу на систему более простых понятий, (и не обязательно только«модулей», «структур», «процедур», «объектов»,) а затем без особых ограничений реализовать те понятия и взаимосвязи между ними.

Начинающим программистам

Остережение выше было обращено к программистам, привыкшим к нелисповым языкам. Но и совершенным новичкам может быть немудро начинать с изучения Лиспа.[5] Во-первых, это сложный язык, а Общий Лисп — сложнейший из диалектов. Во-вторых, он непопулярен: намного трудней найти с ним трудоустройство, хостинг для веб-приложений или помощь.

Однако, изучение Лиспа будет полезно хотя бы для глубокого понимания информатики и проектирования программ.


  1. Информатик, когнитолог, философ. Творец термина «искусственный интеллект» (1955), прародитель (1956) логического программирования, отец-основатель функционального программирования (одновременно с Лиспом, в 1958 году), лауреат премии Тьюринга (1971) и других.
  2. Mysteries and other Matters
  3. Статья Programming Bottom Up на английском; часть книги «On Lisp».
  4. (англ.) Paul Graham, On Lisp, ISBN 0130305529
  5. Даже по Эрику Рэймонду[1], Лисп должен быть не первым изученным языком, а лишь одним из пяти-шести первых, наряду с Си[++], Пайтоном, Джавой и Пёрлом ^.^ kawaii ;-)