Сфера применения Рефала

38 views
Skip to first unread message

Александр Коновалов a.v.konovalov87_AT_mail.ru

unread,
Nov 5, 2024, 8:22:36 AM11/5/24
to re...@botik.ru
Добрый день!

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

Я могу выделить следующие черты Рефала:
  • динамически типизированный с закрытым набором типов — есть ограниченный набор встроенных типов данных, пользовательские типы конструируются на уровне соглашений (исключение: пара моих реализаций, где есть инкапуслирующие квадратные скобки — небесспорное расширение) — примерно та же ситуация, что и в классической Scheme;
  • мощное сопоставление с образцом — сопоставлением с образцом сейчас уже никого не удивишь, оно есть даже в Питоне (начиная с версии 3.10 или 3.11, и тоже довольно выразительное), но есть две достаточно редкие черты:
    • повторные переменные, и соответственно, встроенное в язык понятие равенства (однако, есть в Racket и есть в Scala),
    • поиск в середине последовательности по образцу «e.X PAT e.Y», аналогичная возможность есть только в Tom (предназначен для работы с XML и вообще удивительно похож на Рефал);
  • встроенная в семантику конкатенация — в результатных выражениях она записывается пустым местом, в других языках синтаксис конкатенации более многословный,
  • симметричный доступ к обоим концам последовательности в образцах — в большинстве функциональных языков встроенными (основными) последовательностями являются однонаправленные списки и образцы допускают обращение только слева, исключения — Scala, где есть «:+» и «+:», сопоставление с эллипсисом в макросах Scheme и образцах Racket, образцы в Python, но там списки — массивы,
  • возврат из функции нескольких значений столь же (не)естественнен, как и передача нескольких аргументов.

Подытоживая, Рефал — динамически типизированный функциональный язык с выразительным сопоставлением с образцом, позволяющий удобно преобразовывать иерархические данные, например, синтаксические деревья. И сами данные, и их сопоставление с образцом, и построение новых значений записываются без лишнего синтаксического шума, т.е. всевозможных запятых, значков «+», «++», «+ и прочих. Благодаря динамической типизации, он годится для быстрого написания небольших программ, выполняющих символьные вычисления. Но с другой стороны, написание крупных программ, разрабатываемых коллективами затрудняется: типы всё равно придётся определять и документировать, что для Рефала, как правило, делается комментариями с грамматикой для объектных выражений.

Я пока нашёл только одну сферу, где Рефал неплох и абсолютно уместен — рабочий язык для небольшого курса, посвящённого генерации кода. Студенты пишут программы, принимающие на входе синтаксическое дерево, и порождающие код для модельного ассемблера. Пример синтаксического дерева:
(function gcd (x y)
  (var (rem 1))
  (while ((L y) "<>" 0)
    (rem "=" ((L x) "%" (L y)))
    (x "=" (L y))
    (y "=" (L rem))
  )
  (return (L x))
)
Синтаксическое дерево одновременно выглядит как код на ЯП и одновременно машиночитаемо — это просто запись объектного выражения Рефала-5. Синтаксис Рефала и основные приёмы программирования можно рассказать за две пары, а затем уже студенты могут писать компиляторы для подобных программ в рамках домашних работ. Более подходящего языка для этого курса я не вижу.


Других применений, где Рефал уместнее других языков программирования, я пока не встречал. А вы?

Где ещё Рефал может быть уместнее других языков программирования?


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

Arkady Klimov arkady.klimov_AT_gmail.com

unread,
Nov 5, 2024, 11:44:36 AM11/5/24
to re...@botik.ru
Здравствуйте все!
Александр, спасибо, очень приятное, лаконичное и содержательное представление достоинств и преимуществ рефала.
Очень мне понравилось Ваше выражение: "без лишнего синтаксического шума". Это очень точно сказано.
Я последнее время изучаю язык Julia, там тоже есть сопоставление с образцами, правда не в самом языке, а в виде библиотеки. Но точно с излишним "синтаксическим шумом". 
В Julii образцы тоже двусторонние, есть повторные переменные, вложения образцов, переменные типа "список" с эллипсисом, но открытых переменных нет (с поиском подобразца в списке). Есть даже управление откатами.
Об областях применения. Ваш пример хорош, подобное мне тоже приходилось писать. Наверно можно сказать шире: любая трансляция из синтаксического дерева в другое дерево или что-то еще. Действительно, рефал дает очень хорошо читаемое представления АСД. Однако сразу отмечу, чего здесь не хватает и что плохо дается.
1. Таблицы, словари с быстрой выборкой по ключу (можно сделать внешними средствами, но это выглядит как чужеродный объект).
2. Я не смог придумать, как удобно сделать разметку дерева дополнительной информацией, чтобы она не мешала анализу, например, чтобы парсер добавил информацию о позициях (строка, колонка) в исходном файле. В ОО-среде это было бы тривиально, через дополнительные скрытые атрибуты.

