Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Алгол 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]

  1. Перед использованием необходимо указать идентификаторы, режимы и операторы.
  2. Нет автоматической обработки
  3. Явный недействительный режим
  4. Нет официальных заявителей
  5. Без параллельной обработки
  6. goto нельзя опускать
  7. Объединение действует только в сильных позициях

Многие из этих ограничений были приняты в пересмотренном отчете по Алголу 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]

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

  1. ^ Пек, JEL, изд. (1970), Труды рабочей конференции IFIP по внедрению Алгола 68 , Мюнхен: Северная Голландия, ISBN 0-7204-2045-8
  2. ^ Бонд, Сьюзен ; Аббат, Джанет (26 сентября 2001 г.). "Устная история: Сьюзан Бонд: Разработка первого в мире компилятора Алгола 68" . Вики по истории инженерии и технологий (ETHW) . Институт инженеров по электротехнике и радиоэлектронике (IEEE) . Проверено 22 апреля 2020 г. - через United Engineering Foundation (UEF).
  3. ^ Реализация АЛГОЛА 68, стр.
  4. ^ Карри, IF; Bond, SG ; Morison, JD (1971), «Алгол 68-R, его реализация и использование», Proc IFIP Congress 1971 (обработка информации 1971) , Любляна, Югославия: Северная Голландия, стр. 360–363, ISBN 0-7204-2063-6
  5. Анонимный (январь 1977 г.). Система Algol 68-R - Установка и обслуживание (PDF) . Подразделение вычислительной техники и программного обеспечения - Royal Radar Establishment . Проверено 9 апреля 2011 . [ постоянная мертвая ссылка ]
  6. ^ Реализация АЛГОЛА 68, стр. 294
  7. ^ Реализация АЛГОЛА 68, страницы 21-26
  8. ^ Реализация АЛГОЛА 68, стр. 276
  9. ^ Оливер, младший; Ньютон, RS (1979). «Практический опыт работы с АЛГОЛОМ 68-РТ» (PDF) . Компьютерный журнал . 22 (2): 114–118. DOI : 10.1093 / comjnl / 22.2.114 .
  10. ^ Линдси, Чарльз Х .; ван дер Меулен, С.Г. (1997). «Приложение 4, подъязык». неформальное введение в АЛГОЛ 68 (отредактированный) . Северная Голландия. ISBN 0-7204-0726-5.
  11. ^ Раймонд, Эрик С. (1996). "дурак". Новый хакерский словарь; 3-е издание . MIT Press. п. 200. ISBN 978-0-262-68092-9. Компилятор Algol 68-R использовал для инициализации своего хранилища символьную строку «F00LF00LF00LF00L ...», потому что как указатель или как число с плавающей запятой он вызывал сбой, а как целое число или символьная строка он был очень узнаваем свалка.
  12. ^ Система Algol 68-R - Установка и обслуживание, страница 25
  13. ^ Реализация АЛГОЛА 68, стр.
  14. ^ Вудворд, PM ; Бонд, SG (1974). «14 - Программная сегментация». Руководство пользователя ALGOL 68-R . Канцелярия Ее Величества (HMSO). С. 87–89. ISBN 0-11-771600-6.
  15. ^ Система Algol 68-R - Установка и обслуживание, стр. 26-30
  16. ^ Toal, Грэм (сентябрь 2018). "George3: Эмуляция ICL 1900" . Сохранение программного обеспечения и эмуляция машин . Проверено 19 апреля 2020 .

Внешние ссылки [ править ]

  • Алгол 68 - Общество истории радаров и технологий Малверна