(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))
)
Александр, спасибо, очень приятное, лаконичное и содержательное представление достоинств и преимуществ рефала.
Однако сразу отмечу, чего здесь не хватает и что плохо дается.
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)
…
}
SomeParserFunc {
… t.Expr @ <Pure (Name e.VarName)> …
}
… VAR @ <EXTR PATTERN> …
… VAR …, <EXTR VAR> : PATTERN
… VAR @ [EXTR PATTERN] …
Здравствуйте все!Александр, спасибо, очень приятное, лаконичное и содержательное представление достоинств и преимуществ рефала.Очень мне понравилось Ваше выражение: "без лишнего синтаксического шума". Это очень точно сказано.Я последнее время изучаю язык 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, но там списки — массивы, возврат из функции нескольких значений столь же (не)естественнен, как и передача нескольких аргументов.
Такого рода соревнование уже было:
- Аналоговые компьютеры против цифровых в 70-х. Цифровые были весьма несовершенны, но массовы. Аналоговые давали мгновенный результат и не имели проблем численных методов того времени. Но проиграли ввиду сильной зависимости от человеческого фактора. Всегда в наличии нужен был умный и знающий специфику программист.
- Процессоры 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: Сфера применения Рефала...
Хотя в лингвистике сейчас все захватили нейросети, мне кажется что для работы с текстами у классических методов есть шансы, скажем опередить нейросети по энергопотреблению и возможности анализа. Здесь интересно было бы генрировать программы анализа естественного языка и перевода с него на язык формальной логики с помощью машинного обучения (генетических алгоритмов, чего-то типа индуктивного логического программирования).
Но далее он собирался эту функцию использовать в своей рабочей системе обработки базы данных.
А как туда воткнуть функцию на рефале? А насколько это будет эффективно?
Т.е. получается, что во-первых лучше писать на том языке, которым лучше владеешь,
а во-вторых рефал проигрывает в коммуникации с другими языками и системами.
- всеУважаемые господа!
Долго сдерживался, но все же решил влить свою ненаучную струю в эту стройную концепцию ;)Тут недавно (уже почти 2 года назад) мой сын привлекал внука к программированию нормализации телефонных номеров...
Они писали на Python. Я подумал, что это проще реализовать на рефале, и написал код...
Оказалось, по размеру примерно одинаково. Всё равно все условия надо обрабатывать...Но далее он собирался эту функцию использовать в своей рабочей системе обработки базы данных.
А как туда воткнуть функцию на рефале? А насколько это будет эффективно?
Т.е. получается, что во-первых лучше писать на том языке, которым лучше владеешь,
а во-вторых рефал проигрывает в коммуникации с другими языками и системами.
Добрый вечер, Александр!
«Что хотелось бы добавить в Рефал:
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: Сфера применения Рефала
Добрый день всем!
Добавлю немного своего мёда в бочку.
Плюсы для меня:
Что хотелось бы добавить в Рефал:
Мои идеи:
Мои выводы:
Вторник, 5 ноября 2024, 16:22 +03:00 от Александр Коновалов a.v.konovalov87_AT_mail.ru <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/), система для прототипирования и изучения семантик виртуальных машин и языков программирования, имеет схожие черты с Рефалом. Мне кажется интересным применить Рефал в этой области.
Добрый вечер всем!
В Рефале со списковой реализацией двоичный поиск с функцией 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: Сфера применения Рефала
- все
Михаил пишет:
«Это проблема всех языков. Код на питоне воткнуть в программу на Haskell будет непросто, что теперь на питоне не писать?»
В соседнем письме я писал, что у хорошего компилятора Рефала должен быть интерфейс в обе стороны между ним и нижележащим языком. Если это программы для процессора, то должен быть интерфейс с Си, если для виртуальной машины (JVM или .NET), то интерфейс, соответственно, с Java или C#.
С уважением,
Александр Коновалов
Добрый вечер, Дмитрий!
«Рефал может выплёвывать компилируемый код как результат своей работы — кодогенерация может спасти любителей экстремистских языков.»
Есть компиляторы Рефала в Си, 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: Сфера применения Рефала
Добрый день