XML, "holes" and programming styles in R5 and R+


Subject: XML, "holes" and programming styles in R5 and R+
From: Andrei Klimov (Andrei.Klimov@supercompilers.com)
Date: Sun Jun 04 2000 - 05:37:26 MSD


Добрый день!

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

Это обсуждение возникло в таком контексте:

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

Александр Корлюков написал интерпретатор подмножества
XSLT (XML Style Sheet Transformations), который успешно
специализируется Рефал-суперкомпилятором Андрея Немытых.
Таким образом (подмножество) XSLT компилируется в Рефал-5.

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

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

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

Определение для тех, кто не знаком с идеей "дырок":

Def. Параметры "левая и правая дырки" задаются в процентах.
        Они указывают какое свободное место надо оставлять
        при размещении нового выражение в свободной памяти:
        "левая дырка" -- это объем памяти в % от длины этого выражения,
        который надо оставить свободным перед этим выражением,
        "правая дырка" -- после него.

        Дырки используются при конкатенации выражений:
        если у одного из них имеется соответствующая дырка,
        вмещающая второе выражение, то копируется только оно
        (в эту дырку).

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

Присоединяйтесь!

Андрей (К).

PS. Это письмо придет также членам рабочей группы "Рефал-XML",
не подписанным на refal@botik.ru. Их адреса не видны, так как я их задал
в BCC ("blind carbon copy"). Из-за этого их не будет в списке рассылки ответов.
При желании они смогут проследить за дальнейшей дискуссией в архиве:
http://www.botik.ru/mail-archive/plus/

А если хотите подписаться на refal@botik.ru -- обращайтесь ко мне. Спасибо!

----- Original Message -----
From: Sergei M. Abramov (at home)
To: Andrei Klimov ; Andrei Slepuhin
Cc: Yura Klimov
Sent: Saturday, June 03, 2000 01:41
Subject: Re: Description of holes wanted

День добрый, всем!

AK> Андрей (С), добрый день!
AK>
AK>Я заглянул в Вашу поставку Рефала Плюс и не нашел там объяснений про дырки.
AK>Есть только упоминание при перечислении параметров. Но мне кажется, что
AK>несколько лет назад я видел текст про дырки. Он до Вас из Переславля не дошел?
AK>Или лежит так, что я не заметил?
AK>
AK>Сергей, ведь правда, что существовала страничка текста с описанием, что
AK>такое дырки, да? Или мне мерещится. :-)

Андрей (К), такой текст существовал, но я не думаю, что стоит тратить время на
его поиски (если он только не лежит в МГУ "под руками"), вот почему:

=1= понимание и реализация дырок убежали вперед того текста;

=2= написать актуальный правильный текст "с нуля" -- дело получаса (которого,
    конечно не так легко найти в загруженном графике, но все-таки...)

То есть, я "ЗА" написание нового правильного текста, а не за поиски старого.

Позволю дать Outline:

==================8<===================

о Постановка проблемы (описание додырочной эпохи РПлюса):

    -- Пояснить о реализации операции конкатенации. Разные случаи при
       выполнении конкатенации:
        *1 ни один из участников не копируется (один из них пустой, они лежат
           рядом);
        *2 только один участник копируется (рядом с другим, с нужной стороны
           есть СВОБОДНОЕ пространство ДОСТАТОЧНОГО размера);
        *3 оба участника копируются.

    -- Пример программы (реверс? побайтное чтение файла?), которая работает
       К*(К-1)/2 времени.

о Понятие дырок, параметры управления дырочным механизмом.

о Рекомендации по подбору оптимальных параметров дырок (на примере программы
     из раздела 1)

    -- описание ключика, который дает по завершению статистику по использованию
       памяти и по статистике (частотам) различных случаев при исполнении
       конкатенации в run-time:

    -- пример поиска оптимальных значений параметров для программки, описанной в
       разделе "о1".

==================8<===================

Юра! Я вам в вашей борьбе с плохим временем работы той самой программы не
подсказал хороших дырочных параметров, вот почему:

=1= не бывает универсальных правильных дырочных параметров;

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

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

Берете данныем, на которых программа работает существенное но не изматывающее
вас время и замеряете время: Т(0,0), Т(100,0), Т(0,100), Т(100,100), Т(100,100),
Т(200,0), Т(0,200), Т(200,200), то бишь в углах сетки:

        * * *

        * * *

        * * *

Смотря на получившиеся значения и предполагая, что Т выпуклая, соображаете, в
какой стороне у вас может жить минимум Т, и соответственно с этим:

    -- либо бьете мелкий квадратик на более мелкие части и измеряете
       (недостающие) точки, чтобы иметь Т в 9 точках этого квадрата;

        * * + *
            + + +
        * * + *

        * * *

    -- либо строите (недостающие) 9 точек квадрата 400х400.

Наверное, можно для красоты ненаглядной 3D-сплайнами рисовать поверхность в
Екселе Т(х,у)... ;-)

Маленькая, симпатичная лабораторка, не правда-ли?

