newsmode
search
Меню
arrow_back Назад

The Roots of Lisp

auto_awesomeКраткое саммари

Эссе Пола Грэма (май 2001) объясняет, что в 1960 году Джон Маккарти опубликовал статью, в которой сделал для программирования примерно то же, что Евклид для геометрии: показал, как из горстки простых операторов и нотации для функций можно построить целый язык программирования. Этот язык он назвал Lisp (от «List Processing»), поскольку одной из его ключевых идей было использование простой структуры данных — списка — одновременно и для кода, и для данных. Грэм утверждает, что в истории было две по-настоящему чистые и непротиворечивые модели программирования: модель C и модель Lisp, и что новые языки последних 20 лет неуклонно движутся в сторону модели Lisp, добавляя к C-модели по частям такие черты, как типизация во время выполнения и сборка мусора. Отличительная — фактически определяющая — особенность Lisp в том, что он может быть написан на самом себе. Чтобы понять, что Маккарти имел в виду под этим, автор предлагает пройти его путь заново, переведя математическую нотацию в работающий код на Common Lisp.

Май 2001

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

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

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

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