Re: Evolution of programming languages Was: Об отсечениях внутри блока.


Subject: Re: Evolution of programming languages Was: Об отсечениях внутри блока.
From: Arkady Klimov (klark@bagirra.net)
Date: Thu Nov 30 2000 - 15:52:48 MSK


Привет всем.

Возможно, я в своем письме "погорячился" с сомнениями в ценности откатов,
на самом деле они (сомнения) касались ТОЛЬКО особенных средств
УПРАВЛЕНИЯ откатами (отсечений и заборов), сами же откаты
(откатные функции, прозрачные блоки) я, напротив, очень ценю.

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

 В Р+ - по умолчанию функции безоткатные, по специальному указанию - откатные,
аналогично блоки: по умолчанию непрозрачные, по специальному указанию - прозрачные.
В Р6 - все функции откатные (потенциально), все блоки прозрачные.
Согласно моим представлениям, автор Р+ отказался от решения считать функции и
обычные блоки {...} прозрачными по умолчанию только из соображений
преемственности с Рефалом-5, где все блоки непрозрачные,
при этом как бы "наступая на горло" своим представлениям
о логичности дизайна (возможно я чересчур категоричен).
Но, к сожалению, жизнь показала, что эта "совместимость"
так и осталась невостребованной: если по-мелкому, то
общее подмножество, можно сказать, есть и при альтернативном решении
(если говорить о программах, которые не завершаются аварийно),
а если по-крупному, так все равно приходится строить конверторы.
И, опять же к сожалению (но это моя субъективная эмоция),
Рефалу Плюс теперь приходится и дальше оставаться
в рамках этого же дизайна, уже для совместимости с самим собой.
В этом смысле Рефал-6 имеет альтернативный дизайн,
который внутренне я считаю более логичным и потому не видел
целесообразности отказываться от него в движении к Рефалу Плюс.

Теперь о равенстве. Нагрузка на этот знак тоже разная, причем и тут и там его семантика
является обобщением его семантики в Рефале-5, но разными обобщениями. Напомню:
В Р+ равенство означает откат на уровень функции (с точки зрения заборов и отсечений оно
равносильно запятой, перед которой стоит достаточное количество отсечений).
В Р6 равенство означает абсолютную преграду для откатов, в силу чего в случае неуспеха
справа от него просто происходит авария (unexpected Fail или "отождествление невозможно",
в нынешнем рефале-6 аварии не перехватываются, в Рефале Плюс есть перехваты аварий).
В связи с этим уместно заметить, что если рассмотреть Базисный подмножества
Рефала-5 и Рефала-6, то семантики будут совпадать полностью даже с точки зрения аварий,
несмотря на откатность функций рефала-6: этот откат всегда будет пойман равенством
перед правой частью, породившей этот вызов. Даже локализация аварии будет такой же,
благодаря тому, что после равенства все вызовы метятся компилятором как безоткатные.

