pg.gimran.org

Корни Lisp

Май 2001 · Все эссе

Перевод эссе Пола Грэма «Корни Lisp». Оригинал: https://paulgraham.com/rootsoflisp.html. Машинный перевод (Gemini).

Translation of Paul Graham's essay 'The Roots of Lisp'. Original: https://paulgraham.com/rootsoflisp.html. Machine translation (Gemini).

(Я написал эту статью, чтобы самому точно понять, что именно открыл Маккарти. Знать всё это не обязательно, чтобы программировать на Lisp, но это должно помочь каждому, кто хочет понять саму суть Lisp — как в смысле его происхождения, так и в смысле его семантического ядра. Наличие такого ядра — одна из отличительных черт Lisp и причина того, почему, в отличие от других языков, у Lisp есть диалекты.)

В 1960 году Джон Маккарти опубликовал замечательную статью, в которой он сделал для программирования нечто подобное тому, что Евклид сделал для геометрии. Он показал, как, имея лишь горсть простых операторов и нотацию для функций, можно построить целый язык программирования. Он назвал этот язык Lisp (от «List Processing»), потому что одна из его ключевых идей состояла в том, чтобы использовать простую структуру данных под названием список (list) как для кода, так и для данных.

То, что открыл Маккарти, стоит понять не просто как веху в истории вычислительной техники, но и как модель того, к чему стремится программирование в наши дни. Мне кажется, что до сих пор существовали две по-настоящему чистые, последовательные модели программирования: модель C и модель Lisp. Они кажутся двумя возвышенностями, между которыми лежит болотистая низина. По мере того как компьютеры становились мощнее, разрабатываемые новые языки неуклонно приближались к модели Lisp. Популярным рецептом создания новых языков программирования за последние 20 лет было взять модель вычислений C и по кусочкам добавлять к ней части модели Lisp, такие как динамическая типизация и сборка мусора.

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