Андрей Николаевич Терехов - научный путь и научная школа

Андрей Николаевич Терехов - научный путь и научная школа

При всей широте и богатстве личности нашего отца, первое, что привлекало людей к нему, были его общительность и великолепное чувство юмора. Редко какой ученый оставляет за собой не только шлейф статей, книг и учеников, но и собрания мемов, баек и присловий, которыми он запомнился.

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

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

Это все, однако, было только талантливой формой подачи серьезного научного и исследовательского содержания.

Сегодня мы хотим представить вам Андрея Николаевича Терехова как глубокого и отчасти даже философского исследователя программирования, на стыке двух ключевых научных дисциплин второй половины двадцатого века - информатики и программной инженерии - которые он развивал в СССР, а потом и в России, в самых разных направлениях и на уровне мировых достижений.

Начало пути

Андрей Николаевич рассказывал, что он впервые познакомился с компьютерами (тогда, конечно же, они назывались ЭВМ - электронными вычислительными машинами) в 1963 году из-за того, что с ними пришлось разбираться его отцу. В начале 1960-х Николай Васильевич Терехов вышел в отставку из армии в звании полковника и на новой работе впервые столкнулся с ЭВМ “Урал-1” (в армии на тот момент большинство техники было аналоговой). К разбору этих новинок Николай Васильевич решил привлечь своего сына. Андрей Николаевич вспоминал, что в качестве устройства ввода в этой ЭВМ использовалась… кинолента [10].

Чуть позже Андрею Николаевичу повезло еще раз - в старших классах он перешел учиться в математическую школу, в которой были сразу две ЭВМ “Урал-1”. Благодаря этому к моменту выпуска он даже успел получить официальный разряд программиста. Сейчас выпускник школы, умеющий программировать, никого не удивит, но в середине 1960-х это было уникальным опытом. Нельзя удержаться от того, чтобы не провести параллель с Биллом Гейтсом, для которого доступ к компьютерам в школьные годы также стал идеальной стартовой площадкой для карьеры в программировании - конечно же, с поправкой на кардинальные различия во времени и месте их знакомства с программированием.

На следующем этапе Андрею Николаевичу повезло чуть меньше. Год его выпуска из школы был особым, так как незадолго до того в СССР провели школьную реформу и в 1966-м одновременно заканчивали обучение школьники, учившиеся по 11-летней и по 10-летней программе. Таким образом, конкурс в университет был в два раза больше обычного и Андрею Николаевичу не удалось поступить туда, куда он хотел - на очное отделение математико-механического факультета Ленинградского государственного университета. На мат-мех он решил поступать в основном из-за того, что там не преподавали химию и начертательную геометрию - кстати, нелюбовь к черчению передалась и его детям!

Однако, как говорит поговорка, “не было бы счастья, да несчастье помогло”. Андрею Николаевичу пришлось начинать учебу на вечернем отделении университета, а в те времена это требовало работы в дневное время. Хоть и не сразу, но ему удалось найти работу по профилю - в крупной организации “Ленэлектронмаш”. Там его практический опыт программирования позволил ему выдвинуться в руководители группы программистов (как сказали бы теперь - в менеджеры среднего звена) в очень юном возрасте. Через год ему удалось перевестись на очное отделение мат-меха, но параллельно с этим он продолжал работать программистом и руководителем.

Такие необычные условия для старта заложили основу для всей дальнейшей деятельности Андрей Николаевича на стыке науки, производства и преподавания.

В тот момент советское программирование все еще находилось в стадии становления. Андрей Николаевич был одним из первых выпускников кафедры математического обеспечения ЭВМ ЛГУ. Он вспоминал, что в момент создания новой кафедры его (все еще студента ЛГУ) вызвал замдекана мат-меха, Зенон Иванович Боревич, и попросил выступить перед однокурсниками, чтобы “прорекламировать” новую кафедру и предметы, которые на ней будут изучаться. Дело было новое и многие студенты опасались идти по “непроторенной” дороге. В качестве мотивации Андрей Николаевич рассказывал о том, как с помощью программирования можно решать практические задачи, но главное - сколько он таким образом зарабатывал. В итоге, набралась целая группа добровольцев, около 20 человек, включая, естественно, и самого Андрея Николаевича, который после этого с гордостью называл себя первым выпускником кафедры “матобес ЭВМ”.

Показательно также, что академический журнал “Программирование” стали выпускать лишь через несколько лет после выпуска Андрея Николаевича из университета, в 1975 году. До того статьи приходилось публиковать в “родственных по профилю” изданиях, ближайшим из которых к программированию был журнал “Автоматика и телемеханика”. По воспоминаниям современников, статьи на чисто программистскую тематику там публиковали весьма неохотно.

Отсюда же ранний интерес Андрея Николаевича к преподаванию. Ему пришлось обучать программированию своих коллег по работе еще в бытность студентом, преподавать в ЛГУ он начал еще до собственного выпуска из университета и преподавал в нем до конца жизни. Впоследствии он будет работать в лаборатории системного программирования в НИИ математики и механики, на кафедре математического обеспечения ЭВМ, а со временем создаст и возглавит в Санкт-Петербургском государственном университете кафедру системного программирования (традиционное название, которое он предпочитал переводить на английский язык как software engineering) и Научно-исследовательский институт информационных технологий (подробнее об этом ниже в разделе “Преподавание, наука и ИТ-индустрия”).

Великие учителя Андрея Николаевича

Каждая научная эпоха и отрасль стоит на плечах великих ученых, создавших новые направления исследований, зачастую под влиянием потребностей совсем других наук. Так было и с программированием. Зарождение понятия и специальности “программирование” в СССР связано с именами ученых, начинавших как инженеры-энергетики (С.А. Лебедев), физики (А.П Ершов), как математики (опять же Ершов и А.А. Марков), как математические лингвисты (Г.С. Цейтин) или механики и баллистики (С.С. Лавров). Все эти области познания пришли к необходимости алгоритмического управления процессами, а также алгоритмического решения множества задач, казавшихся неподъемными до появления вычислительных машин.

Этот запрос оказался сильнейшей мотивацией для рывкового развития различных дисциплин, до того относившихся в самом широком смысле к “прикладной математике” - математической логики, исследования операций, алгоритмов, сложности алгоритмов, исследования структуры языков как машинных, так и естественных, и наконец - исследование возможностей новоизобретенных вычислительных машин, через расширение способов программирования на них.

Как говорил сам Андрей Николаевич - в жизни ему везло. Повезло ему и в самом начале научной деятельности быстро встретить и начать работать с уникальным в своей энциклопедичности ученым, ставшим его научным руководителем. Речь идет о Григории Самуиловиче Цейтине.

Григорий Самуилович, ученик Андрея Андреевича Маркова (сына), рано проявил выдающиеся математические способности и окончил университет уже сложившимся математиком с широким кругом интересов - от теории алгоритмов и математической логики до конструктивной математики и теории групп. Цейтин был разносторонне одарен - успешно изучал языки, окончил музыкальную школу для взрослых - и фантастически плодотворен в науке. Задачи алгоритмов и конструктивной математики привели его к исследованию сложности алгоритмов, где он стал автором трех значимых до сих пор понятий - цейтинского правила расширения, цейтинских формул (системы линейных уравнений над конечным полем, построенные по графу) и цейтинского перевода булевых схем в пропозициональные формулы, ставшего стандартным приемом в теории сложности вычислений.

И для нашего доклада, и для становления информатики в СССР чрезвычайно важно, что именно такой талантливый и зрелый математик глубоко заинтересовался программированием, а через него - математической лингвистикой, и быстро стал неформальным лидером ленинградской школы программирования. Сам Григорий Самуилович неоднократно объяснял этот поворот научной биографии тем, что наряду со строгими схемами и абстрактными понятиями, в программировании есть существенный человеческий фактор, который и делает эту менее предсказуемую область научной деятельности интересной для него.

В начале 1960-х годов Григорий Самуилович основал на базе мат-меха исследовательскую группу по изучению механизмов, лежащих в основе естественных языков, и созданию схем, пригодных для обработки конструкций языка вычислительными машинами. В то время много выдающихся ученых по всему миру работали над задачей автоматизации перевода с любого языка на любой другой. Г. С. Цейтину, хорошо владевшему несколькими языками, активному пропагандисту языка международного общения эсперанто, эта идея была особенно близка. Она, наряду с упомянутой выше причиной, способствовала постепенному переходу Григория Самуиловича от математической логики к программированию. В то же время и под влиянием тех же идей в НИИ математики и механики ЛГУ сформировалась сильная группа ученых и программистов, занимавшихся разработкой трансляторов для различных языков программирования. Особенно заинтересовал Григория Самуиловича Алгол-68 – язык с очень богатым синтаксисом, реализация которого представляла большую сложность и несомненный научный интерес.

