АЛГОЛ 68RS
Оригинальный автор(ы) | И.Ф. Карри, Джей Ди Моррисон |
---|---|
Разработчики) | Королевские сигналы и радарное учреждение |
Начальная версия | август 1977 года |
Стабильная версия | алгол68ток 1.14
/ 25 августа 2012 г |
Написано в | АЛГОЛ 68 |
Операционная система | СМС |
Платформа | Серия ICL 2900 , Мультики , VAX |
Доступно в | Английский |
Тип | Составитель , переводчик |
Лицензия | Бесплатное ПО , общественное достояние (части) |
Веб-сайт | Алгол68 |
АЛГОЛ 68RS — второй АЛГОЛА 68, компилятор написанный И. Ф. Карри и Дж. Д. Моррисоном в Королевском институте сигналов и радиолокации (RSRE). [1] В отличие от более раннего ALGOL 68-R , он был разработан как переносимый и реализовал язык пересмотренного отчета.
Версии ALGOL 68RS были написаны для ICL 2900 Series , Multics и VAX под управлением VMS . [2] [3]
Впоследствии части этого компилятора были выпущены в открытый доступ в качестве транслятора с АЛГОЛа 68 на C , как часть общедоступного выпуска языка описания аппаратного обеспечения ELLA , также выпущенного RSRE.
История [ править ]
Хотя компилятор ALGOL 68-R , написанный И. Ф. Карри, Дж. Д. Моррисоном и С. Г. Бондом , имел большой успех, у него были две основные проблемы: он был написан для почти устаревшего компьютера ICL 1900 и в нем реализован выход. актуальная версия языка, поскольку она была выпущена до того, как стал доступен пересмотренный отчет об Алголе 68.
RSRE требовался новый компилятор для различных внутренних проектов, поэтому команда Карри и Моррисона написала новый компилятор, предназначенный для межплатформенной переносимости программного обеспечения между машинами. Компилятор занимался анализом АЛГОЛА 68, создавая промежуточный язык высокого уровня, известный как язык , который затем транслятором компилируется в код машинный потоковый . Компилятору нужно было знать только размеры различных типов объектных машинных данных и доступную кодировку (набор) символов.
Компилятор был написан на ALGOL 68, первоначально загруженный с использованием компилятора ALGOL 68-R.
Команда из двух программистов из вычислительной службы Оксфордского университета написала генератор кода для серии ICL 2900. [4] Мартин Томас из Регионального компьютерного центра Юго-Западных университетов (SWURCC) организовал спонсирование этой системы компанией International Computers Limited (ICL) и ее продажу в качестве официального продукта ICL. [5]
Позже Объединенный компьютерный центр университетов Эйвона , крупный пользователь Multics , попросил команду SWURCC создать Multics-версию АЛГОЛА 68RS. версия для Digital Equipment Corporation (DEC) компьютера VAX Также была написана .
В конце концов команда SWURCC сформировала компанию Praxis , первоначально поддерживающую версию ALGOL 68RS для Multics.
RSRE также использовала компилятор ALGOL 68RS для внутренних проектов, включая машину Flex и язык проектирования аппаратного обеспечения ELLA. Когда было решено сделать ELLA бесплатным, компании Praxis было поручено написать АЛГОЛ 68 в C транслятор под названием ctrans на основе компилятора АЛГОЛ 68RS.
Ограничения в компилируемом языке [ править ]
Как и более ранний компилятор ALGOL 68-R, ALGOL 68RS был однопроходным компилятором , что требовало некоторых ограничений на компилируемый язык.
Декларация перед использованием [ править ]
Программа АЛГОЛ 68:
PROC четный = ( число INT ) BOOL : (число = 0 | ИСТИНА | нечетное ( ABS (число - 1))); PROC нечетное = ( число INT ) BOOL : (число = 0 | ЛОЖЬ | четное ( ABS (число - 1)));
придется переписать так:
PROC ( INT ) BOOL нечетный; PROC четный = ( число INT ) BOOL : (число = 0 | ИСТИНА | нечетное ( ABS (число - 1))); нечетное := ( число INT ) BOOL : (число = 0 | ЛОЖЬ | четное ( ABS (число - 1)));
Чтобы разрешить рекурсивное объявление режимов (типов), использовалось специальное объявление режима -заглушки , чтобы сообщить компилятору, что предстоящий символ является режимом, а не оператором:
РЕЖИМ Б , A = СТРУКТУРА ( REF B b), B = [1:10] ССЫЛКА A ;
Параллельная обработка [ править ]
Как и в АЛГОЛе 68-R, операторы PAR и режим SEMA со связанными с ним UP , DOWN и LEVEL были опущены.
Расширения Алгола 68 [ править ]
Выпрямление [ править ]
Одна из основных ошибок АЛГОЛа 68 заключается в том, что невозможно написать стандартные процедуры передачи ( ввода/вывода ) в чистом АЛГОЛе 68. Процедура печати принимает, например, массив элементов для печати в любом режиме и с помощью процесса с именем выпрямление преобразует их в простые значения, которые можно распечатать. Например:
STRUCT ( INT a, REAL b) c := ...; печать (с); { волшебным образом преобразуется в print ((a OF c, b OF c)); }
Авторы АЛГОЛА 68RS решили сделать выпрямление частью языка. Режим STRAIGHT напоминает массив , но имеет особую особенность: элементы можно перевести в режим STRAIGHT , если их компоненты можно привести к этому режиму. Например:
STRUCT ( INT a, REAL b) c; ПРЯМОЙ СОЮЗ ( INT , REAL ) z = c;
Оба поля C могут быть приведены к UNION ( INT , REAL ), поэтому к полю «a OF c» можно получить доступ как к z[1], а к «b OF c» — это z[2].
Стандартную процедуру печати теперь можно объявить так:
MODE PRINTMODE = UNION ( INT , REAL ,... STRAIGHT PRINTMODE ); PROC print = ([] PRINTMODE аргументы ) VOID : ...;
Эффективная обработка массивов [ править ]
Режимы работы с массивами в Алголе 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 .
БАЙТЫ РЕЖИМА = СТРУКТУРА 4 СИМВОЛА ; OP ELEM = ( INT индекс , BYTES значение) CHAR : значение[индекс]; ... БАЙТЫ b = «abcd»; ... печать (2 ЭЛЕМ б);
Компилятор ALGOL 68RS скомпилирует любую строковую константу в соответствующий STRUCT n CHAR .
В контекстах, где требовался вектор или массив, i-структуру можно было расширить до соответствующего типа вектора или массива.
Векторы [ править ]
ВЕКТОР . — это упрощенный массив, имеющий только одно измерение и нижнюю границу, фиксированную на уровне 1
ВЕКТОР [4] INT a; { аналогично [1:4] INT a; }
В любом контексте, где требовался массив, вектор можно было преобразовать в массив.
Заявление FORALL [ править ]
Оператор FORALL позволяет эффективно перемещаться по элементам массива.
[12] INT a := ...; ФОРАЛЛ ха ИН а ДЕЛАТЬ ха := ха * 2 ОД
xa будет ссылкой на каждый элемент a по очереди. FORALL может проходить через несколько массивов параллельно и управляться предложением WHILE :
[12] INT а, б; ... ФОРАЛЛ ха ИН а, хб В б ПОКА ха > xb ДЕЛАТЬ е(ха, хб) ОД
Раздельная компиляция [ править ]
АЛГОЛ 68RS предоставил механизм для создания библиотек , аналогичный отдельным средствам компиляции АЛГОЛ 68-R , и механизм для сборки программ нисходящим способом, аналогичный механизмам АЛГОЛ 68C .
Модули деклараций [ править ]
Библиотеки в ALGOL 68RS написаны с использованием модулей объявлений, которые состоят из последовательности объявлений MODE , переменных, операторов и процедур, за которыми следует список сохранения , который определяет, какие объявления видны другим сегментам.
Затем пользователь библиотеки добавляет USE- заголовок, который указывает компилятору сделать символы одной или нескольких библиотек объявлений доступными для программы.
Например, графическая библиотека может быть записана как:
DECS графическая библиотека ИСПОЛЬЗУЙТЕ какую-нибудь другую библиотеку = ГРАФИКА РЕЖИМА СТРУКТУРА ( ...); ИДЕНТ ГРАФ РЕЖИМА = . ГРАФИКА ; Новый график PROC = ( ... ) ГРАФИК : ...; График рисования PROC = ( GRAPH g) VOID : ...; ... СОХРАНИТЬ ГРАФИК , новый график, нарисовать график ЗАКАНЧИВАТЬ
А пользовательская программа для использования этой библиотеки будет выглядеть так:
ПРОГРАММА myprog ИСПОЛЬЗОВАТЬ графическую библиотеку НАЧАТЬ ГРАФИК g = новый график (...); ... нарисовать график (г); ... КОНЕЧНАЯ ОТДЕЛКА
Вложенные модули [ править ]
Для поддержки нисходящего стиля программирования в ALGOL 68RS предусмотрены возможности HERE и CONTEXT .
Программа может быть написана с частями, которые необходимо заполнить позже, помеченными тегом HERE , за которым следует список объявлений, которые будут доступны.
ПРОГРАММНЫЙ (pass1, pass2) компилятор BEGIN STRING источник := ...; ДЕРЕВО парсетри; ... ЗДЕСЬ pass1 (источник, дерево синтаксических анализаторов); ... ИНСТРУКЦИЯ инст; ЗДЕСЬ pass2 (parsetree, insts); ... КОНЕЧНАЯ ОТДЕЛКА
Код, который будет выполняться в контексте тегов HERE , будет записан так:
ПРОГРАММА pass1 реализация КОНТЕКСТ pass1 IN- компилятор НАЧИНАТЬ ... {код, использующий «источник» и «дерево синтаксического анализа» } КОНЕЧНАЯ ОТДЕЛКА
HERE аналогичен ALGOL 68C ENVIRON , а CONTEXT эквивалентен ALGOL 68C USING .
Код и доступ инопланетян [ править ]
АЛГОЛ 68RS был предназначен для использования в системном программировании низкого уровня . Чтобы сделать это возможным, были включены средства доступа к машинному коду и объектам, не относящимся к ALGOL 68RS.
Код был вставлен с помощью конструкции CODE :
SOMEMODE CODE ( item1 , item2 , ...) «... код ...»
Где элементы s — это значения ALGOL 68RS, которые должны быть доступны для вставки кода, а SOMEMODE — возвращаемый режим. Режим можно опустить, если код не возвращает значения.
Доступ к объектам, отличным от ALGOL68, был доступен с помощью вставки ALIEN :
SOMEMODE name = ALIEN " внешнее-имя "
Любой простой объект АЛГОЛа 68RS можно преобразовать в ВЕКТОР символов с помощью оператора SPELL :
STRUCT ( INT a, REAL b) c = ...; print (("внутренний повтор = ", SPELL c, новая строка));
Простой объект — это объект , который не содержит массивов или векторов .
Наличие [ править ]
Транслятор АЛГОЛ 68 в C, написанный Praxis для системы ELLA, содержит большую часть компилятора АЛГОЛ 68RS. Заметным исключением является код для обработки FORMAT .
По состоянию на сентябрь 2020 г. [update]Алгол 68RS доступен на SourceForge . [6]
Ссылки [ править ]
- ^ Бонд, Южная Каролина ; Вудворд, премьер-министр (август 1977 г.). «Введение в портативный компилятор ALGOL 68 RS» . Техническое примечание (802). Архивировано из оригинала 14 декабря 2012 года.
- ^ Вудворд, Премьер-министр ; Бонд, СГ (1983). Руководство по Алголу 68 для пользователей систем RS . Эдвард Арнольд (Издательство) Ltd. ISBN 978-0-7131-3490-2 .
- ^ Линдси, Швейцария (август 1998 г.). «Обзор жизнеспособных реализаций Алгола 68» . Бюллетень Алгола (52): 5–8. ISSN 0084-6198 .
- ^ «История сайта Multitics: Avon» .
- ^ Линдси, Швейцария (декабрь 1980 г.). «Реализации ALGOL 68: компилятор ICL 2900» . Бюллетень Алгола (46): 7–8. ISSN 0084-6198 .
- ^ ван дер Веер, Марсель; НевиллДНЗ. «Реализации ALGOL 68 с открытым исходным кодом» . СоурсФордж . Проверено 18 сентября 2020 г.