Rebol ( / ˈ r ɛ b əl / REB -əl ; исторически REBOL ) — кроссплатформенный [6] язык обмена данными и многопарадигмальный динамический язык программирования, разработанный Карлом Сассенратом для сетевых коммуникаций и распределенных вычислений . Он вводит концепцию диалектизма : небольшие, оптимизированные , предметно-ориентированные языки для кода и данных, [6] [7] что также является наиболее заметным свойством языка по словам его разработчика Карла Сассенрата :
Хотя его можно использовать для программирования, написания функций и выполнения процессов, его самая сильная сторона — возможность легко создавать языки или диалекты, специфичные для определенной области.
— Карл Сассенрат [8]
Дуглас Крокфорд , известный своим участием в разработке JavaScript , описал Rebol как «более современный язык, но с некоторыми идеями, очень похожими на Lisp, в том смысле, что все это построено на представлении данных, которые затем исполняются в виде программ» и как одно из влияний JSON . [5]
Первоначально язык и его официальная реализация были проприетарными и имели закрытый исходный код, разработанными REBOL Technologies. После обсуждения с Лоуренсом Розеном [ 9] интерпретатор Rebol версии 3 был выпущен под лицензией Apache 2.0 12 декабря 2012 года. [10] Более старые версии доступны только в двоичной форме, и выпуск исходного кода для них не планируется.
Rebol использовался для программирования интернет- приложений (как клиентских , так и серверных ), приложений баз данных , утилит и мультимедийных приложений. [6]
Rebol изначально был аббревиатурой от R elative Expression B ased Object Language , написанной заглавными буквами . [6] [8] Чтобы соответствовать современным тенденциям в именовании представленных языков, например, замене исторического названия LISP на Lisp , программисты прекратили практику написания REBOL заглавными буквами. В конечном итоге Сассенрат вынес вопрос об именовании на обсуждение сообщества в своем блоге. [11] В последующих работах Сассенрат принял соглашение о написании названия языка как Rebol . [12]
Впервые выпущенный в 1997 году, Rebol разрабатывался в течение 20 лет Карлом Сассенратом, архитектором и основным разработчиком AmigaOS , на основе его исследований денотационной семантики и с использованием концепций из языков программирования Lisp , Forth , Logo и Self .
Один из принципов дизайна Rebol — «делать простые вещи простыми способами». [6] В следующем примере диалект визуального интерфейса используется для описания простой программы Hello world с графическим пользовательским интерфейсом:
вид макета [ текст "Привет, мир!" кнопка "Выйти" [ выйти ]]
Вот как выглядит аналогичный пример в R3-GUI:
вид [ текст "Привет, мир!" кнопка "Выйти" на- действие [ выйти ]]
Доменно-специфические языки Rebol , называемые диалектами , представляют собой микроязыки, оптимизированные для определенной цели. Диалекты могут использоваться для определения бизнес-правил, графических пользовательских интерфейсов или последовательностей экранов во время установки программы. Пользователи могут определять свои собственные диалекты, повторно используя любое существующее слово Rebol и придавая ему определенное значение в этом диалекте. [6] Диалекты интерпретируются функциями, обрабатывающими блоки Rebol (или анализирующими строки) определенным образом.
Пример диалектных способностей Rebol можно увидеть на примере слова return
. В диалекте обмена данными return
— это просто слово, не имеющее определенного значения. В диалекте do — return
это глобальная переменная, ссылающаяся на собственную функцию, передающую обратно значение результата функции. [4] В диалекте визуального интерфейса (VID) — return
это ключевое слово , заставляющее движок макета имитировать возврат каретки , перемещая «перо рендеринга» вниз к началу следующей строки. [7]
Переводчик Rebol с графическими способностями должен понимать и интерпретировать множество диалектов. В таблице ниже перечислены наиболее важные из них в порядке значимости.
Синтаксис Rebol — свободный , не требующий определенного позиционирования. Однако отступы часто используются для лучшей передачи структуры текста для людей-читателей.
Синтаксические свойства различных диалектов могут различаться. Общей платформой для всех диалектов ребола является диалект обмена данными ; другие диалекты обычно происходят от него. Помимо того, что диалект обмена данными является общей платформой для всех диалектов, он напрямую используется для представления данных и метаданных, заполнения структур данных, отправки данных через Интернет и сохранения их в хранилище данных.
В отличие от языков программирования, таких как C , диалект обмена данными не состоит из деклараций , операторов , выражений или ключевых слов. Допустимый текстовый поток диалекта обмена данными представляет собой древовидную структуру данных , состоящую из блоков (корневой блок неявный, подблоки разделены квадратными скобками ) , скобок (разделенных круглыми скобками ), строк (разделенных двойными кавычками или фигурными скобками, подходящими для многострочных строк; обозначение вставки используется для непечатаемых символов), URL-адресов , адресов электронной почты, файлов, путей или других составных значений . В отличие от блоков ALGOL , блоки Rebol являются составными значениями, похожими на цитируемые s-выражения в Lisp . Тот факт, что код написан в виде блоков Rebol, делает язык гомоиконичным . [4]
Блоки, а также скобки могут содержать другие составные значения (блок может содержать подблоки, скобки, строки, ...) или скалярные значения , такие как слова, set-words (слова с суффиксом двоеточия ) , get-words (слова с префиксом двоеточия), lit-words (слова с префиксом апострофа ) , числа, деньги, символы и т. д., разделенные пробелами . В словах разрешены специальные символы, как и a+b
слово unlike a + b
, которое представляет собой последовательность из трех слов, разделенных пробелами.
Комментарии могут появляться после точки с запятой до конца строки. Многострочные комментарии или комментарии, не игнорируемые лексическим анализатором, могут быть записаны с использованием «обычных» типов данных, таких как многострочные строки. [4]
Блоки, содержащие специфичный для предметной области язык, могут быть представлены в качестве аргументов для определенных функций оценки . [6]
Наиболее часто используемым оценщиком является do
функция. Она используется по умолчанию для интерпретации текстового ввода в консоль интерпретатора .
Диалект do, интерпретируемый функцией do
, является подъязыком , ориентированным на выражения, диалекта обмена данными . Основной семантической единицей языка является выражение . В отличие от императивных языков программирования, происходящих от ALGOL , диалект do не имеет ни ключевых слов, ни операторов.
Слова используются как переменные, нечувствительные к регистру . Как и во всех динамически типизированных языках , переменные не имеют связанного типа, тип связан со значениями. Результат, т. е. оценка слова, возвращается, когда слово встречается функции . Форма множества-слова слова может использоваться для присваивания . Хотя не имеет операторов, присваивание вместе с функциями с побочными эффектами может использоваться для императивного программирования . [4]do
Подблоки корневого блока оценивают себя. Это свойство используется для обработки блоков данных, для структурного программирования путем отправки блоков в качестве аргументов для функций управленияif
, таких как , either
, loop
, и т. д., и для диалектизации, когда блок передается определенной функции интерпретатора. [6]
Конкретная проблема, которую стоит отметить, заключается в том, что составные значения, назначенные переменным, не копируются. Чтобы сделать копию, значение должно быть передано функции copy
. [4]
Функция do
обычно следует префиксному стилю оценки , где функция обрабатывает аргументы, которые следуют за ней. Однако существует также инфиксная оценка с использованием инфиксных операторов . Инфиксная оценка имеет приоритет над префиксной оценкой. Например,
пресс -2 + 3
возвращает 1, так как инфиксное сложение имеет приоритет над вычислением абсолютного значения. При оценке инфиксных выражений порядок оценки слева направо, ни один оператор не имеет приоритета над другим. Например,
2 + 3 * 4
возвращает 20, тогда как оценка, дающая приоритет умножению, дала бы 14. Все операторы имеют префиксные версии. Do
обычно оценивает аргументы перед передачей их в функцию. Итак, следующее выражение:
печать читать http://en.wikipedia.org/wiki/REBOL/Rebol
Сначала читает страницу Wikipedia Rebol, а затем передает результат функции print
. Скобки можно использовать для изменения порядка оценки. Используя префиксную нотацию , можно избежать использования скобок в выражениях. [4]
Простые правила приоритета являются преимуществом:
а также недостаток:
Функция parse
предпочтительно используется для указания, проверки, преобразования и интерпретации диалектов. Она делает это путем сопоставления выражений синтаксического анализа во время выполнения. [6]
Выражения разбора записываются на диалекте разбора , который, как и диалект do , является подъязыком, ориентированным на выражения, диалекта обмена данными . В отличие от диалекта do , диалект разбора использует ключевые слова, представляющие операторы, и наиболее важные нетерминалы , операторы инфиксного разбора не имеют префиксных эквивалентов и используют правила приоритета ( последовательность имеет более высокий приоритет, чем выбор ). [6]
Действия могут быть включены для выполнения в процессе разбора, а parse
функция может использоваться для обработки блоков или строк. На уровне разбора строкparse
необходимо обрабатывать «низкоуровневый» разбор, принимая во внимание символы и разделители. Разбор блоков — это более высокий уровень, обрабатывающий сканирование на уровне значений Rebol. [6]
Диалект парсинга принадлежит к семейству грамматик, представленному языком парсинга сверху вниз или грамматикой парсингового выражения (PEG). Основное сходство заключается в наличии операторов последовательности и выбора , которые есть у всех членов семейства. Синтаксис диалекта парсинга и сходство между диалектом парсинга и PEG иллюстрируются этой транслитерацией примера PEG , который парсит арифметическое выражение:
Цифра: набор_символов [ #"0" - #"9" ] Значение: [ некоторая_цифра | " (" Выраж. ")" ] Произведение: [ Любое_значение [ [ "*" | "/" ] Значение ]] Сумма: [ Любое_значение [ [ "+" | "-" ] Произведение ]] Выражение: Сумма разбор/ все "12+13" Выражение
Официальная реализация Rebol 2.7.8 доступна в нескольких редакциях ( /Core , /View , /Command , /SDK и /IOS ). Обе редакции /Core и /View являются свободно распространяемым программным обеспечением . [1]
Среда выполнения хранится в одном исполняемом файле. Rebol/Core 2.7.8, консольная версия, имеет размер около 300 КБ, а Rebol/View 2.7.8, версия с графическим пользовательским интерфейсом , имеет размер около 650 КБ.
Rebol/View обеспечивает независимый от платформы доступ к графике и звуку, а также поставляется с собственным набором инструментов для работы с окнами и расширяемым набором стилей ( виджеты GUI ). Расширенные версии, такие как Rebol/Command 2.7.8 или Rebol/SDK 2.7.8, требуют платной лицензии; они добавляют такие функции, как доступ к данным ODBC и возможность создания автономных исполняемых файлов. [ необходима цитата ]
, вероятно, думали, что исходный код никогда не выйдет? Я прав? Ну, теперь он есть на github по адресу github.com/rebol/rebol.