АЛГОЛ 68-R

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

АЛГОЛ 68-Rбыл первой реализацией алгоритмического языка АЛГОЛ 68.

В декабре 1968 года был опубликован отчет об алгоритмическом языке ALGOL 68. 20–24 июля 1970 г. Международная федерация обработки информации (IFIP) организовала рабочую конференцию для обсуждения проблем внедрения языка, небольшую группу из Royal Radar Establishment (RRE) представили свой компилятор, написанный IF Currie, Susan G. Bond и JD Morrison. Принимая во внимание, что на реализацию языка с использованием многопроходных компиляторов с числом проходов до семи, они описали, как они уже реализовали однопроходный компилятор, который был в производстве для инженерных и научных целей.

Содержание
  • 1 Компилятор
  • 2 Ограничения на скомпилированном языке
    • 2.1 Спецификация перед использованием
    • 2.2 Без обработки
    • 2.3 Явный режим void
    • 2.4 Отсутствие формальных заявителей
    • 2.5 Без параллельной обработки
    • 2.6 goto не может быть пропущено
    • 2.7 Объединение разрешено только в сильных позициях
  • 3 F00L
  • 4 Stropping
  • 5 Расширения к ALGOL 68
    • 5.1 Раздельная компиляция
    • 5.2 Низкоуровневый доступ к системе
  • 6 Доступность
  • 7 Ссылки
  • 8 Внешние ссылки
Компилятор

Компилятор ALGOL 68-R изначально был написан на локальном диалекте ALGOL 60 с расширениями для управления адресами и обработки списков. Синтаксический анализатор был написан с использованием JM Foster's Syntax Improving Device (SID) parser generator.

Примерно 20 КБ этой программы, которая, по нашему мнению, слишком велика.
- Карри

первая версия компилятора занимала 34 тыс. слов. Позже он был переписан на АЛГОЛ 68-R, что потребовало около 36 тыс. Слов для компиляции большинства программ.

АЛГОЛ 68-R был реализован в операционной системе George 3 на ICL. 1907F. Компилятор бесплатно распространялся компанией International Computers Limited (ICL) от имени Royal Radar Establishment (RRE).

Ограничения в составленном языке

Это вопрос морали. У нас есть Библия, а вы грешите!
- Майю

Чтобы разрешить однопроходную компиляцию, АЛГОЛ 68-R реализовал подмножество языка, определенного в исходном отчете:

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

Многие из этих ограничений были приняты в пересмотренном отчете по АЛГОЛу 68.

Спецификация перед использованием

Чтобы позволить компиляцию за один проход, Алгол 68-R настаивал на том, чтобы все идентификаторы были указаны (объявлены) перед использованием.

Стандартная программа:

proceven = (intnumber) bool: (number = 0 | true| нечетное (абс(число - 1))); procodd = (intnumber) bool: (number = 0 | false| even (abs( номер 1)));

необходимо переписать как:

proc(int) boolodd; proceven = (intnumber) bool: (number = 0 | true| odd (abs( номер 1))); odd: = (intnumber) bool: (number = 0 | false| even (abs(number - 1))) ;

Чтобы разрешить рекурсивное объявление режимов (типов), было использовано специальное объявление режима заглушки, чтобы сообщить компилятору, что предстоящий символ был режимом, а не оператором:

modeb; modea= структура(ссылкаbb); режимb= [1:10] refa;

Без процедуры

На стандартном языке процедура принуждение может в сильном контексте преобразовать выражение некоторого типа в процедуру, возвращающую этот тип. Это может быть использовано для реализации вызова по имени.

. Другой случай, когда использовалась процедура, - это объявление процедур в объявлении:

procx plus 1 = int: х + 1;

правая часть была приведением x + 1к целому числу, которое затем было преобразовано в процедуру, возвращающую целое число.

Команда ALGOL 68-R сочла это слишком трудным для решения и внесла два изменения в язык. Принуждение процедуры было отброшено, а форма mode: expression была переопределена как обозначение процедуры, при этом приведение типов обозначалось явным символом val:

