АЛГОЛ 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 четный = ( число 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 ;
Никаких процедур [ править ]
В стандартном языке процедур приведение могло бы в строгом контексте преобразовать выражение некоторого типа в процедуру, возвращающую этот тип. Это можно использовать для реализации вызова по имени .
Другим случаем использования процедур было объявление процедур в объявлении:
PROC x плюс 1 = INT : x + 1;
правая часть представляла собой x преобразование + 1 в целое число, которое затем было преобразовано в процедуру, возвращающую целое число .
Команда разработчиков ALGOL 68-R сочла это слишком сложным и внесла в язык два изменения. Приведение процедур было удалено, а выражение form mode:expression было переопределено как обозначение процедуры , приведение типов обозначалось явным символом VAL :
REAL : x CO приведение к REAL в ALGOL 68 CO REAL VAL x CO приведение к REAL в ALGOL 68-R CO
Код, в котором допустимо использовать вызов по имени (например, устройство Дженсена ), может просто передать обозначение процедуры:
Сумма PROC = ( INT lo, hi, PROC ( INT ) REAL term) REAL : НАЧАТЬ РЕАЛЬНУЮ температуру := 0; ДЛЯ Я ОТ ло ДО привет ДЕЛАТЬ темп +:= термин (я); температура КОНЕЦ ; распечатать (сумма (1, 100, ( INT i) REAL : 1/i))
В версии языка, определенной в пересмотренном отчете, эти изменения были приняты, хотя форма приведения была немного изменена на режим (выражение) .
REAL (x) CO приведение к REAL в пересмотренном АЛГОЛе 68 CO
Явный режим void [ править ]
В исходном языке режим VOID был представлен пустым режимом:
: х := 3,14; CO cast (x := 3.14) для аннулирования CO PROC endit = GOTO end; CO процедура, возвращающая void CO
Команда ALGOL 68-R решила использовать явный символ VOID , чтобы упростить синтаксический анализ (и повысить читаемость):
ЗНАЧЕНИЕ ПУСТОЕ x := 3,14; CO cast (x := 3.14) для отмены CO PROC endit = VOID : GOTO end; CO процедура, возвращающая void CO
Эта модификация языка была принята в пересмотренном отчете ALGOL 68.
официальных Нет декларантов
Формальные объявления — это режимы в левой части объявления идентичности или режимы, указанные в объявлении процедуры. В исходном языке они могли включать границы массива и указывать, был ли соответствующий фактический оператор объявления фиксированным: FLEX или ИЛИ ЛИБО :
[ 15 ] ИНТ а; CO фактический оператор объявления, границы 1:15 CO REF [ 3 : ] INT b = a; CO Это ошибка CO PROC x = ( REF [ 1 : EITHER ] INT a) : ...
Я думаю, что для меня было разумным опустить границы в формальных объявлениях, но я думаю, что было ужасным преступлением опустить ИЛИ или FLEX .
– Линдси [8]
Команда ALGOL 68-R переопределила формальные объявления, чтобы они были такими же, как виртуальные объявления , которые не включают в себя связанную информацию. Они обнаружили, что это уменьшает неоднозначность при синтаксическом анализе языка, и посчитали, что эта функция не будет использоваться в рабочих программах.
Если процедуре необходимы определенные границы для ее аргументов, она может проверить их самостоятельно с помощью операторов UPB (верхняя граница) и LWB (нижняя граница).
В АЛГОЛе 68-R приведенный выше пример можно было бы перекодировать следующим образом: (границы a в процедуре будут зависеть от вызывающей стороны).
[ 15 ] ИНТ а; CO фактический оператор объявления, границы 1:15 CO REF [] INT b = a [ AT 3]; CO использует фрагмент , чтобы b имел границы 3:17 CO PROC x = ( REF [] INT a) VOID : ... границы CO , заданные вызывающей стороной CO
В пересмотренном отчете по Алголу 68 формальные границы также были удалены, но индикатор FLEX был перемещен в такое положение, чтобы его можно было включить в формальные объявления:
[ 1: FLEX ] INT a; CO оригинальный АЛГОЛ 68 или АЛГОЛ 68-R CO FLEX [ 1: ] INT a; CO пересмотрела Алгол 68, CO
PROC x = ( REF [ 1: FLEX ] INT a) : ... CO Исходный ALGOL 68 CO PROC x = ( REF [ ] INT a) VOID : ... CO ALGOL 68-R CO PROC x = ( REF FLEX [ ] INT a) VOID : ... CO Пересмотренный ALGOL 68 CO
Никакой параллельной обработки [ править ]
В ALGOL 68 код можно запускать параллельно, записывая PAR , за которым следует вспомогательное предложение , например:
ПАР НАЧАЛО режиссер, потребитель КОНЕЦ
процедуры производителя и потребителя будут выполняться параллельно. Тип семафора ( SEMA ) с традиционными операторами P ( DOWN ) и V ( UP ) предусмотрен для синхронизации между частями параллельного предложения,
Эта возможность не была реализована в АЛГОЛЕ 68-R.
Было написано расширение под названием ALGOL 68-RT, которое использовало функцию подпрограммирования ICL 1900 для предоставления возможностей многопоточности программам ALGOL 68-R с семантикой, аналогичной современным потоков . библиотекам [9] В компилятор не вносилось никаких изменений, только библиотека времени выполнения и компоновщик.
goto нельзя опускать [ править ]
В АЛГОЛе 68 символ GOTO можно было опустить при переходе:
Стоп PROC = : ...; ... BEGIN IF x > 3 THEN стоп FI ; CO прыжок, а не вызов CO ... останавливаться: ПРОПУСТИТЬ КОНЕЦ
Поскольку АЛГОЛ 68-R был однопроходным компилятором, это было слишком сложно, поэтому символ GOTO был сделан обязательным.
Такое же ограничение было сделано в официальном подъязыке АЛГОЛ 68S . [10]
Объединение разрешено только в сильных позициях [ править ]
В Алголе 68 объединение — это приведение, которое создает СОЕДИНЕНИЕ из составного режима, например:
РЕЖИМ IBOOL = СОЮЗ ( INT , BOOL ); CO IBOOL — это INT или BOOL CO IBOOL a = TRUE ; CO BOOL значение TRUE объединяется с IBOOL CO
В стандарте АЛГОЛа 68 объединение было возможно в устойчивом или сильном контексте, поэтому, например, его можно было применить к операндам формул :
OP ISTRUE = ( IBOOL a) BOOL : ...; ЕСЛИ ИСТИННО 1 CO законно, потому что 1 ( INT ) можно объединить с IBOOL CO, ТОГДА ...
Разработчики Алгола 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 имя сегмента CO BEGIN MODE GRAPHDATA = STRUCT (...); ИДЕНТ ГРАФ РЕЖИМА = . ГРАФИКА ; Новый график PROC = ( ... ) ГРАФИК : ...; График рисования PROC = ( GRAPH g) VOID : ...; ... КОНЕЦ СОХРАНИТЬ ГРАФИК , новый график, нарисовать график ЗАКАНЧИВАТЬ
И тогда функции графа могут быть использованы другим сегментом:
myprog С графической библиотекой ИЗ графальбума НАЧАТЬ ГРАФИК g = новый график (...); ... нарисовать график (г); ... КОНЕЧНАЯ ОТДЕЛКА
Низкоуровневый доступ к системе [ править ]
Будучи строго типизированным языком высокого уровня, АЛГОЛ 68 не позволяет программам напрямую обращаться к аппаратному обеспечению низкого уровня. Например, для адресной арифметики не существует операторов.
Поскольку АЛГОЛ 68-R не компилировался в стандартный полукомпилированный (готовый к компоновке) формат ICL, было необходимо расширить язык, чтобы обеспечить возможности АЛГОЛ 68-R для написания кода, который обычно пишется на языке ассемблера . Машинные инструкции могли быть записаны внутри разделов CODE ... EDOC операторы манипулирования адресами INC , DEC , DIF , AS . и были добавлены [15]
Пример использования операции Джорджа Пери для выдачи команды:
[1 : 120] усиление CHAR ; INT номер устройства; STRUCT ( режим типа BITS , ответ, количество INT , REF CHAR адрес ) область управления := (8r47400014,0,120,buff[1]); ...; КОД 0,6/шт.номер; 157,6/типрежим зоны управления 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 - Общество истории радаров и технологий Малверна