Доброе утро, Василий, доброе утро, господа!

Я, в свою очередь, посмотрел на ваш Рефал/2: исходники и интерпретатора, и 
компилятора. Довольно любопытная и минималистичная реализация, по всей 
видимости, ориентированная на написание каких-то небольших ежедневных скриптов, 
для которых часто под Unix используют sed, awk, Perl. Иначе нельзя объяснить, 
например, зашитую на уровне дизайна языка интерпретацию параметров командной 
строки. Сюда же: язык не предполагает никакую модульность — исходная программа 
должна писаться в виде единого файла — но для небольших скриптов этого вполне 
достаточно. 

Стандартная библиотека языка выглядит так, как будто проектировалась именно для 
написания такого самоприменимого компилятора, иначе я не могу объяснить наличие 
буфера с произвольным доступом на запись (названного в документации загадочной 
формулой «X+LX»), куда запись производится по смещениям и который сохраняется в 
файл (третий аргумент интерпретатора) по завершении работы программы.

Интересной выглядит реализация поля зрения: вместо двусвязного списка узлов с 
полями «тег», «информация», «вперёд», «назад», используются четыре массива со 
смыслом данных полей (массивы «вперёд» и «назад» содержат не указатели, а 
целочисленные смещения). Массив «тегов» имеет символьный тип, что позволяет 
экономить память, которая терялась бы на выравнивание.

Язык сборки реализует систему команд, предложенную Романенко в диссертации 1978 
года. По той же схеме, на сколько мне известно, реализованы «официальный» 
Рефал-2 Белоуса и Рефал-5. 

Исходный код выглядит как написанный в прошлом веке, когда ещё не были 
распространены современные практики написания сопровождаемых программ. В коде 
на Си относительно часто используется goto (часть из них можно объяснить ручным 
дословным перекодированием псевдокода из диссертации Романенко), глобальные 
переменные с именем из одной буквы (часть из них тоже «переехала» из 
диссертации, например, Г1 и Г2). Впрочем, тем же страдают и исходные тексты 
Рефала-5 (я их когда-то внимательно изучал).

Исходник на Рефале выглядит как шифровка: многие функции названы по схеме 
«буква» + «число», иногда с суффиксом, названным по той же схеме (F20, F2E0, 
W15, F2E_S2…). Чтобы понять смысл каждой конкретной функции, приходится искать 
её место вызова (в других функциях) и пытаться понять, что же ей передаётся. 
Однако, если внимательно читать программу от начала и до конца, то понять 
целиком всё можно.

 

«Т.е. уже более 19 лет использования в практических задачах.»

Я им пользуюсь где-то с 2005 года, но больше в теоретических задачах: пишу для 
него компиляторы(ы). Просто сам язык для меня интересен. Также применяю его в 
(около)научной работе на кафедре. Например, чудовищно интересными были 
оптимизации совместного сопоставления с образцом (с выводом т.н. «глобального 
сложнейшего обобщения») и построения результата (используя алгоритм жадного 
строкового замощения, используемого обычно при поиске плагиата).

 

«За что я его (рефал) ценю?

0) удобно производить символьные преобразования»

Полностью согласен. Может заменить и Perl с AWK’ом, перемалывающие строки 
текста, и Lisp, преобразующий сложные символьные конструкции (например, в 
задачах компиляции).

 

«1) наглядность

Я использую как редактор far, раньше был Norton Commander.

Основной код программы на рефале (в метакоде B), которым занимаюсь при 
программировании (та часть,которую сейчас пишу), обычно помещается на экране (в 
окне редактора).

Не нужно никуда листать, смотреть и т.п.

В этом смысле, чем компактнее исходный код, тем лучше!!! А значит короткие 
односимвольные имена переменных предпочтительнее длинных-мнемонических. Чем 
меньше строк - тем нагляднее!!!!»

Я использую как редактор Far и Vim. Причём исторически начинал с Far’а (и мне 
не влом было набирать длинные имена переменных без автодополнения).

С тем, что чем компактнее исходный код, тем лучше, я не согласен. Я считаю, что 
чем легче читается и воспринимается, тем нагляднее. Например, что делает 
функция F2E_K? Для ответа на этот вопрос нужно прочитать её код, а также 
прочитать то, как она вызывается из других функций. А что делает функция 
PairResultBrackets? Имя нам подсказывает, что она спаривает скобки в 
результатном выражении. А значит, чтобы понять, что происходит в месте её 
вызова, тупо не надо читать другое место. Аналогична история с переменными. Что 
хранится в переменной T3? Нужно посмотреть, где эта функция вызывается и что по 
этому параметру передаёт. А что хранится в t.NextToken? Следующий токен.

 

