вторник, 19 июня 2007 г.

Lisp на "Эльбрусе" (первая предыстория)

ое первое знакомство с Лиспом относится еще к студенческим годам. Я был тогда активен и любопытен, бросался на все, что удавалось найти в печати о языках программирования и компиляторах, и, разумеется, у меня была тоненькая книжка (практически брошюрка) под названием Обработка списков. Язык Лисп и его реализация. Долгое время эта книга была единственным источником знаний о языке - ничего другого не выходило. Прочитал я ее несколько раз и долгое время находился под впечатлением совершенно иной философии программирования. Не помню, употреблялся ли тогда (в семидесятых годах) термин "функциональное программирование", но сама парадигма в этой книге была описана вполне отчетливо, хотя и очень лаконично.

Надо понимать: в университете нас учили Алголу и Фортрану, начав работать, я программировал на низком уровне для БЭСМ-6, потом два-три года на PL/I (ЕС ЭВМ), потом пришел Паскаль, потом на горизонте замаячила Ада... Все, в общем, шло в русле одной хорошо известной и понятной императивной парадигмы. Скромный и элегантный Лисп со своей нестандартной "ориентацией" стоял в уголке сознания, внимания к себе особо не требуя, но и не давая о себе забыть. Да и особого повода серьезно им заняться не было: и текущей работы полно, и других интересных вещей вокруг много.

Все изменилось, когда я перешел на "Эльбрус". Хотя работы стало еще больше, и проекты возникали все масштабнее и амбициознее, но, видимо, выдающаяся архитектурная элегантность и рекордная по тогдашним меркам производительность системы сами по себе стимулировали творческое воображение и прямо-таки подталкивали к различным дерзновенным программным экспериментам.

Конкретным толчком послужили исходные тексты системы Reduce-2, которые я случайно обнаружил на излете своей работы на ЕС.

Тем, кто эти баснословные времена не застал, надо объяснить специально. Тогда не было совершенно ничего похожего на теперешнюю свистопляску и накал страстей вокруг "открытого кода", "свободного или проприетарного ПО", копирайтов и "копилефтов" и прочего. Программы товаром не являлись, отдельно от компьютеров, для которых были предназначены, не распространялись и потому отдельной ценности (кроме, разве что, аспектов секретности) не имели. Под "программой", как правило, понималась ее исходная форма. Исходники очередных версий операционной системы "Эльбруса" вместе с компиляторами и прочими программами мы регулярно привозили от разработчиков (инсталляция системы на машине пользователя безусловно подразумевала этап компиляции) и могли сколько угодно их распечатывать, изучать и обсуждать. Хотя с исходниками ОС ЕС ситуация была не столь благостной (все-таки, система-то ворованная), но тексты отечественных программ для ЕС никто не думал ни от кого скрывать. Так что на системных дисках и там попадалось кое-что интересное.

Там я и наткнулся на Reduce-2 - программу символических манипуляций над формулами. Можно было производить различные операции над формулами, брать производные и интегралы, и все это аналитически, без реальных вычислений, по формальным математическим правилам! - тогда это поражало воображение. И написана эта программа была, как вы догадываетесь, на Лиспе. И исходники - вот они... Красивая и по виду не очень сложная программа.

Идея созрела довольно быстро: перенести исходники на "Эльбрус", по-быстрому (ох уж это "по-быстрому"! - сколько раз в жизни дебильный оптимизм меня подводил...) реализовать Лисп на "Эльбрусе", руководствуясь той книжечкой, оттранслировать Редьюс и играть с ним, так сказать, по месту основной работы.

Почему нельзя было перенести вместе с Редьюсом и сам Лисп - уже не помню: то ли не было его исходников, то ли написан он был на чем-то, чего не было на "Эльбрусе"... В общем, сказано - сделано. Через общий для двух машин накопитель на магнитных лентах (кто-нибудь помнит эти двухметровые шкафы, неспешно дергающие толстые бобины туда-сюда? Там был даже специальный механизм, который засасывал конец ленты с одной бобины, чтобы автоматически намотать его на приемную кассету. А в PL/I на уровне языка был определен специальный вид файлов и соответствующих операций обмена, ориентированный на работу с лентопротяжками...) Reduce оказался у меня на "Эльбрусе".