Удачи

Сергей

П.С. =================================================

И еще, Юра!

Ту задачу (признаюсь, я не смотрел на Ваш Рефал Плюс текст) считаю очень важной
для судьбы Рефала Плюс и для судьбы Scp4/Refal-5: разобраться с нею очень нужно.

При этом, важно не только подобрать дырки и на этом успокоиться... Нет, важно
сделать от нее (от кусков написанных в стиле Refal-5) сделать несколько шагов
к Рефалу Плюс.

Да, я не смотрел _Вашу_ программу (и сейчас она у меня не под руками), но я
смотрел программу, которую мне предоставил А.Конышев (спасибо!).

И я думаю, что мы говорим про одну и ту же программу (результат суперкомпиляции
некой обработки XML-я).

Так вот, первый же взгляд на эту программу показывает, что она состоит из
нескольких (главных) фаз:

    фаза 1 == считать текстовый файл в память;
    фаза 2 == перевести XML во внутреннее представление (спарить скобки, тэги
              представить словами, разобраться с " --> &quote; & --> &amp;)
    фаза 3 == собственно преобразование;
    фаза 4 == вывод.

При этом:

=1= пятерошные фазы:

Функции реализующие 1, 2, 4 -- не суперкомпилировались: как они были написаны на
Рефале-5 программистом пятерошником, такими они и остались. Эти функции написаны
в пятерошном стиле и они могут оказаться ОЧЕНЬ КРИВЫМИ для "прямого" переноса
в Рефал Плюс. Их надо бы переписать заново (см. также Сноску (1) в конце
письма).

=2= плюсные фазы:

Результатом суперкомпиляции является функция фазы 3. То есть, была
некоторая рефал-5-функция, написанная программистом пятерошником, ее
засунули в суперкомпилятор (с частично заданными данными) и Scp4 эту
пятерошную программу ПОЛНОСТЬЮ ЗАНОВО переписал.

Общий лозунг: Scp4 на самом деле ХОРОШИЙ ПЛЮСНЫЙ ПРОГРАММИСТ, из под "его рук"
выходят вполне плюсовые (по стилю и духу) программы.

Фаза 3 (результат работы суперкомпилятора)--это ХОРОШАЯ Рефал Плюс программа
(как мне показалось). В ней только осталось раскомментировать описание входного
формата функций (они есть уже) и, неплохо бы, посчитать еще выходные форматы--и
вполне сносный код на Рефале Плюс.

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

Когда я смотрел, какою техникой делается фаза 2 -- это чисто Рефал-5-стрикт
техника. Такой стиль написания поперек горлу Рефалу Плюс и на Рефале Плюс
открытыми и откатными функциями это все делается лучше и пуще!

Переписывать, переписывать и переписывать!

Чтобы было ясно, о чем это я талдычу, я Вам напишу любимую замену A на B (на
всех скобочных уровнях) дважды: как ее могли бы написать программист-пятерешник
и плюсный-программист. Итак, маленькая "жемчужинка"...

/* пример не надуманный, именно так примерно написана
   по стилю программистом-пятерешником фаза 2
*/

/* рефала-плюс под руками нету, посему, пардон, возможны
   синт-неточности, но идея, я надеюсь, понятна.
*/

программист-пятерешник =========================

$func ZamenaAB e = e;

ZamenaAB eX =
    eX:{
        'A' eX-- = 'B' <ZamenaAB eX-->;
        sY eX-- = sY <ZamenaAB eX-->;
        (eY) eX-- = (<ZamenaAB eY-->) <ZamenaAB eX-->;
        /* empty */ = /* empty */;
    }

плюсный-программист =========================

$func RepAB! e = e; /* безоткатная главная функция */
$func? RepAB? e = e;
$func? RepTermAB? t = t;

/* Откатные функции: если замена A -> B _меняет_ аргумент,
    тогда удача и мы строим измененный аргумент. Если не
    изменяет -- тогда просто неудача.
*/

RepAB! eX = { <RepAB? eX>;
               eX;
            };

/* Что есть изменяемое выражение и на что оно изменяется? */

RepAB? eX tA eY, /* -- найти первый */
            <RepTermAB? tA>::tB, /* изменяемый терм? */
            <RepAB! eY> ::eZ, /* -- изменить хвост! */
                    eX tB eZ; /* -- результат */

/* Что есть изменяемый терм и на что он изменяется? */

RepTermAB? \{ 'A', 'B';
               (eA), (<RepAB? eA>);
            };

/////////////////////////////////////////////////////////////

Сноска (1)

Под словами переписать под рефал плюс, я подразумеваю, в том числе и
возможное (если оно потребуется) расширение рефал-плюс библиотеки.

Например, функцией, которая одним чохом читает ВЕСЬ файл (а не по
одному символу):

$func ReadChars! s.Channel s.Length = e.Chars;
/* считать s.Length (или до конца файла) символов из файла.
   Если s.Length < 0 -- считать от текущей позиции до конца
   файла...
 */



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