Pull to refresh
85.94
Rating
Edison
Изобретаем успех: софт и стартапы

Пол Грэм: «Месть ботанов». В чем отличие Lisp

Edison corporate blogProgrammingLispProfessional literature
Продолжаем перевод эссе и книги Пола Грэма «Хакеры и Художники».
«Мы гонялись за С++ программистами. Нам удалось перетащить их целую кучу на полпути к Lisp.»
Гай Стил, соавтор Java спецификации.


Оригинал — Revenge of the Nerds, Май 2002
и What Made Lisp Different, декабрь 2001
За перевод спасибо Щёкотовой Яне.

Начало: Пол Грэм: «Месть ботанов», часть 1

Часть вторая


Чем отличается Lisp

Когда Lisp был впервые разработан, он воплощал в себе 9 новых принципов. Сегодня некоторые из них мы воспринимаем как само собой разумеющееся, другие можно увидеть только в более продвинутых языках, а два все еще остаются прерогативой Lisp. Эти 9 принципов перечислены ниже в порядке их применения в основном IT-течении.



EDISON Software Development Centre
Подходы к двух- и трехступечатому проектированию, которые мы используем на проектах в EDISON Software Development Centre.



1 Условные высказывания (Conditionals). Условное высказывание представляет собой конструкцию if-then-else. Сегодня для нас это стандарт, но вот в Fortran I они отсутствовали. Там был только условный переход goto, на основе низлежащей машинной инструкции.

2 Функциональный тип данных (A function type). В Lisp функции – это такой же тип данных, как integer или string. Они имеют буквенное представление, могут быть присвоены переменным, могут передаваться в качестве аргументов, и т.д.

3 Рекурсия (Recursion). Lisp был первым языком программирования, который ее поддерживал.

4 Динамическое типизирование (Dynamic typing). В Lisp все переменные, в сущности своей, являются указателями. Значения – вот что имеет тип, а не переменные, и присвоение или связывание переменных означает копирование указателей, а не того, на что они указывают.

5 Сборка мусора (Garbage-collection).

6 Программы, составленные из выражений (Programs composed of expressions). Программы на Lisp представлены в виде деревьев выражений, каждое из которых возвращает значение. Это как противопоставление Fortran и большинству последующих языков, которое различает понятия «выражения» и «операторы».

Для Fortran I это различие было естественным, потому что операторы не могли быть вложенными. И таким образом, пока для работы нужны были математические выражения, не было смысла в создании чего-то такого, что возвращало бы значение, т.к. это значение никуда не могло быть сохранено.

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

7 Символьный тип (symbol type). Символы по факту являются указателями на строки, сохраненные в хеш-таблицах. Таким образом, проверять равенство можно путем сравнения указателей, а не каждого символа.

8 Нотации для кода, использующего деревья символов и констант.

9 Постоянная целостность языка. В действительности различия между временем чтения кода, временем компиляции и временем выполнения нет. Можно компилировать или запускать код во время чтения, читать или запускать код во время компиляции, и читать или компилировать код во время его выполнения.

Запуск кода во время чтения позволяет пользователям перепрограммировать синтаксис Lisp. Запуск кода во время компиляции – это базовый принцип макроса. Компиляция во время выполнения – это принцип использования Lisp в качестве языка расширения в программах подобных Emacs. А чтение во время выполнения позволяет программам общаться посредством S-выражений, что не так давно было заново изобретено как XML.

Когда Lisp впервые появился, эти принципы были далеко за пределами обычной практики программирования, что, в основном, было продиктовано аппаратурой, появившейся в конце 1950-ых годов. Со временем, базовый язык, воплощенный в последователях популярных языков, постепенно эволюционировал в Lisp. Принципы 1-5 сейчас широко распространены. Принцип под номером 6 еще только начинает проявляться в мейнстриме. Python находится на 7 стадии, хотя, кажется, для этого принципа отсутствуют какие-либо синтаксические правила.

Что касается пункта 8, то он, возможно, является одним из самых интересных. Принципы 8 и 9 стали частью Lisp случайно, потому что Стив Рассел внедрил то, что Маккарти никогда и не собирался делать. И все же, эти принципы оказались лежащими в основе как странного появления Lisp, так и его наиболее отличительных черт. Lisp выглядит настолько странно не потому что у него своеобразный синтаксис, а потому что у него нет синтаксиса как такового. Вы пишете программы прямо в деревьях грамматического разбора, которые строятся за кулисами во время парсинга в других языках программирования, и эти деревья состоят из списков, которые являются структурами данных в Lisp.

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

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

В основном, я это все преподношу как шутку, но в ней есть доля правды. Если определить язык, в котором есть car, cdr, cons, quote, cond, atom, eq и нотация для функций, выраженных в виде списков, тогда из всего этого можно построить все остальное нутро Lisp. Это, на самом деле, и есть определяющее качество Lisp: все было организовано так, чтобы Маккарти придал Lisp ту форму, которую он имеет сейчас.

Где языки имеют значение

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

Конечно, существуют проекты, где выбор языка программирования не имеет значения. Как правило, чем требовательнее приложение, тем больший выигрыш Вы получаете от использования мощного языка. Но множество проектов не настолько требовательные. Большая часть процесса программирования состоит из написания небольших программ-посредников, где можно использовать любой язык, с которым Вы уже знакомы, и у которого есть хороший набор библиотек для любых Ваших целей. Если Вам нужно только передать данные из одной Windows программы в другую, конечно же, используйте Visual Basic.

Вы можете также писать программы-посредники и на Lisp (я его использую как настольный калькулятор), но наибольшая выгода от использования языков подобных Lisp в другом спектре применения, где Вам нужно написать сложные программы для решения сложных задач в условиях жесткой конкуренции. Хорошим примером является программа поиска цен на авиаперелеты, право на использование которой ITA Software предоставила компании Orbitz. Эти ребята вошли на рынок, где уже доминировали два крупных сильных противника, Travelocity и Expedia, и, казалось, просто подавили их с технологической точки зрения.

Ядро приложения ITA составляют 200 000 строк программы на Common Lisp, которая ищет на порядок больше возможностей, чем их конкуренты, все еще, по-видимому, использующие технологии эпохи программирования мейнфреймов. (Хотя ITA также в некотором смысле использует язык программирования эпохи мейнфреймов). Я ни разу не видел ни строчки кода из программы ITA, но, согласно одному из их лучших специалистов, они используют много макросов, чему я нисколько не удивляюсь.

Продолжение следует

(Кто хочет помочь с переводами статей Пола Грэма — пишите в личку)
Tags:lispПол Грэмдизайн языков программированияedisonsoftware
Hubs: Edison corporate blog Programming Lisp Professional literature
Total votes 19: ↑16 and ↓3+13
Views22K

Top of the last 24 hours

Information

Founded
Location
Россия
Website
www.edsd.ru
Employees
31–50 employees
Registered