Лисп-машина


Лисп-машина — универсальная вычислительная машина, архитектура которой оптимизирована для эффективного выполнения программ на языке Лисп.

Эквивалентна (абстрактной) машине Тьюринга (и обычному персональному компьютеру) по критерию полиноминальной сводимости.

Несмотря на то, что лисп-машины никогда не были широко распространены (около 7 тыс. штук во всём мире на 1988 год), многие распространённые ныне идеи и программные технологии были впервые разработаны с помощью лисп-машин, например на тех, что использовались в исследовательском центре Xerox PARC были реализованы:

Лисп-машины предоставляли широкие возможности по проведению экспериментальных разработок в области компьютерных наук. На базе разработок таких машин было создано новое поколение инженерных рабочих станций.

В 1973 году программисты лаборатории искусственного интеллекта при Массачусетском технологическом институте Ричард Гринблэтт и Томас Найт начали работу над тем, что впоследствии стало «проектом лисп-машины MIT». Изначально это был компьютер, аппаратно приспособленный для выполнения некоторых основных операций Лиспа в 24-битовой теговой архитектуре. Обрабатывать лисп-программы программно было накладно, так как переменные в Лиспе типизируются при выполнении, а не на этапе компиляции, и из-за проверок и ветвления обыкновенное добавление двух переменных могло занимать до пяти минут на обычных компьютерах. Машина также выполняла последовательную (называемую «Arena») сборку мусора. При тестировании в лисп-машинах также параллельно использовались более традиционные методы — если одновременные тесты проваливались, то результат сбрасывался и вычислялся заново; во многих случаях это означало ускорение. Такое приближение также использовалось при тестировании границ массивов и других операциях, связанных с управлением памятью (не обязательно связанных со сборкой мусора или массивами).

Проверка типов впоследствии была улучшена и автоматизирована, когда традиционный размер машинного слова в 32 бита был увеличен до 36 бит у лисп-машин модели Symbolics 3600, и даже до 40 бит или больше (обычно избыточные биты использовались для кодов коррекции ошибок). В первом блоке добавочных битов хранился тип данных (что и делало архитектуру теговой), а оставшиеся использовались для CDR-кодирования (когда обычные элементы в связном списке сжимались примерно вдвое), упрощая сборку мусора на порядок. Дальнейшим усовершенствованием стали две инструкции, которые специальным образом поддерживали функции Лиспа, уменьшая стоимость вызова функций до 20 тактов (в некоторых реализациях Symbolics).