Еще применения: мне недавно довелось писать обратный инжиниринг для вентильных схем, отображенных в КНФ. Есть КНФ в формате DIMACS, построенная по вентильной схеме, требуется восстановить исходную схему. Очень классно играют образцы с открытыми переменными при поиске шаблонов - образов вентилей. Это все приходилось подбирать в ходе проб, и я не знаю, в каком языке это было бы удобнее. Удавалось подняться до весьма сложных элементов вроде мультиплексоров, if-then-else, AND-OR-XOR-EQU с многими аргументами. При желании можно и сумматоры находить, но я уж выдохся.
Да, и последующее преобразование результата в формат .dot для Graphviz.
Думаю, все что угодно инверсно инжинирить удобнее на рефале.

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

С уважением,
Аркади


вт, 5 нояб. 2024 г. в 16:21, Александр Коновалов a.v.konovalov87_AT_mail.ru <re...@botik.ru>:

Александр Коновалов a.v.konovalov87_AT_mail.ru

unread,
Nov 5, 2024, 1:25:01 PM11/5/24
to re...@botik.ru
Добрый вечер, Аркадий!

Спасибо за отклик.
Александр, спасибо, очень приятное, лаконичное и содержательное представление достоинств и преимуществ рефала.
Здесь, скорее, не достоинства и преимущества, а черты, отличающие Рефал от большинства других языков. Будут ли они достоинствами и преимуществами — спорный вопрос. Та же двунаправленность и конкатенация приводят сложности эффективной реализации: приходится платить или стоимостью копирования переменной (на сколько мне известно, эта проблема известна только в Рефале), или стоимостью конкатенации в зависимости от промежуточного представления.
Однако сразу отмечу, чего здесь не хватает и что плохо дается.
1. Таблицы, словари с быстрой выборкой по ключу (можно сделать внешними средствами, но это выглядит как чужеродный объект).
У меня были мысли, как расширить синтаксис Рефала для поддержки словарей — напишу отдельным письмом (позже, возможно, завтра).
2. Я не смог придумать, как удобно сделать разметку дерева дополнительной информацией, чтобы она не мешала анализу, например, чтобы парсер добавил информацию о позициях (строка, колонка) в исходном файле. В ОО-среде это было бы тривиально, через дополнительные скрытые атрибуты.
Можно, используя условия:
/*
t.Expr ::=
    (t.Pos Ident e.Name)
  | (t.Pos Const e.Value)
  | (t.Pos t.Expr s.BinOp t.Expr)
  | …
t.PureExpr ::=
    (Ident e.Name)
  | (Const e.Value)
  | (t.Expr s.BinOp t.Expr) -- намеренно нерекурсивно!
  | …
*/

// <Pure t.Expr> == t.PureExpr -- нерекурсивная!
Pure { ... }

SomeParserFunc {
  … t.Expr …
    , <Pure t.Expr> : (Name e.VarName)
    …
}
Немного многословно (есть некоторое количество синтаксического шума), но работать будет. Можно для этой идиомы придумать какой-нибудь синтаксический сахар, в котором будет меньше синтаксического шума — по аналогии с экстракторами в Scala (см. метод unapply). Скажем, как-то так:
SomeParserFunc {
  … t.Expr @ <Pure (Name e.VarName)> …
}
Т.е. запись
… VAR @ <EXTR PATTERN> …
является сокращённой записью
… VAR …, <EXTR VAR> : PATTERN
неуспех в экстракторе EXTR приводит к неуспеху образца. Если не нравятся угловые скобки в образце, можно использовать квадратные:
… VAR @ [EXTR PATTERN] …


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


