АЛГОЛ 68-Р
Оригинальный автор(ы) | И.Ф. Карри, Сьюзен Дж. Бонд , Джей Ди Моррисон |
---|---|
Разработчик(и) | Королевское радарное учреждение |
Первоначальный выпуск | 20 июля 1970 г |
Написано в | АЛГОЛ 60 (оригинал) АЛГОЛ 68-Р (последний) |
Операционная система | Джордж 3 |
Платформа | ICL 1907F |
Размер | 34 тыс. слов |
Доступно в | Английский |
Тип | Составитель , переводчик |
Лицензия | Бесплатное ПО |
Веб-сайт | SW |
АЛГОЛ 68-R был первой реализацией алгоритмического языка АЛГОЛ 68 .
В декабре 1968 года был опубликован отчет об алгоритмическом языке АЛГОЛ 68. (IFIP) организовала рабочую конференцию 20–24 июля 1970 г. Международная федерация обработки информации для обсуждения проблем внедрения языка. [1] небольшая группа из Королевского радиолокационного учреждения (RRE) присутствовала, чтобы представить свой компилятор , написанный И. Ф. Карри, Сьюзен Г. Бонд , [2] и Джей Ди Моррисон. Учитывая оценки, требующие до 100 человеко-лет для реализации языка с использованием многопроходных компиляторов с числом до семи проходов, они описали, как они уже реализовали однопроходный компилятор , который находился в производстве для инженерных и научных целей.
Компилятор
[ редактировать ]Компилятор ALGOL 68-R изначально был написан на локальном диалекте ALGOL 60 с расширениями для манипулирования адресами и обработки списков. Парсер был написан с использованием Syntax Improving Device (SID) генератора синтаксического анализатора JM Foster .
Около 20 тысяч из них — это программа, которая, по нашему мнению, слишком велика.
- Карри [3]
Первая версия компилятора занимала 34 тыс. слов. Позже он был переписан в АЛГОЛе 68-R. [4] для компиляции большинства программ требуется около 36 тыс. слов. [5]
АЛГОЛ 68-R был реализован под операционной системой George 3 на ICL 1907F . Компилятор бесплатно распространялся компанией International Computers Limited (ICL) от имени Королевского радарного учреждения (RRE).
Ограничения в компилируемом языке
[ редактировать ]Это вопрос морали. У нас есть Библия, а вы грешите!
– Майю [6]
Чтобы обеспечить возможность однопроходной компиляции, в ALGOL 68-R реализовано подмножество языка, определенное в исходном отчете: [7]
- Идентификаторы, режимы и операторы необходимо указать перед использованием.
- Нет автоматической обработки
- Явный VOID режим
- Нет официальных декларантов
- Никакой параллельной обработки
- GOTO нельзя опустить
- Объединение возможно только в сильных позициях
Многие из этих ограничений были приняты в пересмотренном отчете об Алголе 68.
Спецификация перед использованием
[ редактировать ]Чтобы обеспечить возможность компиляции за один проход, АЛГОЛ 68-R настаивал на том, чтобы все идентификаторы были указаны (объявлены) перед использованием.
Стандартная программа:
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;MODE A = STRUCT (REF B b);MODE B = [1:10] REF A;
Никаких процедур
[ редактировать ]В стандартном языке процедур приведение могло бы в строгом контексте преобразовать выражение некоторого типа в процедуру, возвращающую этот тип. Это можно использовать для реализации вызова по имени .
Другим случаем использования процедур было объявление процедур в объявлении:
PROC x plus 1 = INT : x + 1;
правая часть представляла собой преобразование x + 1 в целое число, которое затем было преобразовано в процедуру, возвращающую целое число .
Команда разработчиков ALGOL 68-R сочла это слишком сложным и внесла в язык два изменения. Приведение процедур было удалено, а выражение form mode:expression было переопределено как обозначение процедуры , причем приведение типов обозначалось явным символом VAL :
REAL : x CO a cast to REAL in ALGOL 68 COREAL VAL x CO a cast to REAL in ALGOL 68-R CO
Код, в котором допустимо использовать вызов по имени (например, устройство Дженсена ), может просто передать обозначение процедуры:
PROC sum = (INT lo, hi, PROC (INT) REAL term) REAL : BEGIN REAL temp := 0; FOR i FROM lo TO hi DO temp +:= term (i); temp END; print (sum (1, 100, (INT i) REAL: 1/i))
В версии языка, определенной в пересмотренном отчете, эти изменения были приняты, хотя форма приведения была немного изменена на режим (выражение) .
REAL (x) CO a cast to REAL in revised ALGOL 68 CO
Явный недействительный режим
[ редактировать ]В исходном языке режим VOID был представлен пустым режимом:
: x := 3.14; CO cast (x := 3.14) to void COPROC endit = GOTO end; CO a procedure returning void CO
Команда ALGOL 68-R решила использовать явный символ VOID , чтобы упростить синтаксический анализ (и повысить читаемость):
VOID VAL x := 3.14; CO cast (x := 3.14) to void COPROC endit = VOID : GOTO end; CO a procedure returning void CO
Эта модификация языка была принята в пересмотренном отчете ALGOL 68.
Нет официальных декларантов
[ редактировать ]Формальные объявления — это режимы в левой части объявления идентичности или режимы, указанные в объявлении процедуры. В исходном языке они могли включать границы массива и указывать, был ли соответствующий фактический оператор объявления фиксированным: FLEX или ИЛИ ЛИБО :
[ 15 ] INT a; CO an actual declarer, bounds 1:15 COREF [ 3 : ] INT b = a; CO This is an error COPROC x = (REF [ 1 : EITHER] INT a) : ...
Я думаю, что для меня было разумным опустить границы в формальных объявлениях, но я думаю, что было ужасным преступлением опустить ИЛИ или FLEX .
– Линдси [8]
Команда ALGOL 68-R переопределила формальные объявления, чтобы они были такими же, как виртуальные объявления , которые не включают в себя связанную информацию. Они обнаружили, что это уменьшает неоднозначность при синтаксическом анализе языка, и посчитали, что эта функция не будет использоваться в рабочих программах.
Если процедуре необходимы определенные границы для ее аргументов, она может проверить их самостоятельно с помощью операторов UPB (верхняя граница) и LWB (нижняя граница).
В АЛГОЛе 68-R приведенный выше пример можно было бы перекодировать следующим образом: (границы a в процедуре будут зависеть от вызывающей стороны).
[ 15 ] INT a; CO an actual declarer, bounds 1:15 COREF [] INT b = a [ AT 3]; CO use slice so b has bounds 3:17 COPROC x = (REF [] INT a) VOID: ... CO bounds given by caller CO
В пересмотренном отчете по Алголу 68 формальные границы также были удалены, но индикатор FLEX был перемещен в такое положение, чтобы его можно было включить в формальные объявления:
[ 1: FLEX ] INT a; CO original ALGOL 68, or ALGOL 68-R COFLEX [ 1: ] INT a; CO revised ALGOL 68, CO
PROC x = (REF [ 1: FLEX ] INT a) : ... CO Original ALGOL 68 COPROC x = (REF [ ] INT a) VOID: ... CO ALGOL 68-R COPROC x = (REF FLEX [ ] INT a) VOID: ... CO Revised ALGOL 68 CO
Никакой параллельной обработки
[ редактировать ]В ALGOL 68 код можно запускать параллельно, записывая PAR , за которым следует вспомогательное предложение , например:
PAR BEGIN producer, consumerEND
процедуры производителя и потребителя будут выполняться параллельно. Тип семафора SEMA ( ) с традиционными операторами P ( DOWN ) и V ( UP ) предусмотрен для синхронизации между частями параллельного предложения,
Эта возможность не была реализована в АЛГОЛЕ 68-R.
Было написано расширение под названием ALGOL 68-RT, которое использовало подпрограммирования функцию ICL 1900 для предоставления возможностей многопоточности программам ALGOL 68-R с семантикой, аналогичной современным библиотекам потоков . [9] В компилятор не вносилось никаких изменений, только библиотека времени выполнения и компоновщик.
goto нельзя опускать
[ редактировать ]В АЛГОЛе 68 символ GOTO можно было опустить при переходе:
PROC stop = : ...;...BEGIN IF x > 3 THEN stop FI; CO a jump, not a call CO ...stop: SKIPEND
Поскольку АЛГОЛ 68-R был однопроходным компилятором, это было слишком сложно, поэтому символ GOTO был сделан обязательным.
Такое же ограничение было сделано в официальном подъязыке АЛГОЛ 68S . [10]
Объединение допускается только в сильных позициях
[ редактировать ]В Алголе 68 объединение — это приведение, которое создает СОЕДИНЕНИЕ из составного режима, например:
MODE IBOOL = UNION (INT, BOOL); CO an IBOOL is an INT or a BOOL COIBOOL a = TRUE; CO the BOOL value TRUE is united to an IBOOL CO
В стандарте АЛГОЛа 68 объединение было возможно в устойчивом или сильном контексте, поэтому, например, его можно было применить к операндам формул :
OP ISTRUE = (IBOOL a) BOOL: ...; IF ISTRUE 1 CO legal because 1 (INT) can be united to IBOOL CO THEN ...
Разработчики Алгола 68-R обнаружили, что это приводит к слишком большому количеству неоднозначных ситуаций, поэтому ограничили объединяющее приведение сильными контекстами.
Последствия этого ограничения редко были существенными, и при необходимости его можно было обойти, используя приведение типов для обеспечения сильного контекста в требуемом месте программы.
F00L
[ редактировать ]Компилятор ALGOL 68-R инициализировал неиспользуемую память значением -6815700. [11] [12]
Это значение было выбрано потому, что:
- В качестве целого числа это было большое отрицательное значение.
- Как адрес он превышал максимальный адрес для любой практической программы на ICL 1900.
- Как инструкция это было незаконно
- В виде текста он отображается как
F00L
- Как число с плавающей запятой, у него был установлен бит переполнения.
То же значение использовалось для обозначения NIL .
Обвязка
[ редактировать ]Я заметил, что в некоторых примерах ваших программ вы ничего не подчеркиваете и не обрезаете.
– Майю [13]
В языках семейства АЛГОЛ необходимо различать идентификаторы и основные символы языка. В печатных текстах это обычно достигалось путем печати основных символов жирным шрифтом или подчеркиванием ( , BEGIN или Begin например ).
В с исходным кодом программах ограничения приходилось использовать некоторую технику . Во многих языках, подобных АЛГОЛу, до АЛГОЛа 68-R, это достигалось путем заключения основных символов в одинарные кавычки (например, «начало»). В 68-R основные символы можно было отличить, написав их в верхнем регистре, а для идентификаторов использовался нижний регистр.
Поскольку АЛГОЛ 68-R был реализован на машине с 6- битными байтами (и, следовательно, с набором символов из 64 символов), это было довольно сложно, и, по крайней мере первоначально, программы приходилось составлять на бумажной перфоленте с использованием флексорайтера Friden .
Частично основанный на опыте работы с АЛГОЛом 68-R, в пересмотренном отчете по АЛГОЛу 68 указаны аппаратные представления языка, включая ограничение UPPER.
Расширения Алгола 68
[ редактировать ]В АЛГОЛ 68-R включены расширения для раздельной компиляции и низкоуровневого доступа к машине.
Раздельная компиляция
[ редактировать ]Поскольку АЛГОЛ 68 является строго типизированным языком, простых библиотечных средств, используемых другими языками в системе ICL 1900, было недостаточно. АЛГОЛ 68-R поставлялся с собственным форматом библиотеки и утилитами, которые позволяли совместно использовать режимы, функции, переменные и операторы между отдельно скомпилированными сегментами кода, которые можно было хранить в альбомах . [14]
Сегмент, который будет доступен другим сегментам, будет заканчиваться списком объявлений, которые должны быть доступны:
graphlib CO the segment name COBEGIN MODE GRAPHDATA = STRUCT ( ... ); MODE GRAPH = REF GRAPHDATA; PROC new graph = ( ... ) GRAPH : ...; PROC draw graph = (GRAPH g) VOID : ...; ...ENDKEEP GRAPH, new graph, draw graphFINISH
И тогда функции графа могут быть использованы другим сегментом:
myprog WITH graphlib FROM graphalbumBEGIN GRAPH g = new graph (...); ... draw graph (g); ...ENDFINISH
Доступ к системе низкого уровня
[ редактировать ]Будучи строго типизированным языком высокого уровня, АЛГОЛ 68 не позволяет программам напрямую обращаться к аппаратному обеспечению низкого уровня. Например, для адресной арифметики не существует операторов.
Поскольку АЛГОЛ 68-R не компилировался в стандартный полукомпилированный (готовый к компоновке) формат ICL, было необходимо расширить язык, чтобы обеспечить возможности АЛГОЛ 68-R для написания кода, который обычно пишется на языке ассемблера . Машинные инструкции могли быть написаны внутри разделов CODE ... EDOC операторы манипулирования адресами INC , DEC , DIF , AS . и были добавлены [15]
Пример использования операции Джорджа Пери для выдачи команды:
[1 : 120] CHAR buff;INT unitnumber;STRUCT (BITS typemode, reply, INT count, REF CHAR address) control area := (8r47400014,0,120,buff[1]);...;CODE 0,6/unitnumber; 157,6/typemode OF control area EDOC
Доступность
[ редактировать ]Копия компилятора ALGOL 68-R, работающего под эмулятором операционной системы George 3 , созданного Дэвидом Холдсвортом ( Университет Лидса ), доступна вместе с исходным кодом под лицензией GNU General Public License (GPL). [16]
Ссылки
[ редактировать ]- ^ Пек, JEL, изд. (1970), Материалы рабочей конференции ИФИП по реализации Алгола 68 , Мюнхен: Северная Голландия, ISBN. 0-7204-2045-8
- ^ Бонд, Сьюзен ; Аббате, Джанет (26 сентября 2001 г.). «Устная история: Сьюзен Бонд: Разработка первого в мире компилятора АЛГОЛА 68» . Wiki по истории техники и технологий (ETHW) . Институт инженеров по электротехнике и электронике (IEEE) . Проверено 22 апреля 2020 г. - через Объединенный инженерный фонд (UEF).
- ^ Реализация АЛГОЛа 68, стр. 21
- ^ Карри, ЕСЛИ; Бонд, Южная Каролина ; Морисон, доктор медицинских наук (1971), «АЛГОЛ 68-R, его реализация и использование», Proc Конгресса ИФИП 1971 г. (Обработка информации, 1971 г.) , Любляна, Югославия: Северная Голландия, стр. 360–363, ISBN 0-7204-2063-6
- ^ Аноним (январь 1977 г.). Система Алгол 68-Р – Установка и обслуживание (PDF) . Отдел исследований в области вычислительной техники и программного обеспечения — Королевский радарный институт . Проверено 9 апреля 2011 г. [ постоянная мертвая ссылка ]
- ^ Реализация АЛГОЛА 68, стр. 294
- ^ Реализация АЛГОЛА 68, страницы 21-26.
- ^ Реализация АЛГОЛА 68, стр. 276
- ^ Оливер-младший; Ньютон, Р.С. (1979). «Практический опыт работы с АЛГОЛом 68-RT» . Компьютерный журнал . 22 (2): 114–118. дои : 10.1093/comjnl/22.2.114 .
- ^ Линдси, Чарльз Х .; ван дер Мейлен, С.Г. (1997). «Приложение 4, подъязык». неофициальное введение в АЛГОЛ 68 (пересмотренный) . Северная Голландия. ISBN 0-7204-0726-5 .
- ^ Раймонд, Эрик С. (1996). "дурак". Новый хакерский словарь; 3-е издание . МТИ Пресс. п. 200. ИСБН 978-0-262-68092-9 .
Компилятор Algol 68-R инициализировал свое хранилище символьной строкой «F00LF00LF00LF00L...», потому что как указатель или как число с плавающей запятой это вызывало сбой, а как целое число или символьная строка было очень узнаваемо в свалка.
- ^ Система Алгол 68-Р – Установка и обслуживание, стр. 25
- ^ Реализация АЛГОЛа 68, стр. 30
- ^ Вудворд, Премьер-министр ; Бонд, СГ (1974). «14 – Сегментация программы». Руководство пользователя АЛГОЛ 68-Р . Канцелярия Ее Величества (HMSO). стр. 87–89. ISBN 0-11-771600-6 .
- ^ Система Алгол 68-R – Установка и обслуживание, стр. 26-30.
- ^ Тоал, Грэм (сентябрь 2018 г.). «Джордж3: Эмуляция ICL 1900» . Сохранение программного обеспечения и эмуляция машин . Проверено 19 апреля 2020 г.
Внешние ссылки
[ редактировать ]- Алгол 68 - Общество истории радаров и технологий Малверна