Теперь вернемся к вопросу о блоках: в рефале-6 все блоки прозрачные. А как сделать блок
непрозрачным? Очень просто - поставить перед ним равенство вместо запятой. Это если
он был результатным, то есть каждая его ветвь начинается с результатного выражения.
А если он был образцовым, то можно поставить равенство чуть раньше, а если это
неадекватно (например из источника тоже могут быть откаты), то можно,
используя новую е-переменную ez, заменить :{ на :ez = ez:{. (Есть еще возможность просто
заменить одиночное двоеточие на двойное). Также можно обойтись и с
телом функции, начав его с ez = ez: . И получается, что практическая надобность
в безоткатности как специальном средстве языка отпадает.
Таким образом, иная семантика равенства в рефале-6 и отсутствие явного указания
о безоткатности - очень связанные аспекты. Аналогично с функциями: можно сказать,
что откатность функции в Рефале+ управляется декларацией функции, в рефале-6 -
вызовом (точнее, контекстом вызова).

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

Теперь перейдем к отсечениям и заборам. В целом это решено примерно одинаково,
различия есть в обозначениях и в том, что было замечено в предыдущих письмах:
в Р+ из блока в роли источника не может выйти усиленный отсечением неуспех, в Р6 может.
Конечно, было бы интересно проанализировать и понять, с чем это связано. Возможная
гипотеза - блок в роли источника Р+ трактует как результат раскрытия вызова функции.

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

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

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

Аркадий

----- Original Message -----
From: Andrei Klimov <Andrei.Klimov@supercompilers.com>
To: <refal@botik.ru>
Cc: Fedor Romanenko <fedor@blues.ru>
Sent: Tuesday, November 28, 2000 2:20 AM
Subject: Re: Evolution of programming languages (Was: Об отсечениях внутри блока.)

| Сергей, добрый день!
|
| > Добрый день!
| >
| > > AнК:
| > > Также соглашусь с ним в вопросе, что SML более богатый язык,
| > > чем Рефал Плюс (по числу понятий, считаемых штуками или
| > > попугаями -- кто как хочет;-) -- именно поэтому я сейчас
| > > делаю большой проект на SML-е, а не на Рефале.
| > > ...
| > > Однако, "богатство" языка надо считать, конечно, не "попугаями",
| > > а сопоставляя языковые механизмы и понятия с *целями языка*.
| >
| > СР:
| > Понятное дело... Но ведь я и не сказал, что SML - "хороший" язык, потому что
| > в нем много всего! Наоборот, я похвалил его как раз за то, чего в нем нет. И
| > рассуждал с точки зрения пользователя определенного типа: а именно, такого,
| > который хочет строить свой мир из конструктора (поскольку мне самому это
| > нравится). Но ведь такой способ работы устраивает не всех!
| >
| > Сергей
|
| АнК:
| Согласен, "конструктность" -- очень хорошая цель для языка!
| (В скобках заметим: *одна из* целей).
|
| С этой точки зрения введение откатов и откатных функций
| в Рефал повышает его "конструктность".
|
| (Хочу подчеркнуть, что я сейчас говорю только о сравнении
| разных версий Рефала между собой, а не о Рефалах и SML-ях.
| Последние слишком различаются по устройству и удовлетворяют
| слишком разным целям.)
|
| Однако, откатность -- это лишь одно из колесиков Рефала Плюс.
| Если откатность не нравится, надо ставить вопрос всерьез и по крупному:
|
| Достичь *тех же целей* без откатности!
|
| Если кто-то сможет это сделать, это будет прекрасным
| продолжением эволюции Рефала во "второй стадии".
|
| Но сначала надо сформулировать хотя бы часть целей.
| Это нетрудно, поскольку Сергей Романенко сделал это сам
| 10-15 лет тому назад (см. его препринт "Рефал-4..."):
|
| Сделать выразимым на самом языке те преобразования
| (разные оптимизации, прогонку и т.п.),
| которые до этого формулировались на других языках:
| "языке сборки", Рефал-графах и т.д.
|
| И надо заметить, что эта "сумасбродная" цель была достигнута
| в Рефале Плюс без разрушения многих других свойств Рефала!
| "Язык сборки" и Рефал-графы тоже удовлетворяют этой цели,
| но это (мягко говоря) уж очень другие языки.
|
| А для чего это нужно? -- Назову 2 "мелочи" и одну "крупную цель".
|
| "Мелочи", уже использованные на практике:
|
| - основные оптимизации делаются (в новой реализации Рефала Плюс --
| не так ли? -- обращаюсь к трем А: Абрамову, Андрею и Антону)
| в независимом как от входного языка, так и от выходного
| отображения виде -- на AS по терминологии Абрамова;
| (не говорю уж о том, что их можно разрабатывать, преподавать,
| строить теорию -- и все это в человеческом виде).
|
| - нет проблемы естественного преобразования выхода
| суперкомпилятора(Рефал-графов) в Рефал (Плюс):
| понятий достаточно, не нужно порождать вспомогательные функции и т.п.;
| (это использовалось 2 раза: мной в 90-м году для суперкомпилятора
| Турчина 90-го года и в этом году Антоном О. и Юрой К. для Scp4).
|
| Крупная цель:
|
| Ребята, ну, мы ж все время говорим о метасистемном переходе
| и метавычислениях -- о том, что тексты на языке должны
| стать объектом преобразований! -- и чем легче, проще и
| выразимее это будет, тем...
|
| Андрей.



This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:24:58 MSD