real: x coприведение к вещественномув АЛГОЛе 68 coвещественноезначениеx coприведение к вещественномув АЛГОЛе 68-R co

Код, имеющий действительный использование для вызова по имени (например, устройство Дженсена ) может просто передать обозначение процедуры:

procsum = (intlo, hi, proc(int) realterm) real: beginrealtemp: = 0; дляi отlo доhi dotemp +: = term (i); temp end; print (sum (1, 100, (inti) real: 1 / i))

В версии языка, определенной в исправленном отчете, эти изменения были приняты, хотя форма приведения была немного изменена на режим (выражение).

real(x) coприведение к realв исправленном АЛГОЛЕ 68 co

Explicit void mode

В исходном языке режим voidбыл представлен пустым режимом:

: x: = 3.14; coпреобразование (x: = 3.14) в void coprocendit = gotoend; coпроцедура, возвращающая void co

Команда ALGOL 68-R решила использовать явный символ void, чтобы упростить синтаксический анализ (и повысить читаемость):

voidvalx: = 3,14; coприведение (x: = 3.14) к void coprocendit = void: gotoend; coпроцедура, возвращающая void co

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

Никаких формальных заявителей

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

[15] inta; coфактический оператор объявления, границы 1:15 coref[3:] intb = a; coЭто ошибка coprocx = (ref[1: либо] inta):...

Я думаю, что было разумным опустить границы в формальных заявителях, но я считаю ужасным преступлением опустить либо, либо flex
Линдси

Команда ALGOL 68-R переопределила формальные деклараторы, чтобы они были такими же, как виртуальные деклараторы, которые не включают связанную информацию. Они обнаружили, что это уменьшило двусмысленность при синтаксическом анализе языка и сочли, что это не та функция, которая будет использоваться в рабочих программах.

Если процедуре требуются определенные границы для своих аргументов, она может проверить их сама с помощью операторов upb(верхняя граница) и lwb(нижняя граница).

В Алголе 68-R приведенный выше пример можно было бы переписать следующим образом: (границы a в процедуре будут зависеть от вызывающего).

[15] inta; coфактический объявитель, границы 1:15 corefintb = a [at3]; coиспользовать срез, поэтому b имеет границы 3:17 coprocx = (refinta) void:... coграницы, заданные вызывающей стороной co

В пересмотренном отчете по Алголу 68 формальные границы также были удалены, но указание flexбыло перемещено на место, чтобы его можно было включить в формальные объявления:

[1: flex] inta; coоригинальный АЛГОЛ 68 или АЛГОЛ 68-R coflex[1:] inta; coизмененный АЛГОЛ 68, co
procx = (ref[1: flex] inta):... coИсходный АЛГОЛ 68 coprocx = (ref[] inta) void:... coАЛГОЛ 68-R coprocx = (refflex[] inta) void:... coПересмотренный АЛГОЛ 68 co

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

В АЛГОЛе 68 код можно запускать параллельно, записав parс последующим вспомогательное предложение, например, в:

parbeginпродюсер, потребитель конец

, производитель и потребитель процедур будут выполняться параллельно. Тип семафор (sema) с традиционными операторами P (down) и V (up) предоставляется для системной синхронизации между частями предложения parallel,

Эта функция не была реализована в АЛГОЛе 68-R.

Было написано расширение под названием ALGOL 68-RT, которое использовало функцию подпрограммирования ICL 1900 для обеспечения многопоточности программ на ALGOL 68-R с семантикой, аналогичной современной thread библиотеки. В компилятор не было внесено никаких изменений, только библиотека среды выполнения и компоновщик.

goto нельзя опускать

В АЛГОЛе 68 символ gotoможно было опустить при переходе:

procstop =:...;... beginifx>3 затемstop fi; coпереход, а не вызов co... stop: пропуститьend

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

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

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

В АЛГОЛе 68 объединение - это принуждение, которое производит unionиз составляющего режима, например:

modeibool= union(int, bool); coan ibool- это intили boolcoiboola = true; coboolvalue trueобъединяется с iboolco

