Re: Refal -> Java? РефалАС-->АСАИЯ !


Subject: Re: Refal -> Java? РефалАС-->АСАИЯ !
From: Andrey Slepuhin (pooh@msu.ru)
Date: Fri Dec 10 1999 - 14:56:44 MSK


> "Sergei M. Abramov" wrote:
>
> День добрый, всем!
>
> Позвольте краткую реплику, по поводу:
>
> Date: 7 декабря 1999 г. 22:45
> Subject: Refal -> Java
>
> ================
> (0) Блестящая идея!
> ================
>
> Идея компилировать Рефал(ы) в императивный язык (функция-->в функцию,
> развилки-->в "IF", вызовы-->в CALL, циклы--в циклы) как убедительно
> показал Алик, достояна самого пристального внимания...
>
> Я давно (с лета!) не испытывал такого Рефал-удовлетворения и
> Рефал-подъема!
>
> ===================
> (1) Давно забытое старое
> ===================
>
> Конечно, идея старая. И даже был ведь компилятор Рефала Плюс в Си.
>
> Правда, идея Алика--намного глубше ТОГО компилятора--там был все-таки
> виртуальный код.
>
> Основная мысль у Алика (и именно ее надо не потерять), в том, что:
> виртуальный код НЕ НУЖЕН, ОН ТОЛЬКО МЕШАЕТ (!!!).

Ну вот...

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

Если хочется сделать коарность, то зачем изобретать велосипед -
функция (a, b) <- f (x, y, z) представляется как:

C:
  объявление:
    res_t f (const obj_t, const obj_t, const obj_t, obj_t*, obj_t*) ;
  вызов:
    res = f(x,y,z,&a,&b);
C++:
  объявление:
    res_t f (const obj_t, const obj_t, const obj_t, obj_t&, obj_t&);
  вызов:
    res = f(x,y,z,a,b);
Java:
  объявление:
    Res f (Obj, Obj, Obj, ObjHolder, ObjHolder);
  вызов:
    ObjHolder _a=new ObjHolder();
    ObjHolder _b=new ObjHolder();
    res = f(x,y,z,_a,_b);
    a=_a.value; b=_b.value;

В результат при этом помещается fail и может быть еще какакя-нибудь
необходимая информация.
Это вполне стандартное представление коарности (см. передачу out и inout
параметров в IDL-mapping'е для соответствующих языков - чай не дураки
все-таки делали);

>
> 2 переменные-->в переменные;

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

> 3 развилки-->в "IF";

Вот в этом я совсем не уверен. С точки зрения компиляции в Java
развилки в общем случае будут выглядеть примерно так:

alt_label: { // начало развилки
  alt1: { // первая альтернатива
    ...
    if ([FAIL]) break;
    ...
    [ хвост после = ]
    ...
    if ([FAIL]) break alt_label; // а если блок непрозрачный, то можно и
глобально
                                 // пофэйлиться
    ...
    break alt_label;
  }
  alt2: { // вторая альтернатива
    ...
    break alt_label;
  }
  ...
  [FAIL]
}

>
> 4 вызовы-->в CALL;

Только вот, боюсь, в Java будут проблемы с хвостовой рекурсией.
Я пока не вижу, как с ней бороться. Как это делать в C/C++ я
могу представить (правда, для стековой реализации, когда все функции
имеют
один прототип).

> 5 циклы--в циклы (хочу в императивном языке иметь метки и GOTO
> внутри тела функции! Не знаю, в Яве-то они есть?);

goto в Java нету, но без них можно обойтись.

