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 был аббревиатурой языка относительных выражений , основанных на объектах , написанного заглавными буквами. [6] [8] Чтобы соответствовать современным тенденциям в именовании языков, например, заменой исторического названия LISP на Lisp , программисты прекратили практику написания REBOL заглавными буквами. В конце концов Сассенрат вынес вопрос об названии на обсуждение сообщества в своем блоге. [11] В последующем написании Сассенрат принял соглашение о написании названия языка как Rebol . [12]
Впервые выпущенный в 1997 году, Rebol разрабатывался в течение 20 лет Карлом Сассенратом, архитектором и основным разработчиком AmigaOS , на основе его исследования денотационной семантики и использования концепций языков программирования Lisp , Forth , Logo и Self .
Один из принципов дизайна Rebol — «делать простые вещи простыми способами». [6] В следующем примере диалект визуального интерфейса используется для описания простой программы Hello world с графическим пользовательским интерфейсом:
просмотреть макет [ текст «Привет, мир!» кнопка «Выход» [ выйти ]]
Вот как аналогичный пример выглядит в R3-GUI:
просмотреть [ текст «Привет, мир!» кнопка «Выход» on- действие [ quit ]]
Языки, специфичные для предметной области Rebol , называемые диалектами , представляют собой микроязыки, оптимизированные для определенной цели. Диалекты можно использовать для определения бизнес-правил, графических пользовательских интерфейсов или последовательности экранов во время установки программы. Пользователи могут определять свои собственные диалекты, повторно используя любое существующее слово Rebol и придавая ему определенное значение в этом диалекте. [6] Диалекты интерпретируются функциями, обрабатывающими блоки Rebol (или анализирующими строки) определенным образом.
Пример диалектных способностей Ребола можно увидеть на примере слова return
. В диалекте обмена данными return
это просто слово, не имеющее какого-либо конкретного значения. В диалекте do — return
это глобальная переменная , ссылающаяся на встроенную функцию , передающую обратно значение результата функции. [4] В диалекте визуального интерфейса (VID) — return
это ключевое слово , заставляющее механизм компоновки имитировать возврат каретки , перемещая «перо рендеринга» вниз к началу следующей строки. [7]
Переводчик Rebol с графическими способностями должен понимать и интерпретировать многие диалекты. В таблице ниже перечислены наиболее важные из них в порядке значимости.
Синтаксис Rebol имеет произвольную форму и не требует специального позиционирования. Однако отступы часто используются, чтобы лучше передать структуру текста читателям.
Синтаксические свойства разных диалектов могут различаться. Общей платформой для всех диалектов Ребола является диалект обмена данными ; от него обычно происходят другие диалекты. Помимо того, что диалект обмена данными является общей платформой для всех диалектов, он напрямую используется для представления данных и метаданных, заполнения структур данных, отправки данных через Интернет и сохранения их в хранилище данных.
В отличие от языков программирования, таких как C , диалект обмена данными не состоит из объявлений , операторов , выражений или ключевых слов. Действительный текстовый поток диалекта обмена данными — это древовидная структура данных , состоящая из блоков (корневой блок неявный, подблоки ограничены квадратными скобками ), скобок (ограниченных круглыми скобками ), строк (ограниченных двойными кавычками или фигурными скобками, подходящими для нескольких -строчные строки; для непечатаемых символов используется каретка ), URL -адреса , адреса электронной почты, файлы, пути или другие составные значения . В отличие от блоков ALGOL , блоки Rebol представляют собой составные значения, аналогичные s-выражениям в кавычках в Lisp . Тот факт, что код написан в виде блоков Rebol, делает язык гомоиконичным . [4]
Блоки, а также круглые скобки могут содержать другие составные значения (блок может содержать подблоки, круглые скобки, строки и т. д.) или скалярные значения, такие как слова, заданные слова (слова с суффиксом двоеточия ) , get-слова (слова с префиксом двоеточие), лит-слова (слова с префиксом апострофа ) , цифры, деньги, символы и т. д., разделенные пробелом . В словах допускаются специальные символы, а также a+b
слово «отлично» a + b
, которое представляет собой последовательность из трех слов, разделенных пробелами.
Комментарии могут появляться после точки с запятой до конца строки. Многострочные комментарии или комментарии, не игнорируемые лексическим анализатором, могут быть написаны с использованием «обычных» типов данных, таких как многострочные строки. [4]
Блоки, содержащие язык, специфичный для предметной области, могут быть переданы в качестве аргументов конкретным функциям оценки . [6]
Наиболее часто используемым оценщиком является do
функция. По умолчанию он используется для интерпретации ввода текста в консоль переводчика .
Диалект do, интерпретируемый функцией do
, представляет собой ориентированный на выражения подъязык диалекта обмена данными . Основной семантической единицей языка является выражение . В отличие от императивных языков программирования, произошедших от АЛГОЛА , диалект do не имеет ни ключевых слов, ни операторов.
Слова используются как регистронезависимые переменные . Как и во всех динамически типизированных языках , переменные не имеют связанного типа, тип связан со значениями. Результат, т.е. оценка слова, возвращается, когда слово встречается функцией do
. Для присваивания можно использовать словарную форму слова . Не имея операторов, присваивание вместе с функциями с побочными эффектами может использоваться для императивного программирования . [4]
Подблоки корневого блока оценивают сами себя. Это свойство используется для обработки блоков данных, для структурного программирования путем отправки блоков в качестве аргументов в функции управленияif
, такие как , either
, loop
и т. д., а также для диалектирования, когда блок передается определенной функции интерпретатора. [6]
Стоит отметить особую проблему: составные значения, присвоенные переменным, не копируются. Чтобы сделать копию, значение необходимо передать в copy
функцию. [4]
Функция do
обычно следует префиксному стилю оценки , при котором функция обрабатывает аргументы, следующие за ней. Однако существует также инфиксная оценка с использованием инфиксных операторов . Оценка инфикса имеет приоритет над оценкой префикса. Например,
абс -2 + 3
возвращает 1, поскольку добавление инфикса имеет приоритет над вычислением абсолютного значения. При вычислении инфиксных выражений порядок вычислений слева направо, ни один оператор не имеет приоритета над другим. Например,
2 + 3 * 4
возвращает 20, тогда как оценка, отдающая приоритет умножению, даст 14. Все операторы имеют версии префикса. Do
обычно оценивает аргументы перед передачей их функции. Итак, выражение ниже:
распечатать прочитать http://en.wikipedia.org/wiki/Rebol/Rebol
сначала читает страницу 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 обеспечивает независимый от платформы доступ к графике и звуку, а также поставляется с собственным набором оконных инструментов и расширяемым набором стилей ( виджеты графического интерфейса ). Расширенные выпуски, такие как Rebol/Command 2.7.8 или Rebol/SDK 2.7.8, требуют платной лицензии; они добавляют такие функции, как доступ к данным ODBC и возможность создавать автономные исполняемые файлы. [ нужна цитата ]
Вы, наверное, думали, что релиз исходного кода никогда не состоится?
Я прав?
Ну, теперь он есть на github по адресу github.com/rebol/rebol.