У нас в Ленинграде Г.С. Цейтин собрал группу, состоявшую из нескольких кандидатов наук и довольно большого количества студентов, которой предложил заниматься реализацией Алгола 68. Дело было новое, опыта программирования трансляторов не было ни у кого. Этот проект оказался насыщенной питательной средой, давшей мощный старт в науке не только Андрею Николаевичу, но и нескольким десяткам соратников, и еще важнее - системному программированию, как направлению исследований.

Сотрудничество с Цейтиным, зародившееся еще в студенческие годы Андрея Николаевича, продолжалось с разной степенью близости в течение следующих 10-15 лет, пока их научные направления и задачи внедрения науки в производство не развели их пути слишком далеко друг от друга.

Наряду со своим научным руководителем, Андрей Николаевич особенно выделял двух ученых, повлиявших на его раннее становление и выбор научного направления - Святослава Сергеевича Лаврова и Андрея Петровича Ершова.

С Андреем Петровичем Ершовым, тогда еще член-корреспондентом АН СССР, Андрей Николаевич познакомился, будучи студентом пятого курса мат-меха. Они встретились в Москве, в НИЦЭВТ (Научно-исследовательском центре электронной вычислительной техники), куда они оба приехали, чтобы подписывать договоры о реализации языка Алгол-68. В Ленинграде планировалось создание транслятора с одного языка. Идея Ершова была более глобальной – он хотел разработать семейство трансляторов с языков Алгол 68, PL/I, Симула 67 для разных машин, то есть реализовать идею UnCoL (Universal Common Language) - во всей полноте не осуществленную до сих пор. Много лет спустя Андрей Николаевич предложит использовать ее в задачах реинжиниринга (подробнее об этом ниже в разделе “Реинжиниринг программного обеспечения”).

Вскоре была создана всесоюзная Рабочая группа по языку Алгол-68, и Андрей Петрович Ершов ее возглавил. В рамках работы этой группы, проходившей с азартом и спорами, назначались встречи в разных городах Союза (чаще всего в Ленинграде и Новосибирске), которые, по воспоминаниям Андрея Николаевича, всегда оказывались плодотворными “рассадниками новых идей и затей”. Сложился дружный и интересный коллектив единомышленников, регулярно встречавшихся друг с другом.

Быстрое становление программирования не только как науки, но и как сферы производства программ, также происходило под эгидой Ершова. Выдающийся ученый-теоретик программирования, Ершов еще в 1960-х гг. отстаивал точку зрения, что программирование, несмотря на интеллектуальность и творческий характер этого процесса, нуждается в организации и регламентации, наборе или системе соглашений и правил, не говоря уже об инструментальном обеспечении. Тогда такие идеи встречали изрядное сопротивление, так что близкое знакомство и частое общение с Ершовым, несомненно, повлияли на все дальнейшие убеждения Андрея Николаевича в отношении технологии программирования. “Ершов был моим гуру, человеком, безошибочно распознававшим точки роста в науке”, - говорил Андрей Николаевич об этих встречах.

Ничуть не меньше на становление Андрея Николаевича, как ученого и преподавателя, повлиял Святослав Сергеевич Лавров. Научная биография С.С. Лаврова поистине уникальна. Еще в сравнительно молодом возрасте он стал основоположником ракетно-космической баллистики в СССР и неоспоримым авторитетом в области динамики управляемого полета и автоматического управления им. Появление цифровой вычислительной техники и успешный опыт применения ее к вычислениям в баллистике привели С.С. Лаврова к резкому повороту в деятельности - в качестве дальнейшего направления работы он выбрал программирование. Сам Святослав Сергеевич отмечал, что решение посвятить себя программированию подогревалось не только профессиональными интересами: «Это занятие затрагивало какие-то глубинные струны моей души, отвечало складу всей моей личности» (цитируется по статье).

На этом моменте задержимся и обдумаем. Оказывается, мотивация всех упомянутых ученых, стоявших у истоков программирования в СССР, заключалась не только в выборе той или иной области науки, но и в активном стремлении изучать, осмысливать и упорядочивать социальную и человеческую сторону программирования. Можно выделить общую доминанту в работах Ершова, Цейтина, Лаврова, а затем и Терехова - стремление развить инструменты и теоретические основы программирования до уровня, при котором оно стало бы массовой практикой (что в дальнейшем и произошло).

Обратимся опять к самому Святославу Сергеевичу (op cit) – «Мне было ясно, что массовое программирование не может вестись только силами программистов-профессионалов, а ими пока с неизбежностью становились все, кому требовалось использовать ЭВМ. Эти люди были вынуждены осваивать машинный язык, приемы программирования и работы на ЭВМ. ...Алгол-60 при всех его слабостях воспринимался мной как язык качественно иного уровня, и мне захотелось испытать свои силы в работе над транслятором с этого языка». Еще во время работы в конструкторском бюро Королева, Святослав Сергеевич стал вдохновителем и организатором создания одного из первых и самых популярных трансляторов Алгола-60 на советскую ЭВМ М-20, так называемого ТА-1.

Уволившись после смерти С.П. Королева в 1966 году из ОКБ-1, Святослав Сергеевич продолжал работать в Москве, где с 1959 года он по совместительству был профессором мех-мата, а затем и нового факультета вычислительной математики и кибернетики МГУ. В 1971 году он переехал в Ленинград и в 1972 году стал заведующим кафедрой матобеспечения ЭВМ, где внёс существенный вклад в развитие ленинградской школы программирования. Работа над транслятором с Алгола-68 уже шла вовсю, в лаборатории системного программирования в НИИ математики и механики, также руководимой Лавровым. Святослав Сергеевич высоко ценил как цель, так и шаги, ведущие к цели, быстро со всеми познакомился и активно участвовал в семинарах и обсуждениях, оказывая большое научное влияние на молодых тогда специалистов - Сергея Николаевича Баранова, Илью Борисовича Гиндыша, Бориса Константиновича Мартыненко, Петера Сёке мл., Андрея Николаевича Терехова, Николая Федоровича Фоминых.

В 1977 году С.С. Лавров был избран на пост директора Института Теоретической Астрономии АН СССР, его активность в ЛГУ заметно снизилась, в конце концов, он оставил за собой только кафедру матобеспечения ЭВМ, а исполняющим обязанности заведующим лаборатории системного программирования выбрали Андрея Николаевича.

Разумеется, на становление Андрея Николаевича, как любого ученого, повлияли и многие другие ученые, семинары, научные коллективы и разговоры. Все же уже из этого краткого изложения видны основные направляющие, задающие вектор научных интересов и трудов Андрея Николаевича. Попробуем их сформулировать:

  • Языки программирования высокого и очень высокого уровня, как наилучший инструмент для программирования как в науке, так и в промышленности
  • Социальные и человеческие аспекты успеха программирования - технология системного программирования
  • Обобщение и упрощение создания трансляторов, как посредников между любыми прикладными областями программирования и любой вычислительной техникой, на которой должны работать программы - поиски своеобразного “философского камня” автогенерации - идеи, вдохновляющей информатику по сей день
  • Как сумма всех этих достижений - совместный дизайн программных и аппаратных средств, задача вывода вопроса на мета-уровень и оптимизации целого

Научная деятельность АНТ как отражение рывкового развития информатики в 20 веке

Андрей Николаевич всегда занимался задачами, которые подходили к пределу современной теории и практики программирования. Этим он напоминал одного из персонажей книги братьев Стругацких “Понедельник начинается в субботу”, Кристобаля Хунту, который интересовался только задачами, официально не имеющими решения.

В 1960-х годах такой подход в духе времени - в Советском Союзе велись активные исследования в области космоса, ядерной физики. В стране царил неподдельный энтузиазм, особенно среди молодежи. Казалось, что еще вот-вот и “на Марсе будут яблони цвести”. Молодым 20-летним выпускникам университетов всё казалось по плечу и, пожалуй, современные выпускники вряд ли сильно отличаются в этом плане. Более удивительно, что Андрею Николаевичу удалось сохранить интерес к новейшим веяниям в течение всей его жизни.

Профессор Терехов занимался подобными задачами всю свою жизнь - в трансляторах, операционных системах, системах реального времени, в теории оптимизации. Этот “фронтир” постоянно двигался вперед. Андрей Николаевич определял интересовавший его тип задач как “Наукоемкое производство” и постоянно подчеркивал, что возглавляемый им коллектив (как бы по-разному он ни назывался на разных этапах его деятельности) не занимается рутинным программированием.

Транслятор Алгол 68 ЛГУ

Первой из “нерешаемых задач” в послужном списке Андрея Николаевича стала реализация транслятора Алгола 68 для ЕС ЭВМ. Возможно, Алгол 68 не был лучшим в мире языком программирования даже в момент своего появления (хотя сам Андрей Николаевич - и даже его дети - в это искренне верили) но это точно был одних из сложнейших языков с точки зрения реализации и потому Андрей Николаевич долго и с азартом занимался этой задачей, даже после того, как большинство изначальных участников этого проекта потеряло энтузиазм.

