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


Subject: Re: XML, "holes" and programming styles in R5 and R+
From: Arkady Klimov (Arkady.Klimov@supercompilers.com)
Date: Sat Jun 10 2000 - 11:04:06 MSD


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

Прошу прощения, если тема ("дырки" в рефале+) уже слегка "устарела",
но мне захотелось внести в нее свой скромный вклад.

----- Original Message -----
From: "Andrei Klimov" <Andrei.Klimov@supercompilers.com>
To: <refal@botik.ru>
Sent: Saturday, June 03, 2000 9:37 PM
Subject: XML, "holes" and programming styles in R5 and R+

> Добрый день!
>
> Направляю в refal@botik.ru письмо Сергея Абрамова
> о "дырках" (есть такое понятие в реализации Рефала Плюс) и

. . .<опущено>. . .

АБРАМОВ:
>
> ==================8<===================
>
> Юра! Я вам в вашей борьбе с плохим временем работы той самой программы не
> подсказал хороших дырочных параметров, вот почему:
>
> =1= не бывает универсальных правильных дырочных параметров;
>
> =2= подбирать оптимальные дырочные параметры надо по задаче (а иногда и по
> данным к ней:) -- это процесс не сложный и он базируется на идее минимизации
> выпуклых функций методом подбора шага с адаптивным выбором шага (делим последний
> шак или умножаем его на 2).
>
> В большинстве случаев важны только два дырочных параметра (левая и правая
> процентная длина дырки--х, у), при этом на время работы программы можно смотреть
> как на выпуклую функцию Т(х,у).
>
> Берете данныем, на которых программа работает существенное но не изматывающее
> вас время и замеряете время: Т(0,0), Т(100,0), Т(0,100), Т(100,100), Т(100,100),
> Т(200,0), Т(0,200), Т(200,200), то бишь в углах сетки:
>

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

. . .<опущено>. . .

>
> программист-пятерешник =========================
>
> $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. Что терм можно не строить заново, если в нем не было замен.
2. Что можно использовать повторно куски выражений; при этом они копируются,
но быстро, поскольку может использоваться специальная команда.

>
> Сноска (1)
>
> Под словами переписать под рефал плюс, я подразумеваю, в том числе и
> возможное (если оно потребуется) расширение рефал-плюс библиотеки.
>
> Например, функцией, которая одним чохом читает ВЕСЬ файл (а не по
> одному символу):
>
> $func ReadChars! s.Channel s.Length = e.Chars;
> /* считать s.Length (или до конца файла) символов из файла.
> Если s.Length < 0 -- считать от текущей позиции до конца
> файла...
> */

АРК:
Я думаю, будет полезнее, если такая функция будет строить не выражение (где
на каждый символ уходит 8-12 байтов), а символ-строку.
Такую штуку я когда-то сделал в Рефале-6, назвав ее, кажется, ReadBlock.
У меня тоже требовалось указать размер. Мы тут обсуждали это с Андреем,
он предлагает убрать этот параметр, чтобы читать весь файл целиком,
используя ту особенность плюсовой памяти, что всегда есть одна большая дырка.
От этого мне хотелось бы предостеречь, поскольку аналогичную функцию
на других моделях динамической памяти реализовать будет либо невозможно,
либо она будет шибко неэффективной.

>
Аркадий.



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