С уважением,
Евгений Корныхин
> спасибо большое! замечательно, что работа ведется. Очень интересные
> результаты по верификации протоколов. У меня только сразу же возникает
> вопрос сравнительный :) Эти протоколы чем только ни верифицируют - в
> большинстве случаев разного вида автоматными техниками, model checking
> и сопутствующие. Какие преимущества у суперкомпилятора перед ними
> всеми в этой задаче? Выигрыш по времени/памяти/удобстве проведения
> доказательства/что-то еще ?
Если отвечать кратко и абстрактно, то ответ получается примерно такой.
Преимещество суперкомпиляции в том, что это довольно общий метод
(отслеживание возможных путей вычислений "в общем виде"). Поэтому,
можно надеяться на то, что с её помощью можно решать довольно широкий
класс задач.
Возникла потребность решить некую задачу - засовываем её в
суперкомпилятор и смотрим, что получится. Даже если не получится,
имеет смысл внимательно посмотреть, в каком месте сил у
суперкомпиляции не хватило.
Тут ещё надо учесть разницу между "суперкомпиляцией" в чистом виде и
"суперкомпилятором". Суперкомпилятор - это система преобразования
программ, которая, естественно, основана на суперкомпиляции, но имеет
право дополнительно использовать и любые другие, сколь угодно
утончённые методы анализа и преобразования программ. В качестве
примера можно привести суперкомпилятор Андрея Немытых SCP4. Этот
суперкомпилятор обрабатывает программы на языке Рефал (строгий
функциональный язык), и, кроме самой суперкомпиляции, содержит ещё
много хитрых "колёсиков" и усовершенствований. Например, в нём
реализован алгоритм распознавания того, что некоторые определения
функций на самом деле определяют функцию "тождественную на своей
области определения", т.е. если аргумент принадлежит к области
определения функции, то он же и возвращается в качестве результата
Поэтому можно действовать так. Засовываем некую задачу в
суперкомпилятор. Если получилось - хорошо. А если не получилось -
смотрим, почему не получилось, и добавляем к суперкомпилятору какое-
нибудь дополнительное "колёсико".
Достоинство такого подхода, по сравнению с изготовлением
специализированной системы для специализированного класса задач, в
том, что при изготовлении специализированной системы всё равно надо
реализовать некую большую "стандартную" часть, а потом уже что-то
специфическое. А если уже есть работающий суперкомпилятор, то в нём
уже реализована эта занудная "стандартная" часть, и можно сразу
заняться прикручиванием к нему своего "колёсика".
Но, естественно, сказанное справедливо только в том случае, если
доступен суперкомпилятор с открытыми исходниками, с лицензией,
разрешающей его "подхакивать" всем желающим, и если суперкомпилятор
запрограммирован в тмком виде, чтобы в нём был способен разобраться
"человек с улицы". (Имеется в виду не любой человек, гуляющий по
улице, а то, что на улице должен найтись хотя бы один человек,
способный разобраться.)
Вот, из таких соображений и были созданы проекты:
http://code.google.com/p/spsc/
http://code.google.com/p/hosc/
Попытались выставить хоть что-то "для простого народа"... А хорошо ли
получилось - другой вопрос.
Сергей Романенко
-- Я здесь не вполне согласен.
Во-первых понятие "суперкомпиляции" достаточно размыто. Это скорее
некоторый набор идей, чем конкретный алгоритм.
Если же мы и зафиксируем некоторый алгоритм и объявим его
"суперкомпиляцией", тогда нам на эту тему не о чем говорить и
рассуждать. Нужно только кодировать и быть довольными достаточно
слабыми результатами суперкомпиляции; так как мы себя насильно
ограничили, а задача оптимизации (или специализации и т.п.) программ,
как таковая (то есть, в идеале), алгоритмически неразрешима.
Более того нам не о чем говорить по-существу, так как - таким образом
- исчезает сама задача.
Внесение любой свежей идеи будет порождать "гиперкомпляцию" (а это ещё
страшнее :-()).
Андрей Немытых.
> > Тут ещё надо учесть разницу между "суперкомпиляцией" в чистом виде и
> > "суперкомпилятором".
>
> -- Я здесь не вполне согласен.
> Во-первых понятие "суперкомпиляции" достаточно размыто. Это скорее
> некоторый набор идей, чем конкретный алгоритм.
>
> Если же мы и зафиксируем некоторый алгоритм и объявим его
> "суперкомпиляцией", тогда нам на эту тему не о чем говорить и
> рассуждать.
Зафиксировать "алгоритм" суперкомпиляции нельзя. Граф конфигураций
содержит в узлах "конфигурации", каждая из которых описывает некое
множество возможных состояний вычислительного процесса. Понятно, что
эти множества состояний должны быть описаны конструктивным способом: в
виде конечных выражений на каком-то языке.
А каким дожен быть этот язык? А вот это - неизвестно, до тех пор, пока
мы не решим, для какого конкретного языка программирования мы
собираемся делать суперкомпиляцию. Должен быть известен синтаксис
языка, какие в нём есть конструкции и операции над данными.
Кроме того, нужно ещё остановиться на каком-то конкретном варианте
операционной семантики обрабатываемого языка. Ведь прогонка - это
обобщение обычного исполнения программы, и должна вырождаться в
обычное исполнение, если на вход поданы полностью известные данные.
Также, чтобы доказать корректность прогонки (а, стало быть, и
суперкомпиляции) нужно иметь что-то, по отношению к чему эта
корректность дожна доказываться. Если прогонка является обобщением
какого-то варианта операционной семантики, то естественный подход
состоит в том, чтобы доказывать её корректность по отношению именно к
этом варианту. (Хотя, абстрактно рассуждая, может быть, можно было бы
доказать и по отношению к чему-то другому.)
Ну, а когда у нас есть язык и есть его операционная семантика
(основанная на какой-то модели вычислений), нужно ещё придумать язык
на котором будут описываться множества вычислительных состояния. Этот
язык зависит от языка и его семантики, но однозначно ими, естественно,
не определяется. Поэтому, даже для заданного языка можно придумать
много разных вариантов суперкомпиляции (не говоря уже о разных
языках).
Согласен с тем, что какой уж тут "алгоритм" суперкомпиляции?
Суперкомпиляция - это не "алгоритм", а "метод" и/или "подход".
> Нужно только кодировать и быть довольными достаточно
> слабыми результатами суперкомпиляции; так как мы себя насильно
> ограничили, а задача оптимизации (или специализации и т.п.) программ,
> как таковая (то есть, в идеале), алгоритмически неразрешима.
Не понял, что означает это утверждение. Как я уже сказал выше, даже
для фиксированного языка и фиксированной модели вычислений, можно
бесконечно заниматься совершенствованием языка, на котором описываются
конфигурации (и повышать точность операций, совершаемых над
конфигурациями). О каком "кодировании" тут можно говорить? Задача -
творческая и неисчерпаемая (в силу всё той же алгоритмической
неразрешимости).
Так же не понимаю, почему, если мы будем отличать суперкомпиляцию как
таковую от других методов анализа и преобразования программ, это как-
то подрежет крылья у разработчиков суперкомпиляторов? Им же никто не
запретит добавлять к суперкомпиляции всё, что им захочется?
> Более того нам не о чем говорить по-существу, так как - таким образом
> - исчезает сама задача.
Я думаю, что дело обстоит ровно наоборот: если мы от жадности начнём
валить в одну кучу с суперкомпиляцией все известные нам методы анализа
и преобразования программ, то тогда обессмыслится само понятие
суперкомпиляции, и, так сказать, торговая марка "суперкомпиляция"
будет безнадёжно изгажена и обессмыслена. Как мы тогда сможем
объяснить людям, в чём состоит специфика нашего подхода и её отличие
от других подходов?
> Внесение любой свежей идеи будет порождать "гиперкомпляцию" (а это ещё
> страшнее :-()).
Именно так! Как учил Турчин, над суперкомпиляцией нужно строить
метасистему, в которой суперкомпиляция будет использоваться уже как
элементарная операция. То, что будет твориться в этой метасистеме
должно и называться по-другому. Например, higher-level
supercompilation или ещё как-нибудь.
Над арифметикой строится школная алгебра, над школьной алгеброй -
высшая алгебра и матанализ. Никто же не называет матанализ
"арифметикой"? Термины, конечно, нужно экономить, но в разумных
пределах. Если какие-то вещи существенно отличаются, они и называться
должны по-разному.
Сергей Романенко