АЛГОЛ ( / ˈ æ l ɡ ɒ l , - ɡ ɔː l / ; сокращение от « Алгоритмический язык ») [1] — семейство императивных языков компьютерного программирования, первоначально разработанных в 1958 году. АЛГОЛ сильно повлиял на многие другие языки и был стандартным методом. для описания алгоритма , используемого Ассоциацией вычислительной техники (ACM) в учебниках и академических источниках более тридцати лет. [2]
В том смысле, что синтаксис большинства современных языков «похож на Алгол», [3] он, возможно, оказал большее влияние, чем три других языка программирования высокого уровня, среди которых он был примерно современным: FORTRAN , Lisp и COBOL . [4] Он был разработан, чтобы избежать некоторых предполагаемых проблем с FORTRAN, и в конечном итоге породил множество других языков программирования, включая PL/I , Simula , BCPL , B , Pascal , Ada и C.
В АЛГОЛе были представлены блоки кода и пары begin
... end
для их разграничения. Это был также первый язык, реализовавший определения вложенных функций с лексической областью действия . Более того, это был первый язык программирования, в котором подробное внимание уделялось формальному определению языка, и в отчете об Алголе 60 была представлена форма Бэкуса-Наура , основная формальная грамматическая запись для проектирования языка.
Существовало три основные спецификации, названные в честь года их первой публикации:
АЛГОЛ 68 существенно отличается от АЛГОЛА 60 и не был принят хорошо [ по мнению кого? ] поэтому под словом «Алгол» обычно понимают АЛГОЛ 60 и его диалекты. [ нужна цитата ]
АЛГОЛ был разработан совместно комитетом европейских и американских ученых-компьютерщиков на встрече в 1958 году в Швейцарском федеральном технологическом институте в Цюрихе (см. АЛГОЛ 58 ). [ нужна цитация ] Он определил три разных синтаксиса: ссылочный синтаксис, синтаксис публикации и синтаксис реализации, синтаксисы, которые позволяли ему использовать разные имена ключевых слов и соглашения для десятичных точек (запятые или точки) для разных языков. [ нужна цитата ]
АЛГОЛ использовался в основном учеными-компьютерщиками в США и Европе; коммерческим приложениям препятствовало отсутствие стандартных средств ввода/вывода в его описании, а также отсутствие интереса к языку со стороны крупных поставщиков компьютеров (кроме Burroughs Corporation ). [ нужна цитация ] АЛГОЛ 60, однако, стал стандартом для публикации алгоритмов и оказал глубокое влияние на будущее развитие языка. [ по мнению кого? ]
Джон Бэкус разработал метод нормальной формы Бэкуса для описания языков программирования специально для АЛГОЛа 58. Он был переработан и расширен Питером Науром для АЛГОЛа 60 и по предложению Дональда Кнута переименован в форму Бэкуса-Наура . [9]
Питер Наур: «Как редактор бюллетеня АЛГОЛ, я был вовлечен в международные дискуссии по этому языку и в ноябре 1959 года был выбран членом европейской группы разработчиков языков. В этом качестве я был редактором отчета об АЛГОЛ 60, подготовленного в результате встречи АЛГОЛ-60 в Париже в январе 1960 года». [10]
На встрече в Париже (с 1 по 16 января) присутствовали следующие люди: [ нужна ссылка ]
Алан Перлис дал яркое описание встречи: «Встречи были утомительными, бесконечными и волнующими. Человек раздражался, когда хорошие идеи одного человека отбрасывались вместе с плохими идеями других. Тем не менее, усердие сохранялось в течение всего периода. 13 было превосходно». [ Эта цитата нуждается в цитировании ]
АЛГОЛ 60 вдохновил множество последовавших за ним языков. Тони Хоар заметил: «Это язык, настолько опередивший свое время, что он был усовершенствованием не только своих предшественников, но и почти всех своих преемников». [11] Язык программирования Scheme , вариант Lisp , который принял блочную структуру и лексический объем ALGOL, также принял формулировку «Пересмотренный отчет об алгоритмической языковой схеме» для своих стандартных документов в честь ALGOL. [12]
Как заметил Питер Ландин , [ нужна цитация ] ALGOL был первым языком, в котором органично сочетались императивные эффекты с ( вызовом по имени ) лямбда-исчислением . [ нужна цитата ] Возможно, самая элегантная формулировка языка принадлежит Джону К. Рейнольдсу , и она лучше всего демонстрирует свою синтаксическую и семантическую чистоту. [ по мнению кого? ] Идеализированный АЛГОЛ Рейнольдса также представил убедительный методологический аргумент относительно пригодности локальных эффектов в контексте языков с вызовом по имени, в отличие от глобальных эффектов, используемых языками с вызовом по значению, такими как ML . [ нужна цитация ] Концептуальная целостность языка сделала его одним из основных объектов семантических исследований, наряду с программированием вычислимых функций (PCF) и машинным обучением. [ нужна цитата ]
На сегодняшний день существует не менее 70 дополнений, расширений, производных и подъязыков Алгола 60. [13]
Диалекты Берроуза включали специальные диалекты начальной загрузки, такие как ESPOL и NEWP . Последний до сих пор используется для системного программного обеспечения Unisys MCP.
Алгол 60 в официальном определении не имел средств ввода-вывода ; реализации определяли свои собственные способами, которые редко были совместимы друг с другом. Напротив, АЛГОЛ 68 предлагал обширную библиотеку средств передачи (ввода/вывода).
АЛГОЛ 60 допускал две стратегии оценки передачи параметров : общий вызов по значению и вызов по имени . Вызов по имени имеет определенные эффекты в отличие от вызова по ссылке . Например, без указания параметров как value или reference невозможно разработать процедуру, которая будет менять местами значения двух параметров, если фактические передаваемые параметры представляют собой целочисленную переменную и массив, индексированный той же целочисленной переменной. . [22] Представьте себе передачу указателя на swap(i, A[i]) в функцию. Теперь, когда каждый раз обращаются к свопу, он пересчитывается. Скажем, i := 1 и A[i] := 2, поэтому при каждом обращении к swap он будет возвращать другую комбинацию значений ([1,2], [2,1], [1,2] и т. д. ). Аналогичная ситуация возникает со случайной функцией, переданной в качестве фактического аргумента.
Функция Call-by-name известна многим разработчикам компиляторов благодаря интересным « thunks », которые используются для ее реализации. Дональд Кнут разработал « тест мужчины или мальчика » для разделения компиляторов, которые правильно реализовали « рекурсию и нелокальные ссылки». Этот тест содержит пример вызова по имени.
Алгол 68 был определен с использованием двухуровневого грамматического формализма, изобретенного Адрианом ван Вейнгаарденом и носящего его имя. Грамматики Ван Вейнгаардена используют контекстно-свободную грамматику для создания бесконечного набора продуктов, которые распознают конкретную программу ALGOL 68; в частности, они способны выражать требования, которые во многих других стандартах языков программирования называются «семантикой» и должны быть выражены в склонной к неоднозначности прозе естественного языка, а затем реализованы в компиляторах в виде специального кода, прикрепленного к формальному языку. парсер.
(Способ написания жирного текста зависит от реализации, например, «ЦЕЛОЕ» (включая кавычки) для целого числа. Это называется обрезкой .)
процедура Absmax(a) Размер:(n, m) Результат:(y) Индексы:(i, k); значение n, м; массив а; целое число n, m, i, k; правда ;комментарий Абсолютный наибольший элемент матрицы a размером n на m, копируется в y, а индексы этого элемента в i и k;начать целое число p, q; у := 0; я := к := 1; for p := 1 шаг 1 до n делать for q := 1 шаг 1 до m делать if abs(a[p, q]) > y then start y := abs(a[p, q]); я := р; к := q конец конец Абсмакс
Вот пример того, как создать таблицу с помощью Elliott 803 ALGOL. [23]
АЛГОЛ ТЕСТ С ПЛАВАЮЩЕЙ ТОЧКОЙ' НАЧИНАЙТЕ НАСТОЯЩЕЕ A,B,C,D' ЧИТАЙТЕ Д' ДЛЯ A:= 0,0 ШАГ D ДО 6,3 DO НАЧИНАТЬ ПУФОН ДЛЯ ПЕЧАТИ(3),££L??' Б := SIN(A)' C := COS(A)' ПУФОН ДЛЯ ПЕЧАТИ(3),ТО ЖЕ ЛИНИИ,СОВМЕЩЕННЫЙ(1,6),A,B,C' КОНЕЦ КОНЕЦ'
PUNCH(3) отправляет вывод на телетайп, а не на перфоратор.
SAMELINE подавляет возврат каретки + перевод строки, обычно выводимый между аргументами.
ALIGNED(1,6) управляет форматом вывода с одной цифрой до и шестью после десятичной точки.
Следующие примеры кода представляют собой версии ALGOL 68 приведенных выше примеров кода ALGOL 60.
Реализации ALGOL 68 использовали подходы ALGOL 60 к ограничению . В случае Алгола 68 токены, выделенные жирным шрифтом, представляют собой зарезервированные слова, типы (режимы) или операторы.
proc abs max = ([,] real a, ref real y, ref int i, k) real : comment Абсолютный наибольший элемент матрицы a размером ⌈a на 2⌈aпередается в y, а индексы этого элемента в i и k; начало комментария реальное y := 0; я := ⌊а; к := 2⌊а; для p от ⌊a до ⌈a do для q от 2⌊a до 2⌈a do if abs a[p, q] > y then y := abs a[p, q]; я := р; к := q фи од од ; йконец # абс макс #
Примечание. Нижняя (⌊) и верхняя (⌈) границы массива, а также срез массива доступны непосредственно программисту.
Тест algol68 с плавающей запятой:( реальные а, б, в, г; # printf – отправляет вывод в файл . # # printf($p$); – выбирает новую страницу # printf(($pg$,"Введите d:")); читать (д); для шага от 0 while a:=step*d; a <= 2*pi do printf($l$); # $l$ — выбирает новую строку . # б := грех(а); с := соз(а); printf(($zd.6d$,a,b,c)) # форматирует вывод с 1 цифрой до и 6 после десятичной точки. # од)
Вариации и отсутствие переносимости программ из одной реализации в другую легко демонстрирует классическая программа hello world . [ нужна цитата ]
Алгол 58 не имел средств ввода-вывода.
Поскольку в АЛГОЛе 60 не было средств ввода-вывода, в АЛГОЛе нет переносимой программы hello world . Следующие три примера находятся в расширенном алгоритме Берроуза. Первые два напрямую выводятся на интерактивный терминал, на котором они запущены. Первый использует массив символов, аналогичный C. Язык позволяет использовать идентификатор массива в качестве указателя на массив и, следовательно, в инструкции REPLACE.
НАЧАТЬ ФАЙЛ F ( ВИД = УДАЛЕННЫЙ ); EBCDIC МАССИВ E [ 0:11 ] ; _ ЗАМЕНИТЕ E НА «HELLO WORLD!» ; ЗАПИСАТЬ ( F , * , E ); КОНЕЦ .
Более простая программа, использующая встроенный формат:
НАЧАТЬ ФАЙЛ F ( ВИД = УДАЛЕННЫЙ ); WRITE ( F , < "HELLO WORLD!" > ); КОНЕЦ .
Еще более простая программа, использующая оператор Display. Обратите внимание, что его выходные данные попадут на системную консоль («SPO»):
НАЧАЛО ОТОБРАЖЕНИЯ ( «ПРИВЕТ, МИР!» ) КОНЕЦ .
Альтернативный пример использования ввода-вывода Elliott Algol выглядит следующим образом. Эллиот Алгол использовал разные символы для «цитат открытой строки» и «кавычек закрытой строки», представленных здесь как ' и ' .
программа HiFolks ; начало печати ' Привет, мир ' конец ;
Ниже представлена версия от Elliott 803 Algol (A104). В стандартном Elliott 803 использовалась бумажная лента с пятью отверстиями, поэтому в нем были только заглавные буквы. В коде отсутствовали символы кавычек, поэтому для открытой кавычки использовался £ (знак британского фунта), а ? (Знак вопроса) для закрытия цитаты. Специальные последовательности заключались в двойные кавычки (например, ££L?? выводил на телетайпе новую строку).
ПРИВЕТ НАРОД' НАЧИНАТЬ НАПЕЧАТАЙТЕ £HELLO WORLD£L??' КОНЕЦ'
Версия Algol I/O серии ICT 1900 позволяла вводить данные с бумажной ленты или перфокарты. В режиме «заполнения» бумажной ленты разрешен нижний регистр. Вывод осуществлялся на построчный принтер. Символы открывающей и закрывающей кавычки были представлены с помощью символов «(» и «)» и пробелов через %. [24]
'НАЧИНАТЬ' НАПИСАТЬ ТЕКСТ('('HELLO%WORLD')'); 'КОНЕЦ'
Код ALGOL 68 был опубликован с зарезервированными словами, обычно написанными строчными буквами, но выделенными жирным шрифтом или подчеркнутыми.
начинать printf(($gl$,"Привет, мир!"))конец
На языке «Отчета Алгола 68» средства ввода/вывода назывались «Транспут».
Алголы были задуманы в то время, когда наборы символов были разнообразны и быстро развивались; кроме того, АЛГОЛы были определены так, что требовались только заглавные буквы.
1960: ИФИП – язык и отчет Алгол 60 включали несколько математических символов, которые доступны на современных компьютерах и операционных системах, но, к сожалению, не поддерживались большинством вычислительных систем того времени. Например: ×, ÷, ≤, ≥, ≠, ¬, ∨, ∧, ⊂, ≡, ␣ и ⏨.
Сентябрь 1961 года: ASCII. В набор символов ASCII , находившийся тогда на ранней стадии разработки, был добавлен символ \ (обратная косая черта) для поддержки логических операторов АЛГОЛА /\ и \/ . [25]
1962: ALCOR - этот набор символов включал необычный рунический крест «᛭» [26] для умножения и символ десятичной экспоненты «⏨» [27] для записи с плавающей запятой. [28] [29] [30]
1964: ГОСТ . Советский стандарт ГОСТ 10859 1964 года допускал кодирование 4-битных, 5-битных, 6-битных и 7-битных символов в АЛГОЛе. [31]
1968: «Отчет об Алголе 68» - использовались существующие символы ALGOL и в дальнейшем были приняты символы →, ↓, ↑, □, ⌊, ⌈, ⎩, ⎧, ○, ⊥ и ¢, которые можно найти на клавиатуре IBM 2741 с помощью вставлены печатающие головки печатного мяча (или мяча для гольфа ) (например, мяч для гольфа APL ). Они стали доступны в середине 1960-х годов, когда разрабатывался Алгол 68. Отчет был переведен на русский, немецкий, французский и болгарский языки и позволял программировать на языках с более широким набором символов, например, на кириллице советской БЭСМ -4. Все символы АЛГОЛА также являются частью стандарта Unicode , и большинство из них доступны в нескольких популярных шрифтах .
Октябрь 2009 г.: Unicode - ⏨
(символ десятичной экспоненты) для обозначения с плавающей запятой был добавлен в Unicode 5.2 для обратной совместимости с историческим программным обеспечением ALGOL программы Buran . [32]
{{cite book}}
: CS1 maint: multiple names: editors list (link)Первый том двухтомного набора, который включает введение Питера У. О'Хирна и Роберта Д. Теннента, отчет об Алголе 60 Питера Наура и его коллег, четыре главы Джона К. Рейнольдса и другие главы Кристофера. Стрейчи , Матиас Феллисен , Стивен Уикс , Альберт Р. Мейер , Курт Зибер, Випин Сваруп, Удай С. Редди и Эван Айрлэнд.Это означает, что необходимость в перекодировании программного обеспечения и документации на основе ГОСТ все еще может возникнуть: устаревшие числовые алгоритмы (некоторые из которых могут представлять интерес, например, для автоматической посадки шаттла «Буран»…), оптимизированные для операций с плавающей запятой, не соответствующих IEEE представление БЭСМ-6 нельзя просто перекомпилировать и ожидать, что оно будет работать надежно, и может потребоваться некоторое вмешательство человека.