«2) спецификации

В новых версиях есть внутренние функции. Безусловно, с их помощью можно 
спрограммировать и спецификации рефала/2 и еще много чего! НО!!!

Но они затуманивают алгоритм выполнения программы!!!

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

Вообще-то вложенные функции не могут заменить спецификации Рефала-2. Заменить 
спецификации можно только условиями Рефала-5 или более общей конструкцией — 
действиями с неуспехом Рефала-6, Рефала-Плюс, Рефала-7.

То, что они затуманивают выполнение программы, я не согласен. Они наоборот её 
проясняют. Например, функция Map, отображающая одну последовательность термов в 
другую:

Map SF TN ET = kSF TN. k/Map/ SF ET.
    SF       =
PlusOnes EX = k/Map/ /P1/ EX.
UnBracket EX = k/Map/ /UnBracket1/ EX.
UnBracket1 (EX) = EX
PutLines EX = k/Map/ /PutLine/ EX.

PutLine (EX) = k/P/ EX.

Здесь для примера функция PlusOnes прибавляет к каждому терму единицу, 
UnBracket, принимая список скобочных термов, все их разворачивает, PutLines 
распечатывает последовательность строк. Преимущество функции Map в том, что не 
надо описывать обработку всей последовательности — достаточно описать обработку 
одного элемента и сказать «сделай со всеми так».

Вообще, вложенные функции сейчас присутствуют практически во всех 
распространённых языках общего назначения: Си++ (с 2011 года), Java, C#, 
JavaScript, Python, Ruby, Scala, Kotlin, Rust, Go. Относительно Visual Basic не 
в курсе, не слежу за ним. И люди этим активно пользуются. Вложенные функции 
стали такой же общей практикой, что и ООП. 

 

«3) привычка

Когда я смотрю на метакод B - я его читаю.

Когда ж "современный" синтаксис - приходится переводить... как с другого 
языка...

Особенно, когда несколько встроенных функций (как, например, в "декартовом 
произведении" п. 3.3.5.3 из

https://github.com/bmstu-iu9/simple-refal/blob/master/doc/manul.pdf )

Безусловно - красиво!

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

Исключительно вопрос привычки и практики.

 

«4) возможность программной оптимизации не обязательна!»

Простой Рефал самоприменяется 10 секунд, поэтому оптимизация не лишняя. Кроме 
того, это очень интересно (писал уже выше).

 

From: s...@cnshb.ru [mailto:s...@cnshb.ru] 
Sent: Thursday, July 27, 2017 6:48 PM
To: refal@botik.ru
Subject: Re: Рефал умер?

 

Здравствуйте, Александр, здравствуйте господа!
Посмотрел на Ваш, Александр, Простой Рефал...
Вы меня извините, господа, я конечно понимаю: унификация, суперкомпиляция, 
имена, отражающие суть...
Безусловно, меня гнетет груз привычки к рефалу/2, с которым я познакомился в 
конце 70-х...
Но использовать рефал в производственных условиях я начал с 1998-го, когда для 
ПК написал собственную версию.
Правда, я еще раньше для Turbo-C написал функцию "рефальское отождествление"...
Т.е. уже более 19 лет использования в практических задачах.
За что я его (рефал) ценю?

0) удобно производить символьные преобразования
1) наглядность
Я использую как редактор far, раньше был Norton Commander.
Основной код программы на рефале (в метакоде B), которым занимаюсь при 
программировании (та часть,которую сейчас пишу), обычно помещается на экране (в 
окне редактора).
Не нужно никуда листать, смотреть и т.п.
В этом смысле, чем компактнее исходный код, тем лучше!!! А значит короткие 
односимвольные имена переменных предпочтительнее длинных-мнемонических. Чем 
меньше строк - тем нагляднее!!!!

