рефал

9 апреля 2014 3681 admin

РЕФАЛ.


Рефал - язык программирования.


Сегодня, я хочу написать об одном языке программирования, который создан на заре компьютеризации, и который...мало распространен. К сожалению sad

Называется он - РЕФАЛ.

Оф.сайт: http://www.refal.ru/

Расшировывается так: РЕФАЛ - РЕкурсивных Функций АЛгоритмический.
История его настолько печальна, насколько заслуживает всяческого внимания и развития.

Для чего я сделал отдельный поддомен: http://refal.freeserver.su/ Где я буду выкладывать основную инфу. В основном, это собранная на просторах интернета информация.
Эта статья - тоже обзорная, компилятивная.

Но, я надеюсь, РЕФАЛ - всё-таки, не умрет smile

Итак, поехали.

РЕФАЛ создан в 1966 году Валентином Турчиным в качестве метаязыка для описания семантики других языков. Он является одним из старейших языков для функционального программирования.

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

В отличие от Лиспа, Рефал в качестве основного механизма работы использует сравнение с образцом. Благодаря этому тексты программ на Рефале в 2-3 раза короче, чем такие же программы, записанные на Лиспе, и при этом значительно "читабельнее".

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

Основными структурами данных Лиспа и Пролога являются односторонние списки. Рефал базируется на двусторонних списках, которые могут просматриваться (и строиться) как слева направо, так и справа налево. Именно так человек обычно изучает текст на бумаге. Более сложные (нелинейные) объекты очень легко реализуются с помощью аппарата структурных скобок. Все это предоставляет программисту условия для свободной и удобной работы, строящейся по существу только на двух механизмах управления сравнении с образцом и подстановке.

А именно эти механизмы играют особо большую (чуть ли не единственную) роль в человеческом мышлении. Тем самым проявляется методологическая ценность Рефала как инструмента познания, и, значит, обрисовываются его возможности в преподавании (и не только преподавании информатики).
источник: http://ito.su/1999/I/2/278.html

Примеры использования РЕФАЛа в обучении:

- http://ito.edu.ru/2000/dopoln_tez/dopoln_tez18.html
- http://do.gendocs.ru/docs/index-102985.html
-

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

Объектное выражение определяется таким образом, что операция конкатенации делается неявной, скрытой. Точнее сказать, что конкатенация на уровне значений выражается конкатенацией на уровне имен. Это свойство вытекает из основной цели рефала как метаязыка для описания различных языковых объектов. Оно придает особую выразительную силу и остальным средствам языка, таким как образцы и результатные выражения.

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

Что же умеет РЕФАЛ и для чего он предназначен ?
Приведу выдержки из сайтов авторов:

"Этот изящный универсальный язык программирования высокого уровня, который ориентирован на обработку символьных древовидных структур и обладает мощным механизмом сопоставления с образцом - наилучший выбор для специалистов с математичеким мышлением"

Области эффективного применения:

Языки программирования:
- трансляция,
- анализ, Компьютерная алгебра
- метавычисления,
- и т.д.

Искусственный интеллект:
- доказательство теорем,
- естественные языки,
- базы знаний

Обработка символьных данных:

Компьютерная алгебра:

Scripting and prototyping:
источник: http://www.refal.net/~arklimov/refal6/

Как видно, сфера применений - достаточно широка. Хватило бы фантазии ;)

