Главные вехи в истории метавычислений
АрхивЗанятно, что история метавычислений неплохо ложится на десятилетия. Или, быть может, я подгоняю задним числом?
Занятно, что история метавычислений неплохо ложится на десятилетия.
Или, быть может, я подгоняю задним числом?
1960-е годы
Первые попытки сделать преобразователи программ, отличные от оптимизирующих компиляторов. Еще в те времена появился термин «partial evaluation». Тогдашние подходы к проблеме теперь представляют лишь исторический интерес. Для «широкой публики» может быть интересно, что уже тогда было понято: программы надо специализировать (определение см. ниже). Это видно по статьям, авторы которых пытались даже делать экспериментальные системы. Нетрудно догадаться, что при слабости компьютеров и программистских инструментов того времени все это осталось в области теории.
1970-е годы
Зарождение методов и понимания фундаментальной важности задачи глубокого преобразования программ - в частности специализации. Независимо друг от друга к этим идеям пришли Валентин Турчин, Андрей Ершов, Йошихико Футамура (Yoshihiko Futamura).
Футамура первым понял, как с помощью самоприменения специализатора можно преобразовать интерпретатор в компилятор. Дата публикации его статьи (1971 год) теперь считается днем рождения этого научного направления, которое в этом году может отметить 30-летний юбилей. Однако Футамура не смог тогда предложить работоспособного метода специализации. Статья содержит набросок, который так и не стал алгоритмом.
Специализация программ - это порождение по программе f(x,y) при известном x программы fx, такой, что fx(y) = f(x,y). Специализатор Spec - это программа, выдающая по f и x программу fx = Spec(f,x).
Турчин в 1972-77 годах разработал основы метода суперкомпиляции, опираясь на понимание необходимости «совершения крупномасштабного метасистемного перехода (МСП) над алгоритмами, программами», после разработки концепции МСП, изложенной в книге «Феномен науки» (написана в 1970 году). Цель этого МСП он метафорически описывал так: «Нужно сделать программы таким же естественным объектом обработки, как числа на Фортране». Турчин показал, как суперкомпиляция может решать 1) обратную задачу (дана программа и ее результат, найти аргумент), 2) автоматизировать построение компиляторов из интерпретаторов. Он заметил, что двойное самоприменение (то есть МСП) суперкомпилятора (как специализатора) дает компилятор компиляторов (Футамура и Ершов остановились на однократном самоприменении).
Андрей Ершов обнаружил (в процессе работы его коллектива над многоязыковым компилятором «Альфа»), что большое число разных с виду задач сводится к построению так называемого генерирующего расширения программ.
Генерирующее расширение программы f(x,y) - это программа fge(x), которая по данному х порождает программу fx, такую, что fx(y) = f(x,y), то есть f(x,y) = fge(x)(y).
Пример: компилятор - это генерирующее расширение интерпретатора. Ершов разрабатывал метод под названием смешанные вычисления с целью автоматической генерации генерирующих расширений: Gen(f) = fge. Связь со специализацией: Gen(f) = Spec(Spec, f); здесь происходит однократное самоприменение специализатора.
1980-е годы
Появление экспериментальных суперкомпиляторов и специализаторов. Возникновение мирового научного сообщества Partial Evaluation and Semantic-based Program Manipulation (PEPM), которое включало в себя и суперкомпиляцию.
Валентин Турчин начал свою работу в США с написания монографии по суперкомпиляции, изданной как Technical Report of City University of New York (№20, 1980). В ней он систематизировал идеи 70-х годов и заложил основы дальнейших работ, которые «расхлебываются» до сих пор. В начале десятилетия он со своей группой провел эксперименты с первой версией суперкомпилятора, а в конце они уже располагали весьма развитым суперкомпилятором Рефала. В 1989-90-х годах произошло «воссоединение» Турчина с российской командой, которое было отмечено летом 1990 года двухнедельной школой-семинаром в Обнинске.
Нил Джоунс (Neil Jones) и его группа в Копенгагенском университете, «заразившись» от Андрея Ершова задачей специализации программ и ознакомившись с методами Турчина, изобрели новый метод, названный ими старым термином частичные вычисления (partial evaluation). С одной стороны, его можно считать частным, упрощенным случаем суперкомпиляции, с другой - он содержит дополнительные оригинальные идеи, которые позволили в 1985 году группе Джоунса впервые вычислить на компьютере формулы Футамуры-Турчина порождения компилятора компиляторов путем двукратного самоприменения специализатора. Интересно, что авторы специализатора не смогли разобраться в первом компиляторе компиляторов, порожденном машиной. (Машина оказалась «умнее»…) После шлифовки метода Сергеем Романенко и текст, и идея автоматически порожденного компилятора компиляторов стали понятны людям (теперь эту идею можно изложить на одной странице). Интересно, были ли еще случаи в истории программирования, когда машина «порождала» фундаментальные идеи?
1990-е годы
Проработка деталей теории суперкомпиляции и движение к практике.
К началу 90-х назрела необходимость в систематизации и «наведении порядка» в основаниях суперкомпиляции. Благодаря работам Сергея Абрамова, Роберта Глюка (Robert Glьck) и Андрея Климова суперкомпиляция была структурирована так, чтобы можно было использовать ядро методов для решения более простых задач и постепенно добавлять приемы для более сложных задач. Это позволило начать разработку суперкомпиляторов для сложных практических языков типа Java.
Одновременно, Турчин и Андрей Немытых продолжали развивать «продвинутые» (advanced) методы суперкомпиляции в процессе реализации нового суперкомпилятора для Рефала-5, который удалось использовать в некоторых практических задачах.
С 2000 года на мехмате МГУ Сергей Абрамов читает курс по теории метавычислений и суперкомпиляции.
2000-е годы (прогноз)
«Матерение» теории и методов. Использование суперкомпиляторов на практике. В частности, будут завершены ведущиеся с конца 90-х годов работы по метавычислениям языка Java (и суперкомпиляция, и частичные вычисления) и начнется их практическое применение.
Компьютерная и информационная революция 90-х годов создала реальную потребность в глубоких методах оптимизации программ и подготовила условия и технические средства для использования их на практике. Суперкомпиляция окажет революционизирующее влияние на методы программирования, дав инструменты для дальнейшего развития «компонентного программирования», декларативного программирования, разработки разнообразных специализированных языков и т. п.
[i40229]
1970-е годы | ||
1971 |
Y. Futamura |
Преобразование интерпретатора в компилятор (часть того, что позже было названо «Futamura-Turchin Projections») |
1972-77 |
В. Турчин |
Суперкомпиляция (1972 - статья в сборнике ЦНИПИАСС о «прогонке» (driving); 1974 - лекции на Рефал-семинаре; 1977 - раздел в монографии по Рефалу) |
1976 |
А. Ершов |
Смешанные вычисления (1976 - лекции в Москве, 1977 - статья в журнале «Программирование», включающая обсуждение «теоремы В. Турчина о двойной прогонке») |
1980-е годы | ||
1980-89 |
В. Турчин |
Развитие методов суперкомпиляции: от монографии по суперкомпиляции (1980) через первые эксперименты (1982) до весьма развитого суперкомпилятора Рефала-5 в конце 80-х годов |
1985 |
N. Jones и др. |
Partial Evaluation, самоприменение специализатора, порождение компилятора компиляторов |
1987 |
С. Романенко |
Улучшение частичных вычислений, порождение читабельного компилятора компиляторов |
1990 |
Школа-семинар по суперкомпиляции в Обнинске |
1990-е годы | ||
1993 |
Р. Глюк, |
Простейший суперкомпилятор для модельного языка на языке Haskell, статья «Occam Razor in Metacomputation: The Notion of the Perfect Process Tree» |
1995 |
С. Абрамов |
Монография «Метавычисления и их применение», алгоритмизация методов метавычислений на языке Haskell для примитивных модельных языков |
1999 |
А. Немытых, |
Новая версия суперкомпилятора для Рефала-5 |
2000 |
На мехмате МГУ открыто дополнительное к высшему образование, включающее курс по метавычислениям и суперкомпиляции (mathinform.math.msu.su) |
2000-е годы (прогноз) | ||
2001 |
Андрей Климов |
Суперкомпилятор для языка Java, реализующий базовую часть методов |
2001 |
Аркадий Климов |
Специализатор для Java-байткода на основе partial evaluation |