2) спецификации
В новых версиях есть внутренние функции. Безусловно, с их помощью можно 
спрограммировать и спецификации рефала/2 и еще много чего! НО!!!
Но они затуманивают алгоритм выполнения программы!!!
На самом деле, когда пишешь программу, каждый раз для себя доказываешь 
(теорему), что тот код, который пишешь, действительно решает ту задачу, которую 
надо решить...
3) привычка
Когда я смотрю на метакод B - я его читаю.
Когда ж "современный" синтаксис - приходится переводить... как с другого 
языка...
Особенно, когда несколько встроенных функций (как, например, в "декартовом 
произведении" п. 3.3.5.3 из
https://github.com/bmstu-iu9/simple-refal/blob/master/doc/manul.pdf )
Безусловно - красиво!
Но писать, думаю, быстрее проще, да и в случае возникновения ошибок, мне 
кажется, легче разбираться с простым кодом.
4) возможность программной оптимизации не обязательна!
Мне кажется, сейчас, когда ПК становятся всё быстрее и мощнее, вопрос 
производительности так остро не стоит!
(тем более, что вообще решили обратиться к рефалу ;) )

Значительно важнее простота доказательства, что это именно то, что нужно!

 

Рефал - не простой язык. Не привычный.
Я после фортрана, PL/1 и ассемблера ЕС ЭВМ долго к рефалу привыкал, а после 
того как уже свободно "читал" программы, "писать" начал только через полгода.

 

Может быть новых потенциальных программистов рефала отпугивает излишняя 
"заумность" последних "научных" версий (5, 6, + и т.п.) ???

 

ЗЫ а после рефала СНОБОЛ-4 пошел "на ура!"... но не прижился....

 

Василий
http://swi.16mb.com/

26.07.2017, 21:47, "Александр Коновалов" <a.v.konovalo...@mail.ru 
<mailto:a.v.konovalo...@mail.ru> >:

Здравствуйте, Василий!

 

Да, Рефал жив его пользователями. Но, если уйдёт поколение пользователей, то и 
Рефал умрёт. Может я и ошибаюсь, но по моим наблюдениям поколение 
воспроизводится как-то слабо (если вообще воспроизводится). 

 

Спасибо за ссылки. Я их пока поверхностно посмотрел, думаю, потом изучу 
внимательнее. А мне наоборот, проще воспринимать языки с «современным» 
синтаксисом: РЕФАЛ-5, Рефал-6, Рефал Плюс. А вот читать Рефал-2 я ещё не привык 
— глаза не привыкли к k/F/что-то. Вашу реализацию постараюсь посмотреть в 
свободное время (видел, что исходник целиком написан в одном файле REFAL.REF, а 
внутри сплошной метакод B).

 

Кстати, студентов я пытаюсь привлекать к Рефалу. В частности, в моей реализации 
уже есть исходный код нескольких курсовых и дипломных проектов (в папке 
https://github.com/bmstu-iu9/simple-refal/tree/master/doc и её подпапках есть 
несколько записок по проектам, можно почитать). Но, к сожалению, их он не особо 
интересует (сдали и забыли).

 

--
Коновалов Александр Владимирович, преподаватель
кафедра ИУ9 «Теоретическая информатика и компьютерные технологии»
МГТУ имени Н. Э. Баумана, Москва

 

From: s...@cnshb.ru <mailto:s...@cnshb.ru>  [mailto:s...@cnshb.ru 
<mailto:s...@cnshb.ru> ]
Sent: Wednesday, July 26, 2017 4:15 PM
To: refal@botik.ru <mailto:refal@botik.ru> 
Subject: Re: Рефал умер?

 

Здравствуйте, господа!
Большое спасибо, Аркадий, за развернутый ответ!
Полностью с Вами согласен, что рефал жив его пользователями.
Я в своей производственной и др. деятельности активно использую рефал. Правда, 
я задержался на рефале/2 (с метакодом B), и пользуюсь последнее время своей 
версией. В паре задач использовал рефал-5, но потом от него отказался, т.к. мне 
удобнее думать на 2-м, к которому давно привык...