Поначалу участники проекта полагали, что транслятор с Алгола 68 может быть реализован по стандартным образцам - лексический анализ, синтаксический разбор и генерация. Однако, для Алгола 68 этого оказалось недостаточно, так как язык был чрезвычайно сложным - настолько, что для его описания пришлось изобретать особую формальную грамматику (двухуровневая грамматика ван Вейнгаардена). Алгол 68 предоставлял широкие возможности по переопределению синтаксиса, операторов и даже ключевых слов языка, из-за чего его иногда даже называли “языком сверхвысокого уровня”, в отличие от его предшественников типа Фортрана, PL/I и Алгола 60. Например, в Алголе 68 конструкция m a; может быть как описанием переменной а, если m описана как вид, так и унарной формулой, если m описана как унарная операция. Таким образом, предварительную идентификацию надо было проводить ещё до начала традиционного синтаксического разбора, а идентификация видов и операций требовала разбора блочной структуры всей программы и составления многих нетривиальных таблиц.

Андрею Николаевичу удалось придумать архитектуру транслятора из шести просмотров, причем направления просмотров в этой схеме чередовались. По предложению Цейтина примерно в начале 1973 года он написал статью на эту тему, которая в конечном итоге была опубликована в 1975 году во втором номере только что созданного академического журнала «Программирование» ("Процессы идентификации и структура компилятора с языка Алгол 68", №2, 1975). Вспоминая опять Стругацких, тут уместно вспомнить, что двухпроходный транслятор стал у Стругацких двухходовым (наблюдение А.П. Ершова).

Работы по созданию транслятора с Алгола 68 продолжались еще много лет. Вклад Андрея Николаевича в этот проект огромен. Им были изобретены и реализованы новые подходы практически во всех частях этого транслятора - от начального разбора до синтеза эффективного объектного кода. По результатам этих работ было сделано множество докладов на всесоюзных конференциях и опубликовано еще несколько статей в журнале “Программирование” (например, "Средства эффективного синтеза объектной программы", "Программирование" №6, 1975, в соавторстве с Г.С.Цейтиным; "Распределение регистров в рабочей программе", "Программирование", №1, 1977).

Первая работающая версия транслятора появилась только в конце 1975 года, причем это был кросс-транслятор - анализирующая часть была написана на Алголе 60 и отлаживалась на польской ЭВМ Одра 1204, а синтезирующая часть писалась на макроязыке ассемблера ЕС ЭВМ. Текст на промежуточном языке переносился с машины на машину на перфоленте. В этом трансляторе было еще много ошибок, качество объектного кода было не идеальным, но он работал! Впоследствии транслятор был полностью перенесен на ЕС ЭВМ, причем это было сделано “методом раскрутки” - генерирующая часть была переписана на Алголе 68 и постепенно оттранслирована и оптимизирована на ЕС ЭВМ. В конечном итоге, транслятор с Алгола 68 был целиком написан на Алголе 68.

Надо отметить любопытную деталь, которая, наверное, покажется невероятной сегодняшним студентам - в процессе работы над транслятором с Алгола 68 для ЕС ЭВМ у разработчиков довольно долгое время не было постоянного доступа собственно к ЕС ЭВМ. На мат-мехе они появились только в 1975 году (причем это был чуть ли не первый случай, когда ЕС ЭВМ была установлена в “гражданской” организации), поэтому разработчики каждую неделю ездили на 2-3 дня в Москву в НИЦЭВТ, где работали ночами на ее американском оригинале, IBM 360.

Г.С. Цейтин предложил написать монографию по результатам этих работ и в 1976 году в издательстве ЛГУ была выпущена книга "Алгол 68. Методы реализации" (под редакцией Г.С.Цейтина, авторы - Балуев А.Н., Братчиков И.Л., Гиндыш И.Б., Крупко Н.А., Терехов А.Н., Терехова Г.Х., Цейтин Г.С. и др. - всего 12 человек). Так как книга была написана коллективом авторов, в предисловии было указано, кто написал каждую главу и даже каждый параграф. Фамилия Терехов упоминается в этом предисловии чаще всех - в конечном итоге, Андреем Николаевичем была написана примерно половина книги.

Андрей Николаевич вспоминал, что когда книга вышла из типографии, в Ленинград приехали с визитом живые классики программирования - Эдсгер Дейкстра, Тони Хоар и Джейкоб Шварц, в сопровождении А.П. Ершова. Авторы транслятора с Алгола 68 подарили им по экземпляру монографии. В ответ через месяц от Дейкстры пришло письмо с таким примерно содержанием: «Спасибо за подарок! Я даже представить себе не мог, что в таком медвежьем углу, как Ленинград, занимаются столь тонкими вопросами, как Алгол 68. Поскольку я не владею русским языком, я подарю эту книгу библиотеке своего университета и она будет там стоять в одном ряду с редкими китайскими манускриптами».

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

Иногда это приводило к “изобретению велосипеда”. Например, Андрей Николаевич рассказывал о том, как в 1967-м он вместе с Геннадием Дейкало сделали первый в СССР “автооператор” (в современной терминологии - реализовали механизм пакетной обработки) и подали документы на авторское свидетельство. Через некоторое время они получили ответ: “То, что вы придумали, уже несколько лет существует под именем OS/360 в Америке”.

Андрей Николаевич осознавал тщетность конкуренции “домашнего производства” с мировой промышленностью и любил вспоминать Эллочку-людоедку из “Двенадцати стульев” и ее попытки заочного соревнования в нарядах с дочерью миллиардера Вандербильта в рамках зарплаты мужа, 200 рублей в месяц. С другой стороны, такая ограниченность в средствах заставляла советских программистов создавать более эффективные программы.

При этом Андрей Николаевич критически относился к принятому в конце 1960-х годов решению о массовом копировании иностранной вычислительной техники в СССР. Мы уже упоминали, что ЕС ЭВМ, для которой создавался транслятор с Алгола 68, была практически 100% аналогом американских компьютеров IBM System/360 и System/370. В 1970-х годах появились также серия “малых ЭВМ” под названием СМ ЭВМ, которые были совместимы с компьютерами DEC PDP-11. Массовый выпуск этих машин позволил в некоторой степени решить проблему острой нехватки в СССР вычислительной техники, но одновременно он привел к фактическому прекращению проектов создания оригинальных советских компьютеров.

Возвращаясь к транслятору “Алгол 68 ЛГУ” - создание его первой версии укладывается в интервал между дипломной работой Андрея Николаевича “Поиск цепочки приведений в трансляторе с Алгола 68 для ЕС ЭВМ” (1971 год) и его кандидатской диссертацией “Методы синтеза эффективной рабочей программы” (1978 год). Обе работы были выполнены под научным руководством Г.С. Цейтина и обе описывали задачи, возникающие на разных этапах трансляции с Алгола 68.

Дипломная работа, написанная Андреем Николаевичем на последнем курсе мат-меха, была посвящена поиску цепочки приведений (преобразований типов) в Алголе 68. В 1974 году было опубликовано «Пересмотренное сообщение об Алголе 68», в котором язык был существенно упрощен, но в первом варианте языка приведение и эквивалентность видов (в том числе рекурсивных) были очень трудными задачами.

К моменту поступления в аспирантуру Андрей Николаевич полагал, что тема анализа алгоритмических языков уже практически исчерпана, поэтому он попросил научного руководителя предложить ему какую-нибудь тему по генерации кода. В этом направлении у Цейтина были оригинальные идеи, возникшие во время работ по автоматическому переводу с одного естественного языка на другой, и позволявшие в теории существенно снизить объем перебираемых вариантов при кодогенерации. Андрей Николаевич творчески развил и реализовал эти идеи, основные результаты были опубликованы в академических журналах.

В конце 1975 года диссертация была завершена и подготовлена к защите. В начале 1976 года в Академгородке под Новосибирском состоялась большая международная конференция, на которой Андрей Николаевич выступил с докладом о своих результатах. В те годы Академгородок был настоящей Меккой советского программирования. А.П.Ершов создал там одну из самых сильных школ системного программирования, часто ездил за границу (что тогда было большой редкостью), имел широкий круг друзей и коллег, которые считали за честь принять его приглашение на конференцию в Академгородок.

Одним из таких ученых, часто приезжавших в Академгородок, был Джейкоб Шварц, создавший первый в мире язык сверхвысокого уровня SETL, в котором элементарными данными были множества, деревья, списки и т.д. После доклада Андрея Николаевича Шварц задал ему вопрос “А как Ваш метод соотносится с языками искусственного интеллекта Planner и Conniver?” Ни Терехов, ни его научный руководитель Цейтин ничего о них не знали - Интернета тогда не было, а “железный занавес” был. За ужином Шварц вкратце рассказал основные идеи, реализованные в этих языках. Андрей Николаевич очень расстроился, так как основные идеи, сформулированные в диссертации - предсказатели, перебор вариантов и поиск оптимального решения - в этих языках искусственного интеллекта уже присутствовали.

