RE: Прогонка для Рефала-4 (Плюс) и $iter

2018-02-21 Пенетрантность Александр Коновалов
«Интересно было бы решить "обратную задачу": придумать для этого виртуального 
кода какой-то другой входной язык, который был бы более "могучим", чем Рефал 
Плюс.»

Вот ещё что подумал. Вполне можно написать паскалеподобный классический 
императивный язык с присваиваниями, ветвлениями и циклами, данными которого 
могут быть объектные выражения (в соответствии с типом переменной), функции 
нескольких аргументов и результатов, могут быть неуспешными.

Пример:

$func Neg[s.X] => s.Y
$begin
  s.Y := Sub[0, s.X]
$end

$func GCD[s.X, s.Y] => s.GCD
$var s.Rem
$begin
  $if Lt[s.X, 0] $then
s.X := Neg[s.X]
  $end;

  $if Lt[s.Y, 0] $then
s.Y := Neg[s.Y]
  $end

 $while s.Y != 0 $then
s.Rem := Rem[s.X, s.Y];
s.X := s.Y;
s.Y := s.Rem
  $end

  s.GCD := s.X
$end GCD;

В условиях можно вызывать функции-предикаты, располагать перестройки Res : Pat 
(при этом в ветке $then соответствующим переменным образца присваивается новое 
значение) и неравенства, все эти выражения можно связывать при помощи $and, $or 
и $not.

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

Присваивания, на первый взгляд, откомпилировать трудно, поскольку нет команды 
присваивания i-му элементу стека — можно либо положить значение на вершину 
(многие команды кладут значение на вершину), либо удалить из середины стека 
несколько элементов (SQUEEZE a n, SLIDE n == SQUEEZE 1 n). Т.е. присваивание 
элементу на глубине k можно выполнить цепочкой команд «вычислить новое значение 
на вершине», (k−1)×PUSH k−1, SQUEEZE k, k−1. Но гораздо эффективнее 
использовать SSA-представление, а переменные, вычисляемые фи-функцией, класть 
на вершины стека в предыдущих базовых блоках и уплотнять.

(Думаю, что не все подписчики знакомы с SSA, поэтому вот вам ссылка: 
https://ru.wikipedia.org/wiki/SSA — SSA (static single assignment form) это 
промежуточное представление в компиляторах императивных языков, отличается тем, 
что присваивания всем переменным уникальны.)

Синтаксис и семантику предложенного языка можно развивать и уточнять. Только 
зачем? (Троллейбус из <http://borya-spec.livejournal.com/126307.html>  хлеба.)

С уважением,
Александр Коновалов

 

From: Александр Коновалов [mailto:a.v.konovalo...@mail.ru] 
Sent: Wednesday, February 21, 2018 11:31 PM
To: refal@botik.ru
Subject: RE: Прогонка для Рефала-4 (Плюс) и $iter

 

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

Кстати, да. Видно что, виртуальный код разрабатывался так, чтобы точно выражать 
понятия Рефала Плюс. И это заметно по его набору инструкций, в частности, 
ориентация на дешёвое копирование как в случае массивового представления. С 
другой, он как язык низкого уровня, шире. Так что интересно придумать язык 
промежуточный между высокоуровневым Рефалом Плюс и низкоуровневым виртуальным 
кодом. Хотя, у меня есть предположение: может это гипотетический диалект RL с 
неуспехами?

Александр Коновалов

 

From: Sergei Romanenko [mailto <mailto:sergei.romane...@gmail.com> 
:sergei.romane...@gmail.com] 
Sent: Wednesday, February 21, 2018 11:18 PM
To: Refal Botik <refal@botik.ru <mailto:refal@botik.ru> >
Subject: Re: Прогонка для Рефала-4 (Плюс) и $iter

 

2018-02-21 23:01 GMT+03:00 Александр Коновалов <a.v.konovalo...@mail.ru 
<mailto:a.v.konovalo...@mail.ru> >:

Я правильно понимаю следующий подход? Команда ALT Label сохраняет в 
стеке-«свалке» точку отката и состояние программы для обработки последующего 
неуспеха. И обычно эта команда сохраняет метку начала следующего предложения, 
чтобы при неуспехе перейти на него (что-то вроде BASIC’овского оператора ON 
ERROR GOTO). Но семантика виртуального кода не запрещает и установки ссылки 
назад. И конструкция $iter — как раз способ представить в виде кода на Рефале 
такую вещь.

 

Так оно и есть...

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

 

И почитав про виртуальный код, я стал лучше понимать и Рефал Плюс. Не только 
про $iter, но и вообще.

 

"Расширение сознания"! :-)

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

