Автор (ы) оригинала | И. Ф. Карри, Сьюзан Дж. Бонд , Дж. Д. Моррисон |
---|---|
Разработчики) | Королевский радар |
Первый выпуск | 20 июля 1970 г . |
Написано в | АЛГОЛ 60 (исходный) АЛГОЛ 68-R (последний) |
Операционная система | Георгий 3 |
Платформа | ICL 1907F |
Размер | 34 тыс. Слов |
Доступно в | английский |
Тип | Составитель , переводчик |
Лицензия | Бесплатное ПО |
Веб-сайт | sw |
Алгол 68-R был первой реализацией Алгоритмического языка 68 .
В декабре 1968 г. был опубликован отчет об алгоритмическом языке ALGOL 68. С 20-24 июля 1970 года рабочая конференция была организована Международной федерации по обработке информации (IFIP) , чтобы обсудить проблемы реализации языка, [1] небольшая команда из Royal Radar Establishment (РРЭ) присутствовали представить их компилятор , написано И. Ф. Карри, Сьюзен Г. Бонд , [2] и Дж. Д. Моррисоном. Принимая во внимание, что на реализацию языка потребуется до 100 человеко-лет с использованием многопроходных компиляторов с числом проходов до семи, они описали, как они уже реализовали однопроходный компилятор. который находился в производстве для инженерных и научных целей.
Компилятор [ править ]
Компилятор ALGOL 68-R изначально был написан на локальном диалекте ALGOL 60 с расширениями для управления адресами и обработки списков. Синтаксический анализатор был написан с использованием генератора синтаксического анализатора JM Foster's Syntax Improving Device (SID) .
Около 20К из этой программы, что мы считаем слишком большим.
- Карри [3]
Первая версия компилятора занимала 34 тыс. Слов. Позже он был переписан на АЛГОЛ 68-R, [4] потребовав около 36 тыс. Слов для компиляции большинства программ. [5]
Алгол 68-R был реализован в операционной системе George 3 на ICL 1907F . Компилятор был бесплатно распространен компанией International Computers Limited (ICL) от имени Royal Radar Establishment (RRE).
Ограничения на скомпилированном языке [ править ]
Это вопрос морали. У нас есть Библия, а вы грешите!
- Майю [6]
Чтобы обеспечить возможность компиляции за один проход, Алгол 68-R реализовал подмножество языка, определенного в исходном отчете: [7]
- Перед использованием необходимо указать идентификаторы, режимы и операторы.
- Нет автоматической обработки
- Явный недействительный режим
- Нет официальных заявителей
- Без параллельной обработки
- goto нельзя опускать
- Объединение действует только в сильных позициях
Многие из этих ограничений были приняты в пересмотренном отчете по Алголу 68.
Спецификация перед использованием [ править ]
Чтобы позволить компиляцию за один проход, Алгол 68-R настаивал на том, чтобы все идентификаторы были указаны (объявлены) перед использованием.
Стандартная программа:
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 ;
Нет процедуры [ править ]
В стандартном языке принуждение к процедуре могло бы в сильном контексте преобразовать выражение некоторого типа в процедуру, возвращающую этот тип. Это может быть использовано для реализации вызова по имени .
Другой случай, когда использовалась процедура, - это объявление процедуры в декларации:
proc x плюс 1 = int : x + 1;
правая рука была литая из х + 1 в целое число, которое затем превращают в процедуру возвращения целого числа .
Команда ALGOL 68-R сочла это слишком сложным и внесла в язык два изменения. Принуждение процедуры было отброшено, а форма mode: expression была переопределена как обозначение процедуры , при этом приведение типов обозначалось явным символом val :
real : x co преобразование в реальное в ALGOL 68 coreal val x co приведение к реальному в ALGOL 68-R co
Код, который имел допустимое использование для вызова по имени (например, устройство Дженсена ), мог просто передавать обозначение процедуры:
proc sum = ( int lo, hi, proc ( int ) real term) real : begin real temp: = 0; для меня от lo до hi do temp +: = срок (i); темп конец ; print (сумма (1, 100, ( int i) вещественное число : 1 / i))
В версии языка, определенной в исправленном отчете, эти изменения были приняты, хотя форма приведения была немного изменена на режим (выражение) .
real (x) co - приведение к real в пересмотренном ALGOL 68 co.
Явный недействительный режим [ править ]
В исходном языке режим void был представлен пустым режимом:
: х: = 3,14; co cast (x: = 3.14) в void coproc endit = goto end; co процедура, возвращающая void co
Команда ALGOL 68-R решила использовать явный символ void , чтобы упростить синтаксический анализ (и повысить удобочитаемость):
void val x: = 3,14; co cast (x: = 3.14) в void coproc endit = void : goto end; co процедура, возвращающая void co
Эта модификация языка была принята в пересмотренном отчете Алгола 68.
Нет официальных заявителей [ править ]
Формальные объявители - это режимы в левой части объявления идентичности или режимы, указанные в объявлении процедуры. В исходном языке они могли включать границы массива и указывать, был ли соответствующий фактический объявитель фиксированным, гибким или одним из следующих :
[15] int a; co фактический объявитель, границы 1:15 co ref [3:] int b = a; co Это ошибка coproc x = ( ref [1: либо ] int a): ...
Я считаю, что было разумным опустить границы в формальных заявителях, но я считаю ужасным преступлением пропустить или или гибкость
- Линдси [8]
Команда ALGOL 68-R переопределила формальные деклараторы, чтобы они были такими же, как виртуальные деклараторы, которые не содержат связанной информации. Они обнаружили, что это уменьшило двусмысленность при синтаксическом анализе языка, и сочли, что это не та функция, которая будет использоваться в рабочих программах.
Если процедуре требуются определенные границы для своих аргументов, она может сама проверить их с помощью операторов upb (верхняя граница) и lwb (нижняя граница).
В АЛГОЛе 68-R приведенный выше пример можно было бы переписать следующим образом: (границы a в процедуре будут зависеть от вызывающей стороны).
[15] int a; co фактический объявитель, границы 1:15 co ref [] int b = a [ at 3]; co использовать slice, поэтому b имеет границы 3:17 coproc x = ( ref [] int a) void : ... co границы, заданные вызывающим co
В пересмотренном отчете по Алголу 68 формальные границы также были удалены, но индикатор гибкости был перемещен в положение, чтобы его можно было включить в формальные деклараторы:
[1: гибкий ] int a; совместно с оригинальным АЛГОЛОМ 68 или АЛГОЛ 68-R co flex [1:] int a; соредактировал АЛГОЛ 68, соавтор.
proc x = ( ref [1: flex ] int a): ... co Исходный АЛГОЛ 68 co proc x = ( ref [] int a) void : ... co АЛГОЛ 68-R co proc x = ( ref flex [ ] int a) void : ... co Пересмотренный АЛГОЛ 68 co
Без параллельной обработки [ править ]
В Алголе 68 код можно запускать параллельно, написав par с дополнительным условием , например в:
номинальное начало режиссер, потребительконец
процедуры производитель и потребитель будет работать параллельно. Тип семафора ( sema ) с традиционными операторами P ( вниз ) и V ( вверх ) предоставляется для системной синхронизации между частями предложения parallel,
Эта функция не была реализована в Алголе 68-R.
Было написано расширение под названием ALGOL 68-RT, которое использовало функцию подпрограммирования ICL 1900 для обеспечения многопоточности программ на ALGOL 68-R с семантикой, подобной современным библиотекам потоков . [9] В компилятор не было внесено никаких изменений, только библиотека времени выполнения и компоновщик.
goto нельзя опускать [ править ]
В АЛГОЛЕ 68 символ перехода можно было опустить при переходе:
proc stop =: ...;...начать, если x> 3, затем остановить fi ; совместно прыжок, не призыв ко ...останавливаться: пропустить конец
Поскольку ALGOL 68-R был однопроходным компилятором, это было слишком сложно, поэтому символ goto стал обязательным.
Такое же ограничение было сделано в официальном подъязыке АЛГОЛ 68S . [10]
Объединение разрешено только на сильных позициях [ править ]
В АЛГОЛе 68 объединение - это принуждение, которое производит объединение из составляющего режима, например:
режим ibool = union ( int , bool ); co an ibool - это int или bool co ibool a = true ; совместно BOOL значение верно будет объединено с ibool со
В стандартном АЛГОЛе 68 объединение было возможно в устойчивом или сильном контексте, поэтому, например, его можно было применить к операндам формул :
op istrue = ( ibool a) bool : ...; if istrue 1 co legal, потому что 1 ( int ) может быть объединен с ibool co, тогда ...
Разработчики ALGOL 68-R обнаружили, что это создает слишком много неоднозначных ситуаций, поэтому объединяющее принуждение ограничивается сильными контекстами.
Эффекты этого ограничения редко были важными, и при необходимости их можно было обойти, используя приведение типов, чтобы обеспечить надежный контекст в требуемой точке программы.
F00L [ править ]
Компилятор ALGOL 68-R инициализировал неиспользуемую память значением -6815700. [11] [12]
Это значение было выбрано, потому что:
- В качестве целого числа это было большое отрицательное значение.
- Как адрес это был вне максимального адреса для любой практической программы на ICL 1900.
- По инструкции это было незаконно
- В виде текста он отображается как
F00L
- В качестве числа с плавающей запятой у него был установлен бит переполнения
То же значение использовалось для представления nil .
Строппинг [ править ]
Я заметил, что в некоторых из ваших программ-примеров вы ничего не подчеркиваете и не корректируете.
- Майю [13]
В языках семейства ALGOL необходимо различать идентификаторы и базовые символы языка. В печатных текстах это обычно достигалось путем печати основных символов жирным шрифтом или подчеркиванием (например, начало или начало ).
В программах с исходным кодом приходилось использовать некоторую технику строчки . Во многих АЛГОЛ-подобных языках до АЛГОЛА 68-R это достигалось заключением основных символов в символы одинарных кавычек (например, «начало»). В 68-R основные символы можно было различить, записав их в верхнем регистре, а нижний регистр использовался для идентификаторов.
Поскольку АЛГОЛ 68-R был реализован на машине с 6- битными байтами (и, следовательно, с 64-символьным набором), это было довольно сложно, и, по крайней мере, первоначально программы должны были быть составлены на перфоленте с использованием перфоленты Friden Flexowriter .
Отчасти основанный на опыте ALGOL 68-R, пересмотренный отчет по ALGOL 68 определил аппаратные представления для языка, в том числе UPPER.
Расширения к АЛГОЛу 68 [ править ]
Алгол 68-R включает расширения для раздельной компиляции и низкоуровневого доступа к машине.
Раздельная компиляция [ править ]
Поскольку АЛГОЛ 68 - это строго типизированный язык, простых библиотечных возможностей, используемых другими языками в системе ICL 1900, было недостаточно. Алгол 68-R поставлялся со своим собственным форматом библиотеки и утилит, которые позволяли разделять режимы, функции, переменные и операторы между отдельно скомпилированными сегментами кода, которые могли храниться в альбомах . [14]
Сегмент, который будет доступен для других сегментов, будет заканчиваться списком объявлений, которые будут доступны:
graphlib co имя сегмента co begin mode graphdata = struct (...); mode graph = ref graphdata ; proc new graph = (...) graph : ...; proc draw graph = ( graph g) void : ...; ...конец сохранить график , новый график, нарисовать график, конец
И тогда функции графика могут использоваться другим сегментом:
myprog с graphlib из graphalbum begin graph g = new graph (...); ... начертить график (ж); ...конец финиша
Доступ к системе низкого уровня [ править ]
Как строго типизированный язык высокого уровня, АЛГОЛ 68 предотвращает прямой доступ программ к низкоуровневому оборудованию. Например, не существует операторов для адресной арифметики.
Поскольку ALGOL 68-R не компилировался в стандартный полукомпилированный (готовый к связыванию) формат ICL , было необходимо расширить язык, чтобы предоставить функции в ALGOL 68-R для написания кода, который обычно был бы написан на языке ассемблера . Инструкции машин могут быть написана рядным , внутри кода ... EDOC секция и операторы манипулирования адреса вкла , декабрь , диф , а были добавлены. [15]
Пример использования операции Джорджа пери для выдачи команды:
[1: 120] CHAR бафф;Номер устройства INT;СТРУКТУРА (режим типа BITS, ответ, счетчик INT, адрес REF CHAR) область управления: = (8r47400014,0,120, buff [1]);...;КОД 0,6 / номер устройства; 157,6 / типрежим области управления EDOC
Доступность [ править ]
Копия компилятора ALGOL 68-R Дэвида Холдсворта ( Университет Лидса ) , запускаемого под эмулятором операционной системы George 3 , доступна вместе с исходным кодом под Стандартной общественной лицензией GNU (GPL). [16]
Ссылки [ править ]
- ^ Пек, JEL, изд. (1970), Труды рабочей конференции IFIP по внедрению Алгола 68 , Мюнхен: Северная Голландия, ISBN 0-7204-2045-8
- ^ Бонд, Сьюзен ; Аббат, Джанет (26 сентября 2001 г.). "Устная история: Сьюзан Бонд: Разработка первого в мире компилятора Алгола 68" . Вики по истории инженерии и технологий (ETHW) . Институт инженеров по электротехнике и радиоэлектронике (IEEE) . Проверено 22 апреля 2020 г. - через United Engineering Foundation (UEF).
- ^ Реализация АЛГОЛА 68, стр.
- ^ Карри, IF; Bond, SG ; Morison, JD (1971), «Алгол 68-R, его реализация и использование», Proc IFIP Congress 1971 (обработка информации 1971) , Любляна, Югославия: Северная Голландия, стр. 360–363, ISBN 0-7204-2063-6
- ↑ Анонимный (январь 1977 г.). Система Algol 68-R - Установка и обслуживание (PDF) . Подразделение вычислительной техники и программного обеспечения - Royal Radar Establishment . Проверено 9 апреля 2011 . [ постоянная мертвая ссылка ]
- ^ Реализация АЛГОЛА 68, стр. 294
- ^ Реализация АЛГОЛА 68, страницы 21-26
- ^ Реализация АЛГОЛА 68, стр. 276
- ^ Оливер, младший; Ньютон, RS (1979). «Практический опыт работы с АЛГОЛОМ 68-РТ» (PDF) . Компьютерный журнал . 22 (2): 114–118. DOI : 10.1093 / comjnl / 22.2.114 .
- ^ Линдси, Чарльз Х .; ван дер Меулен, С.Г. (1997). «Приложение 4, подъязык». неформальное введение в АЛГОЛ 68 (отредактированный) . Северная Голландия. ISBN 0-7204-0726-5.
- ^ Раймонд, Эрик С. (1996). "дурак". Новый хакерский словарь; 3-е издание . MIT Press. п. 200. ISBN 978-0-262-68092-9.
Компилятор Algol 68-R использовал для инициализации своего хранилища символьную строку «F00LF00LF00LF00L ...», потому что как указатель или как число с плавающей запятой он вызывал сбой, а как целое число или символьная строка он был очень узнаваем свалка.
- ^ Система Algol 68-R - Установка и обслуживание, страница 25
- ^ Реализация АЛГОЛА 68, стр.
- ^ Вудворд, PM ; Бонд, SG (1974). «14 - Программная сегментация». Руководство пользователя ALGOL 68-R . Канцелярия Ее Величества (HMSO). С. 87–89. ISBN 0-11-771600-6.
- ^ Система Algol 68-R - Установка и обслуживание, стр. 26-30
- ^ Toal, Грэм (сентябрь 2018). "George3: Эмуляция ICL 1900" . Сохранение программного обеспечения и эмуляция машин . Проверено 19 апреля 2020 .
Внешние ссылки [ править ]
- Алгол 68 - Общество истории радаров и технологий Малверна