Через некоторое время Шварц прислал Терехову бандероль с подборкой статей на эту тему, на которой сверху лежала записка: “Андрей, ничего не перекладывай, статьи специально сложены в порядке, в котором их надо читать”. После их внимательного изучения оказалось, что все не так плохо - более того, выяснилось, что для задач искусственного интеллекта, где тогда царствовал экспоненциально сложный механизм возврата (бэктрекинга), в диссертации Терехова был предложен совершенно иной, часто более эффективный метод решения.

В результате, изменения в диссертации свелись к добавлению короткого раздела «Приложение метода к построению языков искусственного интеллекта». Защита прошла успешно.

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

Надо сказать, что несмотря на успешное применение Алгола 68 в целом ряде сценариев, массового успеха он так и не получил - как в СССР, так и в остальном мире. Во многом это было связано именно со сложностью самого языка программирования. Разработка Алгола 68 велась рабочей группой, объединявшей множество ведущих ученых той эпохи, но по большинству вопросов им не удалось прийти к согласию.

В результате, получился классический пример “design by committee” - язык программирования, в котором было реализовано множество новаторских, но еще не прошедших проверку практикой идей, без какого-то объединяющего их стержня. Алгол 68 оказался перегружен функциональностью, которая редко использовалась, и создатели трансляторов зачастую реализовывали лишь его подмножество, но в этом случае логичнее ориентироваться на более простые (пусть и чуть менее выразительные) языки программирования.

Впрочем, даже недостатки Алгола 68 оказали огромное влияние на все последующие языки программирования - например, язык Pascal появился на свет в большой степени как реакция Николаса Вирта на чрезмерную сложность Алгола 68.

С точки зрения Андрея Николаевича, одним из главных достоинств Алгола 68 была его высокая степень “защиты от дурака” благодаря статической типизации, встроенной проверки выхода индексов за границы массива и тому подобным средствам статического контроля. Это позволяет избежать огромного количества типичных ошибок, что особенно важно при создании систем с повышенными требованиями к надежности программного обеспечения. Впоследствии эта идея получит свое развитие в спроектированном его коллективом компьютере “Самсон” - специализированном компьютере, ориентированным исключительно на языки программирования со статической типизацией (подробнее об этом в следующем разделе).

В 2014 году Андрей Николаевич рассказал историю развития и внедрения Алгола 68 в советскую промышленность на конференции “Развитие вычислительной техники и ее программного обеспечения в России и странах бывшего СССР: история и перспективы” в Казани - см. его статью в трудах конференции: “Алгол 68 и его влияние на программирование в СССР и России"

От трансляторов - к технологиям программирования

Информатика в Советском Союзе (а в широком смысле - также в странах СЭВ) развивалась из другой исходной точки сбора, чем в США - ведущей на тот момент конкурирующей научной школы программирования и основ ЭВМ. Советские специалисты умели делать трансляторы, операционные системы, даже машины, но о программном производстве знали гораздо меньше.

Поэтому неудивительно, что создание транслятора с Алгола-68 само по себе не привело к прорывам в прикладных областях программирования в СССР. Когда университет - в лице лаборатории системного программирования и кафедры матобеспечения ЭВМ - начал заниматься внедрением Алгола 68 в научных и производственных организациях, выяснилось, что его надежность никому особенно не нужна, кроме военных. Но у Андрея Николаевича это только разожгло азарт и любопытство исследователя.

Хочется сделать отступление. У нас дома с незапамятных времен лежала книга академика Алексея Николаевича Крылова “Мои воспоминания” - изрядно потрепанная, так как мы считали ее интереснее любых авантюрных романов. Сочный язык, доходчивое описание научных и технологических нововведений, практическая смекалка и житейская мудрость академика сделала книжку культовой в нашей семье. Пошло это от Андрея Николаевича - он чрезвычайно уважал Крылова и часто цитировал его приключения во время командировок по России, Англии и Франции, сметливость академика в обходе секретности, препятствий и бюрократии, его организационные способности, помогавшие преодолевать любой хаос на производстве.

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

Как и у академика Крылова, практически все научные задачи, которыми занимался Терехов, приходили из реальной жизни. Удивляет разве что своевременность появления этих задач - не успел Андрей Николаевич доспорить все научные дискуссии о пользе прикладного программирования на Алголе-68 и преодолеть сопротивление академической среды, как через тогдашний обком партии в Ленинградский университет пришло распоряжение осуществить научную помощь в области разработки программного обеспечения для оборонных заказов, и лаборатория системного программирования надолго занялась вопросами программирования на спец-ЭВМ (СЭВМ).

За десятилетие сотрудничества с оборонными организациями, работавшими в разных предметных областях, лаборатория системного программирования во главе с Андреем Николаевичем исследовала и обобщила постановку задачи производства ПО для спец-ЭВМ, встроенных систем и систем реального времени, и если не решила ее в общем виде, то преуспела в разработке методов, достаточных для практического применения.

Как стало ясно уже на ранних этапах, основной причиной затрудненной и медленной разработки оборонного программного обеспечения была невозможность стандартизации подхода. Существовало множество как операционных систем специальных ЭВМ, так и функциональных языков описаний задач, которые требовалось на них решать - соотношение “многие ко многим”. Андрей Николаевич предложил описывать функциональные предметные области, используя мощные выразительные возможности алгоритмических языков высокого уровня, через создание специализированных языков из их стандартных конструкций.

Алгол 68, с его “излишней” по мнению многих сложностью, идеально подходил на эту роль: небольшой набор базовых операторов, каждый с ясной и однозначно определенной семантикой, плюс правила суперпозиции операций, позволяющие строить сколь угодно сложные конструкции из простых. Добавим к этому полный видовой контроль периода компиляции, обеспечивающий высокую защищенность пользователя от ошибок и одновременно потенциальную возможность генерации эффективного объектного кода. Предоставляемые Алголом-68 возможности описания новых видов (типов) и операций (а также переописания стандартных операций), в сочетании с возможностью раздельной трансляции и иерархического накопления контекстов, дают возможность создавать специализированные языки, не выходя за рамки Алгола 68. И для этих узкоспециализированных языков не надо реализовывать новые трансляторы.

Уже внедрение этого первого этапа оптимизации привело к резкому повышению производительности труда рядовых программистов. Вместо трудоемкого написания программ в кодах спец-ЭВМ, созданных отнюдь не для человеческого удобства, и головоломной бесконечной отладки, они могли работать с объектами и типами, определенными в терминах их функциональной области, и пользоваться всеми удобствами компактных команд и встроенных статических проверок. Сложность была спрятана в реализации этих программных инструментов: многие пользователи годами писали программы на кем-то подготовленных для них специализированных языках, не подозревая, что они пишут на Алголе 68 и пользуются одним и тем же транслятором.

По пути команда лаборатории ликвидировала и отсталость специального программирования в части инструментов. Дело в том, что нестандартные архитектуры и малая тиражность СЭВМ препятствовали появлению на них развитых операционных систем, компиляторов, отладчиков и прочих привычных инструментов программирования. Поначалу на всех предприятиях оборонного заказа работы производились на перфокартах и непосредственно за пультом СЭВМ "на тумблерах". Это, напоминаем, уже в 1980-е годы!

Сперва Андрей Николаевич попытался воспользоваться уже известными в то время технологиями, однако, оказалось, что, например, Р-технология не имеет никаких средств настройки на СЭВМ, а предлагаемые в ней графический стиль программирования и программа-организатор с ручным вводом мало помогают в решении задач реального времени.

Далее, разумеется, пришлось в массовом порядке заниматься реализацией кросс-трансляторов Алгола-68 из ЕС ЭВМ в коды различных спец-ЭВМ. Все СЭВМ обладали одной общей чертой – они удовлетворяли самым жёстким инженерным требованиям, но программировать для них, а, тем более, создавать для них трансляторы, было очень сложно. Было найдено решение, оказавшееся удачным для большинства проектов СЭВМ - за короткое время реализовали новые кросс-ассемблер и интерпретатор, действовавшие на ЕС ЭВМ, которые вместе с текстовым документатором и некоторыми сервисными программами составили основу первой внедренной в производство (1984 год) технологической системы, интенсивно используемой сотнями разработчиков функционального программного обеспечения.

Промежуточным итогом этого опыта стала статья Андрея Николаевича “Реализация кросс-систем, транслирующих программы на языке Алгол 68 в коды спецЭВМ” и другие его работы в соавторстве, детально проработавшие подход к созданию виртуальных машин с целью специального программирования. В этой серии статей были подробно описаны способы переноса программного обеспечения на разные машины с помощью интерпретируемого байт-кода, техника реализации интерпретаторов, а также ограничения на входные языки, способные гарантировать высокую эффективность исполняемого кода.

