Тернистая история Лисп-машин: первый бум AI, война Столлмана и удивительный интерфейс
Привет! Меня зовут Павел Анохин, я сооснователь и один из кураторов музея Яндекса. Хочу поделиться историей, связанной с нашим экспонатом — редкой платой с Лисп-процессором Symbolics. История эта уходит корнями в далёкое прошлое компьютерной эры — 70-е, времена огромных ЭВМ и первого бума интереса к искусственному интеллекту, продолжается в 80-е, когда Ричард Столлман воевал с компанией Symbolics за право открытого доступа к софту, и заканчивается в 90-х, когда ниша для применения Лисп-машин стала совсем узкой, а небольшие производители компьютеров пали под натиском крупных корпораций. Надеюсь, вам будет интересно узнать обо всём этом больше, а также посмотреть, как работает главный интерфейс Лисп-машины — Listener. Специально для статьи я записал видео с примерами создания несложных программ.
Лисп-плата из музея Яндекса
Первый искусственный интеллект
Первый бум «искусственного интеллекта» пришёлся на 70-е. В то время из-за недостатка в мощностях и данных под этим термином понимали не то же самое, что сейчас. Однако люди уже интересовались такими вещами, как обработка естественного языка и понимание естественных команд. Реализовать качественное распознавание речи (то есть звука) было невозможно, но специалисты всерьёз работали над синтезом речи и распознаванием команд, набранных на естественном языке с клавиатуры. Среди ранних примеров можно выделить SHRDLU (демо, понимавшее команды вида «поставь синюю пирамиду на красный кубик»), Eliza (виртуальный собеседник), Zork (приключенческая игра с управлением на естественном языке: «Ударь тролля мечом», «Открой сундук и положи в него рюкзак»).
Одним из центров по искусственному интеллекту был MIT. Сегодня ИИ в первую очередь ассоциируется с машинным обучением, но тогда наибольшее внимание уделялось символьным вычислениям. Исторически сложилось, что основным языком разработки того, что тогда подразумевалось под искусственным интеллектом, был Лисп. Это первый относительно распространённый язык, который хорошо справлялся не только с вычислениями, но и с обработкой символьной информации.
Много внимания уделялось экспертным системам — программам, способным выполнять действия по созданным вручную правилам. Были и первые эксперименты с нейросетями, но далеко они не зашли.
Рядом с людьми, которые занимались самим ИИ, неизбежно появлялись люди, которые развивали сопутствующие инструменты: язык, компиляторы, средства разработки. Сейчас каждый программист привык к средствам разработки — они во многом являются развитием идей, заложенных тогда. Чтобы разрабатывать сложные по тем временам системы, нужны были ещё толком не существовавшие инструменты. Их придумывали, проводилось много экспериментов, как обустроить пользовательский интерфейс.
Возникло два больших конкурирующих диалекта со своими экосистемами. MIT считали важным, во-первых, развивать сам язык (например, они придумали макросы вполне современного вида), а во-вторых, улучшать качество его реализаций (так появился первый настоящий компилятор Лиспа в машинный код). Эти идеи стали основой диалекта MacLisp. В качестве редактора кода использовали Emacs. Реализацию Emacs того времени едва ли можно назвать ранней версией нынешнего всем известного редактора — скорее это был её идеологический предшественник.
В BBN, а позже в Xerox разрабатывали InterLisp. В языковом плане он оказался более архаичен, но много внимания уделялось инструментарию разработчика. Именно там впервые появились такие привычные сегодня вещи, как автодополнение в командной строке; интерактивный анализ программы на предмет того, в каких местах кода используется конкретная функция или переменная; встроенный в среду разработки специализированный редактор. Также у InterLisp очень рано появился оконный интерфейс. Но были и вещи очень странные по нынешним меркам. Например, исходники хранились не в файлах, а прямо внутри образа системы, который целиком сохранялся и загружался вместе со всем состоянием. А если интерпретатор обнаруживал, что кусок кода содержит ошибку, то пытался её самостоятельно исправить — скажем, меняя несуществующую переменную на существующую с похожим названием. Это порой приводило к непредсказуемым последствиям.
Плата памяти для Лисп-машины из музея Яндекса
Открытость и анархия
Подразделение MIT, сделавшее MacLisp, называлось лабораторией искусственного интеллекта — MIT AI Lab. В лаборатории и вокруг неё сформировалась особая этика совместного пользования ограниченными ресурсами — культура максимальной открытости и, я бы сказал, анархии.
Разработчики тех лет начинали на железе, которое можно было купить: главным Лисп-компьютером 60-х — 70-х служил PDP-10. Это были большие и дорогие машины, которые использовались сразу несколькими людьми в режиме разделения времени. В AI Lab сделали ОС для PDP-10, она так и называлась — «несовместимая система c разделением времени» (Incompatible Timesharing System, ITS).
ITS не предусматривала никакой защиты пользователей друг от друга, никакого разграничения доступа — и это не от бедности, а сознательно. Например, считалось совершенно нормальным читать электронную почту другого человека — вдруг ему задали вопрос, на который лучше ответишь ты? Авторизация происходила без пароля, а логин был нужен только для уведомления соседей по машине о том, кто сейчас за ней работает. Сначала даже для подключения по сети не требовались пароли. Однажды их всё-таки ввели — оставив доступ открытым для тех, кто заходил в систему из здания лаборатории.
Первые специализированные Лисп-компьютеры
К середине 70-х стало понятно, что на покупных PDP-10 далеко не уедешь. Сказывалась недостаточная производительность и особенно ограничения адресного пространства. В MIT начали разрабатывать свой компьютер. А поскольку многие процессы в институте были связаны с Лиспом, то они делали компьютер, заточенный под исполнение Лисп-программ. Первое экспериментальное устройство называлось CADR, сейчас его можно увидеть в музее MIT. CADR был громоздким, их сделали примерно 25, не дойдя до серийного производства.
В лаборатории искусственного интеллекта разные версии CADR хоть и с проблемами, но прижились. И как часто бывает, когда нечто крутое придумывается в университете, разработчики решили: давайте зарабатывать на этом деньги. Из-за разногласий компаний получилось две, их создали с разницей в год: в 1979-м и 1980-м. Первую назвали просто Lisp Machines Inc. (LMI), а вторую Symbolics — напоминаю, что речь шла про обработку символьной информации, а не просто про вычисления.
Война Symbolics со Столлманом как важнейшая глава в истории компьютерных лицензий
Одним из сотрудников лаборатории — в том числе главным мейнтейнером редактора Emacs — был Ричард Столлман. Когда образовались две компании, они наняли почти всех коллег Ричарда по AI Lab — интересно, что сам он не вошёл ни в ту, ни в другую команду.
Столлман, судя по всему, остро переживал то, что считал распадом сообщества, и особенно невзлюбил как раз Symbolics, в которую ушло больше народа и которая была агрессивнее в коммерческом смысле.
Ричард Столлман в MIT. Источник: Марк Шпаковский в Твиттере
Поскольку на ранних этапах обе фирмы фактически продавали клоны CADR, а их софт был основан на разработках времён AI Lab, то между ними и MIT действовало хитрое лицензионное соглашение. Оно позволяло лаборатории пользоваться всеми разработками фирм — без права распространения. Это тоже шло вразрез с привычной Столлману прежней практикой свободного обмена софтом. Он стал «помогать» отстающей LMI, воспроизводя для неё новые фичи от Symbolics, сначала — глядя в исходники Symbolics и переписывая код по-своему, а потом не глядя, по документации. В конце концов Symbolics это надоело, они устроили скандал с MIT, и Ричарду Столлману закрыли доступ к системам. «Война» длилась примерно с 1981 по 1983 год.
Разумеется, стороны по-разному описывают те события. Версия Столлмана изложена в книге Сэма Уильямса «Free as in Freedom. Richard Stallman«s Crusade for Free Software» и вкратце в этой лекции. Взгляд сотрудника Symbolics изложен здесь — если совсем коротко, Столлман никак не повлиял на работу Symbolics, а конкуренции между компаниями как таковой не было.
Сейчас, спустя 40 лет, эта история выглядит как буря в стакане. Но у неё был важный побочный эффект: Столлман решил сохранить культуру и этику, подобные тем, которые он знал по AI Lab и которых лишился. Так он придумал лицензию GPL — и вот она уже оказала большое влияние на мир, в котором мы сейчас живём.
Common Lisp и своё железо
Но вернёмся к LMI и Symbolics. Чуть позже к ним в области символьных вычислений присоединились большие и успешные хардварные компании: Texas Instruments и Xerox. LMI, Symbolics и TI продолжали семейство диалектов, основанных на MacLisp, а Xerox развивал Interlisp.
Со временем диалектов накопилось столько, что лисперы собрались и придумали стандарт Common Lisp: основная работа над ним шла с 1981 по 1984 год. Common Lisp, популярность которого быстро росла, в значительной степени базируется на версии Symbolics. Так парни из Xerox оказались немного на периферии, а Symbolics — наоборот, в самом центре этой тусовки.
Тогда уже было принято работать на однопользовательских машинах. Однако первые компьютеры Symbolics по-прежнему были размером с холодильник и страшно дорогими (35–125 тысяч долларов в 1988-м). Их, тем не менее, покупали организации, занимающиеся сложной обработкой данных. Например, планированием железнодорожных или авиарейсов, экспертными медицинскими системами (вводишь симптомы, и машина даёт оценку, что это может быть за диагноз). Есть сведения о применении в NASA для решения задачи об оптимальном расположении грузов в шаттле. American Express через фирму-партнёра использовала систему Symbolics, чтобы советовать сотрудникам колл-центра, в каких случаях считать звонящего мошенником. Повторюсь, компьютеры стоили дорого — в то же время внутренняя статистика American Express показывала, что окупаемость от их покупки составляет 45–67% (это очень много).
Но в основном технику Symbolics покупали не столько для того, чтобы запускать сложные программы, а чтобы их разрабатывать. Лисп-хакеры как начали ещё в 70-х делать компьютеры для себя и своей тусовски, так и продолжили.
Кстати, если вы не знали, вот вам интересный факт: symbolics.com — самый первый домен в зоне .com:
Creation Date: 1985–03–15T05:00:00Z
AI winter. Почему небольшие группы проиграли корпорациям
Затем наступил период, который принято вспоминать как AI winter. С одной стороны, всеобщий энтузиазм по поводу экспертных систем поугас. С другой, оказалось, что очень большой сегмент покупателей Лисп-машин — подрядчики министерства обороны США. В 1987-м управление перспективных исследовательских проектов в министерстве (Defense Advanced Research Projects Agency, DARPA) сократило расходы на проекты, и развитие всей этой сферы серьёзно замедлилось.
Был и ещё один фактор: компании масштаба Intel без труда вытесняли с рынка маленькие конторы, производящие всё целиком (железо и софт). Продукция Intel была дешевле, не настолько нишевой и продавалась миллионами. Невысокая цена каждого отдельного устройства устраивала корпорацию: деньги с продаж шли на дальнейшие разработки и обеспечивали рост производительности. Начатая тогда унификация в мире компьютеров сохраняется и сейчас.
В том же 1987-м оказалось, что Лисп-программа работает быстрее на неспециализированном компьютере. Сначала такой софт запускали на рабочих станциях c UNIX, особенно производства Sun, а к началу 90-х — и на обычных ПК.
Переход к процессорам и софту
Symbolics начали думать, на чём сэкономить, чтобы остаться минимально конкурентоспособными. Сразу же родилась очевидная идея — перестать производить компьютеры, а делать только специализированные Лисп-процессоры без периферии (клавиатур, памяти, жёстких дисков и так далее). Чип размещался на плате расширения — можно было вставить её в Macintosh и запустить на нём Лисп-среду. В то же время Лисп-процессор умел справляться с гораздо более сложными задачами, чем железо самого Macintosh. Это немного похоже на то, как сейчас пишут программы для внешних GPU.
Интерфейс софта, который поставлялся вместе с Лисп-процессором, представлял собой нечто похожее на CLI, но с некоторыми возможностями из GUI. CLI-образный «текст» мог быть интерактивным объектом: по нему можно было кликнуть правой кнопкой, вывести контекстное меню, относящееся именно к этому объекту, и так далее. Ниже вы найдёте гифки и скринкаст с примерами интерфейса.
К середине 90-х ниша стала совсем узкой, и даже за счёт плат расширения Symbolics уже не могла угнаться за меняющимся миром. Прежде чем обанкротиться в 1996-м, компания успела выпустить эмулятор Лисп-процессора для первых в мире 64-битных чипов Alpha. Сегодня подобный эмулятор можно запустить на обычном ноутбуке.
Лисп-машина в музее Яндекса
Заинтересовавшись этой тематикой, я стал то и дело заходить на eBay —, но за годы ни разу не видел плат расширения с Лисп-процессорами. Возможно, какие-нибудь лоты, быстро ушедшие за фиксированную цену, я пропустил — такие платы появляются в продаже раз в несколько лет. Это старая техника, множество плат находятся в нерабочем состоянии, ещё какие-то хранятся у коллекционеров на Западе. Если уж они что-то продают, то среди своих.
Но однажды я зашёл на reddit и в сабреддите Lisp увидел сообщение от участника — что-то вроде «наигрался, продаю». Речь шла о плате, целиком разработанной в Symbolics и произведённой в 1988 году. Я написал ему, что мы хотим купить плату для музея. Он ответил — раз вы музей, то ставлю вас повыше в очереди. В итоге плата досталась нам.
Любопытный факт: огромные раритетные компьютеры сложнее упаковать и доставить, они требуют большого количества электроэнергии, ухода — и поэтому стоят дешевле, чем платы. Для музея проблемы доставки и эксплуатации чуть менее актуальны, но всё равно принимаются во внимание.
На eBay появляются и другие вещи производства Symbolics: мануалы, книжки, компакт-диски с образами софта. Большим успехом пользуются клавиатуры; люди делают переходники, чтобы подключать их к современным компьютерам. Symbolics любили размещать на клавиатуре множество клавиш-модификаторов — не только Shift, Alt и Control.
Демонстрация работы
Мы посмотрим, как работает главный интерфейс Лисп-машины — Listener. Как я уже говорил, это CLI с некоторыми возможностями из GUI. Для просмотра гифок-скринкастов не нужны специальные знания и умение программировать — мы будем пробовать очень простые команды. Все гифки записаны на реальной Лисп-машине без использования эмулятора.
Начнём с очевидного — в Listener можно вводить Лисп-выражения:
Show Directory — очень многословная команда по меркам UNIX и Windows. В Listener все команды такие. Но благодаря автодополнению необязательно вводить команду целиком — достаточно ввести префиксы слов в команде.
Но где же тут элементы GUI? Дело в том, что содержимое окна Listener кликабельно — например, можно провести курсором по списку (элементы будут подсвечиваться), кликнуть на объект и вывести контекстное меню, относящееся именно к этому объекту:
Но всё перечисленное было бы просто косметикой, если бы нельзя было реализовать автодополнение и кликабельность для своих команд и структур данных.
Напишем на Лиспе небольшую демку. Поскольку мы с вами на Хабре, создадим простой интерфейс работы со списком хабралюдей, у каждого из которых есть карма, и её можно увеличивать.
Обратите внимание, что строка с пользователем Bob некликабельна. Дело в том, что мы удалили этого пользователя командой, идущей сразу после списка. Listener даёт выбрать только тех пользователей, которые существуют в базе.
Я записал на видео более детальный скринкаст со своими комментариями. В нём я прохожу все перечисленные шаги, начиная с Hello world, но останавливаюсь подробнее на программировании и деталях интерфейса. Если хотите заглянуть в код и пошагово узнать, как устроена демка, то садитесь поудобнее:
Если вы читаете статью с компьютера, пользуйтесь «оглавлением» в таймлайне плеера YouTube — можно переходить между фрагментами, смотреть на разные возможности интерфейса и блоки программы.
Заключение
Для всех компаний, упомянутых в посте, идея Лисп-машин была временным решением. Texas Instruments, Xerox и все остальные постепенно переключились на другие направления. Symbolics были наиболее успешны на этом поприще в коммерческом смысле, продали больше всего устройств и, пожалуй, построили самую развитую среду.
Мы рады, что редкая плата с Лисп-процессором Symbolics теперь хранится в московском музее Яндекса. Вы можете прийти и увидеть её своими глазами — она установлена в один из наших «Макинтошей». К сожалению, уже после записи демо для статьи плата сломалась, поэтому попробовать её в работе пока не получится, но мы надеемся, что скоро проблему удастся решить. А пока можно прийти поэкспериментировать с другими экспонатами — наш музей полностью интерактивный.