И я принялся писать интерпретатор Лиспа. Именно тогда и очень скоро я понял, как надо изучать новые языки: чтобы до конца понять его семантику, надо его реализовать! Только после этого приходит настоящее понимание. Конечно, я утрирую, и глупо требовать подобного от всех, но доля истины в этом определенно есть. В самом деле, приходится предельно конкретно и совершенно строго (в виде программы) описывать смысл каждой конструкции языка: что она означает, что происходит при ее выполнении и как это отражается на всей программе и на компьютере в целом.

(И, кстати, реализация интерпретатора языка для целей его изучения гораздо полезнее, нежели разработка компилятора: в случае интерпретатора приходится сосредотачиваться именно на аспектах выполнения программ, не отвлекаясь на детали синтаксического разбора и архитектурных аспектов целевой машины. Именно понимание динамической семантики дает истинное знание языка.)

Это все хорошо и правильно, и действительно дало мне понимание Лиспа, значительно более глубокое, нежели при чтении. Плохо другое: я быстро понял, что мне не хватает информации. Реализовать язык в объеме книжки удалось достаточно быстро. Правда, я делал прямую честную (вариант: тупую) реализацию, в которой все конструкции непосредственно интерпретировались. Богатые архитектурные возможности "Эльбруса" я практически никак не использовал, мне просто хотелось быстро получить работающую систему. Однако та маленькая книжечка явно не тянула на строгое описание языка, и некоторые конструкции в исходниках Reduce так и остались для меня загадкой. Да ведь к тому же диалектов Лиспа уже тогда образовалось достаточно, и у Reduce и у книги были определенно "разные" Лиспы. Несколько позже я где-то раздобыл знаменитую программу Elisa - остроумный имитатор диалога пациента и психоаналитика. Программа работала в диалоговом режиме, и в качестве пациента выступал человек за клавиатурой. Так в этой программе я увидел вызовы функций, которых не было ни в книге, ни в Reduce...

Удивятся: за чем же дело стало, неужели трудно найти нормальное описание Лиспа? Друзья, рассказать, как было с технической информацией (да и с любой другой) в восьмидесятых? Прежде всего, не было Интернета. Во-вторых, часто не было возможности купить нужную книгу - дефицит (знаете такое слово?). Каждой осенью издательства публиковали тематические планы выпуска книг на следующий год. В день выхода этих планов магазины технической книги брались штурмом, и попав туда, нужно было быстро разжиться экземпляром плана, бланками заказов, после чего умудриться за рекордное время заполнить бланки, вписав в них реквизиты выбранных книг и свой адрес, и успеть их сдать быстрее других (счет шел на минуты), пока магазин не исчерпает лимит приема заказов (еще одно канувшее слово...), выделенный ему сверху. Одна радость - стоили книги совсем недорого. Заказать нужную книгу зарубежом было труднее, чем слетать на Луну (второе технически вполне реально, первое было невозможно просто по определению).

Если книга все-таки как-то доставалась, проблемой было сделать копию. Немногочисленные "ксероксы" и "множительные машины 'Эра'" охранялись как ядерные боеголовки, а чтобы получить разрешение на копирование, нужно было пройти несколько кругов бюрократического ада, детально и доходчиво объясняя вдумчивым и молчаливым сотрудникам первых отделов свою крайнюю нужду в этой вот книге, составленной целиком из иностранных букв и загадочных знаков...

Конечно, не все было уж так безысходно. Найти и получить нужную книгу при желании или нужде и некоторой настойчивости было вполне реально, как и обойти идиотские препоны. Люди, работавшие на "Ксероксах" (специальная должность имелась!) были зачастую неплохими ребятами, к тому же не могли похвастаться высокими окладами... В крайнем случае можно было и переписать самое нужное (я в своей юности не одну запрещенную статью и книгу руками, как в восемнадцатом веке, переписал, и на пишущей машинке перепечатывал, и ничего...)