На этом этапе Андрей Николаевич, вместе с ведущими специалистами лаборатории, уже обобщал опыт применения языков высокого уровня в специальных областях в терминах “создание новой технологии программирования”, уже тогда использовался и термин “наукоемкое программирование”.

Не только наука опыляла производство - некоторое обучение и обогащение научных идей шло и в обратную сторону, от практики к технологии. В частности, поначалу “курирование” и “помощь в технологиях” воспринимались сотрудниками ЛГУ как одностороннее движение - внедрение современного инструментария программирования на производстве. Сотрудники же предприятий обороны настаивали на том, что технология - это прежде всего набор формальных методик и регламентирующих средств, позволяющих, в частности, на каждом этапе провести экспертизу, архивацию и измерение объема и качества проделанной работы. Такой подход вызывал постоянное раздражение профессиональных программистов, но в долгосрочной перспективе доказал свою полезность и неотъемлемую принадлежность к технологиям. Сейчас мы видим, что любая методика программирования всегда содержит также и готовые средства регламентации и учета рабочего процесса.

Повидав много удивительных вариаций спец-ЭВМ, с их слабой ориентацией на оптимальность программного обеспечения, и напротив - в течение многих лет работая с ЭВМ, ориентированной на языки высокого уровня “Эльбрус” (проект Института Точной Механики и Вычислительной Техники в Москве), Андрей Николаевич долго вынашивал идею соединить накопленный опыт и разработать полноценную архитектуру виртуальной ЭВМ, а затем и реализовать компьютер, ориентированный на языки высокого уровня (High Level Languages, HLL-компьютер), но не такого энергетически-затратного и крупного, как сам “Эльбрус”, а предназначенного для тех же задач, которые решали спец-ЭВМ.

Вскоре стало ясно, что просто повторить концепцию спец-ЭВМ не удастся - именно из-за узкой специализации на предметную область, вызванную недостатками памяти, оперативной памяти и процессорных возможностей, они и оставались нишевым малосерийным продуктом. Пытаться создать HLL-компьютер, ориентированный на одну предметную область - нонсенс, в нем поневоле окажется большее наполнение универсальными функциями (логические команды, арифметика целых чисел, строки, файлы, диалог), чем специальными. Таким образом, нужна была именно универсальная ЭВМ, несмотря на то, что она применялась бы в разных узких функциональных предметных областях.

Казалось, что налицо внутреннее противоречие - универсальная ЭВМ, чтобы решать задачу полностью, но специализированная на узкую область, причем не большая, не дорогая и не громоздкая. Разрешение этого противоречия пришло из опыта разработки трансляторов. В обычных ЭВМ существенную долю ресурса занимают схемы контроля. Однако, если речь идет о программе, переведенной с АЯВУ в коды ЭВМ при помощи транслятора, то многие проверки, выполняемые аппаратурой, повторяют аналогичные проверки, которые перед этим делал транслятор. Если одновременно разрабатывать и архитектуру ЭВМ, и ее системное программное обеспечение, этой избыточности можно избежать. Просто на такой ЭВМ будет технически невозможно программировать на ассемблере, и тем более в кодах - только на языке высокого уровня, и затем программу транслировать. Надежность и проверки обеспечиваются на программном уровне.

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

При таких заданных условиях гарантировать корректную работу аппаратуры можно только для статических АЯВУ с полным контролем типов в период компиляции - таких, как Алгол 68, Паскаль, Модула 2, Ада, но не С или PL/I.

На этих принципах в лаборатории и был создан новый HLL-компьютер “Самсон” (название выбирали голосованием и оно было в честь главного петергофского фонтана, а не библейского героя - Андрей Николаевич был изрядно разочарован, узнав о его легковерии). Довольно долго “Самсон” существовал только в качестве виртуальной машины, для которой был написан потактовый симулятор. Уже при тестировании на этом симуляторе были выявлены частотные команды. Их оказалось не так много - 20-25 наиболее популярных команд покрывали львиную долю всех исполняемых команд. Первые пять-десять из них исполнялись миллионами раз. Они-то и были заранее запланированы к дальнейшей аппаратной оптимизации.

Стандартные системы команд "Самсона" занимали не более двух третей микропамяти. Оставшаяся треть отводилась пользователям для команд, придуманных специально для их приложений. Во многих случаях это позволяло ускорить критичные по времени фрагменты программы в 10-20 раз. Возможность микропрограммирования дополнительных команд была известна давно, например, все ЕС ЭВМ Ряда 2 ей обладали. Но там никто этим не пользовался из-за высокой сложности работы. При помощи удобной технологии микропрограммирования на базе Алгола-68, реализованной Н.Ф. Фоминых, эта задача упростилась в десятки раз - микропрограммировали с ее помощью даже студенты. Так осуществилось казалось бы невозможное сочетание - универсальный, небольшой компьютер, настраиваемый как программно, так и аппаратно на высокую производительность в узкой предметной области.

С этими наработками и университет ЛГУ, и лаборатория уже активно вошли в следующие проекты с целостным, научно-обоснованным предложением - использовать технологию программирования (на базе Алгола 68), функциональное программное обеспечение и проектирование комплекса вычислительных средств (на базе «Самсона»), соединив, тем самым, три направления исследований, ранее развивавшихся независимо (трансляторы, технология, архитектура ЭВМ) - например, для создания систем реального времени, а также встроенных систем.

Проектирование как встроенных систем, так и особенно - встроенных систем реального времени, требует столь же методологически правильного подхода к самой постановке задачи, как и собственно к программированию. Наряду с ключевым вопросом тестирования “работает ли программа в соответствии со спецификацией?”, в таких случаях крупным планом встает проблема “как убедиться в правильности самой спецификации?”. Иными словами, трудности носят «человеческий», а не технический характер, то есть проблемы возникают не из-за недостаточной квалификации кого-либо из участников разработки, а из-за взаимного недопонимания. Слишком много людей вовлечено в решение этой задачи – алгоритмисты, специалисты по протоколам, программисты, инженеры-электронщики и другие.

Одной из первых предметных областей, которой занялся коллектив лаборатории, стала телефония. Для разработки спецификаций в телефонии уже существовал стандарт в виде серии графических языков описания, в дальнейшем принятый международной организацией телефонии под именем SDL (Specification and Description Language). SDL-диаграммы - это блок-схемы на максималках, с дополнительными уровнями, описывающими, например, состояние системы, допустимые сигналы и диаграммы перехода состояний. Эти расширения нужны для описания процессов, протекающих параллельно.

Рисовать SDL-диаграммы от руки, разумеется, было бы нецелесообразно, поэтому первую реализацию редактора SDL-диаграмм написали еще в 1984 году для ЕС ЭВМ. Графическим редактором получившийся инструмент назвать было сложно, но минимально необходимые черты статического и динамического контроля целостности данных и непротиворечивости диаграммы он уже имел. Почти одновременно был разработан и конвертор из SDL-диаграмм в Алгол 68, система имитационного моделирования, различные отладчики, средства для снятия и анализа трасс и другие инструменты, помогавшие пройти путь от SDL-диаграмм до работающего прототипа. Технология тем самым покрывала все этапы проектирования и реализации встроенных систем - от постановки задачи до отладки прототипа - с непрерывным видовым и статическим контролем. Это был прорыв - реализации проектов стали занимать в разы меньше времени и требовали меньше затрат на отладку.

Со временем громоздкую реализацию SDL-редактора для ЕС ЭВМ переписали для персональных ЭВМ, с одновременным переходом на объектно-ориентированный подход, существенно более прозрачный и эффективный. В этой итерации коллективу удалось найти эффективную реализацию вычислительного процесса для систем реального времени, усилить различные статические проверки (например, если сигнал не упомянут в описании объекта, то его невозможно использовать в SDL-диаграммах), разработать средства автоматической генерации данных и т.д.

Под именем RTST (Real Time Systems Technology) эта технология успешно применялась в десятках проектов по созданию встроенных систем. Ее использование позволяло быстро переносить разработки с одной спец-ЭВМ на другую. Программное обеспечение получалось легко читаемым, прозрачным и легким для сопровождения, более того - частотные фрагменты легко выделялись для переиспользования.

Однако, со временем появились новые требования к проектированию и выяснились некоторые недостатки этой итерации технологии. Сложно заранее описать класс объектов текстом без привязки ко всей схеме. Тут Андрею Николаевичу изобретать колесо не пришлось, так как появился язык UML, коренным образом улучшивший эту часть работы. Однако, на первых порах UML не имел никаких средств для задания алгоритмов как таковых, так что его “вписали” в технологию RTST как составную часть - и это, третье воплощение назвали REAL.

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

