stringtranslate.com

АЛГОЛ

АЛГОЛ ( / ˈ æ 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) и машинным обучением. [ нужна цитата ]

График внедрения IAL

На сегодняшний день существует не менее 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; в частности, они способны выражать требования, которые во многих других стандартах языков программирования называются «семантикой» и должны быть выражены в склонной к неоднозначности прозе естественного языка, а затем реализованы в компиляторах в виде специального кода, прикрепленного к формальному языку. парсер.

Примеры и переносимость

Сравнение примеров кода

АЛГОЛ 60

(Способ написания жирного текста зависит от реализации, например, «ЦЕЛОЕ» (включая кавычки) для целого числа. Это называется обрезкой .)

процедура 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) управляет форматом вывода с одной цифрой до и шестью после десятичной точки.

АЛГОЛ 68

Следующие примеры кода представляют собой версии 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 (ИАЛ)

Алгол 58 не имел средств ввода-вывода.

Семейство АЛГОЛ 60

Поскольку в АЛГОЛе 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')'); 'КОНЕЦ'

АЛГОЛ 68

Код 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]

дальнейшее чтение

Смотрите также

Рекомендации

  1. ^ Название этой языковой семьи иногда дается в смешанном регистре (Algol 60, архивировано 25 июня 2007 г. в Wayback Machine ), а иногда и полностью в верхнем регистре (ALGOL68, архивировано 13 сентября 2014 г. в Wayback Machine ). Для простоты в этой статье используется АЛГОЛ .
  2. ^ Сборник алгоритмов ACM. Архивировано 17 октября 2011 г. в Wikiwix. Сжатые архивы алгоритмов. АКМ .
  3. ^ О'Хирн, PW; Теннент, РД (сентябрь 1996 г.). «Алголоподобные языки, Введение». Архивировано из оригинала 14 ноября 2011 года.
  4. ^ «Язык программирования ALGOL». Архивировано 6 октября 2016 г. в Wayback Machine , Мичиганский университет в Дирборне.
  5. ^ Бэкус, Джон Уорнер ; Бауэр, Фридрих Людвиг ; Грин, Жюльен; Кац, Чарльз ; Маккарти, Джон ; Наур, Питер ; Перлис, Алан Джей ; Рутисхаузер, Хайнц ; Самельсон, Клаус ; Вокуа, Бернар ; Вегштейн, Джозеф Генри ; ван Вейнгаарден, Адриан ; Вуджер, Майкл (май 1960 г.). Наур, Питер (ред.). «Отчет по алгоритмическому языку АЛГОЛ 60». Коммуникации АКМ . Копенгаген, Дания. 3 (5): 299–314. дои : 10.1145/367236.367262 . ISSN  0001-0782. S2CID  278290.
  6. ^ «Пересмотренный отчет об алгоритмическом языке Алгол 60» . 1963. Архивировано из оригинала 25 июня 2007 года . Проверено 8 июня 2007 г.
  7. ^ «Транслятор ALGOL 60 для X1» (PDF) . 1961. Архивировано (PDF) из оригинала 9 октября 2022 года . Проверено 7 января 2021 г.
  8. ^ «Пересмотренный отчет об алгоритмическом языке АЛГОЛ 68» (PDF) . 1973. Архивировано (PDF) из оригинала 13 сентября 2014 года . Проверено 13 сентября 2014 г.
  9. ^ Кнут, Дональд Э. (1964). «Нормальная форма Бэкуса против формы Бэкуса Наура». Коммуникации АКМ . 7 (12): 735–736. дои : 10.1145/355588.365140 . S2CID  47537431.
  10. ^ Цитирование премии ACM: Питер Наур. Архивировано 2 апреля 2012 г. в Archive-It , 2005 г.
  11. ^ «Советы по проектированию языка программирования». Архивировано 15 сентября 2009 года в Wayback Machine , CAR Hoare, декабрь 1973 года. Страница 27. (Это утверждение иногда ошибочно приписывают Эдсгеру В. Дейкстре , также участвовавшему в реализации первого компилятора ALGOL 60. )
  12. ^ Дибвиг, РК; и другие. Рис, Джонатан; Клингер, Уильям; Абельсон, Хэл (ред.). «Пересмотренный (3) отчет об алгоритмической языковой схеме (посвящается памяти Алгола 60)». Архивировано из оригинала 14 января 2010 года . Проверено 20 октября 2009 г.
  13. ^ "Энциклопедия компьютерных языков". Архивировано из оригинала 27 сентября 2011 года . Проверено 20 января 2012 г.
  14. История компьютерного музея. Архивировано 20 августа 2010 года в Wayback Machine , исторический Zuse-Computer Z23, восстановленный Школой Конрада Цузе в Хюнфельде, для Центра истории компьютерного музея в Маунтин-Вью (Калифорния), США.
  15. ^ Дневной свет, EG (2011). «Сплоченный клич Дейкстры к обобщению: появление рекурсивной процедуры, конец 1950-х - начало 1960-х годов». Компьютерный журнал . 54 (11): 1756–1772. CiteSeerX 10.1.1.366.3916 . doi : 10.1093/comjnl/bxr002. Архивировано из оригинала 12 марта 2013 года. 
  16. Круземан Арец, FEJ (30 июня 2003 г.). «Компилятор Дейкстра-Зонневельда ALGOL 60 для Electrologica X1». Программная инженерия (PDF) . История информатики. Амстердам: Centrum Wiskunde & Informatica. Архивировано (PDF) из оригинала 4 марта 2016 г.
  17. ^ Хоар, Энтони (1980). «Старая одежда императора». Коммуникации АКМ . 24 (2): 75–83. дои : 10.1145/358549.358561 .
  18. ^ Коффман, Элиот. «Все, что мне действительно нужно знать, я узнал в CS1» (PDF) . Архивировано из оригинала (PDF) 12 октября 2012 года . Проверено 20 мая 2012 г.
  19. ^ «ГОГОЛЬ – PDP-1 Алгол 60 (язык компьютера)» . Интернет-историческая энциклопедия языков программирования. Архивировано из оригинала 2 февраля 2018 года . Проверено 1 февраля 2018 г.
  20. ^ Мунье-Кун, Пьер (2014). «Алголь во Франции: от универсального проекта к встроенной культуре». IEEE Анналы истории вычислений . 36 (4): 6–25. дои : 10.1109/MAHC.2014.50. ISSN  1058-6180. S2CID  16684090.
  21. ^ Випперманн, Ханс-Вильм (1968) [15 июня 1967, 1966]. «Определение фон Шранкенцалена в Триплекс-АЛГОЛ». Вычисление (на немецком языке). Карлсруэ, Германия: Springer. 3 (2): 99–109. дои : 10.1007/BF02277452. ISSN  0010-485X. S2CID  36685400.
  22. ^ Ахо, Альфред В .; Сетхи, Рави ; Уллман, Джеффри Д. (1986). Составители: принципы, методы и инструменты (1-е изд.). Аддисон-Уэсли. ISBN 0-201-10194-7., Раздел 7.5 и ссылки в нем
  23. ^ «803 АЛГОЛ». Архивировано 29 мая 2010 г. на Wayback Machine , руководство для Elliott 803 ALGOL.
  24. ^ "Серия ICL 1900: Язык Алгол" . Техническая публикация ICL 3340. 1965 г.
  25. ^ Как ASCII получил обратную косую черту. Архивировано 11 июля 2014 года в Wayback Machine , Боб Бемер.
  26. ^ железный/рунический крест
  27. ^ Символ десятичной степени
  28. ^ Бауманн, Р. (октябрь 1961 г.). «Руководство АЛГОЛ группы АЛКОР, Часть 1» [Руководство АЛГОЛ группы АЛКОР]. Elektronische Rechenanlagen (на немецком языке): 206–212.
  29. ^ Бауманн, Р. (декабрь 1961 г.). «Руководство АЛГОЛ группы АЛКОР, Часть 2» [Руководство АЛГОЛ группы АЛКОР]. Elektronische Rechenanlagen (на немецком языке). 6 : 259–265.
  30. ^ Бауманн, Р. (апрель 1962 г.). «Руководство АЛГОЛ группы АЛКОР, часть 3» [Руководство АЛГОЛ группы АЛКОР]. Elektronische Rechenanlagen (на немецком языке). 2 .
  31. ^ "ГОСТ 10859". Архивировано из оригинала 16 июня 2007 года . Проверено 5 июня 2007 г.
  32. Брухис, Леонид (22 января 2008 г.). «Пересмотренное предложение по кодированию символа десятичной степени» (PDF) . www.unicode.org . ISO/IEC JTC 1/SC 2/WG 2. Архивировано (PDF) из оригинала 31 июля 2015 г. . Проверено 24 января 2016 г. Это означает, что необходимость в перекодировании программного обеспечения и документации на основе ГОСТ все еще может возникнуть: устаревшие числовые алгоритмы (некоторые из которых могут представлять интерес, например, для автоматической посадки шаттла «Буран»…), оптимизированные для операций с плавающей запятой, не соответствующих IEEE представление БЭСМ-6 нельзя просто перекомпилировать и ожидать, что оно будет работать надежно, и может потребоваться некоторое вмешательство человека.

Внешние ссылки