Отправлено из Mailspring, лучшего бесплатного приложения электронной почты
On нояб. 5 2024, at 7:44 вечера, Arkady Klimov arkady.klimov_AT_gmail.com <re...@botik.ru> wrote:
Здравствуйте все!
Александр, спасибо, очень приятное, лаконичное и содержательное представление достоинств и преимуществ рефала.
Очень мне понравилось Ваше выражение: "без лишнего синтаксического шума". Это очень точно сказано.
Я последнее время изучаю язык Julia, там тоже есть сопоставление с образцами, правда не в самом языке, а в виде библиотеки. Но точно с излишним "синтаксическим шумом". 
В Julii образцы тоже двусторонние, есть повторные переменные, вложения образцов, переменные типа "список" с эллипсисом, но открытых переменных нет (с поиском подобразца в списке). Есть даже управление откатами.
Об областях применения. Ваш пример хорош, подобное мне тоже приходилось писать. Наверно можно сказать шире: любая трансляция из синтаксического дерева в другое дерево или что-то еще. Действительно, рефал дает очень хорошо читаемое представления АСД. Однако сразу отмечу, чего здесь не хватает и что плохо дается.
1. Таблицы, словари с быстрой выборкой по ключу (можно сделать внешними средствами, но это выглядит как чужеродный объект).
2. Я не смог придумать, как удобно сделать разметку дерева дополнительной информацией, чтобы она не мешала анализу, например, чтобы парсер добавил информацию о позициях (строка, колонка) в исходном файле. В ОО-среде это было бы тривиально, через дополнительные скрытые атрибуты.

Еще применения: мне недавно довелось писать обратный инжиниринг для вентильных схем, отображенных в КНФ. Есть КНФ в формате DIMACS, построенная по вентильной схеме, требуется восстановить исходную схему. Очень классно играют образцы с открытыми переменными при поиске шаблонов - образов вентилей. Это все приходилось подбирать в ходе проб, и я не знаю, в каком языке это было бы удобнее. Удавалось подняться до весьма сложных элементов вроде мультиплексоров, if-then-else, AND-OR-XOR-EQU с многими аргументами. При желании можно и сумматоры находить, но я уж выдохся.
Да, и последующее преобразование результата в формат .dot для Graphviz.
Думаю, все что угодно инверсно инжинирить удобнее на рефале.

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

С уважением,
Аркади


вт, 5 нояб. 2024 г. в 16:21, Александр Коновалов a.v.konovalov87_AT_mail.ru <re...@botik.ru>:
Добрый день!

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

Я могу выделить следующие черты Рефала:
  • дина��ически типизированный с закрытым набором типов — есть ограниченный набор встроенных типов данных, пользовательские типы конструируются на уровне соглашений (исключение: пара моих реализаций, где есть инкапуслирующие квадратные скобки — небесспорное расширение) — примерно та же ситуация, что и в классической Scheme;
  • мощное сопоставление с образцом — сопоставлением с образцом сейчас уже никого не удивишь, оно есть даже в Питоне (начиная с версии 3.10 или 3.11, и тоже довольно выразительное), но есть две достаточно редкие черты:
    • повторные переменные, и соответственно, встроенное в язык понятие равенства (однако, есть в Racket и есть в Scala),
    • поиск в середине последовательности по образцу «e.X PAT e.Y», аналогичная возможность есть только в Tom (предназначен для работы с XML и вообще удивительно похож на Рефал);
  • встроенная в семантику конкатенация — в результатных выражениях она записывается пустым местом, в других языках синтаксис конкатенации более многословный,
  • симметричный доступ к обоим концам последовательности в образцах — в большинстве функциональных языков встроенными (основными) последовательностями являются однонаправленные списки и образцы допускают обращение только слева, исключения — Scala, где есть «:+» и «+:», сопоставление с эллипсисом в макросах Scheme и образцах Racket, образцы в Python, но там списки — массивы,
  • возврат из функции нескольких значений столь же (не)естественнен, как и передача нескольких аргументов.

Mike Potanin mpotanin_AT_gmail.com