>
> 6 "::" в присваивания;
>
> 7 ":" в цепочку конструкций, с широкой эксплуатацией преимуществ
> массивного представления списков:
> (а) прямое обращение к термам по индексу;
> (б) проверка длинны массива, прежде чегм ковыраться в термах.
>
> Ради исторической справедливости скажу, что даже в такой формулировке
> (1--7) идея у нас была уже давно. А именно,
>
> * я четко помню, что Рутик и СеРгей обсуждали такую компиляция
> (по крайней мере, раздел "2. переменные-->в переменные;" мне помнится
> четко);
>
> * и в своих играх в НИЦЭВТе (Рефал-->ПЛ/1-МДА) я выписывал (но
> не реализовал!) использование "7.б Проверка длинны массива, прежде
> чегм ковыраться в термах";
>
> * а в понедельник идя из МГУ в метро (за день !!!, когда я от
> Алика узнал о его письме!) с Андреем Слепухиным мы именно такую
> реализацию обсуждали ;-)
>
> Сказанное выше не умалаяет исторического значения сделанного Аликом
> шага--надо было не просто обсуждать, надо было вспомнить это самое
> "давно забытое старое" и не побояться ярко показать, что оно красиво и
> НАСТОЛЬКО эффективно (надо было попрограммировать и замерить
> эффективность!)
>
> СПАСИБО!
>
> =============================
> (2) Надо делать быстро и качественно
> =============================
>
> Это общий мотив всех откликов на Аликино письмо. И я присоединяююсь к
> этому.
>
> Ну так и давайте от общих слов попробуем перейти к конкретному
> обсуждению (прежде чем перейти к делу ;-). Тем более (по результатом
> восторженной реакции и после локального обсуждения со Светланой
> Пономаревой) кажется могут быть волонтиры, которые возможно до 15
> января будут иметь "дырку" для написания такого компилятора.
> Сложного-то в нем ничего ведь нету!
>
> Так что значит "делать быстро и качественно" (чтобы по возможности
> потом не переделывать)? Мне кажется, это осначает:
>
> * Компилировать надо из АС

Для этого надо AS довести до стабильного состояния. С моей точки зрения
-
это не больше пары часов совместного обсуждения при очной встрече
всех заинтересованных лиц. При обсуждении по почте может и неделя уйти.

> * А при чем тут Ява? Компилировать надо в АСАИЯ (в Абстрактный
> Синтаксис Абстрактного Императивного Языка)

Только вот боюсь, такой синтаксис будет зафиксировать сложнее, чем
рефальский.

> =======================
> (3) Компилировать надо из АС
> =======================
>
> Думаю, с этим тезисом все согласятся.

Я не согласен :-)). Это что же, я зря выдачу VC делал? :-[
И никто меня не остановил...

> Тем самым, после выступления Алика можно сделать два адмнистративных
> заявления:
>
> -а- работа в направлении "уметь выдавать виртуальный код из
> РефалПлюс компилятора"--имеет низкий приоритет, так как для
> промышленной реализации Аликовой идеи:
> >...виртуальный код НЕ НУЖЕН, ОН ТОЛЬКО МЕШАЕТ (!!!)
>
> -б- работа в направлении "уметь выдавать АС из РефалПлюс
> компилятора"--имеет ВЫСОКИЙ приоритет.
>
> ========================
> (4) А при чем тут Ява?
> Компилировать надо в АСАИЯ
> ========================
>
> Объяснюсь. Ставя задачу именно так "компилировать надо в АСАИЯ" мы
> легко получаем:
>
> -1- не только компилятор Рефал в Яву (я согласен, он весьма
> интересен!) но и компиляторы Рефал->Си/Си++, и Рефал->Т-язык (пардон
> за шкурный интерес ;-);

Я боюсь, что C, C++ и Java - слишком разные (!) языки, и чтобы хорошо
компилировать в них Рефал, возможно придется применять различные
механизмы.

> -2- возможность привлечь к разработке волонтеров, которые не знают
> (не хотят спешно изучать) Яву (например: Абрамов, Пономарева);
>
> -3- да и вообще, это выделение разумной независимой фазы ;-)

Так то оно так... Если она сможет выделиться... ;-)

>
> Ну а фаза "АСАИЯ -->Ява" будет задачей на полчаса, для знатоков Явы...
> Впрочем как и фазы "АСАИЯ -->Си", "АСАИЯ -->Си++", "АСАИЯ -->Т-язык".
>
> Вот и все, что я хотел бы сказать по Аликовму письму.
>
> Самый важный лично для меня тезис:
> ========================
> Андрей Слепухин! Срочно
> захотелось иметь отдельную
> фазу: Рефал Плюс-->АС
> ========================

Ну если вопрос так стоит... :-))) Как только AS зафиксируем - сразу
займусь,
благо что лексер уже есть (причем на Рефале).

Всего доброго,
Андрей



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