Без преувеличения можно сказать, что на основе этих публикаций, а также десятков внедрений результатов, полученных при помощи технологий, разработанных лабораторией системного программирования, Андрею Николаевичу наступило время подводить очередные итоги пройденного научного пути. Он засел за докторскую диссертацию.

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

Таким семейным производством текст был сверстан за несколько месяцев, и Андрей Николаевич защитился в Новосибирске в памятном 1991 году, символически завершив советский этап своей научной деятельности.

Реинжиниринг программного обеспечения

После 1991 года начался новый этап деятельности АНТ, в котором ему удалось собрать воедино научные исследования, бизнес и преподавательскую деятельность в условиях постсоветской действительности. Это был уникальный симбиоз - в легендарные девяностые в молодом российском государстве и люди, и организации в основном заботились о выживании, чаще всего ограничиваясь переменой рода деятельности и фокусируясь на занятиях, приносивших сиюминутную выгоду.

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

Первым шагом стало создание в 1991 году государственного предприятия “Терком” (название обычно расшифровывалось как “Терехов и команда”) на базе лаборатории системного программирования СПбГУ. “Терком” стал одной из первых российских ИТ-компаний. В 1998 году было также создано коммерческое предприятие, которое вошло в состав одного из лидеров российского ИТ-рынка, холдинга “Ланит” (ЛАборатория Новых Информационных Технологий; эта компания получила название “Ланит-Терком”). Деятельность обеих компаний быстро расширялась, появились заказы от российских и иностранных компаний (в том числе, из Италии, Финляндии и США).

Одной из новых тем, над которой начал работать коллектив под руководством Андрея Николаевича в эти годы стал реинжиниринг программного обеспечения. Актуальность этого направления связана с тем, что с момента появления первых компьютеров было написано огромное количество программ – по оценкам на конец 1990-х годов, объем созданного ПО превышал 800 миллиардов строк кода. Порядка 30% существовавших тогда программ были написаны на Коболе, 20% – на С/С++, 10% на Ассемблере, а остальные 40% - на одном из примерно пятисот наиболее распространенных языков программирования (на сегодняшний день и сам набор языков, и их процентное соотношение языков, конечно же, сильно изменились). Большинство из когда-либо написанных программ быстро выходят из употребления, но некоторые программные системы живут десятилетиями и не теряют своей актуальности. Возникает вопрос - как их поддерживать, не говоря уже о том, чтобы модернизировать и приспосабливать к постоянно меняющимся технологиям?

Одним из возможных путей выхода из этого кризиса является реинжиниринг ПО (software reengineering), который может принимать самые разные формы - от постепенного улучшения качества в рамках исходных языка программирования и аппаратной платформы до радикальных изменений, таких как полное переписывание приложений, написанных на устаревших языках, или их перенос на современные языки и платформы. Еще раз подчеркнем, что ключевым фактором тут является масштаб - не так трудно переписать небольшую программу с Кобола на Java или Python, но как это сделать, если размер исходного приложения исчисляется сотнями тысяч, а то и миллионами строк кода?

Именно с таким вопросом к Андрею Николаевичу и обратились в 1992 году заказчики из американской компании Seer Technologies. До того они уже связывались с исследователями из американских университетов, но задача оказалось значительно сложнее и дороже в реализации, чем ожидалось, что привело к несколько нестандартному (особенно для тех лет!) решению - попробовать найти ученых, которые могли бы это сделать… в России.

Поначалу казалось, что реинжиниринг концептуально не сильно отличается от трансляторов, с той только разницей, что на выходе генерируется программа на другом языке программирования, а не в объектном коде, и что реинжиниринг может работать как “черный ящик”, на вход которому подаются исходные программы, а на выходе генерируются эквивалентные им программы на целевых языках.

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

В течение следующего десятилетия была создана целая линейка программных продуктов под общим названием RescueWare, которая позволяла решать различные задачи, возникающие в процессе реинжиниринга - от автоматизированного преобразования программ с одних языков программирования на другие до специальных средств анализа и визуализации исходных текстов с целью восстановления утерянных знаний о системе (reverse engineering).

Например, был создан набор визуальных средств, помогающих понять структуру исходной системы и влиять на процесс реинжиниринга - таких как HyperCode, позволяющий визуализировать программы на различных языках и осуществлять легкую навигацию по ним, Diagrammer, предназначенный для создания диаграмм отношений между различными программными компонентами, средства для разбиения исходной системы на компоненты и т.п. Наличие интерактивной среды с мощной графикой и множеством точек принятия решений позволило существенно расширило область применения RescueWare. Теперь пользователь мог не только конвертировать приложения, но и анализировать исходную систему, восстанавливая утерянные знания об ее архитектуре.

В процессе работы над средствами автоматизированного преобразования программ с устаревших языков программирования на более современные пришлось также решать множество задач, нетипичных для обычных трансляторов. Например, существуют десятки различных диалектов Кобола, каждый из которых имеет свою специфику, дополнительные ключевые слова и т. п. Многие из них имеют взаимно противоречащие особенности, поэтому не представляется возможным создать «универсальный» синтаксический анализатор Кобола.

Эта проблема решалась в RescueWare двумя различными способами. Во-первых, было реализовано несколько независимых анализаторов, рассчитанных на наиболее распространенные версии Кобола. Во-вторых, дополнительно к этому был также разработан так называемый «ослабленный» синтаксический анализатор (relaxed parser), который игнорировал все отличия и вариации в исходных текстах. Этот подход помогает, когда на вход системе подается неизвестный диалект Кобола и нужно провести его предварительную обработку. “Нестандартные” конструкции интерпретируются как подлежащие пропуску, но, тем не менее, передаются в виде комментария дальше. Естественно, в случае пропуска незнакомых конструкций не всегда удается корректно восстановить имевшуюся в виду структуру программы, поэтому «ослабленный» синтаксический анализатор использовался в основном на этапе инвентаризации и начального анализа системы.

Как показала практика, при написании устаревших систем использовался целый ряд разнообразных по структуре языков программирования - алгоритмические (Кобол, PL/I, Ассемблер), описания экранных форм (BMS, AS/400 screens), взаимодействия с базами данных (SQL, IMS), управления транзакциями (CICS) и т.д. Нужно было предусмотреть возможность расширения набора входных и выходных языков программирования. Для этого было решено транслировать все входные языки в единое промежуточное представление, повторяя уже упоминавшуюся в этом докладе идею UnCoL, сформулированную А.П. Ершовым за четверть века до того.

Андрей Николаевич считал работы по реинжинирингу классическим образцом наукоемкого программирования, воплощающим в себе сплав науки и производства. В 2000 и 2001 году Gartner Group признала продукт Rescueware лучшим в мире в областях Legacy Understanding и Legacy Transformation. В процессе его создания была решена масса сложных и интересных задач, опубликовало множество статей (в том числе, отдельный сборник статей “Автоматизированный реинжиниринг программ”, вышедший в 2000 году в издательстве Санкт-Петербургского университета), выполнены десятки дипломных проектов и защищены три кандидатские диссертации на эту тему (Лен Эрлих, Андрей Терехов-младший и Максим Мосиенко).

Преподавание, наука и ИТ-индустрия

В советское время в лаборатории системного программирования, которую Андрей Николаевич возглавлял с середины 1970-х годов, велось множество проектов, но общая численность ее сотрудников была относительно стабильной.

После 1991 года условия кардинально поменялись - Андрей Николаевич продемонстрировал недюжинные способности к нахождению новых заказчиков, проектов стало больше, чем исходный коллектив мог переварить. Появилась потребность в количественном росте, но где взять новых сотрудников?

В этой ситуации помогла тесная связь Андрея Николаевича и его команды с университетом. Конечно же, она существовала и ранее, но в 1990-х годах появились условия для очередного скачка популярности программирования. Неожиданно кафедра, которая тогда еще называлась по старинке “математическое обеспечение ЭВМ” (ближе к концу 1990-х она будет переименована в кафедру информатики), стала одной из самых популярных на мат-мехе; для поступления на нее, нужно было набрать максимальные баллы на вступительных экзаменах. Из-за постоянного роста спроса на программистов количество студентов на отделении информатики постоянно росло - не говоря уже о массовой, практически повальной переквалификации инженеров из других специальностей в программисты.

В этой ситуации Андрей Николаевич стал вкладывать все больше сил в улучшение качества преподавания информатики на мат-мехе. Он сам читал лекции, организовывал спецкурсы и семинары, привлекал к работе на кафедре как состоявшихся специалистов, так и перспективных молодых выпускников.