СР



RE: Прогонка для Рефала-4 (Плюс) и $iter

2018-02-21 Пенетрантность Александр Коновалов
Добрый вечер, Сергей!

«Ну да. А другой мотив был - сделать выразимым на Рефале Плюс то, что было 
выразимо на уровне виртуального кода (= языке сборки).»
«Вот, во втором издании книги … есть глава, в которой подробно описан 
виртуальный код, и как в него Рефал Плюс компилируется.»

Прочитал книгу и главу в ней. Интересное описание и виртуального кода, и 
псевдокод компиляции Рефала Плюс.

Я правильно понимаю следующий подход? Команда ALT Label сохраняет в 
стеке-«свалке» точку отката и состояние программы для обработки последующего 
неуспеха. И обычно эта команда сохраняет метку начала следующего предложения, 
чтобы при неуспехе перейти на него (что-то вроде BASIC’овского оператора ON 
ERROR GOTO). Но семантика виртуального кода не запрещает и установки ссылки 
назад. И конструкция $iter — как раз способ представить в виде кода на Рефале 
такую вещь. Во всяком случае на виртуальный код конструкция $iter ложится почти 
дословно:



И почитав про виртуальный код, я стал лучше понимать и Рефал Плюс. Не только 
про $iter, но и вообще.

Спасибо,
Александр Коновалов



Re: Прогонка для Рефала-4 (Плюс) и $iter

2018-02-21 Пенетрантность Sergei Romanenko
2018-02-21 23:01 GMT+03:00 Александр Коновалов :

Я правильно понимаю следующий подход? Команда ALT Label сохраняет
> в стеке-«свалке» точку отката и состояние программы для обработки
> последующего неуспеха. И обычно эта команда сохраняет метку начала
> следующего предложения, чтобы при неуспехе перейти на него (что-то вроде
> BASIC’овского оператора ON ERROR GOTO). Но семантика виртуального кода
> не запрещает и установки ссылки назад. И конструкция $iter — как раз
> способ представить в виде кода на Рефале такую вещь.
>

Так оно и есть...

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


> И почитав про виртуальный код, я стал лучше понимать и Рефал Плюс.
> Не только про $iter, но и вообще.
>

"Расширение сознания"! :-)

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

СР


RE: Прогонка для Рефала-4 (Плюс) и $iter

2018-02-21 Пенетрантность Александр Коновалов
«Наверное, если подумать, то можно придумать и такие способы употребления 
виртуального кода, для которых нет прямого соответствия в Рефале Плюс.»
«Интересно было бы решить "обратную задачу": придумать для этого виртуального 
кода какой-то другой входной язык, который был бы более "могучим", чем Рефал 
Плюс.»

Кстати, да. Видно что, виртуальный код разрабатывался так, чтобы точно выражать 
понятия Рефала Плюс. И это заметно по его набору инструкций, в частности, 
ориентация на дешёвое копирование как в случае массивового представления. С 
другой, он как язык низкого уровня, шире. Так что интересно придумать язык 
промежуточный между высокоуровневым Рефалом Плюс и низкоуровневым виртуальным 
кодом. Хотя, у меня есть предположение: может это гипотетический диалект RL с 
неуспехами?

Александр Коновалов

 

From: Sergei Romanenko [mailto:sergei.romane...@gmail.com] 
Sent: Wednesday, February 21, 2018 11:18 PM
To: Refal Botik <refal@botik.ru>
Subject: Re: Прогонка для Рефала-4 (Плюс) и $iter

 

2018-02-21 23:01 GMT+03:00 Александр Коновалов <a.v.konovalo...@mail.ru 
<mailto:a.v.konovalo...@mail.ru> >:

Я правильно понимаю следующий подход? Команда ALT Label сохраняет в 
стеке-«свалке» точку отката и состояние программы для обработки последующего 
неуспеха. И обычно эта команда сохраняет метку начала следующего предложения, 
чтобы при неуспехе перейти на него (что-то вроде BASIC’овского оператора ON 
ERROR GOTO). Но семантика виртуального кода не запрещает и установки ссылки 
назад. И конструкция $iter — как раз способ представить в виде кода на Рефале 
такую вещь.

 

Так оно и есть...

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

 

И почитав про виртуальный код, я стал лучше понимать и Рефал Плюс. Не только 
про $iter, но и вообще.

 

"Расширение сознания"! :-)

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

СР



RE: Прогонка для Рефала-4 (Плюс) и $iter

2018-02-12 Пенетрантность Александр Коновалов
Сергей!

«Сам Рефал Плюс - тот же самый. Но, правда, кое-какие косметические "подкрутки" 
во входном языке сделали.»