unread,
Nov 6, 2024, 8:53:01 AM11/6/24
to re...@botik.ru
Kframework (https://kframework.org/), система для прототипирования и изучения  семантик виртуальных машин и языков программирования, имеет схожие черты с Рефалом. Мне кажется интересным применить Рефал в этой области.

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

Стеллецкий Василий sw710_AT_yandex.ru

unread,
Nov 10, 2024, 10:27:35 AM11/10/24
to re...@botik.ru
- все
 
Уважаемые господа!
Долго сдерживался, но все же решил влить свою ненаучную струю в эту стройную концепцию ;)
Тут недавно (уже почти 2 года назад) мой сын привлекал внука к программированию нормализации телефонных номеров...
Они писали на Python. Я подумал, что это проще реализовать на рефале, и написал код...
Оказалось, по размеру примерно одинаково. Всё равно все условия надо обрабатывать...
Но далее он собирался эту функцию использовать в своей рабочей системе обработки базы данных.
А как туда воткнуть функцию на рефале? А насколько это будет эффективно?
Т.е. получается, что во-первых лучше писать на том языке, которым лучше владеешь,
а во-вторых рефал проигрывает в коммуникации с другими языками и системами.

Про словари... Может быть я еще живу в прошлом веке...
Но мне кажется, что Нормальные словари должны быть внешними. Если словарь можно поместить в память рефал-машины - то это словарик.
Кстати, если он отсортирован, по нему тоже возможен двоичный поиск с помощью машинной функции first, что на мой взгляд существенно уменьшает время доступа к информации.
Мне в мою бытность в библиотеке приходилось программировать из рефала доступ к внешним текстовым словарям. Я использовал двоичный поиск по файлу и некий "кэш" в рефале размером 10000 звеньев (то же с двоичным поиском через first)...
Время работы программ было вполне приемлемым.
 
... не знаю как продлить рефалу жизнь ...
-- 
С уважением,
Василий
 
 
 
----------------
07.11.2024, 21:41, "Александр Гусев gusev_aleksandr_AT_mail.ru" <re...@botik.ru>:
Кому: refal (re...@botik.ru);
Тема: Сфера применения Рефала;
 
Такого рода соревнование уже было:
  1. Аналоговые компьютеры против цифровых в 70-х. Цифровые были весьма несовершенны, но массовы. Аналоговые давали мгновенный результат и не имели проблем численных методов того времени. Но проиграли ввиду сильной зависимости от человеческого фактора. Всегда в наличии нужен был умный и знающий специфику программист.
  2. Процессоры Intel (кирпич, поддерживающий архаичные команды) и Motorola (с ноготок и более качественным функционалом). В области компьютеров Motorola проиграла в нулевых к всеобщему изумлению поклонников Apple.
Заявления о преимуществе в энергетической эффективности менее чем на порядок, а то и два, недостаточно для победы над уже массовой, увы, технологией нейросетей. Мне кажется, что интереснее объединение программной (Рефал) и стохастической (нейросети) технологий, использование сильных сторон каждой.
 
Либо нужны какие-то оригинальные (или гениальные) маркетинговые ходы.
 
Пока я вижу массовое желание использовать нейронки в программировании вместо людей. Даже если они выдадут некачественный, но работающий продукт, потребителя можно уговорить (или заставить) платить за него. И это будет катастрофа для тех, кто хочет быть программистом и работать головой, а не другими частями тела. Причём такой софт не сопровождается, а переписывается нейронной сетью весь каждый раз при внесении изменений. Через несколько лет квалификация людей упадёт и они перестанут делать code review таких инкубаторных систем. И где контроль за «железным братом»?
Вот здесь как раз есть место Рефалу либо другим подобным способам обработки логики. Но чтобы сделать тут даже первые шаги, нужны готовые и проверенные решения. И люди, способные соединять одно с другим.

-------- Пересылаемое сообщение --------
От кого: Mike Potanin mpotanin_AT_gmail.com <re...@botik.ru>
Кому: re...@botik.ru
Дата: Среда, 6 ноября 2024, 16:53 +03:00
Тема: Re: Сфера применения Рефала
...

Хотя в лингвистике сейчас все захватили нейросети, мне кажется что для работы с текстами у классических методов есть шансы, скажем опередить нейросети по энергопотреблению  и возможности анализа. Здесь интересно было бы генрировать программы анализа естественного языка и перевода с него на язык формальной логики с помощью машинного обучения (генетических алгоритмов, чего-то типа индуктивного логического программирования).
 
 
С уважением,
Александр Гусев
gusev_a...@mail.ru
 
 