Философия преподавания Андрея Николаевича базировалась на двух основных тезисах:

  1. Каждый преподаватель сначала должен быть исследователем, а потом уже преподавателем. Андрей Николаевич был категорически против изложения материала по учебникам, если у преподавателя не было собственного опыта в данной области. В его понимании, такой подход мог иметь место в сугубо теоретических науках, но не имел права на существование в программировании.
  2. Преподавание должно соответствовать мировым стандартам. Конечно же, этот принцип применим не только к программированию, но и к любой другой университетской специальности.

Первый из этих принципов имеет давнюю историю. Немецкий ученый и философ Вильгельм фон Гумбольдт сформулировал идею единства исследований и преподавания еще в начале XIX века. Именно по этому пути пошло развитие университетов в Германии. Советская университетская модель была во многом основана на немецкой, так что для наших условий она также является естественной. В Америке на базе этой парадигмы выросли так называемые “исследовательские университеты”.

Что касается второго принципа, то идея соответствия мировым стандартам появилась у Андрея Николаевичу в начале 1990-х годов, когда он стал полноправным членом международных профессиональных ассоциаций ACM (Association for Computing Machinery) и IEEE (Institute of Electrical and Electronics Engineers). Эти ассоциации существовали с давних пор, издаваемые ими журналы и проводимые под их эгидой конференции задавали тон в своих отраслях, но доступ к ним из СССР был затруднен. Можно было ознакомиться с ключевыми статьями (либо в виде оттисков, либо в переводах на русский), но активное участие в работе международных ассоциаций в советское время было уделом мировых светил, уровня того же академика Ершова.

В 1990-х все изменилось. На первых этапах ряд ученых из стран бывшего СССР приняли в члены этих ассоциаций на бесплатной основе. На домашний адрес Андрея Николаевича каждый месяц стали приходить журналы Communications of the ACM и IEEE Computer. Возможность читать каждый месяц журналы, в которых обсуждаются наиболее актуальные темы программирования, безусловно дала новый толчок не только исследованиям, но и преподаванию.

В конце 1990-х на кафедре информатики (тогда еще она называлась “матобеспечение ЭВМ”) СПбГУ состоялись выборы заведующего. Терехов принял в них участие, но его максималистские тезисы, процитированные выше и которые он изложил в своем предвыборном выступлении перед сотрудниками кафедры, не всем пришлись по душе. Выборы он проиграл, но решил на этом не останавливаться.

В 1995-м году Андрей Николаевич (совместно с сыном, Андреем Андреевичем, бывшим тогда студентом мат-меха) написал программный документ, в котором сравнивалась учебная программа кафедры матобеспечения ЭВМ с документом Computing Curricula: Computer Science. Оказалось, что учебная программа нашего университета не накрывала и 40% от международных рекомендаций. Некоторые аспекты программирования (в трансляторах, операционных системах, в теории оптимизации, формальных схемах) преподавались на мировом уровне, но была и масса “белых пятен”, таких как управление программными проектами. Я помню, что Андрея Николаевича поразила одна из тем в стандарте Computing Curricula - “этические вопросы программирования”. Все это в Советском Союзе было довольно плохо развито.

Решение представлялось Терехову очевидным - нужно было изучить недостающие предметы и включить их в программу обучения на родном факультете. Но как это сделать, если программа обучения уже сформирована? Не было свободных часов, а главное - не было свободных ставок для преподавателей.

Нужна была новая кафедра, которая дополняла бы уже существовавшие предметы и приближала бы уровень преподавания к требованиям Computing Curricula - причем не только по предметам традиционной информатики, но и в более актуальном с точки зрения рынка направлении программной инженерии (Software Engineering).

Этой проблемой занялся декан мат-меха, Геннадий Алексеевич Леонов, и в 1996-м году на отделении информатики мат-меха была открыта новая кафедра системного программирования, которую и возглавил Андрей Николаевич. Надо сказать, что он считал, что добиться 100% соответствия международным стандартам тогда было невозможно - по крайней мере, в среднесрочной перспективе. По каким-то темам не было специалистов, другие темы казались ему не актуальными или непрофильными для мат-меха. Помнится, “робототехнике” (которая в рекомендациях ACM была самостоятельным направлением, с целым рядом курсов и семинаров) в обосновании кафедры была посвящена всего одна строка: “на кафедре системного программирования это направление преподаваться не будет”. К счастью, Андрей Николаевич всегда внимательно прислушивался к требованиям рынка и не стеснялся менять свою точку зрения, если понимал, что ошибался. Робототехника - как и многие другие отсутствовавшие на старте предметы - со временем появилась в учебной программе.

Кафедра открылась в 1996 году, а в следующем календарном году состоялся ее первый выпуск - 9 красных дипломов из 9, что было в какой-то степени предопределено интересом среди студентов к новой кафедре. Конкурс был большой, к тому же, в первые 2-3 года отбор шел среди студентов, уже отучившихся 3-4 года на отделении информатики, поэтому отбор производился просто, по среднему баллу в зачетке. Не удивительно, что в первых выпусках было так много красных дипломов - в 1998 году было даже 13 из 13. Впрочем, и этот рекорд был со временем побит - через несколько лет был еще один 100% “краснодипломный” год, в котором было более 20 выпускников.

Отличники и “красные дипломы” - далеко не единственное, чем Терехов гордился как заведующий кафедрой. В конце 1990-х при кафедре сформировался кружок студентов, интересовавшихся Олимпиадами по программированию - точнее, наиболее известной из них, International Collegiate Programming Contest. Изначально этот кружок возглавляла преподаватель кафедры Наталья Николаевна Вояковская. В эти годы команда студентов СПбГУ регулярно боролась за медали на всемирных олимпиадах и дважды заняла первое место (в 2000 и 2001 годах). Некоторые из участников этих команд-победителей (в первую очередь, Андрей Лопатин) в дальнейшем сами стали тренерами следующего поколения студентов. Приятно отметить, что команда СПбГУ продолжает показывать отличные результаты и сегодня, включая победы на олимпиадах ICPC в 2014, 2016 и в 2025 годах.

В начале 2000-х годов кафедра системного программирования СПбГУ возглавила процесс модернизации российских образовательных стандартов по программированию. Эта деятельность началась с публикации в 2002 году русского перевода того самого документа Computing Curricula: Computer Science, который ранее послужил толчком к созданию кафедры. Эта работа была выполнена под общим редакцией и руководством Андрея Терехова-младшего и Владимира Павлова (Украина). В переводе также принимали участие студенты студенты системного программирования (Андрей Симановский и Дмитрий Шапоренков). Перевод Computing Curricula был издан в издательстве Санкт-Петербургского университета и благодаря спонсорскому участию российской ИТ-ассоциации АПКИТ, был разослан по профильным кафедрам университетов России, Украины и Беларуси.

Кроме того, в 2003 году при активном участии Андрея Николаевича и Андрея Андреевича Тереховых была организована ежегодная научно-практическая конференция “Преподавание информационных технологий в Российской Федерации”, которая проводится до сих пор.

К тому моменту специальность “программирование” разрослась настолько, что ее уже было невозможно покрыть в рамках одной университетской программы. Поэтому в конце 1990-х Computing Curricula был разбит на четыре области - computer science (информатика), software engineering (программная инженерия), проектирование аппаратных платформ (hardware engineering) и информационные системы (information systems). Впоследствии этот список дополнился еще тремя направлениями - информационные технологии (information systems) в 2005 году, плюс cybersecurity и data science в 2020-м.

Мы уже упоминали, что название кафедры, “системное программирование”, Андрей Николаевич предпочитал переводить на английский именно как software engineering. Поэтому, когда в 2004 году совместная рабочая группа ACM и IEEE выпустила документ Computing Curricula: Software Engineering, сразу же началась работа по переводу на русский и его. Однако, редакторы перевода, Андрей Терехов-младший и Владимир Павлов, к тому моменту перешли на работу в крупных ИТ-компаниях (Microsoft, Intel) и больше не могли уделять этому проекту достаточно времени. Если бы на этом этапе к проекту не подключился бы Андрей Николаевич Терехов, то эта работа могла никогда не дойти до конца.

Благодаря активному участию Андрея Николаевича, в 2007 году книга под названием “Рекомендации по преподаванию программной инженерии и информатики в университетах” была опубликована, причем гораздо большим тиражом, чем первое издание. В эту книгу вошел уточненный и обновленный перевод Computing Curricula: Computer Science, а также новый перевод Computing Curricula: Software Engineering. Объединение этих документов под одной обложкой было логичным, так как информатика и программная инженерия неразрывно связаны между собой, как научная и практическая стороны программирования.

Параллельно с этим велась работа по внедрению международных рекомендаций Computing Curricula в российские образовательные стандарты - в том числе, в тот, по которому велось преподавание на нашей собственной кафедре. Как обычно, практика оказалась значительно сложнее теории. В 2006 году Андрей Николаевич и Андрей Андреевич опубликовали статью “Computing Curricula: Software Engineering и российское образование” в журнале “Открытые системы” (№8, 2006) с предложениями о приведению одной из наиболее массовых на тот момент российских образовательных программ (01.04 “Информационные технологии”) в соответствие с рекомендациями Computing Curricula: Software Engineering. Программа преподавания на кафедре системного программирования была модифицирована соответствующим образом, но за пределами СПбГУ дело шло гораздо медленнее. Предлагавшиеся нами изменения принимались в штыки как в Министерстве образования, так и в других университетах, преподававших по той же программе.

