Jump to content

АЛГОЛ 68RS

АЛГОЛ 68RS
Оригинальный автор(ы) И.Ф. Карри, Джей Ди Моррисон
Разработчик(и) Королевские сигналы и радарное учреждение
Первоначальный выпуск август 1977 года ; 46 лет назад ( 1977-08 )
Стабильная версия
алгол68toc 1.14 / 25 августа 2012 г .; 11 лет назад ( 25 августа 2012 )
Написано в АЛГОЛ 68
Операционная система СМС
Платформа Серия ICL 2900 , Мультики , VAX
Доступно в Английский
Тип Составитель , переводчик
Лицензия Бесплатное ПО , общественное достояние (части)
Веб-сайт Алгол68 .sourceforge .сеть

АЛГОЛ 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 even = (INT number) BOOL: ( number = 0 | TRUE | odd (ABS (number - 1)));
PROC odd = (INT number) BOOL: ( number = 0 | FALSE | even (ABS (number - 1)));

придется переписать так:

PROC (INT) BOOL odd;
PROC even = (INT number) BOOL : ( number = 0 | TRUE | odd (ABS (number - 1)));
odd := (INT number) BOOL : ( number = 0 | FALSE | even (ABS (number - 1)));

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

MODE B,
     A = STRUCT (REF B b),
     B = [1:10] REF A;

Параллельная обработка [ править ]

Как и в АЛГОЛе 68-R, операторы PAR и режим SEMA со связанными с ним UP , DOWN и LEVEL были опущены.

Расширения Алгола 68 [ править ]

Выпрямление [ править ]

Одной из основных ошибок АЛГОЛа 68 является то, что невозможно написать стандартные процедуры передачи ( ввода/вывода ) в чистом АЛГОЛе 68. Процедура печати принимает, например, массив элементов для печати в любом режиме и с помощью процесса с именем выпрямление преобразует их в простые значения, которые можно распечатать. Например:

STRUCT (INT a, REAL b) c := ...;

print(c);   { magically transformed to print ((a OF c, b OF c)); }

Авторы АЛГОЛА 68RS решили сделать выпрямление частью языка. Режим STRAIGHT напоминает массив , но имеет особенность: элементы можно перевести в режим STRAIGHT , если их компоненты можно привести к этому режиму. Например:

STRUCT (INT a, REAL b) c;

STRAIGHT UNION (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 arguments ) VOID: ...;

Эффективная обработка массивов [ править ]

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

Например:

[5:23, -7:7] INT a;               { a two dimensional array }
REF [,] INT b = a [ 6:21, 0:3 ]   { a slice of a }
REF [] INT c = a [5]              { just one row of a }

Хотя компилятор приложил все усилия для создания оптимального кода для всех случаев, считалось, что добавление некоторых более простых средств в некоторых случаях позволит улучшить код. С этой целью в АЛГОЛ 68RS были включены индексируемые структуры (i-структуры), векторы и оператор FORALL .

Индексируемые структуры [ править ]

АЛГОЛ 68 уже включал структуры фиксированной длины для эффективной обработки символов и битовых данных на словах машинах, основанных на , режимы BYTES и BITS . Переменная BYTES содержала одно машинное слово символов, переменная BITS содержала биты одного машинного слова.

АЛГОЛ 68RS обобщил эти идеи. Переменная STRUCT содержит ровно 4 4 CHAR символа. Размер был частью типажа. В большинстве систем ALGOL 68RS режим BYTES был эквивалентен STRUCT 4 CHAR .

MODE BYTES = STRUCT 4 CHAR;
OP ELEM = (INT index, BYTES val) CHAR: val[index];
...
BYTES b = "abcd";
...
print (2 ELEM b);

Компилятор ALGOL 68RS скомпилирует любую строковую константу в соответствующий STRUCT n CHAR .

В контекстах, где вектор требовался или массив, i-структуру можно было расширить до соответствующего типа вектора или массива.

Векторы [ править ]

ВЕКТОР это упрощенный массив, имеющий только одно измерение и нижнюю границу, фиксированную на уровне 1.

VECTOR [4] INT a;     { similar to [1:4] INT a; }

В любом контексте, где требовался массив, вектор можно было преобразовать в массив.

Заявление FORALL [ править ]

Оператор FORALL позволяет эффективно перемещаться по элементам массива.

[12] INT a := ...;

FORALL xa IN a
DO xa := xa * 2
OD

xa будет ссылкой на каждый элемент a по очереди. FORALL может проходить через несколько массивов параллельно и управляться предложением WHILE :

[12] INT a, b;
...
FORALL xa IN a,
       xb IN b
WHILE xa > xb
DO
    f(xa, xb)
OD

Раздельная компиляция [ править ]

