ВВЕДЕНИЕ

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

Рефал (алгоритмический язык рекурсивных функций) был создан В.Ф.Турчиным в качестве языка, предназначенного для описания семантики других алгоритмических языков [Тур 66], [Тур 71]. Впоследствии, после появления достаточно эффективных реализаций [КРТ 72], [Бзр 77], [Ром 87а], Рефал нашел применения в таких областях как компьютерная алгебра, конструирование компиляторов и интерпретаторов, искусственный интеллект и др.

Основным типом данных в Рефале являются объектные выражения, которые представляют собой произвольные деревья, изображаемые в линейной записи как последовательности символов и скобок, правильно построенные относительно скобок. Символы представляют собой элементарные объекты (такие как литеры, слова, числа и ссылки на объекты).

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

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

Рефал Плюс возник в результате обобщения опыта, накопленного при разработке, реализации и использовании Базисного Рефала [Бзр 77], Рефала-2 [КлР 86], [КлР 87], [Ром 87а], Рефала-4 [Ром 87б], [Ром 87в], Рефала-5 [Тур 89], и языков FLAC [Кис 87] и RL [Ром 87г], [Ром 88а], [Ром 88б].

По сравнению с другими диалектами Рефала, Рефал Плюс обладает следующими особенностями.

*** Более развитая система модульности.

Каждый модуль разделен на две части: интерфейс модуля и реализацию модуля. Интерфейс модуля содержит ту часть модуля, которая "видна" из других модулей, а реализация модуля содержит те части, которые скрыты от других модулей.

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

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

*** Статические объявления динамических объектов.

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

*** Объявления функций

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

Предыдущие диалекты Рефала позволяли определять только безоткатные функции.

Другая особенность Рефала Плюс - возможность определять функции, получающие несколько аргументов и выдающие несколько результатов. Количество и типы аргументов функции мы будем называть ее арностью (arity), а количество и типы результатов - ее коарностью (co-arity).

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

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

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

*** Перехват неуспехов и аварий.

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

Рефал Плюс содержит конструкции, которые позволяют перехватывать и анализировать неуспехи и аварии.

*** Ввод-вывод объектных выражений.

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

*** Работа с ящиками, векторами и таблицами.

Рефал Плюс дает возможность работать с динамически создаваемыми объектами: ящиками, векторами, строками и таблицами. Средства работы с ящиками те же, что и в Рефале-2, в то время как векторы, строки и таблицы являются особенностью Рефала Плюс.

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

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

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

*** "Векторное" представление объектных выражений.

Реализация Рефала Плюс основана на новом "векторном" представлении объектных выражений [АбР 88], позволяющем свести копирование выражения к копированию пары указателей на его концы. Дешевизна операции копирования позволяет применять функциональный стиль программировании на Рефале, в то время как при использовании предыдущих реализаций приходилось тщательно избегать копирования, что вынуждало, по существу, придерживаться императивного стиля.

Освобождение памяти, занятой уже ненужными выражениями, производится с помощью сборки мусора.