Dmitry Ponyatov dponyatov_AT_gmail.com

unread,
Nov 10, 2024, 10:52:11 AM11/10/24
to re...@botik.ru
Добрый день

Но далее он собирался эту функцию использовать в своей рабочей системе обработки базы данных.
А как туда воткнуть функцию на рефале? А насколько это будет эффективно?
Т.е. получается, что во-первых лучше писать на том языке, которым лучше владеешь,
а во-вторых рефал проигрывает в коммуникации с другими языками и системами.

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

У Рефала другая проблема: открываем первую страницу учебника:

> 1.1. Уравнения в свободной полугруппе. Моноидом называется полугруппа с единицей. 
> Пусть 𝑀 – непустое множество. Тогда свободным моноидом, порождённым 𝑀, 
> называется множество всех конечных последовательностей (включая пустую последовательность) элементов из 𝑀 с полу

мда, у рефальщиков видимо отдельная палата #2.71, с собственными представлениями об обучении

практикующим программистам, даже хоббийщикам-арджуинщикам, такие игрушки неинтересны

------------------------------
С уважением, Понятов Дмитрий, инженер IoT/embedded, тел. +7 917 10 10 818
 

Mike Potanin mpotanin_AT_gmail.com

unread,
Nov 10, 2024, 5:25:02 PM11/10/24
to re...@botik.ru
On Sun, Nov 10, 2024 at 6:26 PM Стеллецкий Василий sw710_AT_yandex.ru <re...@botik.ru> wrote:
- все
 
Уважаемые господа!
Долго сдерживался, но все же решил влить свою ненаучную струю в эту стройную концепцию ;)
Тут недавно (уже почти 2 года назад) мой сын привлекал внука к программированию нормализации телефонных номеров...
Они писали на Python. Я подумал, что это проще реализовать на рефале, и написал код...
Оказалось, по размеру примерно одинаково. Всё равно все условия надо обрабатывать...
Но далее он собирался эту функцию использовать в своей рабочей системе обработки базы данных.
А как туда воткнуть функцию на рефале? А насколько это будет эффективно?
Т.е. получается, что во-первых лучше писать на том языке, которым лучше владеешь,
а во-вторых рефал проигрывает в коммуникации с другими языками и системами.
Это проблема всех языков. Код на питоне воткнуть в программу на Haskell будет непросто, что теперь на питоне не писать?

Александр Коновалов a.v.konovalov87_AT_mail.ru

unread,
Nov 12, 2024, 4:35:47 PM11/12/24
to re...@botik.ru

Добрый вечер, Александр!

«Что хотелось бы добавить в Рефал:
1. Для расширения круга программистов на Рефале нужен осовремененный стандарт языка, включающий
1) UNICODE в основе;»

При реализации с нуля для голого железа задача крайне громоздкая. Сейчас над ней работает Андрей Петрович Немытых, о чём он уже когда-то писал в рассылку.

Можно задачу упростить, реализуя Рефал поверх среды, поддерживающей Юникод: JVM или .NET.

«2) Удобный механизм подключения внешних библиотек в духе GitHub;»

Я когда-то даже формулировал спецификацию, но руки сделать не дошли. Пока не дошли. Спецификация:

https://github.com/Mazdaywik/refal-5-framework/issues/10

«3) Лёгкая интеграция с другими современными технологиями (интернет, базы данных);»

Да, Рефалу не хватает интерфейса с другими языками — собственно, из-за этого я когда-то и начал писать свои реализации. Есть интерфейс с языком Си у Рефала-2, интерфейс с целевыми языками у Рефала Плюс (он может компилироваться в Java и C++), но эти диалекты несколько специфические. Есть документированный интерфейс у моего Рефала-05 (язык, почти совпадающий с Рефалом-5):

https://mazdaywik.github.io/Refal-05/5-implementation.html

Рефал-05 позволяет пользователю писать функции на Си и вызывать их из Рефала. Однако обратный интерфейс (вызов функций Рефала из Си) пока не реализован.

«4) Некоторая корректировка архаичного по нынешним меркам синтаксиса;»

А с этого места, пожалуйста, поподробнее.

«2. Возможность ускорения вычислений за счёт использование возможностей современного «железа»;»

И здесь тоже поподробнее.

