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

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


==Отличия==
[...]
В силу вышесказанного, даже бывалым программистам при изучении Лиспа порою прийдётся переучиваться:
#Отличать значения некоторых терминов в Лиспе от таковых в других языках, например: макрос, оператор, функция, определение функции, присвоение переменной.
#Изучать необычные заменители привычных приспособлений, например: макросы, родовые функции, условия, продолжения, обобщённые переменные.
#Привыкать к иной манере программирования, поощряемой уникальными свойствами Лиспа, — такими, например, как макросы.

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

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

===Восходящее программирование===
<span style="margin-left:-0.1em">Частный</span> аспект этого нового способа назван «восходящим программированием» (по-английски — ''bottom-up'' programming<ref name="onlisp">Paul Graham, ''On Lisp'', ISBN 0130305529</ref> — «программирование со дна вверх»). Вообще-то любая программа составляется и «снизу», и «сверху», — если она, конечно, написана не прямо на автокоде. Программист на Фортране/Алголе/Си++/Джаве «восходит» по лестнице концептуальной сложности программы всякий раз, когда пишет библиотеку. Но целую программу не создашь на одних библиотеках, да и ограничения языка вскоре дают о себе знать. Так программист встаёт на более традиционный путь «нисходящего программирования»: начиная с наиболее общего взгляда на проектируемую систему, мысленно дробит её на такие части, какие легче всего представить средствами данного языка и существующими библиотеками.

<span style="margin-left:-0.1em">Лисп</span> же, будучи усвоен программистом, не торопит навязывать свои структуры и процедуры, а даёт все приспособления для творения новых, — творения, фактически, собственного языка. Опять же, библиотечные функции и классы делают подобное в других языках. Но Лисп идёт намного дальше, позволяя создавать ''«библиотечное что-угодно»'': не только функции или классы, а любую абстракцию вычислительных процессов и структур данных. Например, КЛОС — система классового программирования в Общем Лиспе, — это лишь набор макросов. Это равно что на каком-нибудь Си-шарпе написать библиотеку… например, логического программирования. А вот на Лиспе целая реализация Пролога вместилась в 180 неторопливых строк.<ref name="onlisp" />

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

<span style="margin-left:-0.1em">Так</span>, Лисп позволяет программировать эффективнейшим способом: создать удобный набор понятий и составить из них решение вычислительной задачи. Или же наоборот: разделить задачу на систему более простых понятий, (и не обязательно только«модулей», «структур», «процедур», «объектов»,) а затем без особых ограничений реализовать те понятия и взаимосвязи между ними.

===Начинающим программистам===
Остережение выше было обращено к программистам, привыкшим к нелисповым языкам. Но и совершенным новичкам может быть немудро начинать с изучения Лиспа.<ref>Даже по Эрику Рэймонду[http://www.catb.org/~esr/faqs/hacker-howto.html#skills1], Лисп должен быть не первым изученным языком, а лишь одним из пяти-шести первых, наряду с [[Язык Си в примерах|Си]][[Си++|[++]]], [[:Категория:Python|Пайтоном]], [[Java|Джавой]] и Пёрлом ^.^ kawaii ;-)</ref> Во-первых, это сложный язык, а Общий Лисп — сложнейший из диалектов. Во-вторых, он непопулярен: намного трудней найти с ним трудоустройство, хостинг для веб-приложений или помощь.

Однако, изучение Лиспа будет полезно хотя бы для [[Словарик философствующего информатика|глубокого понимания информатики и проектирования программ]].
----
----
<references />
<references />

Версия от 05:50, 19 августа 2008

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

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

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

Вместо попыток некого соперничества (да и соперничать в середине века было особо не с кем), разработчики Лиспа изначально не боялись испытывать на нём всё новые приёмы исчисления и структурирования программм.

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

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

Отличия

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

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

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

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

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

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

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

Информация

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

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

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

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

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


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