Алгол что это такое
Алгол
Алго́л (англ. 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] В языке Си, напротив, осталась только передача параметров по значению (передача по ссылке там может быть смоделирована путём использования параметров типа «указатель»). А для тех случаев, когда передача параметров по имени имеет смысл (она необходима, например, если требуется создать функцию, для которой значения параметров не вычислялись бы в момент вызова), были созданы специальные синтаксические механизмы.
АЛГОЛ
Алго́л (англ. Algol от англ. algorithmic — алгоритмический и англ. language — язык) — название ряда языков программирования, применяемых при составлении программ для решения научно-технических задач на ЭВМ. Разработан комитетом по языку высокого уровня IFIP в 1958—1960 гг. (Алгол-58, Алгол-60); усовершенствован в 1964—1968 гг. (Алгол 68). Алгол относится к языкам высокого уровня и позволяет легко переводить алгебраические формулы в программные команды. Алгол был популярен в Европе, в том числе в СССР, в то время как сравнимый с ним язык Фортран был распространён в США и Канаде. Оказал заметное влияние на все разработанные позднее императивные языки программирования — в частности, на язык Pascal.
Обычно названием Алгол (без уточнения версии языка) именуют Алгол-60, в то время как Алгол 68 рассматривается как самостоятельный язык.
Содержание
История
Алгол был разработан в 1958 году, на недельной конференции в ETH (Цюрих, Швейцария) как универсальный язык программирования для широкого круга применений, а затем доработан комитетом, созданным Международной федерацией по обработке информации (IFIP). В комитет вошёл ряд ведущих европейских и американских учёных и инженеров-разработчиков языков. Среди них были: Джон Бэкус — один из создателей Фортрана, Джозеф Уэгстен — впоследствии возглавлял комитет по разработке языка Кобол, Джон Маккарти — автор языка Лисп разработанного одновременно с Алголом, Петер Наур — впоследствии доработал «нормальную форму Бэкуса», завершив разработку БНФ, Эдсгер Дейкстра — нидерландский учёный, впоследствии получивший широкую известность как один из создателей структурного программирования и сторонник математического подхода к программированию, будущий лауреат Премии Тьюринга.
Сначала работа столкнулась с большими трудностями непринципиального характера. Так, например, один из членов комитета вспоминал «десятичную бурю» — крайне резкую дискуссию между американскими и европейскими участниками по поводу того, какой именно символ использовать в качестве разделителя целой и дробной части числа. Американцы стояли за точку, европейцы требовали применять традиционную в Европе запятую, и из-за такой мелочи работа оказалась под реальной угрозой срыва. Чтобы избежать конфликтов по мелким вопросам, было решено, что описание Алгола будет трёхуровневым, включающим уровень описаний, публикаций и реализации. Мелкие вопросы, типа выбора между точкой и запятой или используемого алфавита, были вынесены на второй-третий уровень, что позволило относительно быстро решить принципиальные вопросы. На уровне публикаций, согласованном позже, допускалось использование национальных ключевых слов и стандартов представления данных (в том числе и десятичной точки), уровень реализации определял язык совершенно строго — согласно ему должны были строиться трансляторы.
После принятия в 1958 году первой версии описания языка Алгол-58 довольно быстро были осознаны проблемы, для решения которых комитет сформировал новый вариант стандарта — Алгол-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. Такое использование передачи параметра по имени было названо «трюком Йенсена» в честь впервые предложившего его программиста. Фактически для передачи по имени сложных выражений компилятор должен был создавать специальную неименованную функцию, вычисляющую это выражение в его собственной среде окружения, так называемый санк. Ближайшим аналогом санка является замыкание в языке Лисп, однако санк возникает только в специфическом контексте передачи параметров. Эта особенность языка Алгол-60, в остальном довольно разумно организованного, примечательна удивительным сочетанием полной практической бесполезности с чрезвычайной сложностью и неэффективностью реализации. Поэтому в дальнейшем развитии языков программирования от передачи параметров по имени отказались. В языке PL/I, в целом очень много унаследовавшем от Алгола-60, на этой волне заодно отказались и от передачи параметров по значению, оставив, как и в раннем Фортране, единственный механизм — по ссылке. [1] В языке Си, напротив, осталась только передача параметров по значению (передача по ссылке там может быть смоделирована путём использования параметров типа «указатель»). А для тех случаев, когда передача параметров по имени имеет смысл (она необходима, например, если требуется создать функцию, для которой значения параметров не вычислялись бы в момент вызова), были созданы специальные синтаксические механизмы.
История языков программирования: Algol — жертва конфликта интересов
Влияние Algol на ИТ-индустрию
Название языка Algol (ALGOrithmic Language), первая версия которого появилась в 1958 году, подчеркивает то обстоятельство, что он предназначен для записи алгоритмов. Благодаря четкой логической структуре Algol стал стандартным средством записи алгоритмов в научной и технической литературе. Однако он так и не смог полноценно конкурировать с языком Fortran, а с COBOL его и вовсе было трудно сравнивать в силу отсутствия некоторых важных возможностей у Algol – той же обработки текстов например или форматирования ввода/вывода.
«Роды» Algol проходили очень тяжело. Для некоторых его создателей, прямо скажем, – в муках. Ученые и эксперты отрасли никак не могли прийти к единому мнению по многим вопросам.
В результате новый язык скорее вызвал интерес, чем привлек потребителей. Грейс Хоппер охарактеризовала его так: «Похож на большую поэму: простой и ясный с точки зрения математики, но отнюдь не практичный».
Предыстория
В середине 50-х годов роль программирования в машинных кодах стала уменьшаться. Появились языки более высокого уровня – Fortran, Algol, COBOL и так далее.
Первым из них и одним из наиболее распространенных был Fortran (FORmula TRANslator – переводчик формул), разработанный группой программистов фирмы IBM в 1954 году (первая версия). Этот язык был ориентирован на научно-технические расчеты математического характера.
Грейс Хоппер — американская учёная и контр-адмирал флота США. Программист гарвардского компьютера Марк I.
В 1954 году группа под руководством Грейс Хоппер разработала систему, включающую язык программирования и компилятор, которая в дальнейшем получила название Math-Matic. После удачного завершения работ по созданию Math-Matic Хоппер и ее группа принялись за разработку нового языка и компилятора, который позволил бы пользователями программировать на языке, близком к обычному английскому. В 1958 году появился компилятор Flow-Matic. Компилятор Flow-Matic был первым языком для обработки коммерческих данных.
Разработки в этом направлении привели к созданию языка COBOL (Common Business Oriented Language). Он был создан в 1960 году. В этом языке были слабее развиты математические средства, но зато хорошо развиты средства обработки текстов, организация вывода данных в форме требуемого документа. Он задумывался как основной язык для массовой обработки данных в сферах управления и бизнеса.
Лучшее – враг хорошего
В 50-х годах ХХ века весь ученый мир ждал решения проблемы определения единого языка для научного программирования. Первыми предложили свой вариант США. В 1957 году начал активно распространяться Fortran. Но европейское сообщество опасалось гегемонии IBM (там и был создан Fortran) и других агрессивных американских фирм. Поэтому они решили, что на европейском рынке непременно обязана взойти новая «звезда».
В 1958 году в Цюрихе, на базе Федерального технического университета был создан специальный комитет. 27 мая прошло первое заседание, на котором собрались восемь наиболее уважаемых авторитетов в области компьютеров: четверо из Европы и четверо из США. На встрече присутствовали создатель Fortran Джон Бэкус и Джозеф Уэгстен, который в последующем стал председателем кратковременного комитета по COBOL.
Федеральный технический университет. г. Цюрих
Конференция под девизом «Лучшее — враг хорошего» на деле не соответствовала этому утверждению. Из этого работа продвигалась медленно. Американцы настаивали на языке, который был бы близок к уже используемым на компьютерах. Европейцев интересовали не столько компьютеры, сколько мощь языка при решении сложных математических задач. На второй день обсуждение едва не зашло в тупик из-за мелкого, но вызвавшего бурю эмоций пункта — десятичной точки.
Один из европейцев, ударив кулаком по столу, воскликнул: «Нет! Я никогда не буду использовать точку в десятичных дробях!» Американцы же пренебрежительно отнеслись к европейской привычке использовать в десятичных дробях запятую. Тогда Джозеф Уэгстен взял на себя миротворческую роль и попытался утихомирить «десятичную бурю».
Окончательное решение проблемы, предложенное Уэгстеном, обеспечило новому языку одно из его наиболее замечательных свойств. Он предложил трехуровневую модель языка: уровень описаний, публикаций и реализации.
Мелкие вопросы, типа выбора между точкой и запятой или используемого алфавита, были вынесены на второй-третий уровень, что позволило относительно быстро решить принципиальные вопросы. На уровне публикаций, согласованном позже, допускалось использование национальных ключевых слов и стандартов представления данных (в том числе и десятичной точки), уровень реализации определял язык совершенно строго — согласно ему должны были строиться трансляторы.
Дальнейшие обсуждения пошли исключительно на первом уровне, что позволило двигаться дальше и не застревать на второстепенных деталях.
Полуфабрикат
Язык, созданный на конференции в Цюрихе, многое унаследовал от Fortran, но в Algol основные понятия были собраны в более логичную, можно даже сказать, изящную структуру. Но из-за недостатка времени и необходимости компромиссов было допущено немало оплошностей. Одна из них заключалась в отсутствии процедур ввода и вывода данных. Участники совещания намеренно не касались этой области, где многое зависит от типа компьютера, полагая, что процедуры ввода и вывода должен написать разработчик компилятора языка.
Однако единодушие комитета не было абсолютным: часть делегатов уехала с конференции, полагая, что работа сделана в самом грубом приближении, а другая же часть верила, что сделано достаточно, чтобы Algol стал «звездой» и новым международным стандартом.
Одним из таких оптимистов был Джон Бэкус. В феврале 1959 года он убедил влиятельную организацию SHARE (куда входили пользователи компьютеров фирмы IBM) сделать ставку на новый язык программирования. После этого организация настоятельно порекомендовала IBM реализовать Algol.
На словах компания пошла навстречу своим клиентам, а на деле работа в этом направлении почти не велась. В то время IBM была мировым лидером на рынке компьютеров и активно внедряла Fortran, что вполне ожидаемо. У членов SHARE, на самом деле, тоже не было ясной позиции. Когда их энтузиазм угас, они как ни в чем не бывало продолжали поддерживать Fortran.
А Бэкус, несмотря на неудачу, продолжал активно продвигать Algol.
Вернувшись в Цюрих, он заинтересовался грамматикой, то есть правильным расположением слов и знаков в языке. Бэкус разработал строгую и точную систему определения каждой структуры языка логическим образом. Например, определяя элемент «цифра», он писал: « : = 0|1|2|… |9|».
Вскоре программисты стали называть этот подход к описанию синтаксиса нормальной формой Бэкуса, или БНФ. (Последующее уточнение этой работы датским астрономом Питером Науром привело к тому, что такой подход часто стали называть «форма Бэкуса-Наура», (сокращение осталось то же — БНФ). БНФ оказала существенное влияние на разработку языков программирования, в частности была положена в основу второго этапа разработки Алгола.
Между тем, успешным Algol-58 так и не стал: требовалась серьезная доработка.
Algol-60
В январе 1960 года 13 представителей стран Европы и США, включая 7 человек из прошлой цюрихской группы, встретились в Париже, чтобы «залатать дыры», оставшиеся в первом варианте. Одним из вновь прибывших был Наур, предложивший вариант измененного языка Algol, записанный при помощи БНФ.
Синтаксические диаграммы и дерево разбора
После восьми дней трудных переговоров участники конференции покинули Париж в приподнятом настроении, считая, что согласие достигнуто и даже самые ярые критики Алгола должны отныне умолкнуть.
С редким единодушием комитет по разработке Algol-60 «голосует» для этой групповой фотографии, сделанной на конференции в Париже в 1960 году. Среди участников – американский специалист по компьютерам Джон Бэкус (ближайший к камере справа) и датский астроном Петер Наур (четвертый слева), в честь которых система описания языков программирования получила название «форма Бэкуса — Наура». (Фотографию сделал Джон Маккарти, создатель языка LISP)
Но едва американские участники конференции сошли с трапа самолета, на Algol-60 обрушилась жесткая критика со стороны. Кроме того, небольшая группа участников конференции указала на неоднозначности, оставшиеся в языке, и приступила к их «рекламированию». Другие критики подчеркивали, что в язык так и не включены средства ввода/вывода.
В Америке Algol-60 встретили холодно. Более того, оказалось, что для него очень сложно написать компилятор: даже самые продвинутые компьютеры того времени не могли воспринимать набор из 116 литер, которые встречались в языке описаний.
В Европе рассуждали по-другому: новый язык давал возможность обмениваться интересными и сложными идеями, невзирая на границы и языковые барьеры. Что еще важнее, он позволил европейской компьютерной индустрии обрести независимость от американских технологий.
Algol 68
В 1962 году под эгидой Международной федерации по обработке информации (International Federation for Information Processing, IFIP) был создан новый комитет, задачей которого являлись дальнейшее совершенствование Algol. В составе нового комитета оказалось немало ученых с мировым именем, в частности, Эдсгер Дейкстра, Никлаус Вирт и Тони Хоар.
Одним из недостатков предшествующей версии все-таки было признано отсутствие ввода/вывода. Пренебрежение к этому моменту объяснялось академической направленностью языка: для ученых главный интерес представляет сам алгоритм, а в каком виде будут представлены выходные данные — дело второстепенное. Для промышленных нужд такой подход не годился.
Вторым серьезным недостатком было низкое быстродействие. Поэтому важной задачей стало повышение эффективности работы на этапе выполнения программы.
Руководителем группы разработки языка по каким-то причинам был А. Ван Вейнгаарден, директор Математического центра Амстердама. Будучи чистым математиком, он, пользуясь своим авторитетом, принимал решения, с которыми не соглашались программисты-практики, что негативно повлияло на получившийся в результате язык.
К сожалению, авторитарный стиль руководства ван Вейнгаардена нередко приводил к размолвкам в коллективе и даже стал причиной выхода Хоара и Вирта из команды. О том, как тяжела была эта потеря для команды, можно судить по такому факту: предложения Вирта, не принятые комитетом, легли в основу языка Pascal.
В Algol 68 было реализовано несколько интересных идей (например, механизмы расширения языка, а также средства для параллельных вычислений), но он получил ограниченное применение.
В России были энтузиасты, которые активно использовали его в работе, и язык на основе Algol 68 стал некогда базовым для программирования отечественного компьютера «Эльбрус».
Особенности языка
Как и в большинстве других языков программирования, программа на Algol состоит из главной программы и набора подпрограмм.
Структуры данных, созданные внутри блока, локальны в его пределах и при выходе из блока уничтожаются. Таким образом можно управлять временем жизни данных и областью видимости их идентификаторов. Динамическое выделение памяти для переменных в блоке позволяет эффективно использовать рекурсию.
Блоки могут образовывать вложенные структуры, то есть внутрь блока может быть вложен блок, в него — другой блок и так далее. Важной особенностью языка является также то, что блок является разновидностью оператора — составным оператором и может быть употреблен везде, где допустим обычный оператор.
В Algol реализованы логический, целочисленный и вещественный типы, а из структур данных — лишь однородный массив. Правда, массивы являются динамическими, что позволяло эффективно управлять распределением памяти. К сожалению, типы и структуры данных в языке не слишком разнообразны. Пожалуй, это и определило дальнейшую судьбу языка, применявшегося в первую очередь для научных вычислений.
К особенностям языка можно также отнести механизмы передачи параметров подпрограммам. Их два: хорошо известная передача по значению и довольно экзотическая передача по имени.
Переданное в процедуру выражение вычисляется каждый раз – как если бы вместо формальных параметров были подставлены их значения, вычисленные в контексте вызывающей программы. По сути это нечто среднее между макроподстановкой и вызовом подпрограммы.
При выполнении процедуры p на каждом шаге цикла вместо a подставляется i, а вместо b подставляется s[i], и эта процедура просто обнуляет массив s. Проблем с таким способом передачи параметров очень много, поэтому передача параметров по имени так и осталась прерогативой Algol. Но этот способ передачи параметров оказал влияние на дальнейшее развитие языков программирования.
Роль в истории
Так же, как министерство обороны США в свое время активно поддержало язык COBOL, независимый исследовательский совет Германии и другие правительственные организации западноевропейских стран поддержали Algol.
Благодаря этому язык распространился от Великобритании до Советского Союза. Большинство компиляторов оказались удачными, и вскоре Algol был признан международным языком европейских программистов.
Algol не стал всеобщим международным стандартом, как надеялись некоторые, поскольку такой его статус всерьез задел бы американские интересы. Он набрал небольшую популярность в США, но так навсегда и остался в тени Fortran.
Тем не менее, многие языки, возникшие позднее, базировались (по крайней мере, частично) на Algol, и его вклад в их развитие связан с несколькими основными идеями.
Одна из наиболее важных — блочная структура, позволяющая делить программы на замкнутые единицы, разрабатываемые независимо. Другая идея — рекурсия. Третья идея — БНФ, формализованное определение синтаксиса.
Эти и другие фундаментальные идеи достались в наследство разработчикам других языков.