ALGOL 68RS - второй компилятор ALGOL 68, написанный IF Currie и JD Morrison из Royal Signals and Radar Establishment (RSRE). [1] В отличие от более раннего АЛГОЛА 68-R , он был разработан для переносимости и реализовывал язык Пересмотренного отчета.
Автор (ы) оригинала | И. Ф. Карри, Дж. Д. Моррисон |
---|---|
Разработчики) | Королевские сигналы и радиолокационная станция |
Первый выпуск | Август 1977 г . |
Стабильный выпуск | algol68toc 1.14 / 25 августа 2012 г . |
Написано в | АЛГОЛ 68 |
Операционная система | VMS |
Платформа | Серия ICL 2900 , Multics , VAX |
Доступно в | английский |
Тип | Составитель , переводчик |
Лицензия | Бесплатное ПО , общественное достояние (части) |
Веб-сайт | algol68 |
Версии ALGOL 68RS были написаны для серий ICL 2900 , Multics и VAX с VMS . [2] [3]
Впоследствии части этого компилятора были выпущены в общественное достояние в качестве транслятора с Алгола 68 на C , как часть публичного выпуска языка описания оборудования ELLA , также от RSRE.
История
Хотя компилятор ALGOL 68-R , написанный IF Currie, JD Morrison и SG Bond , имел большой успех, он страдал от двух основных проблем: он был написан для почти устаревшего компьютера ICL 1900 и в нем реализован выход из строя. актуальная версия языка, выпущенная до появления Пересмотренного отчета по Алголу 68.
RSRE нуждался в более новом компиляторе для различных внутренних проектов, поэтому команда Карри и Моррисон написала новый компилятор, предназначенный для кроссплатформенной переносимости программного обеспечения между машинами. Компилятор имел дело с разбора АЛГОЛа 68, производя высокого уровня промежуточный язык , известный как поток языка , который затем компилируется в машинный код с помощью переводчика . Компилятору нужно было знать только размеры различных типов машинных данных объекта и доступную кодировку (набор) символов .
Компилятор был написан на АЛГОЛ 68, изначально загруженный с использованием компилятора АЛГОЛА 68-R.
Команда из двух программистов из Oxford University Computing Services написала генератор кода для серии ICL 2900. [4] Мартин Томас из Регионального компьютерного центра юго-западных университетов (SWURCC) организовал, чтобы эта система спонсировалась International Computers Limited (ICL) и продавалась как официальный продукт ICL. [5]
Позже Объединенный компьютерный центр университетов Avon , крупный пользователь Multics, обратился к команде SWURCC с просьбой создать Multics-версию ALGOL 68RS. Также была написана версия для компьютера VAX компании Digital Equipment Corporation (DEC) .
В конце концов команда SWURCC сформировала компанию Praxis , изначально поддерживающую версию Multics для ALGOL 68RS.
RSRE также использовала компилятор ALGOL 68RS для внутренних проектов, включая машину Flex и язык проектирования оборудования ELLA. Когда было решено сделать ELLA свободно доступным, Praxis было поручено написать транслятор ALGOL 68 в C с именем ctrans , основанный на компиляторе ALGOL 68RS.
Ограничения на скомпилированном языке
Как и предыдущий компилятор ALGOL 68-R, ALGOL 68RS был однопроходным компилятором , что требовало некоторых ограничений на компилируемый язык.
Декларация перед использованием
Программа АЛГОЛ 68:
proc even = ( int number) bool : (number = 0 | true | odd ( abs (число - 1)));proc odd = ( int number) bool : (number = 0 | false | even ( abs (number - 1))); (число = 0 | ложь | четное ( абс (число - 1)));
пришлось бы переписать как:
proc ( int ) bool odd;proc even = ( int number) bool : (number = 0 | true | odd ( abs (число - 1)));odd: = ( int number) bool : (number = 0 | false | even ( abs (number - 1))); нечетное число: = ( число - 1));
Чтобы разрешить рекурсивное объявление режимов (типов), было использовано специальное объявление режима заглушки, чтобы сообщить компилятору, что предстоящий символ был режимом, а не оператором:
режим b , a = struct ( ref b b), b = [1:10] ref a ;
Параллельная обработка
Как Алгол 68-R, операторы par
пункт и sema
режим со связанным с ним up
, down
и level
, были опущены.
Расширения Алгола 68
Выпрямление
Одним из основных недостатков АЛГОЛА 68 является то, что невозможно написать стандартные процедуры передачи ( ввода / вывода ) на чистом АЛГОЛе 68. Процедура печати принимает, например, массив элементов для печати в любом режиме и с помощью процесса с именем выпрямляя , преобразует их в простые значения, которые можно распечатать. Например:
struct ( int a, вещественный b) c: = ...;печать (с); {волшебным образом преобразовано в печать ((a из c, b из c)); }
Авторы ALGOL 68RS решили сделать выпрямление доступным как часть языка. straight
Режим напоминает массив , но имеет специальную функцию , что элементы может быть принуждения к straight
режиму , если их компоненты могут быть принуждены к режиму. Например:
struct ( int a, вещественный b) c;прямое объединение ( int , real ) z = c;
Оба поля c
могут быть приведены к union
( int
, real
), поэтому к полю «a of c» можно получить доступ как z [1], а «b of c» - это z [2].
Стандартная процедура печати теперь может быть объявлена как:
режим printmode = union ( int , real , ... прямой режим печати );proc print = ([] аргументы режима печати ) void : ...;
Эффективная обработка массивов
Режимы массива ALGOL 68 очень эффективны, включая множественные измерения, определенные верхние и нижние границы, обрезку (создание нового массива путем взятия непрерывного подмножества массива), нарезку (создание нового массива путем удаления одного измерения из массива), и гребля (создание нового массива путем добавления измерения к существующему массиву.
Например:
[5:23, -7: 7] int a; {двумерный массив} ref [,] int b = a [6:21, 0: 3] {кусок a} ref [] int c = a [5] {только одна строка a}
Хотя компилятор приложил все усилия для генерации оптимального кода для всех случаев, было сочтено, что добавление некоторых более простых средств позволит в некоторых случаях улучшить код. С этой целью в Алгол 68RS включены индексируемые структуры (i-структуры), векторы и forall
оператор.
Индексируемые структуры
Алгол 68 уже включены фиксированной длины структуры для эффективной обработки символов и битовых данных на слово -На машинах bytes
и bits
режимах. bytes
Переменная провела одна машина слово персонажей, bits
переменная держали биты одного машинного слова.
Алгол 68RS обобщил эти идеи. struct
4 char
переменных провел ровно 4 символов. Размер был частью шрифта. В большинстве систем ALGOL 68RS режим bytes
был эквивалентен struct
4 char
.
байты режима = struct 4 char ;op elem = ( int index, bytes val) char : val [index];...байты b = "abcd";...печать (2 элемента б);
Компилятор Алгол 68RS будет компилировать любую струнную константу к соответствующему struct
п char
.
В контекстах, где vector
требовался массив или, i-структура могла быть расширена до соответствующего vector
типа или массива.
Векторы
A vector
- это упрощенный массив, имеющий только одно измерение и нижнюю границу, установленную на 1.
вектор [4] int a; {аналогично [1: 4] int a; }
В любом контексте, где требовался массив, вектор можно было преобразовать в массив.
Заявление FORALL
forall
Заявление позволяет эффективно пошаговые элементам массива.
[12] int a: = ...;FORALL ха в виде сделай ха: = ха * 2 О.Д.
xa будет ссылкой на каждый элемент a по очереди. forall может проходить через несколько массивов параллельно и управляться предложением while :
[12] int a, b;...forall xa в a, xb в b, а xa> xb делать f (xa, xb)od
Раздельная компиляция
Алгол 68RS предоставляет механизм для построения библиотек, аналогичный отдельным средствам компиляции Алгола 68-R, и механизм для построения программ нисходящим образом, подобный таковым в Алголе 68C .
Модули декларации
Библиотеки в ALGOL 68RS написаны с использованием модулей объявлений, которые состоят из последовательности объявлений mode
переменных, операторов и процедур, за которыми следует список сохранения, который определяет, какие объявления видны другим сегментам.
Затем пользователь библиотеки добавляет use
заголовок, который сообщает компилятору сделать символы одной или нескольких библиотек объявлений доступными для программы.
Например, графическая библиотека может быть записана как:
decs graphlib использует другую библиотекурежим graphdata = struct (...);mode graph = ref graphdata ;proc new graph = (...) graph : ...;proc draw graph = ( graph g) void : ...; ...сохранить график , новый график, нарисовать график закончить
И программа пользователя, использующая эту библиотеку, будет выглядеть так:
программа myprog использует graphlib begin graph g = new graph (...); ... начертить график (ж); ...конец финиша
Вложенные модули
Для поддержки нисходящего стиля программирования в ALGOL 68RS предусмотрены возможности here
и context
.
Программа может быть написана с частями, которые необходимо заполнить, позже помеченными here
тегом, за которым следует список объявлений, которые должны быть доступны.
программа (pass1, pass2) компилятор begin string source: = ...; дерево parsetree;... здесь pass1 (источник, дерево разбора);... инструкции insts; здесь pass2 (parsetree, insts);...конец финиша
Код, который будет выполняться в контексте тегов here , будет записан как:
программа pass1 реализация контекста pass1 в начале компилятора ... {код, использующий "исходный код" и "дерево синтаксического анализа"}конец финиша
here
аналогичен Алголу 68C environ
и context
эквивалентен Алголу 68C using
.
Код и доступ инопланетян
Алгол 68RS был предназначен для использования в низкоуровневом системном программировании . Для этого были включены средства доступа к машинному коду и объектам, не относящимся к Алголу 68RS.
Код был вставлен с code
конструкцией:
somemode code ( item1 , item2 , ...) "... код ..."
Где элементы являются значениями АЛГОЛА 68RS, которые должны быть доступны для вставки кода, и somemode
является возвращаемым режимом. Режим можно не указывать, если код не возвращает значения.
Доступ к не-ALGOL68 объектам был доступен при alien
вставке:
somemode name = alien " external-name "
Любой простой объект Алгол 68RS может быть брошен в vector
символах с помощью spell
оператора:
struct ( int a, вещественный b) c = ...;print (("внутренний repr =", заклинание c, новая строка));
Простой объект является тот , который не содержит массивы или vector
с.
Доступность
Транслятор ALGOL 68 в C, написанный Praxis для системы ELLA, содержит большую часть компилятора ALGOL 68RS. Заметным исключением является код для обработки format
s.
По состоянию на сентябрь 2020 г.[Обновить], Алгол 68RS доступен на SourceForge . [6]
Рекомендации
- ^ Bond, SG ; Вудворд, PM (август 1977 г.). "Введение в переносимый компилятор Алгола 68 RS" . Техническая записка (802). Архивировано из оригинального 14 декабря 2012 года.
- ^ Вудворд, PM ; Бонд, SG (1983). Руководство по АЛГОЛу 68 для пользователей RS Systems . Эдвард Арнольд (Издатели) Ltd. ISBN 978-0-7131-3490-2.
- ^ Линдси, Швейцария (август 1998 г.). «Обзор жизнеспособных реализаций Алгола 68» . Бюллетень АЛГОЛА (52): 5–8. ISSN 0084-6198 .
- ^ "История сайта Multics: Avon" .
- ^ Линдси, СН (декабрь 1980 г.). «Реализации АЛГОЛА 68: компилятор ICL 2900» . Бюллетень АЛГОЛА (46): 7–8. ISSN 0084-6198 .
- ^ ван дер Веер, Марсель; NevilleDNZ. «Реализации Алгола 68 с открытым исходным кодом» . SourceForge . Проверено 18 сентября 2020 .