«3. Всякие „плюшки“ вроде распараллеливания и других крутых штучек можно рассматривать только после наступления ясности с результатом “реанимационных мероприятий“.»

Есть поддержка распараллеливания в Рефале Плюс. Я давал курсовую на тему распараллеливания Рефала-05, студент на эту тему даже делал доклад в ИПМ РАН, но реализация до конца не была отлажена:

https://github.com/Santalov/Refal-05 (код распараллеливания не в master)

 

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

Работу с одиночной сессией, как мне кажется, можно реализовать в Рефале-6 не выходя за рамки текущей реализации. Сессия будет выглядеть как консоль REPL. Для реализации нескольких взаимодействующих сессий либо работе в стиле Jupyter Notebook уже нужно реализовывать поддержку сети в Рефале. Мне неизвестны реализации Рефала с поддержкой сети.

«2. Реализация Рефала внутри совершенно другой языковой среды средствами этой среды. Например golang или sql. Это снимает весьма болезненный вопрос встраивания функционала Рефала в различные сложносочинённые приложения.»

Как минимум, нужен современный Рефал, имеющий интерфейс с языком Си в обе стороны: вызов функций, написанных на Си, из Рефала, и вызов функций Рефала из кода на Си. Такое умеет Рефал-2, но синтаксис у него, на мой вкус, архаичный.

Возможно создание транспиляторов Рефала в Go или Java для бесшовного взаимодействия с этими платформами. Для Java уже делалась попытка братьями Климовыми:

http://refal.ru/~arklimov/refal6/refal-j.htm
http://refal.ru/~arklimov/refal6/M7-RefalJava.htm

«3. Рефал может быть использован для конструирования и контроля нейронных сетей. Фактически это технология альтернативная нейронкам и отвечающая обозначившимся потребностям как раз в их контроле.»

Тут мне прокомментировать нечего, т.к. в нейронках я несведущ.

 

«Мои выводы:

2. С учётом реалий, сам Рефал обществу не интересен, нужны приложения, которые реализовать другими средствами невозможно или сильно затруднительно. И при наличии достаточного количества относительно новых языков с очень неплохими возможностями, нельзя не оценивать их конкурентные перспективы.»

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

 

 

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

 

From: Александр Гусев gusev_aleksandr_AT_mail.ru <re...@botik.ru>
Sent: Wednesday, November 6, 2024 2:04 PM
To: re...@botik.ru
Subject: Re:
Сфера применения Рефала

 

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

 

Добавлю немного своего мёда в бочку.

Плюсы для меня:

  1. Внешняя простота и неизбыточность концепции языка. Нет попытки вместить в себя всё сразу. Это даёт лёгкость вхождения. А необходимое можно допрограммировать и это может выглядеть весьма органично.
  2. Язык не навязывает «технарский» тип мышления в духе программ для станка-автомата. Программирование на нём не утомляет, а просветляет голову.
  3. Гибкость формы записи. Введение мнемонических идентификаторов может создать проблемно-ориентированный диалект для непрограммистов. Важно соблюдать меру.

Что хотелось бы добавить в Рефал:

  1. Для расширения круга программистов на Рефале нужен осовремененный стандарт языка, включающий
    1) UNICODE в основе;
    2) Удобный механизм подключения внешних библиотек в духе Githab;
    3) Лёгкая интеграция с другими современными технологиями (интернет, базы данных);
    4) Некоторая корректировка архаичного по нынешним меркам синтаксиса;
  2. Возможность ускорения вычислений за счёт использование возможностей современного «железа»;
  3. Всякие «плюшки» вроде распараллеливания и других крутых штучек можно рассматривать только после наступления ясности с результатом «реанимационных мероприятий».

Мои идеи:

  1. Новая сущность: вместо классического исполнения программы «загрузил-выполнил-посмотрел результат» использовать циклическую последовательность «запустил-открыл сессию-(1)-загрузил-выполнил-остановил или перешел к (1)» с сохранением результата в виде обновлённых функций или содержимого копилок или ящиков. Причём эти данные могут быть доступны из других сессий в реальном времени. Это было реализовано, но не доделано и оставлено «до лучших времён». Возможно, это первоначально навеяно средой исполнения языка Forth. Мысль зародилась примерно в в 2017 году, но пока она неспешно развивалась, ушлые люди создали GhatGPT и теперь догонять их «по прямой» мало реально.
  1. Реализация Рефала внутри совершенно другой языковой среды средствами этой среды. Например golang или sql. Это снимает весьма болезненный вопрос встраивания функционала Рефала в различные сложносочинённые приложения.
  1. Рефал может быть использован для конструирования и контроля нейронных сетей. Фактически это технология альтернативная нейронкам и отвечающая обозначившимся потребностям как раз в их контроле.