В стандартном ALGOL 68 объединение было возможно в устойчивом или сильном контексте, поэтому, например, его можно было применить к операндам формул:

opistrue= (iboola) bool:...; ifистинно1 coзаконно, потому что 1 (int) можно объединить с iboolco, затем...

Найдены разработчики ALGOL 68-R это дало слишком много двусмысленных ситуаций, поэтому объединяющее принуждение ограничивалось сильным контекстом.

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

F00L

Компилятор ALGOL 68-R инициализировал неиспользуемую память значением -6815700.

Это значение было выбрано, потому что:

Это же значение использовалось для представления nil.

Я заметил, что в некоторых из ваших программ-примеров вы ничего не подчеркивая и не зачеркивая.
-
Майю

В языках семейства АЛГОЛ необходимо различать идентификаторы и базовые символы языка. В печатных текстах это обычно достигалось путем печати основных символов жирным шрифтом или подчеркиванием (например, beginили begin ).

В программах с исходным кодом приходилось использовать некоторую технику сглаживания. Во многих АЛГОЛ-подобных языках до АЛГОЛА 68-R это достигалось заключением основных символов в символы одинарных кавычек (например, «начало»). В 68-R основные символы можно было различить, написав их в верхнем регистре, а нижний регистр использовался для идентификаторов.

Поскольку АЛГОЛ 68-R был реализован на машине с 6- битами байтами (и, следовательно, набором из 64 символов), это было довольно сложно и, по крайней мере, первоначально программы должны были быть составлены на бумаге перфоленте с использованием Friden Flexowriter.

Частично на основе опыта Алгола 68-R, пересмотренного отчета по Алголу 68, специфицированному аппаратными представлениями для языка, включая ВЕРХНЮЮ строчку.

Расширения к АЛГОЛу 68

АЛГОЛ 68-R включал расширения для раздельной компиляции и низкоуровневого доступа к машине.

Раздельная компиляция

Поскольку АЛГОЛ 68 является строго типизированным языком, простых библиотечных возможностей, используемых другими языками в системе ICL 1900, было недостаточно. Алгол 68-R поставлялся со своим собственным форматом библиотеки и утилит, которые позволяли разделять режимы, функции, переменные и операторы между отдельно скомпилированными сегментами кода, которые могли храниться в альбомах.

Сегмент, который должен быть доступен в другие сегменты будет заканчиваться списком объявлений, которые будут доступны:

graphlib coимя сегмента cobeginmodegraphdata= структура(...); modegraph= refgraphdata; procновый график = (...) график:...; procdraw graph = (graphg) void:...;... endkeepgraph, new graph, draw graph finish

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

myprog сgraphlib изgraphalbum begingraphg = новый график (...);... нарисовать график (g);... endfinish

Низкоуровневый доступ к системе

Будучи строго типизированным языком высокого уровня, АЛГОЛ 68 предотвращает прямой доступ программ к низкоуровневому оборудованию. Например, не существует операторов для адресной арифметики.

Поскольку ALGOL 68-R не компилировался в стандартный полукомпилированный (готовый к связыванию) формат ICL, было необходимо расширить язык, чтобы обеспечить функции в ALGOL 68-R для написания кода, который обычно был бы написан на язык ассемблера. Машинные инструкции могут быть написаны inline, внутри разделов code... edocи операторов управления адресами inc, dec, dif, asбыли добавлены.

Пример использования операции George peri для выдачи команды:

[1: 120] CHAR бафф; INT unitnumber; STRUCT (режим типа BITS, ответ, число INT, адрес REF CHAR): = (8r47400014,0,120, buff [1]);...; КОД 0,6 / номер устройства; 157,6 / typemode OF control area EDOC
Доступность

Копия компилятора ALGOL 68-R, работающего под эмулятором операционной системы George 3, автор: Дэвид Холдсворт (Университет Лидса ), доступен с исходным кодом по Стандартной общественной лицензии GNU (GPL).

Ссылки
Внешние ссылки
  • Алгол 68 Общества истории развития технологий и радара Малверна, сообщение в блоге
Последняя правка сделана 2021-06-07 21:24:51
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте