Простейший язык программирования алгол
Алгол
Алго́л (англ. Algol от англ. algorithmic — алгоритмический и англ. language — язык) — название ряда языков программирования, применяемых при составлении программ для решения научно-технических задач на ЭВМ. Разработан комитетом по языку высокого уровня IFIP в 1958—1960 годах (Алгол 58, Алгол 60). Кардинально переработан в 1964—1968 годах (Алгол 68). Один из первых языков высокого уровня. Был популярен в Европе, в том числе в СССР, в качестве как языка практического программирования, так и академического языка (языка публикации алгоритмов в научных работах), но в США и Канаде не смог превзойти распространённый там Фортран. Оказал заметное влияние на все разработанные позднее императивные языки программирования — в частности, на язык Pascal.
Обычно названием Алгол (без уточнения версии) именуют Алгол 60, в то время как Алгол 68 рассматривается как самостоятельный язык.
Содержание
История
Алгол был разработан в 1958 году на недельной конференции в ETH (Цюрих, Швейцария) как универсальный язык программирования для широкого круга применений, а затем доработан комитетом, созданным Международной федерацией по обработке информации (IFIP). В комитет вошёл ряд ведущих европейских и американских учёных и инженеров-разработчиков языков. Среди них были: Джон Бэкус — один из создателей Фортрана, Джозеф Уэгстен — впоследствии возглавлял комитет по разработке языка Кобол, Джон Маккарти — автор языка Лисп разработанного одновременно с Алголом, Петер Наур — впоследствии доработал «нормальную форму Бэкуса», завершив разработку БНФ, Эдсгер Дейкстра — нидерландский учёный, впоследствии получивший широкую известность как один из создателей структурного программирования и сторонник математического подхода к программированию, будущий лауреат Премии Тьюринга.
Сначала работа столкнулась с большими трудностями непринципиального характера. Так, например, один из членов комитета вспоминал «десятичную бурю» — крайне резкую дискуссию между американскими и европейскими участниками по поводу того, какой именно символ использовать в качестве разделителя целой и дробной части числа. Американцы стояли за точку, европейцы требовали применять традиционную в Европе запятую, и из-за такой мелочи работа оказалась под реальной угрозой срыва. Чтобы избежать конфликтов по мелким вопросам, было решено, что описание Алгола будет трёхуровневым, включающим уровень описаний, публикаций и реализации. Мелкие вопросы, типа выбора между точкой и запятой или используемого алфавита, были вынесены на второй-третий уровень, что позволило относительно быстро решить принципиальные вопросы. На уровне публикаций, согласованном позже, допускалось использование национальных ключевых слов и стандартов представления данных (в том числе и десятичной точки), уровень реализации определял язык совершенно строго — согласно ему должны были строиться трансляторы.
После принятия в 1958 году первой версии описания языка Алгол 58 (первоначально предполагалось назвать язык IAL — International Algebraic Language, но от этого отказались [1] ) довольно быстро были осознаны проблемы, для решения которых комитет сформировал новый вариант стандарта — Алгол 60; он и стал «классическим» Алголом. В 1959 году Джон Бэкус разработал «нормальную форму Бэкуса» (БНФ) — формальный способ описания алгоритмических языков. Первым языком, спецификация которого была записана в БНФ, стал Алгол 58. Впоследствии, после усовершенствований, которые предложил Питер Наур, возникла форма Бэкуса — Наура (аббревиатура та же — БНФ или BNF), которая использовалась для спецификации языка ALGOL 60 уже на этапе её разработки.
У нового языка нашлись как приверженцы, так и критики. В США Алгол приняли холодно, он был популярен только в академической среде, и то не повсеместно. Те, кто попытался реализовать Алгол, столкнулись с целым рядом сложностей. Так, например, обнаружилось, что ни один из существовавших тогда компьютеров не поддерживал ввод-вывод всех 116 литер, из которых состоял алфавит Алгола.
SHARE — американская ассоциация пользователей компьютеров IBM — потребовала от фирмы реализовать Алгол для своих машин, но появившийся в конце концов компилятор Алгола для IBM OS/360 был крайне неудобен в использовании — вполне естественно, что IBM, вложившая в Фортран огромные суммы, не имела стимула для создания нового продукта, который лишь конкурировал бы со старым. В то же время, недостатки Фортрана вынудили IBM искать ему замену и привели к разработке PL/I — языка-наследника Фортрана, в котором влияние Алгола было весьма заметным.
А вот в Европе Алгол приняли с энтузиазмом. Он быстро завоевал популярность в академической среде, повсеместно шла разработка компиляторов, многие из которых, несмотря на сложности реализации, оказались весьма успешными. Алгол распространился от Великобритании до Дальнего востока СССР, став как универсальным языком описания алгоритмов в научных публикациях, так и средством реального программирования.
В СССР в Вычислительном центре АН СССР в Лаборатории программирования под руководством В. М. Курочкина был создан свой транслятор с языка АЛГОЛ 60 для ЭВМ БЭСМ-6. Он на протяжении многих лет служил важным инструментом для решения прикладных задач из различных областей естественных наук, широко использовался во многих организациях СССР.
Язык Алгол был принят фирмой Burroughs Corporation в их моделях, начиная с B5000 — этот язык получил название Elliott ALGOL. На компьютерах LGP-30 ( англ. ) использовался язык Dartmouth ALGOL 30.
Даже когда язык Алгол почти перестал использоваться для программирования, он ещё долго оставался официальным языком для публикации алгоритмов.
Перед текстом описания языка использовался эпиграф из «Логико-философского трактата» Людвига Витгенштейна: «То, что вообще может быть сказано, может быть сказано ясно; а о чём невозможно говорить, о том следует молчать». [2]
Свойства языка
Современным программистам подобная структура программы кажется очевидной, кое в чём устаревшей и не всегда удобной (часто критикуются бесконечные begin — end в программах на Паскале, который унаследовал эту особенность именно от Алгола), но на момент появления Алгола всё это было заметным шагом вперёд. Программы становились регулярными, это давало возможность наращивать их по объёму, сохраняя обозримыми, понятными, доступными анализу и исправлению. Именно на базе Алгола и его языков-потомков были выполнены успешные работы по аналитическому доказательству правильности программ.
Крайне важным свойством Алгола стала возможность организации рекурсивных процедур, до этого у промышленных языков отсутствовавшая (у лидеров рынка — Фортрана и Кобола, — рекурсия прямо запрещена), но широко использовавшаяся в Лиспе. Использование рекурсивных вычислений в ряде случаев способно значительно упростить структуру программы и сделать её более понятной за счёт близости к математическому описанию алгоритма решения задачи.
Разумеется, не все особенности Алгола сейчас можно назвать удачными и до конца продуманными. Например, стандарт языка полностью проигнорировал средства ввода-вывода; разработчики решили, что каждая реализация языка может решать этот вопрос самостоятельно, исходя из особенностей целевой машины и потребностей пользователей. С другой стороны, концепции модульного программирования с использованием стандартных библиотек подпрограмм тогда ещё просто не было, и операторы ввода-вывода должны были включаться прямо в язык. Это привело к тому, что каждая реализация организовывала ввод-вывод по-своему, и в этой части Алгол-программы для разных компиляторов оказывались почти гарантированно несовместимыми.
В Алголе было предложено два способа передачи параметров в подпрограмму — по имени и по значению. Второй способ широко используется в абсолютном большинстве языков по сей день. Первый же предполагает, что в процедуру передаётся имя фактического параметра, и процедура работает так, как будто в точке обращения записан её код, где вместо формального параметра написано имя фактического. Функции с такими параметрами легко реализуются с помощью препроцессора (как в языке C), однако, генерация объектного кода для них достаточно сложна: фактически для передачи по имени сложных выражений компилятор должен был создавать специальную неименованную функцию, вычисляющую это выражение в его собственной среде окружения, так называемый санк. Ближайшим аналогом санка является замыкание, однако санк возникает только в специфическом контексте передачи параметров. Эта особенность языка Алгол 60, в остальном довольно разумно организованного, примечательна удивительным сочетанием полной практической бесполезности с чрезвычайной сложностью и неэффективностью реализации. Поэтому в дальнейшем развитии языков программирования от передачи параметров по имени отказались. В языке PL/I, в целом очень много унаследовавшем от Алгола-60, на этой волне заодно отказались и от передачи параметров по значению, оставив, как и в раннем Фортране, единственный механизм — по ссылке. [3] В языке Си, напротив, осталась только передача параметров по значению (передача по ссылке там может быть смоделирована путём использования параметров типа «указатель»). А для тех случаев, когда передача параметров по имени имеет смысл (она необходима, например, если требуется создать функцию, для которой значения параметров не вычислялись бы в момент вызова), были созданы специальные синтаксические механизмы.
Примеры кода
Hello, World
Программа Hello, World на диалекте Dartmouth ALGOL 30 [4] :
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
ALGOL
ALGOLПарадигма | язык программирования, процедурный язык программирования, императивный язык программирования и структурный язык программирования |
---|---|
Спроектировано | Bauer, Bottenbruch, Rutishauser, Samelson, Backus, Katz, Perlis, Wegstein, Naur, Vauquois, van Wijngaarden, Woodger, Green, McCarthy |
Первый появившийся | 1958 |
Влияние | |
Большенство современных языков таких, как PL/I, Simula, BCPL, B, Pascal, C |
ALGOL – програмный язык, первоначально разработанные в середине 1950-х годов, который значительно повлиял на многие другие языки и был стандартным методом для описание алгоритма, используемого АСМ в учебниках и в научной литературе более тридцати лет.
Был самым влиятельным из четырех языков программирования высокого уровня, среди которых Fortran, Lisp и COBOL. Был разработан, чтобы избежать некоторых проблем с Fortran и в конечном итоге породил множество других языков программирования, включая PL/I, Simula, BCPL, B, Pascal и C.
Содержание
История
ALGOL создавался совместно с комитетом европейских и американских компьютерных ученых в встрече в 1958 в университете ETH Zurich (ALGOL 58).
В нем указаны три разных синтаксиса: ссылочный синтаксис, синтаксис публикации и синтаксис реализации. Различные синтаксисы позволяют использовать различные имена ключевых слов и соглашения для десятичных знаков (запятые и точки) для разных языков.
Были три основных вида, названные в честь года, когда они были впервые опубликованы:
ALGOL 58
первоначально предлагалось назвать IAL, для международного Алгебраического языка.
Представила трехуровневую концепцию эталонного, издательского и аппаратного языка и концепцию «разделителей слов», имеющих другое представление выбранных выбранных идентификаторов (следовательно, никаких зарезервированных слов).
ALGOL 60
впервые реализован как X1
ALGOL 60 в середине 1960 года. Пересмотрен в 1963 году.
Является первым языком для стандартизации.
ALGOL 68
введены новые элементы, включая гибкие массивы, срезы, параллелизм, идентификацию операторов. Пересмотрен в 1973 году.
Niklaus Wirth основал свой собственный ALGOL W на ALGOL 60 перед разработкой Pascal. ALGOL-W было основано на предложении для следующего поколени ALGOL, но комитет
ALGOL 68 создан на конструкции которая была более сложна и более продвинута, чем очищенное упрощенное ALGOL 60.
ALGOL 68 существенно отличается от ALGOL 60 и не был хорошо принят.
Свойства
ALGOL 60 как первоначально определенные объекты ввода / вывода; реализации определяли свои собственные способами, которые редко были совместимы друг с другом. Напротив, ALGOL 68 предоставляет обширную библиотеку средств передачи (ввода / вывода).
Call-by-name известен многим разработчикам компилятора для интересных «thunks», которые используются для его реализации. Дональд Кнут разработал «тест мужчины или мальчика» для разделения компиляторов, которые позволили реализовать «рекурсию и нелокальные ссылки». Этот тест содержит пример вызова по имени.
ALGOL 68 был определен с использованием двухуровневого формализма грамматики, изобретенного Адрианом ван Вийнгаарденом и который носит его имя. В граммах Van Wijngaarden используется контекстно-свободная грамматика для создания бесконечного набора произведений, которые распознают конкретную программу ALGOL 68; В частности, они могут выразить себя в следующих терминах: синтаксический анализатор.
Сроки реализации
На сегодняшний день было по крайней мере 70 аугментаций, расширений, дериваций и подъязыков Algol 60
Диалекты Burroughs включали специальные загрузочные диалекты, такие как ESPOL и NEWP. Последний по-прежнему используется для системного программного обеспечения UNISYS MCP.
Хронология символов ALGOL
Эта статья содержит символы Unicode 6.0 «Разное». Без надлежащей поддержки рендеринга вы можете видеть вопросительные знаки, поля или другие символы вместо «₁₀» (символ десятичной экспоненты U + 23E8 TTF).
АЛГОЛы были задуманы в то время, когда наборы персонажей были разнообразными и быстро эволюционировали; Кроме того, ALGOLs были определены так, чтобы требовались только прописные буквы.
1960: IFIP. Язык и отчет Algol 60 включали несколько математических символов, которые доступны на современных компьютерах и операционных системах, но, к сожалению, в то время не поддерживались в большинстве систем. Например: ×, ÷, ≤, ≥, ≠, ¬, ∨, ∧, ⊂, ≡, ␣ и.
1962: ALCOR. Этот набор символов включает необычный символ «᛭» (железо / рунический крест ) и символ «⏨» (символ десятичной экспоненты) для нотации с плавающей запятой.
1964: ГОСТ. Советский стандарт 1964 года ГОСТ 10859 разрешил кодирование 4-битных, 5-битных, 6-битных и 7-битных символов в ALGOL.
Недостатки
Algol использовали в основном компьютерщики США и Европы. Использование его в качестве коммерческого ресурса было затруднительно и обуславливалось это отсутствием стандартных средств ввода / вывода в его описании и отсутствием интереса к языку со стороны крупных поставщиков компьютеров, помимо корпорации «Берроуз».
ALGOL 60, однако, стал стандартом для публикации алгоритмов и оказал глубокое влияние на будущее развитие языка. Примечание
Международный Алгебраический Язык (IAL), или ALGOL 58, был чрезвычайно влиятельным и в целом считался родоначальником большинства современных языков программирования (так называемые Algol-подобные языки). Кроме того, объектный код ALGOL был простой, компактной и основанной на стеке архитектурой набора инструкций, обычно используемой при обучении построению компилятора и других языков высокого порядка (из которых Algol обычно считается первым). [Источник 1]
Алгол
Алго́л (англ. Algol от англ. algorithmic — алгоритмический и англ. language — язык) — название ряда языков программирования, применяемых при составлении программ для решения научно-технических задач на ЭВМ. Разработан комитетом по языку высокого уровня IFIP в 1958—1960 гг. (Алгол-58, Алгол-60); усовершенствован в 1964—1968 гг. (Алгол 68). Алгол относится к языкам высокого уровня и позволяет легко переводить алгебраические формулы в программные команды. Алгол был популярен в Европе, в том числе в СССР, в то время как сравнимый с ним язык Фортран был распространён в США и Канаде. Оказал заметное влияние на все разработанные позднее императивные языки программирования — в частности, на язык Pascal.
Обычно названием Алгол (без уточнения версии языка) именуют Алгол-60, в то время как Алгол 68 рассматривается как самостоятельный язык.
Содержание
История
Алгол был разработан в 1958 году, на недельной конференции в ETH (Цюрих, Швейцария) как универсальный язык программирования для широкого круга применений, а затем доработан комитетом, созданным Международной федерацией по обработке информации (IFIP). В комитет вошёл ряд ведущих европейских и американских учёных и инженеров-разработчиков языков. Среди них были: Джон Бэкус — один из создателей Фортрана, Джозеф Уэгстен — впоследствии возглавлял комитет по разработке языка Кобол, Джон Маккарти — автор языка Лисп разработанного одновременно с Алголом, Петер Наур — впоследствии доработал «нормальную форму Бэкуса», завершив разработку БНФ, Эдсгер Дейкстра — нидерландский учёный, впоследствии получивший широкую известность как один из создателей структурного программирования и сторонник математического подхода к программированию, будущий лауреат Премии Тьюринга.
Сначала работа столкнулась с большими трудностями непринципиального характера. Так, например, один из членов комитета вспоминал «десятичную бурю» — крайне резкую дискуссию между американскими и европейскими участниками по поводу того, какой именно символ использовать в качестве разделителя целой и дробной части числа. Американцы стояли за точку, европейцы требовали применять традиционную в Европе запятую, и из-за такой мелочи работа оказалась под реальной угрозой срыва. Чтобы избежать конфликтов по мелким вопросам, было решено, что описание Алгола будет трёхуровневым, включающим уровень описаний, публикаций и реализации. Мелкие вопросы, типа выбора между точкой и запятой или используемого алфавита, были вынесены на второй-третий уровень, что позволило относительно быстро решить принципиальные вопросы. На уровне публикаций, согласованном позже, допускалось использование национальных ключевых слов и стандартов представления данных (в том числе и десятичной точки), уровень реализации определял язык совершенно строго — согласно ему должны были строиться трансляторы.
После принятия в 1958 году первой версии описания языка Алгол-58 (первоначально предполагалось назвать язык IAL — International Algebraic Language, но от этого отказались [1] ) довольно быстро были осознаны проблемы, для решения которых комитет сформировал новый вариант стандарта — Алгол-60; он и стал «классическим» Алголом. В 1959 году Джон Бэкус разработал «нормальную форму Бэкуса» (БНФ) — формальный способ описания алгоритмических языков. Первым языком, спецификация которого была записана в БНФ, стал Алгол-58. Впоследствии, после усовершенствований, которые предложил Питер Наур, возникла форма Бэкуса — Наура (аббревиатура та же — БНФ или BNF), которая использовалась для спецификации языка ALGOL-60 уже на этапе её разработки.
У нового языка нашлись как приверженцы, так и критики. В США Алгол приняли холодно, он был популярен только в академической среде, и то не повсеместно. Те, кто попытался реализовать Алгол, столкнулись с целым рядом сложностей. Так, например, обнаружилось, что ни один из существовавших тогда компьютеров не поддерживал ввод-вывод всех 116 литер, из которых состоял алфавит Алгола.
SHARE — американская ассоциация пользователей компьютеров IBM, — потребовала от фирмы реализовать Алгол для своих машин, но появившийся в конце концов компилятор Алгола для IBM OS/360 был крайне неудобен в использовании — вполне естественно, что IBM, вложившая в Фортран огромные суммы, не имела стимула для создания нового продукта, который лишь конкурировал бы со старым. В то же время, недостатки Фортрана вынудили IBM искать ему замену и привели к разработке PL/I — языка-наследника Фортрана, в котором влияние Алгола было весьма заметным.
А вот в Европе Алгол приняли с энтузиазмом. Он быстро завоевал популярность в академической среде, повсеместно шла разработка компиляторов, многие из которых, несмотря на сложности реализации, оказались весьма успешными. Алгол распространился от Великобритании до Дальнего востока СССР, став как универсальным языком описания алгоритмов в научных публикациях, так и средством реального программирования.
Язык Алгол был принят фирмой Burroughs Corporation в их моделях, начиная с B5000 — этот язык получил название Elliott ALGOL. На компьютерах LGP-30 использовался язык Dartmouth ALGOL 30.
Даже когда язык Алгол почти перестал использоваться для программирования, он ещё долго оставался официальным языком для публикации алгоритмов.
Свойства языка
Современным программистам подобная структура программы кажется чем-то самоочевидной, кое в чём устаревшей и не всегда удобной (так, часто критикуются бесконечные begin — end в программах на Паскале, который унаследовал эту особенность именно от Алгола), но на момент появления Алгола всё это было заметным шагом вперёд. Программы становились регулярными, это давало возможность наращивать их по объёму, сохраняя обозримыми, понятными, доступными анализу и исправлению. Именно на базе Алгола и его языков-потомков были выполнены успешные работы по аналитическому доказательству правильности программ.
Крайне важным свойством Алгола стала возможность организации рекурсивных процедур, до этого у промышленных языков отсутствовавшая (у лидеров рынка — Фортрана и Кобола, — рекурсия прямо запрещена), но широко использовавшаяся в Лиспе. Использование рекурсивных вычислений в ряде случаев способно значительно упростить структуру программы и сделать её более понятной за счёт близости к математическому описанию алгоритма решения задачи.
Разумеется, не все особенности Алгола сейчас можно назвать удачными и до конца продуманными. Например, стандарт языка полностью проигнорировал средства ввода-вывода; разработчики решили, что каждая реализация языка может решать этот вопрос самостоятельно, исходя из особенностей целевой машины и потребностей пользователей. С другой стороны, концепции модульного программирования с использованием стандартных библиотек подпрограмм тогда ещё просто не было, и операторы ввода-вывода должны были включаться прямо в язык. Это привело к тому, что каждая реализация организовывала ввод-вывод по-своему, и в этой части Алгол-программы для разных компиляторов оказывались почти гарантированно несовместимыми.
В Алголе было предложено два способа передачи параметров в подпрограмму — по имени и по значению. Если второй способ возражений не вызывает (он широко используется в абсолютном большинстве языков по сей день), то первый (он предполагает, что в процедуру передаётся имя фактического параметра, и процедура работает так, как будто в точке обращения записан её код, где вместо формального параметра написано имя фактического) приводил к трудностям реализации компиляторов и появлению труднообнаруживаемых ошибок.
Пример кода на языке Алгол-60
Это пример выдачи на печать таблицы в реализации Алгола Elliott 803 ALGOL.
PUNCH(3) посылает текст не на перфоратор, а на удалённый принтер. SAMELINE подавляет возврат каретки. ALIGNED(1,6) указывает формат — 1 знак до и 6 после десятичной точки.
Hello, World
Это пример программы Hello, World для реализации Dartmouth ALGOL 30 см. ссылку.
Это альтернативная реализация для Elliott Algol.
Реализация для IBM OS/360 ALGOL F.
Трюк Йенсена
Рассмотрим следующую программу на Алголе:
В соответствии с определением способа передачи параметров по имени, вызов процедуры p в данном случае должен приводить к обнулению всех элементов массива s. Такое использование передачи параметра по имени было названо «трюком Йенсена» в честь впервые предложившего его программиста. Функции с такими параметрами легко реализуются с помощью препроцессора (как в языке C), однако генерация объектного кода для них достаточно сложна: фактически для передачи по имени сложных выражений компилятор должен был создавать специальную неименованную функцию, вычисляющую это выражение в его собственной среде окружения, так называемый санк (англ.). Ближайшим аналогом санка является замыкание в языке Лисп, однако санк возникает только в специфическом контексте передачи параметров. Эта особенность языка Алгол-60, в остальном довольно разумно организованного, примечательна удивительным сочетанием полной практической бесполезности с чрезвычайной сложностью и неэффективностью реализации. Поэтому в дальнейшем развитии языков программирования от передачи параметров по имени отказались. В языке PL/I, в целом очень много унаследовавшем от Алгола-60, на этой волне заодно отказались и от передачи параметров по значению, оставив, как и в раннем Фортране, единственный механизм — по ссылке. [2] В языке Си, напротив, осталась только передача параметров по значению (передача по ссылке там может быть смоделирована путём использования параметров типа «указатель»). А для тех случаев, когда передача параметров по имени имеет смысл (она необходима, например, если требуется создать функцию, для которой значения параметров не вычислялись бы в момент вызова), были созданы специальные синтаксические механизмы.