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) это 
промежуточное представление в компиляторах императивных языков, отличается тем, 
что присваивания всем переменным уникальны.)

Синтаксис и семантику предложенного языка можно развивать и уточнять. Только 
зачем? (Троллейбус из   хлеба.)

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

 

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  
:sergei.romane...@gmail.com] 
Sent: Wednesday, February 21, 2018 11:18 PM
To: Refal Botik  >
Subject: Re: Прогонка для Рефала-4 (Плюс) и $iter

 

2018-02-21 23:01 GMT+03:00 Александр Коновалов  >:

Я правильно понимаю следующий подход? Команда 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 
Subject: Re: Прогонка для Рефала-4 (Плюс) и $iter

 

2018-02-21 23:01 GMT+03:00 Александр Коновалов  >:

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

 

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

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

 

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

 

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

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

СР