На сегодняшний день, существует 4 основные реализации РЕФАЛА:
( версию с оф.сайта можно посмотреть здесь: http://www.refal.ru/dialects.html )

1. Рефал-2.

Подробнее, по:
- http://www.refal.net/~belous/refal2-r.htm
- http://www.cnshb.ru/vniitei/sw/refal/

2. Рефал-5.

Подробнее, по:
- http://botik.ru/pub/local/scp/refal5/refal5.html

3. Рефал-6.

Подробнее, по:
-[url] http://www.refal.net/~arklimov/refal6/[/url]

4. Рефал-ПЛЮС (Рефал+).

Подробнее, по:
- http://wiki.botik.ru/Refaldevel/WebHome
- ftp://ftp.botik.ru/pub/lang/refal-plus

Различия между диалектами.


Так как очень тяжело разделить диалекты, особенно, 5 и 6, то приведу часть описания, один из ответов на вопрос - что такое РЕФАЛ? - с оф.сайта, по адресу: http://www.refal.ru/intro-ref.htm

Язык определения функций рефала, основанный на понятиях образца и результатного выражения чрезвычайно прост и компактен. Его минимальная версия получила название Базисный рефал. Диалект Базисного рефала под названием Рефал-2 был реализован на многих типах отечественных ЭВМ и долгое время играл роль де-факто стандарта языка Рефал.

В середине 80-х В. Турчиным предложен язык Рефал-5, который содержит Базисный рефал в качестве подмножества. Расширения языка Рефал-5 качественно меняют стиль программирования, поэтому можно говорить о нем как о новом поколении языка.

В настоящее время существует две реализации языка Рефал-5:
- одна выполнена Д. Турчиным,
- другая - Н. Кондратьевым и Арк. Климовым. (Известна как Рефал-6)

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

Параллельно, С. Романенко разработал язык Рефал-Плюс, основаный в принципе на тех же расширениях, что и Рефал-5, но доведенный до концептуальной полноты.
В нем основным можно назвать расширение РЕФАЛА средствами обработки неуспехов.

Впоследствии ряд нововведений Рефала-Плюс в несколько пересмотренном виде был перенесен Арк.Климовым в реализацию Рефала-6.

В настоящее время (1999) продолжается работа по унификации входных языков Рефал-Плюс и Рефал-6.

Достоинства и недочеты.


Во время своего создания язык Рефал был в нескольких важных отношениях весьма передовым
и даже опережающим свою современность. Лежащие в его основе идеи, тем более их сочетание,
предвосхитили тенденции в развитии программирования, проявившиеся лишь десятки лет спу-
стя.

Перечислим основные достоинства Рефала:


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

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

- У функции лишь один аргумент и результат. Разнообразие и общность применимости дости-
гаются не количеством аргументов, а приданием подходящего строения единственному аргу-
менту функции. Так же и насчет результата. Этот принцип хорошо известен по современным
функциональным языкам, где ему следуют практически везде, но сорок с лишним лет назад
господствовали другие представления.

- Неограниченная последовательность с симметричным доступом к элементам  основная струк-
тура данных в языке. Последовательности являются гораздо более ценной структурой по срав-
нению с (однонаправленными) списками10.

- Реализация посредством компилирования исходной программы в программу на языке вирту-
альной машины, которая затем интерпретируется.

- Автоматическое выделение и освобождение памяти.

Последние два свойства тоже не так часто встречались во время становления Рефала.
Удивительно, но данная совокупность свойств как будто относится к языку, изобретенному се-
годня, и к тому же продвинутому!

У Рефала, однако, есть и немало недостатков. Часть их относится к языку вообще, другая  к
Рефалу как к представителю функционального стиля. Рассмотрим наиболее существенные.

Перечислим основные недостатки Рефала:


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

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

- Аскетизм в отношении типов проявляется и в отсутствии в языке булевых значений и булевой арифметики. Вместе с тем нет и какой бы то ни было формы условного ветвления, если не считать выбора предложения в рамках данной функции на основе успешности сопоставления с одним из нескольких образцов. К примеру, сравнение по величине двух чисел состоит в применении функции compare, выдающей '+', '-' или '0', с последующим сопоставлением результата с этими тремя образцами. Однако успех/неуспех сопоставления - всего лишь неполноценная и часто неуклюжая имитация булевой арифметики и выбора действия.

- Для выражения повторяющихся действий в функциональном языке естественно рассчитывать на рекурсию. Во многих языках, однако, для часто возникающих схем повторения предусматриваются специализированные под них конструкции высокого уровня, или по крайней мере стандартные функции, которые, вбирая в себя рекурсию, скрывают ее от программиста. Такими являются, скажем, определители списков (list comprehensions), функции вида map, zip, fold и пр. В Рефале подобного вида конструкций нет и поэтому рекурсию приходится выражать всегда в явной форме. Это приводит к большому числу вспомогательных функций, из-за чего программа имеет тенденцию становится чересчур раздробленной, громоздкой, а смыслл - расплавчатым.

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

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

- Функции стандартной библиотеки тоже не имеют ничего общего с функциональным стилем программирования. На самом деле, библиотеку трудно отнести даже вообще к Рефалу. Трудно
объяснить почти полное отсутствие в ней функций для работы с текстовыми цепочками, равно как и с последовательностями - ведь именно это и есть данные в языке. Отсутствуют даже арифметические функции нахождения абсолютногозначения, меньшего/большего из двух чисел и обращения знака.

- У механизма сопоставления имеется то неудобство, что в рамках образца нельзя выразить ни альтернирование, т. е. ветвление сопоставления, ни повторение, за исключением одинаковых частей,
цитируемых одной и той же переменной. Другими словами, обобщение сопоставлений, аналогичное легко выражаемому примерно аппаратом регулярных выражений, в Рефале невозможно. Вследствие того некоторые задачи, которые очень легко решить регулярными выражениями, требуют неестественно больших и запутанных программ на Рефале.

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

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

- Наконец, имеющиеся описания действующих реализаций языка несколько неполны и в какой-то степени устарели.

Все приведенные выше критические замечания относятся в полной мере к Рефалу-5.
Рефал-6 и Рефал+ восполняют только небольшую часть указанных пробелов и только частичным образом.
Источник: http://www.math.bas.bg/bantchev/articles/refal-pfp.pdf

Замечание автора статьи

С некоторыми доводами я согласен. Например, с отсутствием развитых средств написания программ, типа IDE/RAD-инструментов, с отсутствием компиляторов, документации..

Но делать из Рефала - очередной Си/Java-клон, я считаю не самой удачной идеей. Математические функции, наверное, нужны. Всё-таки, математическая логика задействована ;) Но их надо делать в виде библиотеки, и вызывать соответственно.

