Jump to content

АЛГОЛ 68-Р

(Перенаправлено из АЛГОЛ 68-RT )
АЛГОЛ 68Р
Оригинальный автор(ы) И.Ф. Карри, Сьюзен Дж. Бонд , Джей Ди Моррисон
Разработчик(и) Королевское радарное учреждение
Первоначальный выпуск 20 июля 1970 г .; 54 года назад ( 1970-07-20 )
Написано в АЛГОЛ 60 (оригинал)
АЛГОЛ 68-Р (последний)
Операционная система Джордж 3
Платформа ICL 1907F
Размер 34 тыс. слов
Доступно в Английский
Тип Составитель , переводчик
Лицензия Бесплатное ПО
Веб-сайт SW .ccs .bcs .org /CCs /g3

АЛГОЛ 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]

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

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

REAL 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 CO

PROC 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 CO

PROC endit = VOID : GOTO end;  CO a procedure returning void CO

Эта модификация языка была принята в пересмотренном отчете ALGOL 68.

Нет официальных декларантов

[ редактировать ]

Формальные объявления — это режимы в левой части объявления идентичности или режимы, указанные в объявлении процедуры. В исходном языке они могли включать границы массива и указывать, был ли соответствующий фактический оператор объявления фиксированным: FLEX или ИЛИ ЛИБО :

[ 15 ] INT a;                    CO an actual declarer, bounds 1:15 CO
REF [ 3 : ] INT b = a;           CO This is an error CO

PROC 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 CO
REF [] INT b = a [ AT 3];        CO use slice so b has bounds 3:17 CO

PROC 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 CO
FLEX [ 1: ] INT a;      CO revised ALGOL 68, CO
PROC x = (REF [ 1: FLEX ] INT a) : ...  CO Original ALGOL 68 CO
PROC x = (REF [ ] INT a) VOID: ...      CO ALGOL 68-R CO
PROC x = (REF FLEX [ ] INT a) VOID: ... CO Revised ALGOL 68 CO

Никакой параллельной обработки

[ редактировать ]

В ALGOL 68 код можно запускать параллельно, записывая PAR , за которым следует вспомогательное предложение , например:

PAR BEGIN
   producer,
   consumer
END

процедуры производителя и потребителя будут выполняться параллельно. Тип семафора 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:
   SKIP
END

Поскольку АЛГОЛ 68-R был однопроходным компилятором, это было слишком сложно, поэтому символ GOTO был сделан обязательным.

Такое же ограничение было сделано в официальном подъязыке АЛГОЛ 68S . [10]

Объединение допускается только в сильных позициях

[ редактировать ]

В Алголе 68 объединение — это приведение, которое создает СОЕДИНЕНИЕ из составного режима, например:

MODE IBOOL = UNION (INT, BOOL);    CO an IBOOL is an INT or a BOOL CO
IBOOL 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 обнаружили, что это приводит к слишком большому количеству неоднозначных ситуаций, поэтому ограничили объединяющее приведение сильными контекстами.

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

Компилятор 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 CO
BEGIN
   MODE GRAPHDATA = STRUCT ( ... );
   MODE GRAPH = REF GRAPHDATA;
   PROC new graph = ( ... ) GRAPH : ...;
   PROC draw graph = (GRAPH g) VOID : ...;
   ...
END
KEEP GRAPH, new graph, draw graph
FINISH

И тогда функции графа могут быть использованы другим сегментом:

myprog WITH graphlib FROM graphalbum
BEGIN
    GRAPH g = new graph (...);
    ...
    draw graph (g);
    ...
END
FINISH

Доступ к системе низкого уровня

[ редактировать ]

Будучи строго типизированным языком высокого уровня, АЛГОЛ 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]

  1. ^ Пек, JEL, изд. (1970), Материалы рабочей конференции ИФИП по реализации Алгола 68 , Мюнхен: Северная Голландия, ISBN.  0-7204-2045-8
  2. ^ Бонд, Сьюзен ; Аббате, Джанет (26 сентября 2001 г.). «Устная история: Сьюзен Бонд: Разработка первого в мире компилятора АЛГОЛА 68» . Wiki по истории техники и технологий (ETHW) . Институт инженеров по электротехнике и электронике (IEEE) . Проверено 22 апреля 2020 г. - через Объединенный инженерный фонд (UEF).
  3. ^ Реализация АЛГОЛа 68, стр. 21
  4. ^ Карри, ЕСЛИ; Бонд, Южная Каролина ; Морисон, доктор медицинских наук (1971), «АЛГОЛ 68-R, его реализация и использование», Proc Конгресса ИФИП 1971 г. (Обработка информации, 1971 г.) , Любляна, Югославия: Северная Голландия, стр. 360–363, ISBN  0-7204-2063-6
  5. ^ Аноним (январь 1977 г.). Система Алгол 68-Р – Установка и обслуживание (PDF) . Отдел исследований в области вычислительной техники и программного обеспечения — Королевский радарный институт . Проверено 9 апреля 2011 г. [ постоянная мертвая ссылка ]
  6. ^ Реализация АЛГОЛА 68, стр. 294
  7. ^ Реализация АЛГОЛА 68, страницы 21-26.
  8. ^ Реализация АЛГОЛА 68, стр. 276
  9. ^ Оливер-младший; Ньютон, Р.С. (1979). «Практический опыт работы с АЛГОЛом 68-RT» . Компьютерный журнал . 22 (2): 114–118. дои : 10.1093/comjnl/22.2.114 .
  10. ^ Линдси, Чарльз Х .; ван дер Мейлен, С.Г. (1997). «Приложение 4, подъязык». неофициальное введение в АЛГОЛ 68 (пересмотренный) . Северная Голландия. ISBN  0-7204-0726-5 .
  11. ^ Раймонд, Эрик С. (1996). "дурак". Новый хакерский словарь; 3-е издание . МТИ Пресс. п. 200. ИСБН  978-0-262-68092-9 . Компилятор Algol 68-R инициализировал свое хранилище символьной строкой «F00LF00LF00LF00L...», потому что как указатель или как число с плавающей запятой это вызывало сбой, а как целое число или символьная строка было очень узнаваемо в свалка.
  12. ^ Система Алгол 68-Р – Установка и обслуживание, стр. 25
  13. ^ Реализация АЛГОЛа 68, стр. 30
  14. ^ Вудворд, Премьер-министр ; Бонд, С.Г. (1974). «14 – Сегментация программы». Руководство пользователя АЛГОЛ 68-Р . Канцелярия Ее Величества (HMSO). стр. 87–89. ISBN  0-11-771600-6 .
  15. ^ Система Алгол 68-R – Установка и обслуживание, стр. 26-30.
  16. ^ Тоал, Грэм (сентябрь 2018 г.). «Джордж3: Эмуляция ICL 1900» . Сохранение программного обеспечения и эмуляция машин . Проверено 19 апреля 2020 г.
[ редактировать ]
  • Алгол 68 - Общество истории радаров и технологий Малверна
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 7c8f043c565fc4b723240dce3728be02__1685517000
URL1:https://arc.ask3.ru/arc/aa/7c/02/7c8f043c565fc4b723240dce3728be02.html
Заголовок, (Title) документа по адресу, URL1:
ALGOL 68-R - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)