Т.е. в принципе, пролистать начало всё же стоит. А на счёт <"+" …> → , 
запись через "+" не даёт экономии даже в символах. Это в Рефале-5 получается 
короче — <+…>.

«А когда "люди" исчезли, то стало хорошо!»

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

А если не жалко своих собственных старых программ, то можно невозбранно ломать 
и обратную совместимость.

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

Ну, есть нюанс. Может получиться в итоге и так: «нет народа — и не будет». 
Поэтому я сделал из «Простого Рефала» Рефал-5λ полностью обратно совместимый с 
Рефалом-5. Хотя толку от этого…

«С точки зрения "чистого искусства" можно считать, что решалась задача: "Что 
можно втащить в Рефал из Пролога, не слишком разваливая функциональность 
Рефала.»

На Прологе я не программировал, поэтому задача мне несколько чужда.

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

На мой взгляд, вызовы чистых функций, функций, возвращающих неуспех и функций 
«ввода-вывода» (недетерминированных/с побочными эффектами) должны различаться 
синтаксически. Например, имена последних двух категорий должны 
начинаться/заканчиваться соответственно на ? и !. Т.е. это не соглашение, а 
требование синтаксиса языка. И функция ввода-вывода не может возвращать 
неуспех. Да, и функции ввода-вывода не могут вызываться в условиях Рефала-5 
(или эквивалентных им конструкциях других диалектов).

Соображения — в первую очередь стилистические. Второстепенное — возможность 
оптимизации и более эффективной кодогенерации (в том числе включая и 
распараллеливание).

«А "правильный" (с "религиозной" точки зрения) способ работы с переборными 
алгоритмами был описан вот в этой "культовой статье":»

Надо будет почитать.

«Что же касается Рефала Плюс, то до изготовления, скажем, суперкомпилятора для 
него - дело так и не дошло.»

Значит, всё впереди. Хотя, казалось бы, с препринтов 30 лет прошло.

Спасибо за ответ,
Александр Коновалов

 

From: sergei.romane...@gmail.com [mailto:sergei.romane...@gmail.com] On Behalf 
Of Sergei Romanenko
Sent: Tuesday, February 13, 2018 1:22 AM
To: Refal Botik <refal@botik.ru>
Subject: Re: Прогонка для Рефала-4 (Плюс) и $iter

 

2018-02-13 0:49 GMT+03:00 Александр Коновалов <a.v.konovalo...@mail.ru 
<mailto:a.v.konovalo...@mail.ru> >:

«Вот, во втором издании книги … есть глава, в которой подробно описан 
виртуальный код, и как в него Рефал Плюс компилируется.»

Новая глава во втором издании — это «Принципы реализации Рефала Плюс»? Т.е. для 
экономии времени можно начать с неё?

 

Да. Сам Рефал Плюс - тот же самый. Но, правда, кое-какие косметические 
"подкрутки" во входном языке сделали. Например, заменили имена функций, вроде, 
"+"  на текстовые идентификаторы. Это сделали, чтобы "улучшить" интерфейс с 
Явой. Но, может быть, лучше было бы строго придерживаться того входного языка, 
что был в первом издании.

 

«А другой мотив был - сделать выразимым на Рефале Плюс то, что было выразимо на 
уровне виртуального кода (= языке сборки).»

На первый взгляд это воспринимается как «хвост виляет собакой». Но надо 
почитать соответствующую главу, вероятно, станет понятнее.

 

Вилять должны пользователи. А, поскольку после 1991, сообщество пользователей 
разбрелось в разные стороны (искать подножный корм), появилась неслыханная 
свобода творчества. Раньше надо было оглядываться по сторонам, и думать: "а что 
люди скажут"? А когда "люди" исчезли, то стало хорошо! Поразглядывал 
собственный пуп, и, раз - и какую-нибудь "загогулину" в язык вставил. А "люди" 
ничего на это и не скажут (потому что их больше нет вокруг).

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

 

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

Re: Прогонка для Рефала-4 (Плюс) и $iter

2018-02-12 Пенетрантность Sergei Romanenko
2018-02-12 2:37 GMT+03:00 Александр Коновалов :

Подозреваю, что конструкция $iter была добавлена в язык именно ради таких
> прогонок.
>

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

Вот, во втором издании книги

   - Р.Гурин, С.Романенко. Язык программирования Рефал Плюс. Курс лекций.
   Учебное пособие для студентов университета города Переславля. -
   Переславль-Залесский: "Университет города Переславля" им.А.К.Айламазяна,
   2006. - 222 с. PDF
   


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

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

С.А. Романенко