Мне кажется, что Рефалу нужно развиваться по его основному направлению - теории и алгоритмам, сравнению, методам сравнения и т.д. Его основному направлению.

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

И еще. Раз пошла такая пьянка..

Раздробленность на несколько диалектов - вряд ли поспособствует развитию. Лучше бы собрались вместе, и выработали стандарт Рефла.

Но, ПЕРЕД ЭТИМ, мне кажется важным, теоретическая доработка самой идеи НАМ для целей как языка программирования. Всё-таки, академическое основание любого проекта - гораздо эффективнее.

Конец Зам.авт. ))

Аналогии


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

Prolog - хорошо известный пример тоже декларативного языка и тоже основанного на сопоставлении. Однако (оставим в стороне другие различия) в программе на Prolog-е предметом сопоставления является цель, результат, и действие программы состоит в поиске аргументов, при которых цель удовлетворяется, или же в проверке того, удовлетворяется ли она при заданных аргументах.

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

Что точно известно, так это то, что разница существенным образом сказывается на стиле программирования. Рефал, однако, однозначно выигрывает своими симметричными последовательностьями против однонаправленных списков Prolog-а.

Нельзя не упомянуть и Snobol. Этот язык был еще в 1970-е и остается мощным средством программирования в той же области, что и Рефал - текст и символьные преобразования.
В Snobol-е тоже основа вычислений - сопоставления, но тем сходство с Рефалом кончается. В этом языке образцы - полноправные данные иерархической структуры, включающие, помимо прочего, вызовы функций и присваивания переменным, которые могут быть безусловными или зависеть от успеха сопоставления. Успешные сопоставления сопровождаются заменой распознанной части текстовой цепочки новым текстом. В этом смысле, хотя Snobol совсем не функциональный язык, он даже в большей степени "марковский" чем Рефал.
В отношении сопоставительной семантики Snobol, несмотря на возраст, очень продвинут. С другой стороны, быстродействие программ на Рефале, как правило, чувствительно выше.

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

Практически ценной особенностью OmniMark-а является возможность режимного переключения с общего распознавания на текст, размеченный в SGML, а значит и XML или HTML.

P.S.
Эта статья из тех, которая будет постоянно дополняться и расширяться.
  • 5

Другие новости по теме:

Другие новости по теме:
    Написал: mike
      30.10.2019 - 07:26 | Комментарий: 1
    Рефал, конечно, хороший язык. В плане - ИДЕИ. НО на сегодня практически не пригоден к реальному использованию, ибо слабо развит. Да, идея - хорошая; но идею, не реализованную в виде инструмента, невозможно использовать.
    Надо развивать язык.
    [Цитировать]
    Написал: Singer
      12.12.2019 - 11:12 | Комментарий: 2
    Как раз сейчас я занимаюсь созданием сервера приложений на Рефале для практического применения.
    [Цитировать]
    Написал: admin
      12.12.2019 - 15:00 | Комментарий: 3
    Singer,
    Можете написать подробности ?) Очень интересно посмотреть на практическое применение рефала.
    И второй вопрос - какой диалект используете ?
    [Цитировать]

    Добавление комментария

    Имя:
    Пароль:
    Email:
    Код:
    captcha
    Введите код:

    Последнии комментарии
    Обновление NetBSD до STABLE
    Автор www3 (14.06.2024)
    Много кто пользуется, но народ не очень словоохотл...
    Обновление NetBSD до STABLE
    Автор www2 (14.06.2024)
    anon, я пользуюсь.
    Как конвертировать LSD в DSL
    Автор testforasong (28.01.2024)
    Здравствуйте, не нахожу байт за номером 5A9DD. Ест...
    Как сменить версию php через .htacces
    Автор anon (19.09.2022)
    Спасибо!
    Хоть у кого-то подробное объяснение!
    Обновление NetBSD до STABLE
    Автор anon (12.09.2022)
    Кто-то еще пользуется этой системой?)
    FreeSWITCH on NetBSD
    Автор admin (27.11.2020)
    2default
    круто! хоть какой-то свежак)
    да, netb...
    FreeSWITCH on NetBSD
    Автор default (24.11.2020)
    admin, Собрал, запустил, таки 1.8.7. С ним вполне ...
    FreeSWITCH on NetBSD
    Автор admin (20.11.2020)
    Пробуем последнюю отсюда: https://files.freeswitch...
    FreeSWITCH on NetBSD
    Автор default (20.11.2020)
    admin, Давай скооперируемся. И мне нужен. На FreeB...
    i3lock
    Автор admin (20.11.2020)
    аха, спасибо. Исправили)
     Популярные
       
    Календарь
    « Апрель »
    Пн Вт Ср Чт Пт Сб Вс
    1 2 3 4 5 6
    7 8 9 10 11 12 13
    14 15 16 17 18 19 20
    21 22 23 24 25 26 27
    28 29 30
    Облако тегов