Настоящая проблема была в другом: я понял, что сила моего желания "добить" реализацию недостаточно велика, чтобы тратить время и силы на поиск полного описания языка, а потом - не реализацию всех стандартных функций. Понять семантику ключевых понятий и механизмов Лиспа оказалось тогда достаточно, чтобы почувствовать себя вполне удовлетворенным. В самом деле, EVAL и APPLY у меня работали, подмножество функций первой необходимости в объеме "чистого" Лиспа - тоже. Я мог вполне обоснованно продолжать считать себя крутым программером. :-) К тому же впереди меня ждал жутко амбициозный проект "Эверест", для которого надо было придумывать собственный базовый язык (за основу была взята недавно вышедшая Ада, но сам язык - он назывался Глобус-2 - был задуман заметно более мощным)... В общем, тогда я посчитал, что задача полной реализации Лиспа мне, в принципе, по силам, свою крутизну я себе доказал, ну и отлично, перейдем к более насущным делам.

Но в объеме той книжки мой Лисп вполне работал, и тесты проходил. Только вот реально поиграть с ним было никак невозможно: "скушать" Reduce он был не в состоянии...

А документацию по Лиспу я в итоге достал! Это отдельная, короткая, но очень интересная в своем роде история. Давайте об этом в следующей части.

3 комментария:

Анонимный комментирует...

Lisp на "Эльбрусе" (первая предыстория)

Подзаголовок предполагает, что есть хотя бы вторая предистория. Но,

я ее не нашел. :-((

Все, в общем, шло в русле одной хорошо известной и понятной

императивной парадигмы. Скромный и элегантный Лисп со своей

нестандартной "ориентацией" стоял в уголке сознания...


Раз уж я здесь анонимен, осмелюсь задать глупый вопрос. Из серии:

"Что вы хотели знать о сексе, но стеснялись спросить."

Возможно Вы сталкивались с внутренним языком системы AutoCAD

AutoLISP. Меня давно интересовало, насколько этот язык можно

считать диалектом (или расширением?) Лиспа? Если обобщить мой

вопрос, то всегда ли расширение Лиспа шло через добавление

"императивных" операторов или были и другие пути?

Так что на системных дисках и там попадалось кое-что

интересное.


Вообще-то, ИМХО чаще перевозили ленты. Они были дешевле, а у дисков

иногда возникала проблема с совместимостью. В те времена головки

ж.дисков юстировали, и не всегда эту операцию делали точно. Свои

диски дисковод читал правильно всегда, а чужие не всегда.

Через общий для двух машин накопитель на магнитных лентах

(кто-нибудь помнит эти двухметровые шкафы, неспешно дергающие

толстые бобины туда-сюда? Там был даже специальный механизм,

который засасывал конец ленты с одной бобины, чтобы автоматически

намотать его на приемную кассету.


Я помню. Помню красивый логотип VEB Carl Zeiss Jena на них в виде

выпуклой литой детальки. Такой же как и на моих очках тогда. Искал

в И-нете картинку, - не нашел. А логотип можно посмотреть вот тут:
http://www.artantik.ru/images/big-web/4104-1-DSCN9146.JPG
(он хорошо читается на ручке прибора)


А в PL/I на уровне языка был определен специальный вид файлов и

соответствующих операций обмена, ориентированный на работу с

лентопротяжками...)


На ЕС ЭВМ был кажется специальный язык управления заданиями, общий

для программ на PL/1 и FORTRAN. Но, возможно это было некоторое

подмножество PL/1.

надо его реализовать! Только после этого приходит настоящее

понимание. Конечно, я утрирую, и глупо требовать подобного от всех,

но доля истины в этом определенно есть.


Во всяком случае таким образом можно узнать все конструкции языка,

включая различные "фокусы" которые сам туда заложил. :-))

Да ведь к тому же диалектов Лиспа уже тогда образовалось

достаточно, и у Reduce и у книги были определенно "разные"

Лиспы.