К счастью, в конце 2009 года вышел Федеральный закон, предоставлявший особый статус двум наиболее значимым университетам России - московскому и санкт-петербургскому. Этот закон позволил внедрять в МГУ и СПбГУ собственные образовательные стандарты и даже внедрять их затем в других вузах страны. Андрей Николаевич воспользовался этим нововведением для того, чтобы модернизировать программу преподавания на кафедре системного программирования. Впоследствии эта программа была принята к использованию в 60 вузах страны.

В 2010 году Андрей Николаевич написал программную (это слово будет использовано в данном предложении многократно, но тут уж ничего не поделаешь :)) статью для первого номера нового академического журнала “Программная инженерия” под названием “Что такое программное инженерия”, в котором изложил свой взгляд на эту дисциплину и поделился своим опытом преподавания на мат-мехе СПбГУ.

Деятельность Андрея Николаевича по подготовке кадров не ограничивалась кафедрой системного программирования. В России постоянно ощущалась острая нехватка ИТ-специалистов и потому постоянно возникали различные проекты, ориентированные на решении кадровых и финансовых проблем индустрии. Наукоград Петергоф, создание ИТ-кластера на базе математико-механического факультета, венчурные проекты в Сколково, Академия последипломного образования - Андрей Николаевич Николаевич активно и с большим энтузиазмом участвовал во всех этих начинаниях.

Параллельно с этим Терехов поддерживал программирование как науку. Он был членом программных комитетов бесчисленного количества российских и международных конференций, входил в редакционные советы научных журналов, а главное - всячески поощрял своих аспирантов и студентов публиковать результаты своих исследований. В конце 1990-х на это не всегда хватало денег. Для решения этой проблемы Андрей Николаевич финансово поддерживал публикацию на кафедре сборников научных статей. Для многих его учеников именно статьи в сборниках статей, выпущенных на кафедре, или в серии “Системное программирование” стали первыми научными публикациями.

В 2000-х годах Андрей Николаевич сконцентрировался на передаче своего опыта следующему поколению. Он опубликовал несколько книг, учебных пособий и курсов, обобщавших его опыт как программиста и преподавателя. Следует особо отметить учебное пособие “Технология программирования”, изданное в качестве книги Интернет-университетом информационных технологий в 2006 году, а также видеокурсы «История ЭВМ» (Лекториум) и «Архитектура ЭВМ» (Coursera). Именно в видеоформате Терехов чувствовал себя в своей стихии. Пожалуй, еще ярче он раскрывался в свободной дискуссии в небольшом коллективе, но в качестве лектора на кафедре он также он был очень органичен. Андрей Николаевич был в первую очередь талантливым рассказчиком и вдохновителем, и в меньшей степени писателем. Поэтому количество учеников и вообще людей, на которых он так или иначе повлиял, огромно - на несколько порядков больше, чем диссертаций, защищенных под его непосредственным руководством (хотя и их было немало - 18 кандидатских и 1 докторская). 

Отдельно нужно отметить огромную роль, которую Андрей Николаевич сыграл в формировании российской ИТ-индустрии. Он был одним из инициаторов создания первой ассоциации российских ИТ-компаний (“Форт-Росс”, 2002 год). В 2004 году он был одним из основателей ассоциации разработчиков программного обеспечения “Руссофт”, в которой затем был председателем правления, а затем членом Совета Правления этой ассоциации (подробнее об этом будет рассказано в докладе В.Л.Макарова). Но как бы формально не назывались должности и звания Андрея Николаевича, он был одним из безусловных лидеров российского ИТ-рынка.

Заключение

Андрей Николаевич Терехов был цельным и самобытным человеком, которому повезло прожить счастливую жизнь в науке - работая по призванию, испытывая как успехи, так и неудачи, но всегда с оптимизмом смотря в будущее. Его научная биография созвучна всем эпохам, в которых ему довелось жить и работать. Он был полностью органичен в своем научном патриотизме - от души желая вывести свой коллектив на мировой уровень, Андрей Николаевич интересовался новейшими результатами, где бы они ни были получены, и вел широкое сотрудничество с коллегами-программистами во всем мире.

Основной темой всей его научной, преподавательской и практической работы были Технологии. В 70-ые годы это были технологии трансляции, в 80-ые – промышленные технологии, в 90-ые – технологии реинжиниринга и технологии разработки средств телекоммуникации.

Как ученый и как человек, Андрей Николаевич был скорее вдохновителем, чем руководителем. Его отличительными свойствами были научная щедрость и неисчерпаемость внутренних сил. Это выражалось и в щедрой раздаче идей, и в соавторстве статей, где он часто ставил свое имя последним или не ставил вовсе, в научном руководстве, не ограниченном часами и формальностями. Постоянный интерес к новому не покидал его до самых последних дней его жизни.

Сотни, возможно и тысячи человек называют себя его учениками, а его лекции, рассказы, наставничество повлияли на еще более широкие слои современных программистов - напрямую, через публикации и в непосредственном, неформальном общении. Еще при жизни он стал легендарным, его слова и рассказы передавали из уст в уста.

То же самое можно сказать и про его деятельность в Форт-Россе, Руссофте, АПКИТе и других ассоциациях. Нельзя сказать, что он был их основной движущей силой (хотя некоторые из них он в какое-то время и возглавлял), но многие годы он был несомненным символом российского ИТ-движения.

Заключая наш доклад, мы хотели бы подчеркнуть, что именно совокупность таланта с невероятной работоспособностью и с яркими личностными качествами сделали Андрея Николаевича настоящим патриархом советской и российской школы программирования, под руководством которого выросло несколько поколений ученых и специалистов, делающих честь нашей индустрии и нашей кафедре мат-меха СПбГУ, где бы они ни находились и где бы они ни работали сегодня. 

Литература

  1. “Поиск цепочки приведений в трансляторе с Алгола 68 для ЕС ЭВМ”, дипломная работа, 1971
  2. "Процессы идентификации и структура компилятора с языка Алгол 68", “Программирование”, №2, 1975, стр. 61-67
  3. "Средства эффективного синтеза объектной программы", "Программирование" №6, 1975 (в соавторстве с Г.С.Цейтиным), стр. 38-48
  4. "Алгол 68. Методы реализации" (под редакцией Г.С.Цейтина, авторы - Балуев А.Н., Братчиков И.Л., Гиндыш И.Б., Крупко Н.А., Терехов А.Н., Терехова Г.Х., Цейтин Г.С. и др. - всего 12 человек), 1976
  5. "Распределение регистров в рабочей программе", "Программирование", №1, 1977, стр. 37-41
  6. “Методы синтеза эффективной рабочей программы”, кандидатская диссертация, 1978
  7. Алгол 68 и его влияние на программирование в СССР и России
  8. Рекомендации по преподаванию программной инженерии и информатики в университетах
  9. Computing Curricula: Software Engineering и российское образование” в журнале “Открытые системы”, №8, 2006
  10. Что такое программное инженерия”, журнал “Программная инженерия”
  11. “Реализация кросс-систем, транслирующих программы на языке Алголе 68 в коды спецЭВМ”, IV Всесоюзный симпозиум по системному и теоретическому программированию. Кишинев, 1983, кол-во страниц – 3.
  12. “Внедрение в производство языков высокого уровня”, Сб. “Трансляция и преобразование программ” Новосибирск, ВЦ СОАН СССР, 1984, соавтор – В.П.Морозов, кол-во страниц – 10
  13. “Промышленное программирование на базе языков высокого уровня” (статья), Сб. “Методы трансляции и конструирования программ”, Новосибирск, ВЦ СОАН СССР, 1986, кол-во страниц – 6.
  14. Развитие системы программирования на базе языка Алгол 68" (статья), Сб. “Информатика и программирование”, Новосибирск, ВЦ СОАН СССР, 1989, кол-во – 3.
  15. Технология программирования встроенных систем реального времени”. Диссертация на соискание степени доктора физико-математических наук. Новосибирск, ВЦ СОАН СССР 1991
  16. “Автоматизированный реинжиниринг программ", сборник статей под редакцией А.Н.Терехова и А.А.Терехова, Издательство Санкт-Петербургского университета, 2000
  17. “Технология программирования” (учебное пособие), Интернет-Университет Информационных Технологий. БИНОМ 2006, кол-во страниц – 148.

Доклад был сделан на конференции СПИСОК-2026 в Петербурге
Помещена в музей с разрешения авторов 31 июля 2026