К сожалению мне не удалось научить рефалу ни своих сотрудников, ни даже своих 
детей :(
Большую работу по пропаганде рефала проводил научивший меня рефалу Топунов 
В.Л., но его уже давно нет, и, мне кажется, после него пропаганда рефала в 
вузах резко сократилась...

Хотя я бы считал, что изучение студентами-будущими программистами рефала пошло 
бы им только на пользу!!!

 

может быть Вам будут интересны ссылки:
http://www.cnshb.ru/vniitei/sw/refal/
http://ito.edu.ru/1999/I/2/278.html
http://sw710.narod.ru/For_ITO-2000.htm
 

ЗЫ динамические ящики мне в практической деятельности ни разу не понадобились...

 

Василий Стеллецкий
http://swi.16mb.com/

 

 

26.07.2017, 14:23, "Arkady Klimov" <arkady.kli...@gmail.com 
<mailto:arkady.kli...@gmail.com> >:

Здравствуйте, Александр!

 

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

 

Правда, уже сейчас можно высказать и возражение. Есть основания полагать, что 
Рефал создавался Турчиным именно как язык первого порядка, и в этом была 
интенция автора. И другие особенности языка также были с этой интенцией 
согласованы, как-то: выражения с двусторонним доступом, явная активация, 
концепция "поля зрения", динамическая типизация (отсутствие статической 
типизации). Смысл в том, что любой объект, значение переменной, может быть 
рассмотрено во всех деталях, записано на бумаге, и при этом все, что будет 
видно, и только оно, может использоваться в вычислениях. Функциональные объекты 
этим условиям не удовлетворяют, они эктенсиональны: функцию можно вызвать, но 
нельзя препарировать, рассмотреть ее устройство. Это надлежит делать на 
метауровне, когда одной программе доступен код другой. И насколько я понимаю, 
попытки вводить абстракции, функции высших порядков и т.п. в базовый язык 
встречали сопротивление Турчина. Рефал-5 -- это максимум того, что он был готов 
допустить. Многие дополнительные возможности Рефала Плюс он уже считал 
излишними, кажется, даже динамические ящики.

 

Но конечно, это не значит, что последователи не вправе делать по-своему, с 
опорой на новые знания и опыт. И может быть, особенности Рефала дадут 
возможность по новому увидеть и понять функциональные объекты.

 

Что касается меня, как приложившего руку к созданию Рефала-6, могу только 
сказать, что в последние годы, уже лет 15, выступаю только как пользователь 
"своего" диалекта и пока вполне им доволен. Но это, конечно, не промышленное 
использование. Есть у Рефала-6 еще по-меньшей мере один активный пользователь - 
Игорь Щенков, и он время от времени высказывает претензии. Но к сожалению сил 
на них активно откликаться сейчас у меня очень мало. Се ля ви.

 

С уважением, 

Аркадий Климов,

с.н.с. ИППМ РАН,

+7(499)135-32-95
+7(916)072-81-48

 

25 июля 2017 г., 15:33 пользователь Александр Коновалов 
<a.v.konovalo...@mail.ru <mailto:a.v.konovalo...@mail.ru> > написал:

В начале 2000-х годов язык Рефал ещё как-то развивался, выходили новые версии 
компиляторов: РЕФАЛ-5, Рефал-6, была некоторая активность на сайте 
http://wiki.botik.ru/Refaldevel/, был написан компилятор SCP4. Я читал старый 
архив рассылки refal <mailto:refal@botik.ru> @botik.ru, в нём тоже были 
обсуждения Рефала и не только (например, сравнивали его с Си++). Потом, 
практически синхронно со смертью Турчина, активность спала практически до нуля 
(архива рассылки refal-devel в сети не нашёл, судить не могу).

 

В текущей рассылке (судя по новому архиву) в основном рекламируются конференции 
по метавычислениям, выкладываются сканы старых архивных материалов и Сергей 
Михайлович Абрамов поздравляет с Новым Годом.

 

Я правильно понимаю ситуацию, что Рефал появился не от хорошей жизни: Турчину 
нужен был инструмент (формальный язык) для выражения идей метавычислений, 
суперкомпиляции, существовавшие тогда Фортран и Алгол для этого не подходили, а 
о Лиспе в СССР никто тогда не знал? И теперь, когда появились новые, 
современные функциональные языки программирования, для реализации идей 
суперкомпиляции стали применять уже их? Те же Юрий Климов и Илья Ключников свои 
суперкомпиляторы писали отнюдь не на Рефале. А язык Рефал остался в прошлом.

 

И то, чем я занимаюсь (https://github.com/bmstu-iu9/simple-refal (смотреть 
ветку refal-5-lambda), https://github.com/Mazdaywik/mrefal) уже в проекте 
устарело на десятилетия? Не, своим хобби я заниматься продолжу, мне это 
интересно. Хоть и бесперспективно.

 

--

Коновалов Александр Владимирович, преподаватель

кафедра ИУ9 «Теоретическая информатика и компьютерные технологии»

МГТУ имени Н. Э. Баумана, Москва

 

 

Ответить