АЛГОЛ 68RS предоставил механизм для создания библиотек , аналогичный отдельным средствам компиляции АЛГОЛ 68-R , и механизм для сборки программ нисходящим способом, аналогичный механизмам АЛГОЛ 68C .

Модули деклараций [ править ]

Библиотеки в ALGOL 68RS написаны с использованием модулей объявлений , которые состоят из последовательности объявлений MODE , переменных, операторов и процедур, за которыми следует список сохранения , который определяет, какие объявления видны другим сегментам.

Затем пользователь библиотеки добавляет USE- заголовок, который указывает компилятору сделать символы одной или нескольких библиотек объявлений доступными для программы.

Например, графическая библиотека может быть записана как:

DECS graphlib
USE some other library

MODE GRAPHDATA = STRUCT ( ... );
MODE GRAPH = REF GRAPHDATA;
PROC new graph = ( ... ) GRAPH : ...;
PROC draw graph = (GRAPH g) VOID : ...;
   ...

KEEP GRAPH, new graph, draw graph
FINISH

А пользовательская программа для использования этой библиотеки будет выглядеть так:

PROGRAM myprog
USE graphlib
BEGIN
    GRAPH g = new graph (...);
    ...
    draw graph (g);
    ...
END
FINISH

Вложенные модули [ править ]

Для поддержки нисходящего стиля программирования в ALGOL 68RS предусмотрены возможности HERE и CONTEXT .

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

PROGRAM (pass1, pass2) compiler
BEGIN
   STRING source := ...;
   TREE parsetree;
...
   HERE pass1 (source, parsetree);
...
   INSTRUCTIONS insts;
   HERE pass2 (parsetree, insts);
...
END
FINISH

Код, который будет выполняться в контексте тегов HERE, будет записан так:

PROGRAM pass1 implementation
CONTEXT pass1 IN compiler
BEGIN
  ...   { code using "source" and "parsetree" }
END
FINISH

HERE аналогичен ALGOL 68C ENVIRON , а CONTEXT эквивалентен ALGOL 68C USING .

Код и доступ инопланетян [ править ]

АЛГОЛ 68RS был предназначен для использования в системном программировании низкого уровня . Чтобы сделать это возможным, были включены средства доступа к машинному коду и объектам, не относящимся к ALGOL 68RS.

Код был вставлен с помощью конструкции CODE :

SOMEMODE CODE (item1, item2, ...) "...code..."

Где элементы — это значения ALGOL 68RS, которые должны быть доступны для вставки кода, а SOMEMODE — возвращаемый режим. Режим можно опустить, если код не возвращает значения.

Доступ к объектам, отличным от ALGOL68, был доступен с помощью вставки ALIEN :

SOMEMODE name = ALIEN "external-name"

Любой простой объект АЛГОЛА 68RS можно преобразовать в ВЕКТОР символов с помощью оператора SPELL :

STRUCT (INT a, REAL b) c = ...;

print (("internal repr = ", SPELL c, newline));

объект Простой — это объект, который не содержит массивов или векторов .

Наличие [ править ]

Транслятор АЛГОЛ 68 в C, написанный Praxis для системы ELLA, содержит большую часть компилятора АЛГОЛ 68RS. Заметным исключением является код для обработки FORMAT .

По состоянию на сентябрь 2020 г. Алгол 68RS доступен на SourceForge . [6]

Ссылки [ править ]

  1. ^ Бонд, Южная Каролина ; Вудворд, премьер-министр (август 1977 г.). «Введение в портативный компилятор ALGOL 68 RS» . Техническое примечание (802). Архивировано из оригинала 14 декабря 2012 года.
  2. ^ Вудворд, Премьер-министр ; Бонд, СГ (1983). Руководство по Алголу 68 для пользователей систем RS . Эдвард Арнольд (Издательство) Ltd. ISBN  978-0-7131-3490-2 .
  3. ^ Линдси, Швейцария (август 1998 г.). «Обзор жизнеспособных реализаций Алгола 68» . Бюллетень Алгола (52): 5–8. ISSN   0084-6198 .
  4. ^ «История сайта Multitics: Avon» .
  5. ^ Линдси, Швейцария (декабрь 1980 г.). «Реализации ALGOL 68: компилятор ICL 2900» . Бюллетень Алгола (46): 7–8. ISSN   0084-6198 .
  6. ^ ван дер Веер, Марсель; НевиллДНЗ. «Реализации ALGOL 68 с открытым исходным кодом» . СоурсФордж . Проверено 18 сентября 2020 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 7427a730fb3813717467bed4492276f5__1701812100
URL1:https://arc.ask3.ru/arc/aa/74/f5/7427a730fb3813717467bed4492276f5.html
Заголовок, (Title) документа по адресу, URL1:
ALGOL 68RS - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)