Май 2001
(Я написал эту статью, чтобы помочь себе понять, что именно обнаружил МакКарти. Вам не нужно знать этот материал, чтобы программировать на Lisp, но он должен быть полезен всем, кто хочет понять суть Lisp - как в смысле его происхождения, так и в смысле его семантического ядра. Тот факт, что у него есть такое ядро, является одной из отличительных особенностей Lisp и причиной того, почему, в отличие от других языков, у Lisp есть диалекты).
В 1960 году Джон МакКарти опубликовал замечательную работу, в которой он сделал для программирования то же самое, что Евклид сделал для геометрии. Он показал, как, имея несколько простых операторов и нотацию для функций, можно построить целый язык программирования. Он назвал этот язык Lisp, что означает "обработка списков", поскольку одной из его ключевых идей было использование простой структуры данных, называемой списком, как для кода, так и для данных.
Стоит понять, что открыл МакКарти, не только как веху в истории компьютеров, но и как модель того, чем программирование стремится стать в наше время. Мне кажется, что до сих пор существовали две действительно чистые, последовательные модели программирования: модель C и модель Lisp. Эти две модели кажутся точками возвышенности, между которыми находятся болотистые низины. По мере того как компьютеры становились все мощнее, новые разрабатываемые языки неуклонно двигались в сторону модели Lisp. Популярным рецептом для новых языков программирования в последние 20 лет было взять модель вычислений на языке C и добавить к ней по частям части, взятые из модели Lisp, такие как типизация времени выполнения и сборка мусора.
В этой статье я попытаюсь объяснить в максимально простых терминах, что открыл МакКарти. Дело не только в том, чтобы узнать об интересном теоретическом результате, который кто-то вывел сорок лет назад, но и в том, чтобы показать, куда движутся языки. Необычная вещь в Lisp - фактически, определяющее качество Lisp - это то, что он может быть написан сам по себе. Чтобы понять, что имел в виду МакКарти, мы проследим его шаги, когда его математические обозначения будут переведены в работающий код Common Lisp.