Руководство по АЛГОЛ-20 от 1965 года | |
Парадигма | Процедурное, императив, структурированный |
---|---|
Семья | АЛГОЛ |
Разработано | Бауэром, Боттенбрухом, Рутисхаузером, Самельсон, Бэкус, Кац, Перлис, Вегштейн, Наур, ван Вейнгаарден, Вудгер, Маккарти |
Впервые появилось | 1958; 62 года назад (1958) |
Дисциплина набора текста | Статический, сильный |
Объем | Лексический |
Под влиянием | |
Большинство последующих императивных языков (так называемые АЛГОЛ-подобные языки ) например PL / I, Simula, BCPL, B, Pascal, C |
ALGOL(/ ˈælɡɒl, -ɡɔːl / ; сокращение от " Алгоритмический язык") - это семейство императивных компьютерных языков программирования, первоначально разработанных в 1958 году. Алгол сильно повлиял на многие другие языки и был стандартным методом для описание алгоритма, используемое Association for Computing Machinery (ACM) в учебниках и академических источниках до появления объектно-ориентированных языков на протяжении более тридцати лет.
В том смысле, что синтаксис большинства современных языков является «алголо-подобным», он, возможно, был самым влиятельным из четырех языков программирования высокого уровня, среди которых он был примерно современным: FORTRAN, Лисп и КОБОЛ. Он был разработан, чтобы избежать некоторых предполагаемых проблем с FORTRAN, и в конечном итоге привел к появлению многих других языков программирования, включая PL / I, Simula, BCPL, B, Pascal и C.
ALGOL представил кодовые блоки и пары begin
... end
для их разделения. Это был также первый язык, реализующий определения вложенных функций с лексической областью видимости. Более того, это был первый язык программирования, который уделил особое внимание формальному определению языка и в отчете Algol 60 представил форму Бэкуса – Наура, основную формальную грамматику обозначение для языкового дизайна.
Существовали три основные спецификации, названные по годам, в которые они были впервые опубликованы:
АЛГОЛ 68 существенно отличается от АЛГОЛА 60 и не был хорошо принят, так что в целом «Алгол» означает АЛГОЛ 60 и его диалекты.
Международный алгебраический язык (IAL), переименованный в АЛГОЛ 58, имел большое влияние и, как правило, считался предком большинства современных языков программирования (так называемых языков, подобных Алголу). Кроме того, объектный код ALGOL был простой, компактной и основанной на стеке архитектурой набора инструкций, обычно используемой при обучении конструкции компилятора и других языков высокого порядка; первым из которых обычно считается Алгол.
Алгол был разработан совместно комитетом европейских и американских компьютерных ученых на встрече в 1958 году в Швейцарском федеральном технологическом институте в Цюрихе (ETH Zurich ; см. АЛГОЛ 58 ). Он определил три разных синтаксиса: синтаксис ссылки, синтаксис публикации и синтаксис реализации. Различный синтаксис позволял использовать разные имена ключевых слов и соглашения для десятичных знаков (запятые и точки) для разных языков.
АЛГОЛ использовался в основном учеными-компьютерщиками в США и Европе. Его использованию в коммерческих приложениях препятствовало отсутствие стандартных средств ввода / вывода в его описании и отсутствие интереса к языку со стороны крупных поставщиков компьютеров, кроме Burroughs Corporation. Однако АЛГОЛ 60 стал стандартом для публикации алгоритмов и оказал глубокое влияние на развитие языков в будущем.
Семейное древо Алгола, Фортрана и COBOL династии языков программированияДжон Бэкус разработал метод Бэкуса в нормальной форме для описания языков программирования специально для АЛГОЛА 58. Он был переработан и расширен Питером Науром для АЛГОЛА 60, и по предложению Дональда Кнута был переименован в форму Бэкуса-Наура.
Питер Наур: «Как редактор Бюллетень ALGOL Я был вовлечен в международные дискуссии по этому языку и в ноябре 1959 года был выбран в состав группы разработчиков европейских языков. В этом качестве я был редактором отчета ALGOL 60, подготовленного в результате встречи ALGOL 60 в Париже в январе 1960 года ».
На встрече в Париже (с 1 по 16 января) присутствовали следующие люди:
Алан Перлис ярко описал встречу: " Встречи были изнурительными, бесконечными и волнующими. Одно раздражало, когда его хорошие идеи отбрасывались вместе с плохими идеями других. Тем не менее усердие сохранялось на протяжении всего периода. Химия 13 была превосходной ».
АЛГОЛ 60 вдохновил многие языки, которые последовали за ним. Тони Хоар заметил:« Это язык, настолько опередивший свое время, что он был не только улучшение по сравнению с его предшественниками, но также и почти со всеми его преемниками ». Язык программирования Scheme, вариант Lisp, который принял блочную структуру и лексическую область видимости ALGOL, также принял формулировку «Пересмотренный отчет по схеме алгоритмического языка» для своих стандартов документов, посвященных ALGOL.
Как отметил Питер Ландин, язык Algol был первый язык, который органично сочетает императивные эффекты с (вызовом по имени) лямбда-исчислением. Возможно, самая элегантная формулировка языка принадлежит Джону К. Рейнольдсу, и он best демонстрирует свою синтаксическую и семантическую чистоту. Идеализированный Алгол Рейнольдса также представил убедительный методологический аргумент относительно пригодности l обычные эффекты в контексте языков с вызовом по имени, которые нужно противопоставить глобальным эффектам, используемым в языках с вызовом по значению, таких как ML. Концептуальная целостность языка сделала его одним из основных объектов семантических исследований, наряду с Программирование вычислимых функций (PCF) и ML.
Чтобы дата, когда было как минимум 70 дополнений, расширений, производных и подъязыков Алгола 60.
Имя | Год | Автор | Страна | Описание | Целевой ЦП |
---|---|---|---|---|---|
ZMMD- реализация | 1958 | Фридрих Л. Бауэр, Хайнц Рутисхаузер, Клаус Самельсон, Герман Боттенбрух | Германия | реализация ALGOL 58 | Z22 (позже Zuse Z23 поставлялся с компилятором Algol 60) |
X1 АЛГОЛ 60 | август 1960 | Эдсгер В. Дейкстра и Яап А. Зонневельд | Нидерланды | Первая реализация Алгола 60 | Electrologica X1 |
Эллиотт АЛГОЛ | 1960-е годы | С. AR Hoare | UK | Тема лекции 1980 Тьюринга | Elliott 803, Elliott 503, Elliott 4100 series |
JOVIAL | 1960 | Джулс Шварц | США | A DOD HOL до Ada | Разное (см. Статью) |
Алгол Берроуза (несколько вариантов) | 1961 | Burroughs Corporation (с участием Hoare, Dijkstra и др.) | USA | Основа Burroughs (и теперь Unisys MCP на основе) компьютеров | больших систем Burroughs, а также их среднего уровня. |
1961 | Технологический институт Case | США | Simula изначально была заключена по контракту как расширение моделирования Case ALGOL | UNIVAC 1107 | |
1961 | USA | Для системы разделения времени ODIN | PDP-1 | ||
1961 | Питер Наур, Йорн Йенсен | Дания | Реализация полного Algol 60 | DASK в Regnecentralen | |
Дартмут ALGOL 30 | 1962 | Томас Юджин Курц и др. | США | LGP-30 | |
1962 | Италия | ||||
Переводчик Алгола | 1962 | G. ван дер Мей и В.Л. van der Poel | Нидерланды | Staatsbedrijf der Posterijen, Telegrafie en Telefonie | ZEBRA |
1963 | UK | English Electric Company KDF9 | |||
1963 | США | Тест компилятора компилятора META II | |||
Whetstone | 1964 | Брайан Рэнделл и LJ Russell | UK | Подразделение атомной энергии компании English Electric Company. Предшественник Ferranti Pegasus, National Physical Laboratories ACE и English Electric DEUCE реализации. | English Electric Company KDF9 |
1965 | Норвегия | UNIVAC | |||
ALGEK | 1965 | СССР | АЛГЭК на базе АЛГОЛ-60 и COBOL для экономических задач | Минск -22 | |
ALGOL W | 1966 | Никлаус Вирт | США | Предлагаемый преемник ALGOL 60 | IBM System / 360 |
1966 | publ. А. Виил, М. Котли, М. Рахенди, | Эстонская ССР | Минск-22 | ||
1967 | Группа GAMS (ГАМС, группа автоматизации программирования для машин среднего класса), сотрудничество Академий Comecon наук | Comecon | Минск-22, позже ES EVM, BESM | ||
1967 | Польша | Польский компьютер | |||
Simula 67 | 1967 | Оле-Йохан Даль и Кристен Найгаард | Норвегия | Алгол 60 с классами | UNIVAC 1107 |
Китайский Алгол | 1972 | Китай | Китайские иероглифы, выраженные через систему символов | ||
DG / L | 1972 | USA | DG Eclipse семейство компьютеров | ||
S-algol | 1979 | Рон Моррисон | UK | Добавление ортогональных типов данных с предполагаемым использованием в качестве языка обучения | PDP-11 с последующей реализацией на Java VM |
Диалекты Берроуза включали особую загрузку диалекты, такие как ESPOL и NEWP. Последний до сих пор используется для системного программного обеспечения Unisys MCP.
АЛГОЛ 60, как официально определено, не имел средств ввода / вывода ; реализации определяли свои собственные способы, которые редко были совместимы друг с другом. Напротив, АЛГОЛ 68 предлагает обширную библиотеку средств передачи (ввода / вывода).
АЛГОЛ 60 допускает две стратегии оценки для передачи параметра : общий вызов по значению и вызов по -имя. Вызов по имени имеет определенные эффекты в отличие от вызова по ссылке. Например, без указания параметров в качестве значения или ссылки невозможно разработать процедуру, которая будет менять местами значения двух параметров, если фактические параметры, которые передаются, являются целочисленной переменной и массивом, который индексируется той же целочисленной переменной.. Подумайте о передаче указателя на swap (i, A [i]) в функцию. Теперь, когда на своп ссылаются, он переоценивается. Скажем, i: = 1 и A [i]: = 2, поэтому каждый раз, когда используется своп, он будет возвращать другую комбинацию значений ([1,2], [2,1], [1,2] и т. Д. ). Аналогичная ситуация возникает со случайной функцией, переданной как фактический аргумент.
Call-by-name известен многим разработчикам компиляторов благодаря интересным «thunks », которые используются для его реализации. Дональд Кнут разработал «тест« мужчина или мальчик »для разделения компиляторов, которые правильно реализовали« рекурсию и нелокальные ссылки ». Этот тест содержит пример вызова по имени.
АЛГОЛ 68 был определен с использованием двухуровневого грамматического формализма, изобретенного Адрианом ван Вейнгаарденом и носящего его имя. Грамматики Ван Вейнгардена используют контекстно-свободную грамматику для генерации бесконечного набора продуктов, которые распознают конкретную программу на Алголе 68; в частности, они способны выражать требования, которые во многих других стандартах языков программирования обозначены как "семантика" и должны быть выражены в нечеткой тексте естественного языка, а затем реализованы в компиляторах как специальный код, прикрепленный к формальному языку. парсер.
(способ написания полужирного текста зависит от реализации, например, ' INTEGER '- кавычки включены - для целого числа. Это известно как штриховка.)
процедураAbsmax (a) Размер: (n, m) Результат :( y) Индексы: (i, k); значениеn, m; массивa; целое числоn, m, i, k; действительныйy; комментарийАбсолютно наибольший элемент матрицы a размером n на m переносится в y, а нижние индексы этого элемента в i и k; beginцелое числоp, q; у: = 0; i: = k: = 1; дляp: = 1 шаг1 доn doдляq: = 1 шаг1 доm doifabs (a [p, q])>y затемbeginy: = abs (a [p, q]); i: = p; k: = q endendAbsmax
Вот пример того, как создать таблицу, используя АЛГОЛ Elliott 803.
ТЕСТ АЛГОЛА С ПЛАВАЮЩЕЙ ТОЧКОЙ 'НАЧАТЬ REAL A, B, C, D' ПРОЧИТАТЬ D 'ДЛЯ A: = 0,0 ШАГ D ДО 6,3 НАЧАТЬ ПУАНСОН (3), £ £ L ??' B: = SIN (A) 'C: = COS (A)' ПУАНСОН (3), SAMELINE, ВЫРАВНЕН (1,6), A, B, C 'КОНЕЦ' КОНЕЦ '
ПУАНСОН (3 ) отправляет вывод на телетайп, а не перфоратор.
SAMELINE подавляет возврат каретки + перевод строки, обычно печатаемый между аргументами.
ALIGNED (1,6) управляет форматом вывода с 1 цифрой до и 6 после десятичная точка.
Следующие примеры кода являются версиями АЛГОЛА 68 вышеупомянутых примеров кода АЛГОЛА 60.
Реализации АЛГОЛА 68 использовали подходы АЛГОЛА 60 к сглаживанию. В случае АЛГОЛА 68 лексемы с полужирным шрифтом являются зарезервированными словами, типами (режимs) или операторами.
procabs max = ([,] reala, refrealy, refinti, k) real: комментарийАбсолютно наибольший элемент матрицы a размером ⌈a на 2⌈a передается в y, а нижние индексы этого элемента к i и k; commentbeginrealy: = 0; i: = ⌊a; k: = 2⌊a; дляp от⌊a до⌈a doдляq от2⌊a до2⌈a doifabsa [p, q]>y , затемy: = absa [p, q]; i: = p; k: = q fiodod; y end# abs max #
Примечание: нижняя (⌊) и верхняя (⌈) границы массива и нарезка массива напрямую доступны программисту.
алгоритм algol68 с плавающей запятой: (reala, b, c, d; # printf - отправляет вывод в файлstand out. # # Printf ($ p $); - выбирает новую страницу # printf (($ pg $, "Enter d:")); read (d); дляшаг из0 whilea: = step * d; a <= 2*pi doprintf ($ l $); # $ l $ - выбирает новую строку. # B: = sin (a); c: = cos (a); printf (( $ zd.6d $, a, b, c)) # форматирует вывод с 1 цифрой до и 6 после десятичной точки. # od)
Варианты и отсутствие переносимости программ от одной реализации к другой легко продемонстрировать с помощью классической программы hello world.
АЛГОЛ 58 не имеет средств ввода-вывода.
Поскольку в Алголе 60 не было средств ввода-вывода, в Алголе нет переносимой программы hello world. Следующие три примера взяты из расширенного алгоритма Берроуза. Первые два прямого вывода на интерактивный терминал они выполняются. Первый использует символьный массив, похожий на C. Язык позволяет использовать идентификатор массива в качестве указателя на массив и, следовательно, в операторе REPLACE.
НАЧАТЬ ФАЙЛ F (KIND = REMOTE); EBCDIC ARRAY E [0:11]; ЗАМЕНИТЕ E НА «ПРИВЕТ, МИР!»; ЗАПИСАТЬ (F, *, E); КОНЕЦ.
Более простая программа, использующая встроенный формат:
НАЧАТЬ ФАЙЛ F (KIND = REMOTE); ЗАПИСАТЬ (F, <"HELLO WORLD!">); КОНЕЦ.
Еще более простая программа, использующая оператор Display. Обратите внимание, что его вывод будет в системной консоли ('SPO'):
BEGIN DISPLAY («HELLO WORLD!») END.
Альтернативный пример использования ввода-вывода Elliott Algol выглядит следующим образом. Эллиотт Алгол использовал разные символы для "кавычки-открытой строки" и "кавычки-закрытия":
программаHiFolks; начатьprint'Hello world'; конец;
Вот версия для Elliott 803 Algol (A104). Стандартный Elliott 803 использовал бумажную ленту с 5 отверстиями и, следовательно, имел только верхний регистр. В коде отсутствовали кавычки, поэтому для открытой кавычки использовался знак фунта стерлингов Великобритании и? (Знак вопроса) для закрытия цитаты. Специальные последовательности были заключены в двойные кавычки (например, на телетайпе появилась новая строка с помощью £$ L ??).
HIFOLKS 'НАЧАТЬ ПЕЧАТЬ £ HELLO WORLD £ L ??' END '
В версии ICT 1900 series версия ввода-вывода Algol допускала ввод с бумажной ленты или перфокарты. Бумажная лента в «полном» режиме допускает строчные буквы. Вывод был на строчный принтер. Открывающая и закрывающая кавычки были представлены с помощью '(' и ')' и пробелов через%.
'BEGIN' WRITE TEXT ('(' HELLO% WORLD ')'); 'КОНЕЦ'
Алгол 68код был опубликован с зарезервированными словами, обычно в нижнем регистре, но выделенными жирным или подчеркнутым.
beginprintf (($ gl $, "Hello, world!")) end
На языке "Algol 68 Report" функции ввода / вывода собирательно назывались «Транспут».
Алголы были задуманы в то время, когда наборы символов были разнообразными и быстро развивались; Кроме того, АЛГОЛЫ были определены так, что требовались только прописные буквы.
1960: IFIP - Язык и отчет Algol 60 включают несколько математических символов, которые доступны на современных компьютерах и операционных системах, но, к сожалению, не поддерживаются большинством вычислительных систем в то время. Например: ×, ÷, ≤, ≥, ≠, ¬, ∨, ∧, ⊂, ≡, ␣ и ⏨.
Сентябрь 1961 г.: ASCII - в набор символов ASCII, тогда еще находившийся на ранней стадии разработки, был добавлен символ \ (обратная косая черта), чтобы поддержка логических операторов ALGOL / \ и \/.
1962: ALCOR - этот набор символов включал необычный рунический крестик «᛭» для умножения и «⏨» «Десятичный экспоненциальный знак для записи с плавающей запятой.
1964: ГОСТ - Советский стандарт 1964 года ГОСТ 10859 разрешал кодирование 4-битных, 5-битных, 6 -битовые и 7-битные символы в ALGOL.
1968: «Отчет Algol 68» - использовались существующие символы ALGOL, а затем были приняты →, ↓, ↑, □, ⌊, ⌈, ⎩, ⎧, ○ , ⊥ и ¢, которые можно найти на клавиатуре IBM 2741 со вставленными typeball (или мячом для гольфа) печатающими головками (например, Мяч для гольфа APL ). Они стали доступны в середине 1960-х, когда разрабатывалась АЛГОЛ 68. Отчет был переведен на русский, немецкий, французский и болгарский языки и позволял программировать на языках с более крупными наборами символов, например, кириллица алфавит советского БЭСМ -4. Все символы ALGOL также являются частью стандарта Unicode, и большинство из них доступно в нескольких популярных шрифтах .
2009 Октябрь: Unicode - ⏨
(Десятичный экспоненциальный символ) для записи с плавающей запятой был добавлен в Unicode 5.2 для обратной совместимости с исторической программой Buran программным обеспечением ALGOL.