Мои выводы:

  1. Нынче серьёзный проект не запустить малыми силами одиночек, нужно или объединение единомышленников с взаимной ответственностью, либо изыскание средств со всеми вытекающими проблемами. На меня произвел большое впечатление объём вложений в нейронки ведущими компаниями. Даже если сделать что-то лучшее, убивая своё здоровье вечерами, этого просто почти никто в мире не заметит.
  2. С учётом реалий, сам Рефал обществу не интересен, нужны приложения, которые реализовать другими средствами невозможно или сильно затруднительно. И при наличии достаточного количества относительно новых языков с очень неплохими возможностями, нельзя не оценивать их конкурентные перспективы.
  1. Что касается меня, мне Рефал нравится и я не имею желания приспосабливать другой, даже бесплатно полученный из Америки или откуда ещё, язык к нуждам России. Очень надеюсь ещё поработать на нём и радостью бы принял посильное участие в формировании нормального продукта, соответствующего времени.

Вторник, 5 ноября 2024, 16:22 +03:00 от Александр Коновалов a.v.konovalov87_AT_mail.ru <re...@botik.ru>:
 

 

 

С уважением,
Александр Гусев
gusev_a...@mail.ru

 

Александр Коновалов a.v.konovalov87_AT_mail.ru

unread,
Nov 12, 2024, 5:01:29 PM11/12/24
to re...@botik.ru

Добрый вечер, Михаил!

Мне как раз недавно попались две статьи, которые утверждают, что у классических методов шансов немного:

https://sysblok.ru/blog/gorkij-urok-abbyy-kak-lingvisty-proigrali-poslednjuju-bitvu-za-nlp/
https://sponsr.ru/ashmanov/71371/Nedavnyaya_istoriya_russkogoIT_Sudba_lingvista_vburlyashchem_Otechestve/

Вторая платная, пишите в личку, вышлю текст (бесплатно!). Она интересная.

Если кратко: лингвистику крайне сложно формализовать и для хорошей системы, скажем, машинного перевода на правилах нужны десятки, сотни лингвистов, которые будут формализовывать смыслы слов и правила языка. Гораздо проще использовать методы машинного обучения, скажем, обучения системы перевода на параллельных текстах.

 

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

 

From: Mike Potanin mpotanin_AT_gmail.com <re...@botik.ru>
Sent: Wednesday, November 6, 2024 4:52 PM
To: re...@botik.ru
Subject: Re: Сфера применения Рефала

 

Kframework (https://kframework.org/), система для прототипирования и изучения  семантик виртуальных машин и языков программирования, имеет схожие черты с Рефалом. Мне кажется интересным применить Рефал в этой области.

Александр Коновалов a.v.konovalov87_AT_mail.ru

unread,
Nov 12, 2024, 5:12:21 PM11/12/24
to re...@botik.ru

Добрый вечер всем!

В Рефале со списковой реализацией двоичный поиск с функцией first всё равно будет иметь сложность O(n), т.к. сама функция first имеет линейную сложность. Однако, число сравнений ключей будет меньше O(log n), но сами сравнения сложнее, чем используя ассоциативный поиск (встроенное равенство vs вызов функции сравнения и анализ результата). Поэтому здесь выгоду от двоичного поиска нужно мерять на практике.

У меня был опыт оптимизации поиска в словаре при помощи хеширования. Нужно было искать среди нескольких тысяч имён, представленных как последовательности литер. Я стал вычислять хеш с остатком деления на какое-то простое число (37 кажется), имена сгруппировал в корзины по хешу. Поиск осуществлялся образцом вроде:

s.Hash (e.Name)
e.Buckets-B
(s.Hash e.Names-B ((e.Name) e.Value) e.Names-E)
e.Buckets-E

Т.к. число корзин было сравнимо с корнем от типичного числа ключей, поиск получался не линейным, а O(√n) и это измеримо повысило производительность.

 

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

 

From: Стеллецкий Василий sw710_AT_yandex.ru <re...@botik.ru>
Sent: Sunday, November 10, 2024 6:27 PM
To: re...@botik.ru
Subject: Re: Сфера применения Рефала

 

- все

Александр Коновалов a.v.konovalov87_AT_mail.ru

unread,
Nov 12, 2024, 5:16:44 PM11/12/24
to re...@botik.ru

Михаил пишет:

«Это проблема всех языков. Код на питоне воткнуть в программу на Haskell будет непросто, что теперь на питоне не писать?»

В соседнем письме я писал, что у хорошего компилятора Рефала должен быть интерфейс в обе стороны между ним и нижележащим языком. Если это программы для процессора, то должен быть интерфейс с Си, если для виртуальной машины (JVM или .NET), то интерфейс, соответственно, с Java или C#.

 

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

Александр Коновалов a.v.konovalov87_AT_mail.ru

unread,
Nov 12, 2024, 5:23:54 PM11/12/24
to re...@botik.ru

Добрый вечер, Дмитрий!

«Рефал может выплёвывать компилируемый код как результат своей работы — кодогенерация может спасти любителей экстремистских языков.»

Есть компиляторы Рефала в Си, C++, Java, но как я писал в соседнем письме, этого мало.

 

«У Рефала другая проблема: открываем первую страницу учебника:»

Курс лекций, который Вы цитируете, писался не для Вас, а для математиков. Хорошим руководством для программистов является учебник Турчина:

http://refal.botik.ru/book/html/

Есть руководство по Рефалу-5λ (недописанное), которое должно быть понятно даже гуманитариям:

https://bmstu-iu9.github.io/refal-5-lambda/

 

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

 

From: Dmitry Ponyatov dponyatov_AT_gmail.com <re...@botik.ru>
Sent: Sunday, November 10, 2024 6:52 PM
To: re...@botik.ru
Subject: Re: Сфера применения Рефала

 

Добрый день

 

Peter Sovietov

unread,
Nov 26, 2024, 2:06:42 PM11/26/24
to Refal
Привет Рефал-сообществу!

Я написал миниатюрную реализацию Рефала (https://github.com/true-grue/refalpy ) в виде встроенного в Питон DSL по методике переопределения AST-конструкций последнего. Сделана эта реализация для доклада на C++ Russia 2024 (https://github.com/true-grue/soviet_compilers ), а также в качестве источника упражнений для продвинутых студентов (в духе: реализуйте оптимизацию слияния ветвей из работ С.А. Романенко). Предполагается также использовать RefalPy как простую альтернативу изящному PLT Redex, неизящному K Framework и подобным средствам моделирования языков.

Поскольку RefalPy тесно интегрирован с Питоном, то можно использовать в таком Рефале и, к примеру, библиотеки машинного обучения.

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

Вот пример использования RefalPy в качестве альтернативы shell-скрипту. Здесь загружается с сайта HackerNews верхняя новость и печатается на экране.

import urllib.request
import json
from refalpy import refal

def download_json(arg):
    with urllib.request.urlopen(arg[0]) as f:
        return (json.load(f),)

imports = {
    'download_json': download_json,
    'concat': lambda arg: (''.join(map(str, arg)),),
    'from_tuple': lambda arg: (tuple(arg[0]),),
    'from_dict': lambda arg: (tuple(arg[0].items()),),
}

@refal(imports)
def hackernews():
    TOP_URL = 'https://hacker-news.firebaseio.com/v0/topstories.json'
    ITEM_URL = 'https://hacker-news.firebaseio.com/v0/item/'
    first[{s.x, e.y}] = s.x
    get[{e.x, {s.key, t.val}, e.y}, s.key] = t.val
    item_url[s.x] = concat[ITEM_URL, s.x, '.json']
    top_index = first[from_tuple[download_json[TOP_URL]]]
    msg[s.x] = get[from_dict[download_json[item_url[s.x]]], 'title']
    top = msg[top_index]

print(hackernews('top'))

среда, 13 ноября 2024 г. в 01:23:54 UTC+3, Александр Коновалов a.v.konovalov87_AT_mail.ru:
Reply all
Reply to author
Forward
0 new messages