Насколько я знаю, у Reduce был некий "расширенный" Лисп. Он

назывался R-лисп. Логика расширения так и осталась мне не до конца

понятной. Некоторые вещи косались операций ввода-вывода, которые,

как мне кажется, трудно реализовать в виде действия со списком.

Elisa - остроумный имитатор диалога пациента и психоаналитика.



Вообще-то психоаналитики так не работают. Программа в более-менее

связных выражениях побуждала человека говорить (писать) дальше.

Каждой осенью издательства публиковали тематические планы

выпуска книг на следующий год. В день выхода этих планов магазины

технической книги брались штурмом, и попав туда, нужно было быстро

разжиться экземпляром плана, бланками заказов, после чего

умудриться за рекордное время заполнить бланки, вписав в них

реквизиты выбранных книг и свой адрес, и успеть их сдать быстрее

других (счет шел на минуты), пока магазин не исчерпает лимит приема

заказов (еще одно канувшее слово...), выделенный ему сверху.


Тематические планы публиковались вплоть до 91г. Но, в 92г. заказы,

к сожалению, уже не исполняли.

В 91г. в "Библио Глобус" во время этой процедуры от давки чуть не

треснуло стекло в окне и перевернули прилавок.

Однако бланки заказов при этом не использовались (я такого не

помню). Использовалась обычная почтовая карточка. Можно было и с

картинкой, но так обходилось дороже.


Немногочисленные "ксероксы" и "множительные машины 'Эра'"

охранялись как ядерные боеголовки, а чтобы получить разрешение на

копирование, нужно было пройти несколько кругов бюрократического

ада, детально и доходчиво объясняя вдумчивым и молчаливым

сотрудникам первых отделов свою крайнюю нужду в этой вот книге,

составленной целиком из иностранных букв и загадочных знаков...


Устройства фирмы Xerox стали особенно популярны после знаменитой

"коробки из под ксерокса" :-)) В те времена чаще встречались

творения фирм U-bix и Konica. В нашей организации копировальных

аппаратов было "как грязи". Никаких особых ограничений на работу с

ними не было, и разрешения просить не надо было. "Сотрудник первого

отдела" мог зайти и поинтересоваться: "Кто тут с таким усердием

"размножается"? " Обьяснения, что здесь "размножается" какой-нибудь

BORIS (Block ORIentierte Simultation) или FORT вполне хватало.

Главное что это не какая-нибудь "политика". Однако, следом шло

увещевание: "Наш специалист по копи-технике третьего дня в запой

ушел. Так что, порошок засыпать сами будете. И чистую бумагу со

склада сами принесете. А если сломаете, то и сами ремонтировать

будете :-))"

Самой большой проблемой было переплести отпечатанное. Вы забыли про

переплетные мастерские на предприятиях. Вот там действительно надо

было доказывать необходимость. Но, это тема отдельного разговора.

По техническим решениям тогдашние копировальные аппараты больше

напоминали автомобили (изобилие стали и литых деталей, цепные и

зубчатые передачи). Надежность имели значительно большую, чем

современные, но иногда все же ломались. Открыв заднюю крышку можно

было увидеть "целый театр" со множеством "актеров". Кто-то

появлялся, потом исчезал, потом опять появлялся, и в запахе озона

выезжала наружу сежая копия. А управлял всей этой машинерией

"режиссер" Z80 со стандартным набором микросхем обвязки. Т.е. тот

же самый компьютер.

Говорят, на заре компьютерной эры многие специалисты из предметных

областей, отчаявшись, что программисты поймут их задачи, сами

становились программистами. И лучше других справлялись с

постановкой "своей" задачи и ее решением. Некоторые программисты

шли еще дальше, и становились специалистами по копировальной

технике, так нужной в их работе.

Анонимный комментирует...

Хороший подход.
Я как-то выучил сразу два языка - реализовав Рефал на Haskell. :-)

Анонимный комментирует...

Очень мне понравился рассказ! прочитал с удовольствием. как же я завидую людям которые успели поработать на тех машинах, когда еще мир был юн. а то я родился почти в один год с 486