Текст
                    4ЛГ01-60


ИЗДАТЕЛЬСТВО «МИР»
REVISED REPORT ON THE ALGORITHMIC LANGUAGE ALGOL 60 by J. W. Backus, F. L. Bauer, J. Green, C. Katz, J. McCarthy, P. Naur, A. J. Perlis, II. Rutishauser, K. Samelson, B. Vauquois, J. H. Wegstein, A. van Wijngaarden, M. Woodger Edited by PETER NAUR
АЛГОРИТМИЧЕСКИЙ ЯЗЫК АЛГОЛ-60 ПЕРЕСМОТРЕННОЕ СООБЩЕНИЕ Перевод с английского Псд редакцией А. П. Ершова, С. С. Лаврова и М. Р. Шура-Бура ИЗДАТЕЛЬСТВО «МИР» Москва 1965
УДК 681.142.2. Брошюра содержит русский перевод новейших материалов, по¬ священных международному алгоритмическому языку АЛГОЛ-60. Ее основу составляет официальное описание этого языка, составленное группой ученых и утвержденное советом Международной федерации по обработке информации (IFIP) в 1962 г. Оно подводит итог об¬ суждений этого языка на нескольких научных конференциях. Кроме этого Сообщения, в брошюру включен окончательный вариант (ап¬ рель 1964 г.) Сообщения о процедурах ввода и вывода в АЛГОЛе. Материалы, включенные в брошюру, совершенно необходимы для программистов, математиков, работников учебных и научных учреждений и вычислительных центров, студентов самых различных специальностей, а также для всех, сталкивающихся в своей работе с вычислительными машинами или занимающихся вопросами авто¬ матического программирования. Редакция литературы по математическим наукам
ПРЕДИСЛОВИЕ К РУССКОМУ ИЗДАНИЮ Результатом усилий немецких и американских уче¬ ных в 1958 г. был разработан проект нового языка для описания вычислительных алгоритмов, получивший на¬ звание АЛГОЛ [1, 2]. Целью проекта являлась унифика¬ ция языков программирования в международном мас¬ штабе. Проект был подвергнут всестороннему широкому обсуждению на страницах периодических журналов, в специально созданном в Копенгагене под редакцией П. Наура «АЛГОЛ-бюллетене» и на нескольких регио¬ нальных и международных конференциях. Итогом этой деятельности был выход в свет Сообщения, содержа¬ щего окончательный вариант языка [6], получившего но¬ вое название АЛГОЛ-60. Не будет преувеличением утверждать, что появле¬ ние пять лет назад сообщения об АЛГОЛ-60 стало важ¬ ной вехой в развитии языков программирования. АЛ- ГОЛ-60 был встречен далеко не всеобщим восторгом. Наряду с горячей поддержкой энтузиастов язык приоб¬ рел решительных противников в основном среди кругов, связавших себя с другими системами программиро¬ вания. АЛГОЛ-60, как язык для описания алгоритмов чис¬ ленного анализа, сконцентрировал в себе значительную часть наиболее удачных сторон ранее известных языков программирования, предназначенных для тех же целей. В то же время он оказался значительно свободнее от ориентации на особенности конкретных машин. Послед¬ нее обстоятельство, являясь несомненным преимуще¬ ством АЛГОЛ-60, оказалось в то же время и его уязви¬ мой стороной. В частности, для целей использования АЛГОЛ-60 в качестве входного языка системы авто¬ матизации программирования оказалось неприемлемым отсутствие в языке каких-либо канонизированных
6 Предисловие к русскому изданию средств для задания операций ввода и вывода инфор¬ мации. Упоминание в языке процедур с телами-кодами не могло обеспечить необходимой степени единообразия в задании операций ввода-вывода для различных транс¬ ляторов. Лишь в 1964 г. для устранения этого недостат¬ ка рабочей группой IFIP/WG2.1 были предложены стан¬ дартные процедуры ввода-вывода. Несомненно однако, что в этом направлении желательно проведение даль¬ нейшей стандартизации. Отказ от учета конкретных особенностей машин при¬ вел, конечно, к усложнению алгоритмов трансляции и потребовал разработки новых методов программирова¬ ния. Следует отметить, что в большинстве случаев же¬ лание упростить транслятор без снижения качества из¬ готовляемой программы приводило к отказу от учета тех или иных особенностей языка АЛГОЛ-60 в конкрет¬ ных представлениях. Однако Сообщение и описанный в нем эталонный язык всегда оставались основой для при¬ нятия тех или иных решений. Различные изменения и упрощения в конкретных представлениях обычно формулировались в терминах изменений и дополнений к эталонному языку и легко усваивались каждым, кто знал полный АЛГОЛ-60. Как и предвидели авторы языка, наличие вариантов и раз¬ личных конкретных представлений нисколько не сни¬ жает значение эталонного языка. Такая ситуация в значительной степени определя¬ лась тем, что одной из замечательных сторон языка АЛГОЛ-60 явилась форма, в которой он был изложен в Сообщении. В настоящее время эта форма смело может быть названа классической. Она позволила вести обсуждение достоинств и недостатков языка и предло¬ жений по его исправлению и усовершенствованию на совершенно новом, ранее недоступном уровне четкости. При работе над трансляторами и в процессе обсу¬ ждения выявились ошибки и некоторые двусмыслен¬ ности Сообщения 1960 г. и возникла ситуация, потре¬ бовавшая принятия определенных решений в отношении обнаруженных дефектов. Такие решения были приняты на совещании авторов АЛГОЛа в апреле 1962 г. в Риме. Успех этого совещания был в значительной степени под¬
Предисловие к русскому изданию 7 готовлен «АЛГОЛ-бюллетенем» и его редактором П. Науром. Результатом совещания было появление но¬ вого официального изложения языка, русский перевод которого предлагается вниманию советского читателя. Важным решением римского совещания была передача ответственности за дальнейшую работу над языком представительному органу — рабочей группе при .Меж¬ дународной федерации по обработке информации (IFIP/WG2.1), давшее возможность поднять работу над языком на новый уровень организации. В настоящее время язык АЛГОЛ-60 завоевал проч¬ ные позиции и широко применяется во всем мире и как язык для публикации алгоритмов, и как средство авто¬ матизации программирования, открывающее возмож¬ ность использования машин для широкого круга потре¬ бителей. АЛГОЛ-60 оказал и продолжает оказывать большое влияние на развитие и теорию языков програм¬ мирования и методы автоматизации программирования, а также на логику математических машин. В Советском Союзе АЛГОЛ-60 пользуется заслужен¬ ной популярностью. Он положен в основу различных систем автоматизации программирования, содержащих в своем составе трансляторы для конкретных машин. Круг лиц, использующих АЛГОЛ-60 в своей работе, бы¬ стро растет. В 1960 г. Вычислительным Центром АН СССР было выпущено «Сообщение об алгоритмиче¬ ском языке АЛГОЛ-60» в переводе Г. И. Кожухина под редакцией А., П. Ершова. Несмотря на некоторые по¬ грешности и терминологические недостатки, этот пере¬ вод сыграл большую роль в популяризации языка в Со¬ ветском Союзе. Основным недостатком издания был малый тираж, а неоценимым достоинством — появление его в середине 1960 г., т. е. спустя всего четыре месяца после английской публикации. Этот перевод с неболь¬ шими редакционными исправлениями был переиздан «Журналом вычислительной математики и математиче¬ ской физики» [1, № 2 (1961), 308—342]. Появление Revised report в качестве нового офи¬ циального описания языка, естественно, поставило во¬ прос об издании соответствующего русского перевода.
8 Предисловие к русскому изданию Однако организация этого издания встретила некоторые затруднения. Прежде всего к такому изданию предъ¬ являлся совершенно новый уровень требований по части четкости перевода, совершенства терминологии и отсут¬ ствия ошибок. Если переводчик и редактор первого из¬ дания могли считать своей целью ознакомить читателя с новым языком, то теперь речь шла о подготовке из¬ дания официального описания языка, предназначенного к роли международного и национального стандарта. В этих условиях естественным выходом оказался принцип коллективной ответственности. За подготовку русского перевода Revised report взялась группа в со¬ ставе А. П. Ершова, С. С. Лаврова и М. Р. Шура-Бура. За основу с разрешения Г. И. Кожухина был взят его перевод. Различие точек зрения у членов группы, их стремление к достижению совершенства и, наконец, чи¬ сто технические трудности мешали быстрому достиже¬ нию цели. Необходимость закончить работу заставила группу в некоторый момент признать ее завершенной. Помимо текста Revised report, решено было включить принятые рабочей группой IFIP/WG2.1 сообщения о процедурах ввода-вывода. В заключение следует отметить, что предлагаемая вниманию читателя книга никак не претендует на роль учебного пособия по АЛГОЛу. Форма изложения де¬ лает ее мало пригодной, по крайней мере для перво¬ начального обучения. Следует, однако, отметить, что учебная литература по АЛГОЛу в настоящее время весьма обширна 1). М. Р. Шура-Бура Май 1965 г. ’) Здесь достаточно указать следующие книги: Лавров С. С., Универсальный язык программирования (АЛГОЛ-60), изд-во «Нау¬ ка», М., 1964; Ботте нбрух Г., Структура АЛГОЛ-60 и его использование, ИЛ, М., 1963; Мак-Краке и Д., Программирова¬ ние на АЛГОЛе, изд-во «Мир», М., 1964; Dijkstra Е. W., A pri¬ mer of ALGOL 60 programming, Brighton, 1962.
Посвящается памяти Уильяма Ту раненого КРАТКОЕ СОДЕРЖАНИЕ Настоящее сообщение представляет собой полное описание международного алгоритмического языка АЛ- ГОЛ-60 с дополнениями. Этот язык предназначен для выражения большого класса вычислительных процессов в достаточно четком виде для непосредственного авто¬ матического перевода на язык вычислительных автома¬ тов с программнЫхМ управлением. Введение подводит итог предварительной работе, приведшей к заключительной конференции, определив¬ шей язык. Кроме того, вводятся понятия эталонного языка, языка публикаций и конкретных представлений. В первой главе дается обзор основных элементов и свойств языка и вводятся формальные обозначения, при помощи которых определяется его синтаксическая струк¬ тура. Во второй главе перечисляются все основные сим¬ волы и определяются синтаксические единицы, так на¬ зываемые идентификаторы, числа и строки. Далее опре¬ деляются некоторые важные понятия, такие, как вели¬ чина и значение. В третьей главе описываются правила формирова¬ ния выражений и определяется значение этих выраже¬ ний. Существуют три различных типа выражений: ариф¬ метическое, логическое (булевское) и именующее. Четвертая глава описывает единицы действий языка, так называемые операторы. Основными операторами 2 Зак. 1659
10 Краткое содержание являются: операторы присваивания (вычисление по формуле), операторы перехода (явное нарушение по¬ следовательности выполнения операторов), пустые опе¬ раторы и операторы процедуры (обращение к выполне¬ нию отдельного процесса, определяемого описанием процедуры). Вводятся правила построения более слож¬ ных образований, имеющих характер операторов. К ним относятся: условные операторы, операторы цикла, со¬ ставные операторы и блоки. В пятой главе определяются единицы, так называе¬ мые описания, которые служат для определения по¬ стоянных свойств единиц, входящих в процесс, описы¬ ваемый на языке. Сообщение заканчивается двумя подробными приме¬ рами употребления языка и алфавитным указателем определений.
ВВЕДЕНИЕ Предыстория После опубликования [1, 2] предварительного Сооб¬ щения об алгоритмическом языке АЛГОЛ, подготовлен¬ ного конференцией в Цюрихе в 1958 г., к этому языку был проявлен значительный интерес. В результате неофициальной встречи, состоявшейся в Майнце в ноябре 1958 г., около сорока заинтересован¬ ных лиц из различных европейских стран собрались в Копенгагене в феврале 1959 г. на конференцию по внедрению АЛГОЛа. Была организована рабочая группа для разработки стандартного способа кодирования языка на перфо¬ ленте. В результате конференции Вычислительный центр в Копенгагене начал издавать «АЛГОЛ-бюллетень» («ALGOL Bulletin») под редакцией Петера Наура (Pe¬ ter Naur) с тем, чтобы это издание явилось форумом для дальнейших обсуждений. Во время работы конфе¬ ренции ICIP (Международная конференция по обра¬ ботке информации. — Ред.) в Париже в июне 1959 г. состоялось несколько как официальных, так и неофи¬ циальных встреч. Эти встречи выявили некоторое не¬ допонимание целей группы, которая первоначально была ответственна за формулировку языка. С другой стороны, было ясно, что проведенная работа встретила широкое одобрение. В результате обсуждений было решено провести в январе 1960 г. международную кон¬ ференцию для улучшения языка АЛГОЛ и подготовки окончательного сообщения. В ноябре 1959 г. в Париже на Европейской конференции по АЛГОЛу, на которой присутствовало около 50 человек, были выбраны семь европейских представителей для участия в Январской 2*
12 Введение конференции 1960 г. Они представляли следующие ор¬ ганизации: Французскую вычислительную ассоциацию (Association Franchise de Calcul), Британское вычисли¬ тельное общество (British Computer Society), Общество по прикладной математике и механике (Gesellschaft fur Angewandte Mathematik und Mechanik) и Голландское общество по вычислительной технике (Nederlands Re- kenmachine Genootschap). Эти семь представителей встретились в декабре 1959 г. в Майнце для заключи¬ тельной подготовки. Тем временем в Соединенных Штатах всем желаю¬ щим внести на обсуждение изменения или поправки к АЛГОЛу было предложено направлять свои замеча¬ ния в журнал “ACM Communications”, где они публико¬ вались. Эти замечания стали затем основой для обсу¬ ждения изменений в языке АЛГОЛ. Организации SHARE и USE создали рабочие группы по АЛГОЛу и обе были представлены в комитете АСМ (Ассоциации по вычислительной технике. — Ред.) по языкам про¬ граммирования. Комитет АСМ собрался в Вашингтоне в ноябре 1959 г. и рассмотрел все замечания по АЛ¬ ГОЛу, присланные в “ACM Communications”. Были также избраны семь представителей для участия в ме¬ ждународной конференции в январе 1960 г. Эти семь представителей встретились в декабре 1959 г. в Бостоне для заключительной подготовки. Январская конференция 1960 г. Тринадцать представителей !) из Дании, Англии, Франции, Германии, Голландии, Швейцарии и Соединен¬ ных Штатов провели конференцию в Париже с 11 по 16 января 1960 г. Перед этой конференцией Петер Наур, исходя из предварительного сообщения и рекомендаций подгото¬ вительных встреч, выработал совершенно новый проект Сообщения. Конференция приняла эту новую форму как основу для своего Сообщения. Затеки конференция пере¬ шла к работе по согласованию каждой из частей Сооб- 1) Уильям Туранский, представитель американской группы на январскую конференцию 1960 г., погиб при автомобильной ката¬ строфе как раз перед этой конференцией.
Введение 13 щения. Настоящее Сообщение представляет собой объ¬ единение концепций комитета и изложение решений, по которым достигнуто соглашение. Апрельская конференция 1962 г. (под ред. М. Вуджера) В Риме 2—3 апреля 1962 г. при содействии Между¬ народного вычислительного центра было проведено со¬ вещание некоторых из авторов АЛГОЛ-60. Присутство¬ вали: Авторы Ф. Л. Бауэр, Дж. Грин, С. Кэтц, Р. Когон (предста¬ вляющий Дж. В. Бэкуса), П. Наур, К. Земельзон, Дж. X. Уэгстейн, А. ван Вэйнгаарден, М. Вуджер. Консультанты М. Паул, Р. Франчиотти, П. 3. Ингерман, Г. Зегмюллер, Р. Э. Атмэн, П. Лэндин. Наблюдатель В. Л. ван дер Пул (председатель рабочей группы по АЛГОЛу IFIP ТС 2.1). Целью совещания было исправление обнаруженных ошибок, попытка устранения очевидных двусмысленно¬ стей и внесение большей ясности в «Сообщение об АЛ- ГОЛ-60». Вопросы расширения языка на совещании не рассматривались. За основу были взяты различные предложения по исправлению и разъяснению, которые были представлены на рассмотрение заинтересован¬ ными группами в ответ на вопросник в «АЛГОЛ-бюлле- тене» № 14. Данное сообщение содержит дополнения к «Сообще¬ нию об АЛГОЛ-60», предназначенные для преодоления ряда встречающихся в нем трудностей. Не все вопросы, возникшие относительно первоначального Сообщения, удалось разрешить. Комитет решил не рисковать, де¬ лая поспешные заключения в отношении некоторых за¬ путанных мест, могущие привести к новым двусмыслен¬ ностям, а сделать сообщение только о тех пунктах, которые, по единодушному мнению, могли быть сформу¬ лированы в ясной и недвусмысленной форме.
14 Введение В надежде, что текущая работа над усовершенство¬ ванными языками программирования может привести к лучшему решению, были оставлены для дальнейшего изучения рабочей группой 2.1 IFIP вопросы, касаю¬ щиеся следующих областей: 1. Побочные эффекты функций. 2. Понятие вызова по наименованию. 3. Own: статический или динамический. 4. Оператор цикла: статический или динамический. 5. Противоречие между спецификациями и описа¬ ниями. Авторы «Сообщения об АЛГОЛ-60», присутствовав¬ шие на Римской конференции, будучи осведомленными об образовании рабочей группы по АЛГОЛу при IFIP, согласились, что всякая коллективная ответственность, которую они могли иметь в отношении развития, дета¬ лизации и усовершенствования языка АЛГОЛ, отныне возлагается на эту группу. Настоящее Сообщение было пересмотрено Техниче¬ ским комитетом 1F1P по языкам программирования (IFIP ТС2) в августе 1962 г. и утверждено Советом Международной федерации по обработке информации. Как и в предварительном Сообщении об АЛГОЛе, различаются три уровня языка, а именно эталонный язык, язык публикаций и различные конкретные пред¬ ставления. Эталонный язык 1. Он является рабочим языком комитета. 2. Он является определяющим языком. 3. Его знаки определены исходя из желания облег¬ чить взаимопонимание, а не из каких-либо машинных ограничений, программистских или чисто математиче¬ ских обозначений. 4. Он является основой и руководством для созда¬ телей трансляторов. 5. Он является образцом для всех конкретных пред¬ ставлений. 6. Он является основой для перевода с языка публи¬ каций на любые частные конкретные представления.
Введение 15 7. Основные публикации самого языка АЛГОЛ все¬ гда используют эталонное представление. Язык публикаций 1. Язык публикаций допускает видоизменения эта¬ лонного языка, связанные с удобством печати или на¬ писания (например, индексы, пробелы, показатели сте¬ пени, греческие буквы). 2. Он используется для целей формулирования и об¬ мена информацией. 3. Знаки языка могут быть различными в разных странах, однако должно быть сохранено однозначное соответствие с эталонным представлением. Конкретные представления 1. Каждое из них является таким сокращением эта¬ лонного языка, которое вызвано ограниченным числом знаков в стандартном оборудовании ввода. 2. Каждое из них использует набор знаков конкрет¬ ной вычислительной машины и является языком, вос¬ принимаемым транслятором для данной машины. 3. Каждое из них должно сопровождаться специаль¬ ной совокупностью правил для перевода с языка публи¬ каций или эталонного языка. Для транслитерации между эталонным языком и языком, подходящим для публикаций, наряду с другими рекомендуются следующие правила: Эталонный язык Индексные скобки [ ] Возведение в степень ф Скобки ( ) Основание десятью Язык публикаций Понижение строки, заключенной в скобки, и удаление скобок Поднятие показателя степени Любая форма скобок: круглые, квадратные, фигурные Поднятие десяти и следующего за ним целого числа, вставка подразумеваемого знака умно¬ жения
ОПИСАНИЕ ЭТАЛОННОГО ЯЗЫКА То, что вообще может быть сказано» может быть сказано ясно, а о чем невоз¬ можно говорить — о том следует молчать* Людвиг Витгенштейн 1. СТРУКТУРА ЯЗЫКА Как было сказано во введении, алгоритмический язык имеет три различных уровня представлений — эта¬ лонное, конкретное и для публикаций; последующее описание дается в терминах эталонного представления. Это означает, что все определяемые в языке объекты представляются посредством фиксированной совокуп¬ ности символов, а два других представления могут от¬ личаться только выбором символов. Структура и содер¬ жание должны быть для всех представлений одними и теми же. Назначением алгоритмического языка является опи¬ сание вычислительных процессов. Основной концепцией, используемой для описания правил вычислений, является хорошо известное понятие арифметического выражения, содержащего в качестве составных частей числа, переменные и функции. Из таких выражений пу¬ тем применения правил арифметической композиции образуются самостоятельные единицы языка — явные формулы, называемые операторами присваивания. Для того чтобы указать ход вычислительных про¬ цессов, добавляются некоторые неарифметические и условные операторы, которые могут, например, описы¬ вать альтернативы или циклические повторения вычис¬ лительных операторов. Ввиду того что для функциони¬ рования этих операторов возникает необходимость их
18 Описание эталонного языка взаимосвязи, операторы могут снабжаться метками. Чтобы образовать составной оператор, последователь¬ ность операторов можно заключить в операторные скобки begin и end. Операторы дополняются описаниями, которые сами по себе не являются предписаниями о вычислениях, но информируют транслятор о существовании и некоторых свойствах объектов, фигурирующих в операторах. Эти¬ ми свойствами могут быть, например, класс чисел, ис¬ пользуемых в качестве значений переменной, размер¬ ность массива чисел или даже совокупность правил, определяющих некоторую функцию. Последовательность описаний и следующая за ней последовательность опе¬ раторов, заключенные между begin и end, составляют блок. Каждое описание вводится в блоки таким путем и действительно только для этого блока. Программа является блоком или составным опера¬ тором, который не содержится внутри другого опера¬ тора и который не использует других операторов, не содержащихся в нем. Ниже будут приведены синтаксис и семантика языка !). 1.1. Формализм для синтаксического описания Синтаксис описывается с помощью металингвистиче¬ ских формул [3]. Их интерпретация лучше всего объяс¬ няется с помощью примера: (ab> :: = (IIKab)(|<ab>(d) Последовательности знаков, заключенные в скобки ( ), представляют собой металингвистические переменные, *) Всякий раз, когда утверждается, что точность арифметиче¬ ских действий, вообще говоря, не указана, или когда результат некоторого процесса остается или объявляется неопределенным, это должно пониматься так, что программа станет полностью опреде¬ лять некоторый вычислительный процесс только тогда, когда допол¬ нительная информация укажет как подразумеваемые точность и вид арифметических действий, так и последовательность выполняе¬ мых действий для всех случаев, которые могут встретиться в про¬ цессе вычислений.
I. Ст p у к т у р а языка 19 значениями которых являются последовательности сим¬ волов. Знаки : : = и | (последний со значением «или»)—это металингвистические связки. Любой знак в формуле, который не является переменной или связкой, обозначает самого себя (или класс знаков, ему подобных). Соединение знаков и (или) переменных в формуле означает соединение обозначаемых последо¬ вательностей. Таким образом, вышеприведенная фор¬ мула задает рекурсивное правило для образования зна¬ чений переменной (ab). Она указывает, что (ab) может иметь значение либо (, либо [, или же, если дано неко¬ торое допустимое значение (ab), то еще одно значение можно получить, поставив за (ab) символ ( или некото¬ рое значение переменной (d). Если значениями (d) являются десятичные цифры, то некоторые из значений <дЬ) суть: [(((1(37( (12345( ((( [86 Чтобы облегчить изучение, символы, используемые для различения металингвистических переменных (т. е. по¬ следовательностей знаков, стоящих внутри скобок ( ), подобно ab в вышеприведенном примере), выбраны в виде слов, приблизительно описывающих природу со¬ ответствующей переменной. Там, где слова, введенные таким способом, используются где-либо в тексте, они всегда относятся к соответствующему синтаксическому определению. Кроме того, некоторые формулы приве¬ дены по нескольку раз. Определение: (пусто) : : = (т. е. строка, не содержащая символов).
20 Описание эталонного языка 2. ОСНОВНЫЕ СИМВОЛЫ, ИДЕНТИФИКАТОРЫ, ЧИСЛА И СТРОКИ. ОСНОВНЫЕ понятия Эталонный язык строится из следующих основных символов: (основной символ) :: = (буква)! (цифра)! (логическое значение)! (ограничитель) 2.1. Буквы (буква): : = -4|В|С|D|£|F|G|Z7rZ|J|/<|L| |ЛЛ| O|P|Q| Я|$| T\U\V\W\X\Y\Z | Этот алфавит может быть произвольно сужен или рас¬ ширен добавлением любых других различимых знаков (т. е. символов, не совпадающих с какой бы то ни было цифрой, логическим значением или ограничителем). Буквы не имеют индивидуального смысла. Они ис¬ пользуются для образования идентификаторов и строк ’) (см. разд. 2.4. Идентификаторы, 2.6. Строки). 2.2. Цифры. Логические значения 2.2.1. Цифры (цифра) : : = 0|112|3|4|5|6|7|8|9 Цифры используются для образования чисел, иден¬ тификаторов и строк. 2.2.2. Логические значения (логическое значение) : : —true|fa!se Логические значения имеют фиксированный оче¬ видный смысл 2). *) Следует особо заметить, что повсюду в эталонном языке под¬ черкивание (в данном печатном тексте — выделение полужирным шрифтом. — Ред.) используется для выделения независимых основ¬ ных символов (см. разд. 2.2.2 и 2.3). Подразумевается, что эти основные символы не имеют никакого отношения к отдельным бук¬ вам, из которых они составлены. В настоящем сообщении подчерки¬ вание для других целей не используется. а) true — истина, false — ложь. — Прим. ред.
2. Основные символы 21 2.3. Ограничители (ограничитель) : : = (знак операции)|(разделитель)! (скобка)! (описатель) ((спецификатор) (знак операции) : : = (знак арифметической операции)] (знак операции отношения)|(знак логической опера- ции)|(знак операции следования) (знак арифметической операции) : : — +| — | X | /\ -Ч f (знак операции отношения) — <К1 = |>|>| ¥= (знак логической операции) :: = ==1 о | V | ЛI ””I (знак операции следования) :: = go to | if | then | else | for | do1) (разделитель) : : = , |. |10 |: | ; |: = | —| step| until| while| comment (скобка) : : = (|)|[|J|‘|’|begin|end (описатель) : : = own|Boolean|integer|real|array| switch | procedure (спецификатор) : : = string! label lvalue Ограничители имеют фиксированный смысл, который в большинстве случаев очевиден2), а в остальных слу¬ чаях будет указан ниже. Такие типографские особенности, как пробел или переход на новую строку, в эталонном языке не прини¬ маются во внимание. Однако для облегчения чтения их можно свободно использовать. ') do используется в операторах цикла. Это do не имеет ни¬ какого отношения к do, употреблявшемуся в предварительном сооб¬ щении и не включенному в АЛГОЛ-60. 2) Ниже приводится перевод английских слов, изображающих ряд основных символов АЛГОЛа: go to — перейти к, if — если, then—то, else — иначе, for — для, do—выполнить, step — шаг, until — до, while —пока, comment — примечание, begin— начало, end — конец, own — собственный, Boolean — булевский, или логиче¬ ский, integer — целый, real — вещественный, array — массив, switch — переключатель, procedure — процедура, string — строка, label — метка, value — значение. — Прим. ред.
22 Описание эталонного языка Для возможности включения текста между симво¬ лами программы имеют место следующие правила для примечаний: Последовательность эквивалентна основных символов: ; comment (любая последователь¬ ность, не содержащая;) ; ; begin comment (любая последова¬ тельность, не содержащая;) ; begin end (любая последовательность, не содержащая ни одного из символов end; else) end Эквивалентность здесь означает, что любая из трех конструкций, указанных в левой колонке, если она встречается вне некоторой строки, может заменяться соответствующим ей символом, указанным в правой ко¬ лонке; эта замена не оказывает никакого влияния на работу программы. При этом считается, что конструк¬ цию примечания, встретившуюся раньше при чтении текста слева направо, следует заменять прежде, нежели более поздние конструкции, содержащиеся в этой после¬ довательности. 2.4. Идентификаторы 2.4.1. Синтаксис (идентификатор) : : = (буква)|(идентификатор) (буква)] (идентификатор) (цифра) 2.4.2. Пример ы <7 Soup V\7a c&bkTMNs MARILYN 2.4.3. Семантика Идентификаторы не имеют неизменно присущего им смысла, а служат для обозначения простых перемен¬
2. Основные символы 23 ных, массивов, меток, переключателей и процедур. Их можно выбирать произвольно (см., однако, разд. 3.2.4. Стандартные функции). Один и тот же идентификатор нельзя использовать для обозначения двух различных величин, за исключе¬ нием того случая, когда эти величины, согласно описа¬ ниям программы, имеют несовместные области действия (см. разд. 2.7. Величины, классы и области действия и гл. 5. Описания). 2.5. Числа 2.5.1. Синтаксис (целое без знака) —(цифра) | (целое без знака) (цифра) (целое) : : = (целое без знака)|-(-(целое без знака)| --(целое без знака) (правильная дробь) : : = . (целое без знака) (порядок)::= ю(целое) (десятичное число) : : = (целое без знака)|(правильная дробь)|(целое без знака) (правильная дробь) (число без знака) = (десятичное число)|(порядок)| (десятичное число) (порядок) (число) :: = (число без знака)| -(-(число без знака)) —(число без знака) 2.5.2. Примеры 0 — 200.084 177 4-О7.431о8 .5384 9.3410 + Ю -(-0.7300 210 — 4 2.5.3. Семантика —.08310 —02 - ю7 ю — 4 + io Н-5 Десятичные числа имеют свой обычный смысл. По¬ рядок— это масштабный множитель, выраженный как целая степень десяти.
24 Описание эталонного языка 2.5.4. Типы Целые числа имеют тип integer. Все остальные числа имеют тип real (см. разд. 5.1. Описания типа). 2.6. Строки 2.6.1. Синтаксис (чистая строка) : : —(любая последовательность основ¬ ных символов, не содержащая символа ‘ или символа’)|(пусто) (открытая строка) : : = (чистаястрока)[‘(открытая стро¬ ка)’[(открытая строка) (открытая строка) (строка) : : = ‘ (открытая строка)’ 2.6.2. Примеры ‘5£„ - ‘[ [ [‘ А = /: 'ТГ ‘.. This — is — а — ‘string" ’ 2.6.3. Семантика Для того чтобы в языке можно было иметь дело с произвольными последовательностями основных сим¬ волов, введены кавычки для строк: ‘ и Символ -—1 обозначает пробел. Вне строк он не имеет значения. Строки используются в качестве фактических пара¬ метров процедур (см. разд. 3.2. Указатели функций и 4.7. Операторы процедур). 2.7. Величины, классы и области действия Различаются следующие классы величин: простые переменные, массивы, метки, переключатели и про¬ цедуры. Область действия величины — это совокупность опе¬ раторов и выражений, внутри которой имеет силу опи¬ сание идентификатора, связанного с этой величиной. Вопросы, касающиеся меток, см. в разд. 4.1.3.
3. Выражения 25 2.8. Значения и типы Значение — это некоторое упорядоченное множество чисел (частный случай: отдельное число), некоторое упорядоченное множество логических значений (част¬ ный случай: отдельное логическое значение) или неко¬ торая метка. О некоторых синтаксических единицах говорится, что они обладают значениями. Во время выполнения программы эти значения, вообще говоря, изменяются. Значения выражений и их составных частей опреде¬ ляются в гл. 3. Значение идентификатора массива есть упорядоченное множество значений соответствующего массива переменных с индексами (см. разд. 3.1.4.1). Различные типы (integer, real, Boolean) в основном обозначают свойства значений. Типы, связанные с син¬ таксическими единицами, относятся к значениям этих единиц. 3. ВЫРАЖЕНИЯ В данном языке первичными составными частями программ, описывающих алгоритмические процессы, являются арифметические, логические и именующие выражения. Составными частями этих выражений, по¬ мимо некоторых ограничителей, являются логические значения, числа, переменные, указатели функций, эле¬ ментарные арифметические и логические операции, а также некоторые операции отношения и следования. Поскольку синтаксическое определение как перемен¬ ных, так и указателей функций содержит выражения, определение выражений и их составных частей по необ¬ ходимости является рекурсивным. (выражение): : = (арифметическое выражение)|(логи- ческое выражение)|(именующее выражение) 3.1. Переменные 3.1.1. Синтаксис (идентификатор переменной) : :— (идентификатор) (простая переменная) : : = (идентификатор переменной) 3 Зак. 1559
26 Описание эталонного языка (индексное выражение) :: = (арифметическое выра¬ жение) (список индексов) : : = (индексное выражение)|(список индексов), (индексное выражение) (идентификатор массива): : = (идентификатор) (переменная с индексами) = (идентификатор мас¬ сива) [(список индексов)] (переменная) : : = (простая переменная)|(переменная с индексами). 3.1.2. Примеры epsilon. det А а\7 Q[7, 2] х \sin (п X pZ/2), Q [3, п, 4] ] 3.1.3. Семантика Переменная — это наименование, данное некоторому отдельному значению. Это значение может использо¬ ваться в выражениях для образования других значе- «ий и может быть при желании изменено посредством операторов присваивания (разд. 4.2). Тип значения дан¬ ной переменной определяется описанием самой пере¬ менной (см. разд. 5.1. Описания типа) или соответ¬ ствующего идентификатора массива (см. разд. 5.2. Опи¬ сания массивов). 3.1.4. Индексы 3.1.4.1. Переменные с индексами именуют значения, которые являются компонентами многомерных масси¬ вов (см. разд. 5.2. Описания массивов). Каждое ариф¬ метическое выражение из списка индексов занимает одну индексную позицию переменной с индексами и на¬ зывается индексом. Полный список индексов заклю¬ чается в индексные скобки [ ]. Какая именно компонента массива упоминается с помощью переменной с индек¬ сами, определяется по фактическому числовому значе¬
3. Выражения 27 нию ее индексов (см. разд. 3.3. Арифметические выра¬ жения). 3.1.4.2. Каждая индексная позиция воспринимается как переменная типа integer, и вычисление индекса по¬ нимается как присваивание значения этой фиктивной переменной (см. разд. 4.2.4.). Значение переменной с ин¬ дексами определено только в том случае, когда значе¬ ние индексного выражения находится в пределах гра¬ ниц индексов массива (см. разд. 5.2. Описания мас¬ сивов). 3.2. Указатели функций 3.2.1. Синтаксис (идентификатор процедуры) : : = (идентификатор) (фактический параметр) : : = (строка)|(выражение)| (идентификатор массива)|(идентификатор пере¬ ключателя)! (идентификатор процедуры) (строка букв):: =(буква)!(строка букв)(буква) (ограничитель параметра) :: = ,[) (строка букв) : ( (список фактических параметров) :: = (фактический параметр)! (список фактических параметров) (ограничитель параметра) (фактический пара¬ метр) (совокупность фактических параметров) :: = (пусто)| ((список фактических параметров)) (указатель функции): : = (идентификатор процедуры) (совокупность фактических параметров) 3.2.2. Примеры1) sin (а — Ь) J(v + s, п) R S(s — 5) Температура: (7) Давление: (Р) Compile^ : = ’) Stack'. (Q) !) В данном примере и ниже в некоторых случаях, когда идеи* тификатор имеет мнемоническое значение, он будет переводиться на русский язык. При этом будет неявно предполагаться, что алфавит АЛГОЛа расширен введением русских букв. — Прим, ред.
28 Описание эталонного языка 3.2.3. Семантика Указатели функций определяют отдельные числовые или логические значения, которые получаются в резуль¬ тате применения заданных совокупностей правил, опре¬ деляемых описанием процедуры (см. разд. 5.4. Описа¬ ния процедур), к фиксированным совокупностям факти¬ ческих параметров. Правила, регулирующие задание фактических параметров, даны в разд. 4.7. Операторы процедур. Не каждое описание процедуры определяет значение какого-либо указателя функции. 3.2.4. Стандартные функции Некоторые идентификаторы должны быть закре¬ плены за стандартными функциями анализа, которые выражаются в виде процедур. Рекомендуется, чтобы этот список закреплений содержал: abs(E)— для модуля (абсолютной величины) значе¬ ния выражения Е sign(E)— для знака значения Е (4-1 для Е > О, О для 5 = 0, —1 для Е < 0) sqrt(E) — для квадратного корня из значения Е siniJE)— для синуса значения Е cos(E)—для косинуса значения Е arctan (5) — для главного значения арктангенса зна¬ чения Е 1п(Е) — для натурального логарифма значения Е ехр(Е) — для показательной функции значения Е(еЕ). Считается, что все эти функции оперируют с аргумен¬ тами равно как типа real, так и типа integer. Все они дают значения типа real, кроме sign (5), который имеет значения типа integer. В частных представлениях эти функции могут использоваться без явных описаний (см. гл. 5. Описания). 3.2.5. Функции преобразования Считается, что для любой пары величин и выраже¬ ний можно определить функции преобразования. Среди
3. Выражения 29 стандартных функций рекомендуется иметь одну, а именно entier (Е), которая «преобразует» выражение типа real в выражение типа integer и присваивает ему значение, являющееся наибольшим целым, не превы¬ шающим значение Е. 3.3. Арифметические выражения 3.3.1. Синтаксис (знак операции типа сложения) : : = -ф| — (знак операции типа умножения): : = Х|/|-г- (первичное выражение) :: = (число без знака)|(пере- менная)|(указатель функции)(((арифметическое выражение)) (множитель) : : = (первичное выражение)|(множитель)| (первичное выражение) (терм) :: = (множитель) | (терм) (знак операции типа умножения) (множитель) (простое арифметическое выражение) : : = (терм)|(знак операции типа сложения) (терм)|(простое ариф¬ метическое выражение) (знак операции типа сложения) (терм) (условие) : : = if (логическое выражение) then (арифметическое выражение) :: = (простое арифмети¬ ческое выражение)|(условие) (простое арифме¬ тическое выражение) else (арифметическое вы¬ ражение) 3.3.2. Примеры Первичные выражения: 7.39410—8 sum w[i + 2,8] cos (у + z X 3) (а — 3/у -|- vu | 8)
30 Описание эталонного языка Множители: omega sum f cos {у + z X 3) 7.39410 — 8 f w + 2,8] f (a — 3/y 4- vu f 8) Термы: U omega X sum f cos (y-\-zX 3)/7.394ю — 8 f w ]Z + 2,8] f (a — 3/y + vu f 8) Простое арифметическое выражение: U — Yu + omega X sum f cos (y + z X 3)/7.39410 — 8 f w [/ + 2,8] f (a — 3/y + vu f 8) Арифметические выражения: <w X и — Q (5 + Си) f 2 if <7 > 0 then 5+3 X QM else 2X^+3X? if a < 0 then U + V else if a X b > 17 then U(V else if k у then V/U else 0 a X sin (omega X 0 0.571012Xa[^X(AA-l)/2, 0] (A X arctan (y) + Z) f (7 + Q) if q then n—1 else n if a < 0 then Al В else if b = 0 then В/A else z 3.3.3. Семантика Арифметическое выражение является правилом для вычисления числового значения. В случае простых ариф¬ метических выражений это значение получается путем выполнения указанных арифметических операций над фактическими числовыми значениями первичных выра¬ жений, входящих в данное выражение, как это детально объяснено ниже, в разд. 3.3.4. Что такое фактическое числовое значение первичного выражения, ясно в слу¬ чае чисел. Для переменных оно является текущим зна¬ чением (последним по времени присвоенным значе¬ нием), а для указателей функций оно является значе¬
3. Выражения 31 нием, полученным по правилам вычислений, определяю¬ щих процедуру (см...разд. 5.4.4. Значения указателей функции), примененным к текущим значениям парамет¬ ров процедуры, заданных в выражении. Наконец, для арифметических выражений, заключенных в скобки, их значение должно выражаться посредством рекурсивного анализа, исходя из значений остальных трех видов пер¬ вичных выражений. В более общих арифметических выражениях, вклю¬ чающих в себя условия, на основе фактических значе¬ ний логических выражений (см. разд. 3.4. Логические выражения) выбирается одно из нескольких простых арифметических выражений. Этот выбор производится следующим образом: значения логических выражений, входящих в условия, вычисляются последовательно сле¬ ва направо до тех пор, пока не найдется выражение, имеющее значение true. Значением арифметического вы¬ ражения будет тогда значение первого арифметического выражения, следующего за этим логическим (при этом имеется в виду максимальное арифметическое выраже¬ ние, обнаруживаемое в этой позиции). Конструкция: else (простое арифметическое выражение) эквивалентна конструкции: else if true then (простое арифметическое выражение) 3.3.4. Операции и типы Составные части простых арифметических выраже¬ ний (не считая логических выражений, употребляемых в условиях) должны иметь тип real или integer (см. разд. 5.1. Описания типа). Смысл основных операций и типы выражений, к которым они приводят, опреде¬ ляются следующими правилами: 3.3.4.1. Знаки операций + , — и X имеют обычный смысл (сложение, вычитание и умножение). Выражение имеет тип integer, если оба операнта имеют тип integer, в противном случае — real. 3.3.4.2. Операции (терм)/(множитель\ и (терм)-е- (множитель) обозначают деление, понимаемое как умножение терма на обратную величину множителя
32 Описание эталонного языка с соответствующИхМ учетом правил старшинства (см. разд. 3.3.5). Таким образом, например, alb X 7/(р — <7) X f/s означает ((((а X (*’’)) X 7) X ((р - р)-1)) X -п) X (s’1) Знак операции / определен для всех четырех комбина¬ ций типов real и Integer и в любом случае дает резуль¬ тат типа real. Знак операции -т- определен только для того случая, когда оба операнта имеют тип integer, и дает результат типа integer, математически определяе¬ мый следующим образом: a -j-b — sign (a/b) X entier (abs (a/b)) (см. разд. 3.2.4 и 3.2.5). 3.3.4.3. Операция (множитель) f (первичное выра¬ жение) означает возведение в степень, где множитель есть основание, а первичное выражение — показатель степени. Таким образом, например, 2 2 f п | k означает (2")* тогда как 2 f (л f ш) означает 2^"т^ Если писать i вместо числа типа integer, г вместо числа типа real и а вместо числа типа real или integer, то результат определяется следующими правилами: a J i afr Если i > 0, а X а X • • • X а (i раз), того же типа, что и а. Если i — О, если а 4= 0, 1, того же типа, что и а; если а = 0, не определено. Если / < 0, если а #= 0, 1/(а X а X... X а) (знаменатель имеет —i множите¬ лей), типа real; если а =0, не опре¬ делено. Если а > 0, exp(r X 1п(а)). типа real. Если а — 0, если г>0, 0.0, типа real; если г <0, не определено. Если а < 0, всегда не определено.
3. Выражения 33 3.3.5. Старшинство операций Операции в пределах одного выражения выпол¬ няются, вообще говоря, в последовательности слева направо с учетом следующих добавочных правил: 3.3.5.1. Согласно синтаксису, данному в разд. 3.3.1, выдерживается следующий порядок старшинства: первый: f второй: Х/-^ третий: 4- — 3.3.5.2. Значение выражения между левой скобкой и соответствующей правой скобкой вычисляется само¬ стоятельно id используется в дальнейших вычислениях. Следовательно, желаемый порядок выполнения опера¬ ций в пределах выражения всегда может быть достиг¬ нут соответствующей расстановкой скобок. 3.3.6. А р и ф м е т и к а величин типа real Числа и переменные типа real должны интерпрети¬ роваться в смысле численного анализа, т. е. как объек¬ ты, определенные с присущей им конечной точностью. Аналогично в любом арифметическом выражении явно подразумевается возможность отклонения от математи¬ чески определяемого результата. Тем не менее никакая точная арифметика не определяется и, конечно, счи¬ тается, что в зависимости от различных конкретных представлений значения арифметических выражений могут вычисляться по-разному. Контроль за возмож¬ ными последствиями таких различий должен прово¬ диться методами численного анализа. Этот контроль должен рассматриваться как часть описываемого про¬ цесса и, следовательно, выражаться в терминах самого языка. 3.4. Логические выражения 3.4.1. Синтаксис (знак операции отношения): : = <1<|=|>|>|¥= (отношение): := (простое арифметическое выражение) (знак операции отношения) (простое арифмети¬ ческое выражение)
34 Описание эталонного языка (первичное логическое выражение) :: =(логическое значение)|(переменная)|(указатель функции)! (отношение) | ((логическое выражение)) (вторичное логическое выражение): : = (первичное логическое выражение) | “I (первичное логиче¬ ское выражение) (логический одночлен): : = (вторичное логическое вы¬ ражение) |(логический одночлен) Д (вторичное логическое выражение) (логический терм) —(логический одночлен) | (логи¬ ческий терм)V(логический одночлен) (импликация) : : — (логический терм) | (импликация) (логический терм) (простое логическое выражение) :: =(импликация) (простое логическое выражение) = (импликация) (логическое выражение) :: = (простое логическое вы¬ ражение) |(условие) (простое логическое выра¬ жение) else (логическое выражение) 3.4.2. Примеры х =— 2 Y > W z < q a-\-b> — 5 Д z— d~> q \ 2 р AqV хфу g=qa д Ь /\~}с\/ d V if k < 1 then s > w else h < c if if if a then b else c then d else f then g else h < k 3.4.3. Семантика Логическое выражение является правилом для вы¬ числения логического значения. Принципы вычисления полностью аналогичны правилам, данным в разд. 3.3.3 для арифметических выражений. 3.4.4. Типы Переменные и указатели функций, используемые в качестве первичных логических выражений, должны
3. Выражения 35 быть описаны как имеющие тип Boolean (см. разд. 5.1, Описания типа и разд. 5.4.4. Значения указателей функции). 3.4.5. Операции Отношения принимают значения true в том случае, когда соответствующее отношение удовлетворяется для входящих в него выражений; в противном случае они принимают значение false. Значения знаков логических операций (не), Л (и), V (или), зэ (влечет) и = (эквивалентно) даются следующей функциональной таблицей: 61 false false true true ьч false true false true true true false false 61 л 62 false false false true 61 V 62 false true true true 61 =>62 true true false true 61=62 true false false true 3.4.6. Старшинство операций Операции в пределах одного выражения выпол¬ няются, вообще говоря, в последовательности слева направо с учетом следующих добавочных правил: 3.4.6.1. Согласно синтаксису, данному в разд. 3.4.1, выдерживается следующий порядок старшинства: первый: арифметические выражения согласно разд. 3.3.5. второй: << = >>=£ третий: ~] четвертый: Л пятый: V шестой: о седьмой: = 3.4.6.2. Применение скобок интерпретируется в смы еле, данном в разд. 3.3.5.2.
36 Описание эталонного языка 3.5. Именующие выражения 3.5.1. Синтаксис (метка):: = (идентификатор) | (целое без знака) (идентификатор переключателя): : = (идентификатор) (указатель переключателя): : = (идентификатор пере¬ ключателя) [(индексное выражение)] ^простое именующее выражение): : = (метка)|(указа¬ тель переключателя)!((именующее выражение)) (именующее выражение): : = (простое именующее вы¬ ражение)! (условие) (простое именующее выра¬ жение) else (именующее выражение) 3.5.2. Примеры 17 />9 Выбрать \п—1] Town [if у <0 then N else TV4- 1] if Ab<c then 17 else q [if ^<0 then 2 else n\ 3.5.3. Семантика Именующее выражение является правилом для по¬ лучения метки оператора (см. гл. 4. Операторы). Прин¬ ципы вычисления значения по-прежнему полностью ана¬ логичны правилам, приведенным для арифметических выражений (разд. 3.3.3). В общем случае логические выражения, содержащиеся в условиях, выбирают про¬ стое именующее выражение. Если это метка, то желае¬ мый результат уже получен. Указатель переключателя отсылает к соответствующему описанию переключателя (см. разд. 5.3. Описания переключателей) и по факти¬ ческому числовому значению своего индексного выра¬ жения выбирает одно из именующих выражений, пере¬ численных в описании переключателя, отсчитывая эти выражения слева направо. Так как выбранное таким образом именующее выражение может в свою очередь оказаться указателем переключателя, то вычисление
4.'Операторы 37 значения, очевидно, представляет собой рекурсивный процесс. 3.5.4. Индексное выражение Вычисление значения индексного выражения анало¬ гично такому же вычислению для переменных, с индек¬ сами (см. разд. 3.1.4.2). Значение указателя переключа¬ теля определено только в том случае, когда индексное выражение принимает одно из положительных значе¬ ний 1, 2, 3, . . ., п, где п — число членов в переключа¬ тельном списке. 3.5.5. Целые беззнака в качестве меток Целые без знака, используемые в качестве меток, об¬ ладают тем свойством, что стоящие впереди нули не изменяют их значения. Например, 00217 обозначает ту же метку, что и 217. 4. ОПЕРАТОРЫ Единицы действий в языке называются операторами. Обычно они выполняются в той последовательности, в которой написаны. Однако эта последовательность действий может прерываться операторами перехода, ко¬ торые явно определяют своего преемника, и сокра¬ щаться условными операторами, которые могут вызы¬ вать пропуск некоторых операторов. Для того чтобы имелась возможность указать фак¬ тический порядок следования операторов в процессе ра¬ боты, операторы могут снабжаться метками. Ввиду того что последовательности операторов могут группироваться в составные операторы и блоки, опреде¬ ление оператора по необходимости должно быть рекур¬ сивным. Кроме того, поскольку описания, о которых говорится в гл. 5, существенно входят в синтаксическую структуру, синтаксическое определение операторов должно предполагать, что описания уже определены.
38 Описание эталонного языка 4.1. Составные операторы и блоки 4.1.1. Синтаксис (непомеченный основной оператор): : = (оператор при¬ сваивания) |(оператор перехода)!(пустой опера¬ тор) | (оператор процедуры) (основной оператор): : = (непомеченный основной опе¬ ратор) |(метка):(основной оператор) (безусловный оператор)::=(основной оператор)! (со¬ ставной оператор)|(блок) (оператор): : = (безусловный оператор)!(условный опе¬ ратор) | (оператор цикла) (конец составного) : : = (оператор) end | (оператор); (конец составного) (начало блока) ::= begin (описание)|(начало блока); (описание) (непомеченный составной) : : — begin (конец состав¬ ного) (непомеченный блок) :: = (начало блока); (конец со¬ ставного) (составной оператор) :: = (непомеченный составной)! (метка): (составной оператор) (блок) : : = (непомеченный блок) | (метка) : (блок) (программа): : = (блок)| (составной оператор) Этот синтаксис можно проиллюстрировать следую¬ щим образом. Обозначим произвольные операторы, описания и метки буквами S, D и L соответственно. Тогда основные синтаксические единицы примут сле¬ дующий вид: Составной оператор: L : L : ... begin S; S; ... S; S end Блок: L : L : ... begin D; D; ... D; S; S; ... S; S end При этом нужно помнить, что каждый из операторов S может в свою очередь быть полным составным опера¬ тором или блоком.
4. Операторы 39 4.1.2. Примеры Основные операторы: а : = p-\-q go to Naples START : CONTINUE : IT: = 7.993 Составной оператор: begin x : =0; for у : = 1 step 1 until n do x • =х + Л[г/]; if x>q then go to STOP else if x>w—2 then go toS; Aw : St: W : = x-]- bob end Блок: Q : begin integer Z, k\ real w\ for i: = 1 step 1 until m do for k : = I + 1 step 1 until m do begin w : = A [Z, £]; k\: = A[£, Z]; A[k, Z] : = w end for i and k end block Q 4.1.3. Семантика Каждый блок автоматически вводит новый уровень обозначений. Это реализуется следующим образом. Лю¬ бой идентификатор, встречающийся внутри блока, можно определить посредством соответствующего опи¬ сания (см. гл. 5. Описания) как локальный в данном блоке. Это означает (а), что объект, представленный этим идентификатором внутри данного блока, не суще¬ ствует вне блока и (б) что любой объект, представлен¬ ный тем же идентификатором вне данного блока, нельзя использовать внутри блока. Идентификаторы (за исключением тех, которые изо¬ бражают метки), встречающиеся внутри блока и не опи¬ санные в нем, не локализуются в блоке, т. е. предста¬ вляют одни и те же объекты как внутри блока, так и в соседних блоках. Метка, отделенная двоеточием от оператора, т. е. помечающая этот оператор, действует так, как будто она описана в заголовке наименьшего объемлющего блока, т. е. наименьшего блока, скобки
40 Описание эталонного языка которого begin и end заключают этот оператор. В этом отношении тело процедуры нужно рассматривать так, как если бы оно было заключено между begin и end, и трактовать как блок. Так как некоторый оператор в блоке может в свою очередь тоже быть блоком, то концепции локальности и нелокальности в блоке следует понимать рекурсивно. Таким образом, идентификатор, не локальный в бло¬ ке А, может быть локальным или не локальным в бло¬ ке В, для которого А является одним из его опера¬ торов. 4.2. Операторы присваивания 4.2.1. Синтаксис (левая часть) : : = (переменная) : = [(идентификатор процедуры): = (список левой части):: = (левая часть)|(список левой части) (левая часть) (оператор присваивания) : : — (список левой части) (арифметическое выражение)!(список левой ча¬ сти) (логическое выражение) 4.2.2. Примеры s : = р[0] : = п : = п-\- 1 + s д • = ц —1 А : — В/С — v — qXS S [tj, k + 2]: = 3 — arctan (s X zeta) V: = Q>Y /\Z 4.2.3. Семантика Операторы присваивания служат для присваивания значения выражения одной или нескольким переменным или идентификаторам процедур. Присваивание иденти¬ фикатору процедуры может встречаться только внутри тела процедуры, определяющей значение указателя функции (см. разд. 5.4.4). Подразумевается, что в об¬ щем случае этот процесс проходит в следующие три этапа:
4. Операторы 41 4.2.3.1. Значения всех индексных выражений, встре¬ чающихся в переменных левой части, вычисляются в по¬ рядке слева направо. 4.2.3.2. Вычисляется значение выражения в опера¬ торе. 4.2.3.3. Значение выражения присваивается всем пе¬ ременным левой части, при этом индексные выражения имеют значения, вычисленные на шаге 4.2.3.1. 4.2.4. Типы Все переменные и идентификаторы процедур списка левой части должны по описанию иметь один и тот же тип. Если это тип Boolean, то выражение также должно быть типа Boolean. Если этот тип real или integer, то выражение должно быть арифметическим. Если тип арифметического выражения отличается от типа пере¬ менных и идентификаторов процедур, то считают, что автоматически нужно применить соответствующие функции преобразования. Имеется в виду, что для пре¬ образования из типа real в тип integer функция преоб¬ разования выдает результат, эквивалентный entier (£*4-0,5), где Е— значение выражения. Тип идентификатора про¬ цедуры задается описателем, который является первым символом соответствующего описания процедуры (см. разд. 5.4.4). 4.3. Операторы перехода 4.3.1. Синтаксис (оператор перехода) :: — go to (именующее выражение) 4.3.2. Примеры go to 8 go to exit [n-b 1] go to 7own[if у < 0 then N else N -J-1] go to if Ab < c then 17 else q [if w < Othen 2 else я] 4 Зак. 1659
42 Описание эталонного языка 4.3.3. Семантика Оператор перехода прерывает естественную последо¬ вательность действий, задаваемую порядком написания операторов, явно определяя своего преемника по значе¬ нию именующего выражения. Таким образом, следую¬ щим выполняемым оператором будет тот, который имеет это значение в качестве своей метки. 4.3.4. Ограничение Так как метки всегда локальны, то ни один опера¬ тор перехода не может извне вести к метке внутри блока. Однако оператор перехода может вести извне к метке внутри составного оператора. 4.3.5. Переход при неопределенном ука¬ зателе переключателя В том случае, когда именующее выражение есть указатель переключателя, значение которого не опре¬ делено, оператор перехода эквивалентен пустому оператору. 4.4. Пустые операторы 4.4.1. Синтаксис (пустой оператор) = (пусто) 4.4.2. Примеры L: begin ...; John: end 4.4.3. Семантика Пустой оператор не выполняет никакого действия. Он может служить для помещения метки. 4.5 Условные операторы 4.5.1. Синтаксис (условие): : = if (логическое выражение) then (безусловный оператор): J = (основной оператор) | (со¬ ставной оператор)!(блок)
4. Операторы 43 (оператор „если"): : = (условие) (безусловный опера¬ тор) (условный оператор):: = (оператор „если“)| (оператор „если") else (оператор) | (условие) (оператор цикла) | (метка) : (условный оператор) 4.5.2. Примеры if х > 0 then п: = п + 1 if <v > и then V : q: — n-^-m else go to /? ifs<0V^<Q then AA : begin if q < v then a : = v/s else у: = 2 X a end else if v > s then a: = v — q else if v > s— 1 then go to S 4.5.3. Семантика Условные операторы приводят к пропуску или вы¬ полнению некоторых операторов в зависимости от те¬ кущих значений указанных логических выражений. 4.5.3.1. Оператор «если». Безусловный оператор, вхо¬ дящий в оператор «если», выполняется в том случае, когда логическое выражение, входящее в условие, является истинным. В противном случае он пропу¬ скается, и действия продолжатся начиная со следую¬ щего оператора. 4.5.3.2. Условный оператор. Согласно синтаксису, возможны две различные формы условных операторов. Эти формы могут быть проиллюстрированы следую¬ щими примерами: if Bl then SI else if B2 then S2 else S3; S4 и if Bl then SI else if B2 then S2 else if B3 then S3; S4 Здесь Bl, B2, B3 — логические выражения, a SI, S2, S3 — безусловные операторы; S4 — оператор, следую¬ щий за полным условным оператором. Выполнение условного оператора можно описать сле¬ дующим образом. В порядке слева направо вычис¬ ляются значения логических выражений, стоящих в ус¬ ловиях. Вычисления продолжаются до тех пор, пока не 4*
44 Описание эталонного языка будет найдено выражение, имеющее значение true. После этого выполняется безусловный оператор, сле¬ дующий непосредственно за этим логическим выраже¬ нием. Если этот оператор не определит своего преем¬ ника, то следующим выполняемым оператором будет S4, т. е. оператор, следующий за полным условным опе¬ ратором. Таким образом, действие ограничителя else можно охарактеризовать, сказав, что он определяет в качестве преемника оператора, за которым он (огра¬ ничитель.— Ред.) следует, оператор, следующий за пол¬ ным условным оператором. Конструкция else (безусловный оператор) эквивалентна конструкции else if true then (безусловный оператор) Если ни одно из логических выражений, входящих в условия, не является истинным, то результат работы всего условного оператора эквивалентен работе пу¬ стого оператора. Для дальнейших пояснений может быть полезна следующая схема: if Bl then SI else if B2 then S2 else S3; S4 I t l_ t Bl ложно B2 ложно 4.5.4. Переход внутрь условного опера¬ тора Результат работы оператора перехода, ведущего внутрь условного оператора, непосредственно следует из объясненного выше действия ограничителя else. 4.6. Операторы цикла 4.6.1. Синтаксис (элемент списка цикла): : = (арифметическое выраже¬ ние) | (арифметическое выражение) step (ариф¬ метическое выражение) until (арифметическое
4. Операторы 45 выражение) | (арифметическое выражение) while (логическое выражение) (список цикла) :: =(элемент списка цикла) | (список цикла), (элемент списка цикла) (заголовок цикла) : : = for (переменная) : = (список цикла) do (оператор цикла)::= (заголовок цикла) (оператор)! (метка):(оператор цикла) 4.6.2. Примеры for q: = 1 step s until n do A [<7]: = В [7] *forA: = l, XI X 2 while XI </V do for j : = /-]-(?, L, 1 step 1 until N, C-\-D do Л[А, y]: = Z?[£, /] 4.6.3. Семантика Заголовок цикла заставляет стоящий за ним опе¬ ратор S повторно выполняться нуль или более раз. Кроме того, он осуществляет последовательные при¬ сваивания значений переменной, управляемой данным заголовком1). Этот процесс может быть пояснен сле¬ дующей схемой: I t Начало; проверка; оператор S; продвижение; преемник ; t список цикла исчерпан В этой схеме слово „начало" означает: произвести первое присваивание в заголовке цикла. „Продвиже¬ ние" означает: произвести очередное присваивание в заголовке цикла. „Проверка" определяет, было ли сделано последнее присваивание. Если оно сделано, то выполнение продолжается с преемника оператора цикла. В противном случае выполняется оператор, стоящий за заголовком цикла. 9 9 В дальнейшем это выражение будет заменено принятым в нашей терминологии выражением «параметр цикла». — Прим, ред.
46 Описание эталонного языка 4.6.4. Элементы списка цикла Список цикла дает правило для получения значе¬ ний, которые последовательно присваиваются параметру цикла. Эта последовательность значений получается из элементов списка цикла путем их последовательного перебора в порядке их написания. Последовательность значений, порождаемая каждой из трех разновидностей элементов списка цикла, и соответствующее выполнение оператора S определяются следующими правилами: 4.6.4.1. Арифметическое выражение. Этот элемент за¬ дает только одно значение, а именно значение данного арифметического выражения, вычисленное непосред¬ ственно перед соответствующим выполнением опера¬ тора S. 4.6.4.2. Элемент типа арифметической прогрессии. Элемент, имеющий вид A step В until С, где А, В и С — арифметические выражения, задает порядок выпол¬ нения, который наиболее четко можно описать с по¬ мощью дополнительных операторов АЛГОЛа следую¬ щим образом: = II: if (V—С)Ж sign (В) > 0 then go to Элемент исчерпан; Оператор S; . V. = V+B; go to 11; где V — параметр цикла и «Элемент исчерпан» указы¬ вает на переход либо к вычислениям, соответствующим следующему элементу списка цикла, либо, если данный элемент типа арифметической прогрессии стоит послед¬ ним в списке, к следующему оператору программы. 4.6.4.3. Элемент типа пересчета. Порядок выполне¬ ния, определяемый элементом списка цикла вида Е while F, где Е— арифметическое, a F— логическое выражение, наиболее четко описывается с помощью до¬ полнительных операторов АЛГОЛа следующим об¬
4. Операторы 47 разом: £3: V:—E*> if ■”] F then go to Элемент исчерпан*, Оператор S\ go to £3; где обозначения те же, что и в 4.6.4.2. 4.6.5. 3 н а ч е н и е параметра цикла после выхода После выхода из оператора S (предполагаемого со¬ ставным) посредством какого-либо оператора перехода значение параметра цикла будет таким, каким оно было непосредственно перед выполнением оператора пере¬ хода. С другой стороны, если выход вызван исчерпанием списка цикла, то значение параметра цикла после вы¬ хода не определено. 4.6.6. Опер атор перехода, ведущий в опе¬ ратор цикла Результат действия оператора перехода, стоящего вне оператора цикла и обращающегося к метке внутри оператора цикла, не определен. 4.7 Операторы процедур 4.7.1. Синтаксис (фактический параметр) : : = (строка) | (выражение) | (идентификатор массива) | (идентификатор пере¬ ключателя) | (идентификатор процедуры) (строка букв):: = (буква) | (строка букв) (буква) (ограничитель параметра): :=, |) (строка букв):( (список фактических параметров)::= (фактический параметр) | (список фактических параметров) (ограничитель параметра) (фактический пара¬ метр)
48 Описание эталонного языка (совокупность фактических параметров): : = (пусто)| ((список фактических параметров)) (оператор процедуры): : = (идентификатор процедуры) (совокупность фактических параметров) 4.7.2. Примеры След (Л) Порядок: (7) Результат: (У) Транспонирование (W, т>+1) Абсмакс. (Д N, М, Yy, I, К) Скалярное произведение (Л [Л Р, и], В [Р], 10, Р, К) Эти примеры соответствуют примерам, данным в разд. 5.4.2. 4.7.3. Семантика Оператор процедуры служит для обеспечения вы¬ полнения тела процедуры (см. разд. 5.4. Описания про¬ цедур). В том случае, когда тело процедуры является оператором, записанным на языке АЛГОЛ, результат его выполнения будет эквивалентен результату осуще¬ ствления следующих действий в программе во время выполнения оператора процедуры. 4.7.3.1. Присваивание значений (вызов значением). Всем формальным параметрам, перечисленным в спи¬ ске значений заголовка описания процедуры, присваи¬ ваются значения (см. разд. 2.8. Значения и типы) соот¬ ветствующих фактических параметров; эти присваива¬ ния следует рассматривать как выполняемые непосред¬ ственно перед входом в тело процедуры. Это происхо¬ дит так, как будто создается объемлющий тело про¬ цедуры дополнительный блок, в котором делаются при¬ сваивания переменным, локальным в этом фиктивном блоке и имеющим типы, заданные соответствующими спецификациями (см. разд. 5.4.5). В результате пере¬ менные, вызываемые значением, следует рассматривать как не локальные в теле процедуры, но локальные в этом фиктивном блоке (см. разд. 5.4.3). 4.7.3.2. Замена наименований (вызов по наименова¬ нию), Любой формальный параметр, не перечисленный
4. Операторы 49 в списке значений, повсюду в теле процедуры заме¬ няется на соответствующий фактический параметр, по¬ сле того как последний там, где это синтаксически воз¬ можно, заключен в круглые скобки. Возможность про¬ тиворечий между идентификаторами, вставляемыми в тело процедуры в результате такого процесса, и иден¬ тификаторами, уже присутствующими в теле процедуры, устраняется соответствующими систематическими изме¬ нениями формальных или локальных идентификаторов, затронутых такими противоречиями. 4.7.3.3. Подстановка и выполнение тела процедуры. Наконец, тело процедуры, преобразованное так, как это было описано выше, помещается на место оператора процедуры и выполняется. Если обращение к процедуре производится извне области действия любой величины, не локальной в теле процедуры, то противоречия между идентификаторами, включенными посредством этого процесса подстановки тела, и идентификаторами, описа¬ ния которых имеют силу там, где расположен оператор процедуры или указатель функции, устраняются по¬ средством соответствующих систематических изменений последних идентификаторов. 4.7.4. Соответствие между фактическими и формальными параметрами Соответствие между фактическими параметрами опе¬ ратора процедуры и формальными параметрами заго¬ ловка процедуры устанавливается следующим образом. Список фактических параметров оператора процедуры должен иметь то же число членов, что и список фор¬ мальных параметров заголовка описания процедуры. Соответствие получается путем сопоставления членов этих двух списков в одном и том же порядке. 4.7.5. Ограничения Чтобы оператор процедуры был определен, оче¬ видно, необходимо, чтобы действия над телом про¬ цедуры, определенные в разд. 4.7.3.1 и 4.7.3.2, приводили бы к правильному оператору в языке АЛГОЛ.
50 Описание эталонного языка Это накладывает на любой оператор процедуры ограничения, заключающиеся в том, что класс и тип ка¬ ждого фактического параметра должен быть совместим с классом и типом соответствующего формального па¬ раметра. Некоторые важные частные случаи этого об¬ щего правила приведены ниже: 4.7.5.1. Если строка является фактическим парамет¬ ром оператора процедуры или указателя функции, для которых соответствующее тело процедуры является опе¬ ратором в смысле языка АЛГОЛ-60 (а не неалгольным кодом, см. разд. 4.7.8), то эту строку можно использо¬ вать в теле процедуры только как фактический пара¬ метр в дальнейших обращениях к процедурам. В конеч¬ ном итоге строку можно использовать только в теле процедуры, выраженном неалгольным кодом. 4.7.5.2. Формальному параметру, не вызываемому значением и встречающемуся в теле процедуры в виде переменной левой части некоторого оператора присваи¬ вания, может соответствовать в качестве фактического параметра только переменная (частный случай выра¬ жения). 4.7.5.3. Формальному параметру, используемому в теле процедуры в качестве идентификатора массива, может соответствовать в качестве фактического пара¬ метра только идентификатор массива той же размер¬ ности. Кроме того, если формальный параметр вызы¬ вается значением, то локальный массив, возникающий в теле процедуры во время обращения, получает те же границы индексов, что и фактический массив. 4.7.5.4. Формальному параметру, вызываемому зна¬ чением, не может, вообще говоря, соответствовать ка¬ кой-либо идентификатор переключателя, или идентифи¬ катор процедуры, или строка, так как последние не обладают значениями (исключение составляет иденти¬ фикатор такой процедуры, описание которой имеет пу¬ стую совокупность формальных параметров (см. разд. 5.4.1) и которая определяет значение указателя функ¬ ции (см. разд. 5.4.4). Такой идентификатор процедуры сам по себе является законченным выражением.
5. Описания 51 4.7.5.5. Любой формальный параметр может нала¬ гать ограничения на тип соответствующего связанного с ним фактического параметра (эти ограничения могут быть как указаны, так и не указаны посредством спе¬ цификаций в заголовке процедуры). Очевидно, что в операторе процедуры эти ограничения должны быть соблюдены. 4.7.6. Исключен 4.7.7. Ограничители параметров Все ограничители параметров считаются эквивалент* ными. Не устанавливается никакого соответствия между ограничителями параметров, используемыми в опера¬ торе процедуры, и ограничителями, фигурирующими в заголовке процедуры, кроме того лишь, что их коли¬ чество должно быть одинаковым. Таким образом, вся информация, которая вносится употреблением сложных ограничителей, полностью избыточна. 4.7.8. Тело процедуры, выраженное в коде Ограничения, налагаемые на оператор процедуры, обращающийся к процедуре, тело которой выражено в неалгольном коде, очевидно, могут вытекать лишь из характеристик данного кода и из особых соображений лиц, пользующихся им, и, таким образом, остаются вне рамок эталонного языка. 5. ОПИСАНИЯ Описания служат для того, чтобы определить неко¬ торые свойства величин, используемых в программе, и связать эти величины с идентификаторами. Описание идентификатора имеет силу только в одном блоке. Вне этого блока тот же идентификатор можно использовать для других целей (см. разд. 4.1.3). В процессе работы это' влечет за собой следующее: с момента входа в блок (через begin, так как вну¬ тренние метки локальны и, следовательно, недостижимы
52 Описание эталонного языка извне) все идентификаторы, описанные в блоке, приоб¬ ретают смысл, вытекающий из природы данных описа¬ ний. Если эти идентификаторы уже были определены другими описаниями, находящимися вне блока, то на некоторое время они получают новый смысл. С другой стороны, те идентификаторы, которые не описаны в блоке, сохраняют свой прежний смысл. В момент выхода из блока (через end или оператор перехода) все идентификаторы, которые описаны в блоке, теряют свой локальный смысл. Описание можно снабдить добавочным описателем own (собственный. — Ред.). Это приводит к следую¬ щему: к моменту повторного входа в блок значения собственных величин сохраняются такими же, какими они были после последнего выхода, в то время как зна¬ чения описанных величин, которые не отмечены описа¬ телем own, будут не определены. Следует описывать все идентификаторы программы, за исключением меток, формальных параметров в описаниях процедур и, воз¬ можно, идентификаторов стандартных функций (см. разд. 3.2.4 и 3.2.5). В начале любого блока никакой идентификатор нельзя описывать более одного раза. Синтаксис (описание):: = (описание типа) |(описание массива) | (описание переключателя) | (описание процеду- ры) 5.1. Описания типа 5.1.1. Синтаксис (список типа):: = (простая переменная) | (простая пе¬ ременная), (список типа) (тип): : = real | integer | Boolean (локальный или собственный тип): : = (THn)|own (тип) (описание типа): : = (локальный или собственный тип) (список типа) 5.1.2. Примеры integer р, q, s own Boolean Acryl, n.
5. Описания 53 5.1.3. Семантика Описания типа служат для указания того, что неко¬ торые идентификаторы представляют простые перемен¬ ные данного типа. Переменные, которым описанием дан тип real, могут принимать только положительные и от¬ рицательные значения, включая нуль. Переменные, ко¬ торым описанием дан тип integer, могут принимать толь¬ ко положительные и отрицательные целые значения, включая нуль. Переменные, которым описанием дан тип Boolean, могут принимать только значения true и false. В арифметических выражениях любая позиция, ко¬ торая может быть занята переменной типа real, может быть занята и переменной типа integer. О семантике описателя own см. выше, в четвертом абзаце гл. 5. 5.2. Описания массивов 5.2.1. Синтаксис (нижняя граница) : : = (арифметическое выражение) (верхняя граница): : = (арифметическое выражение) (граничная пара): : —(нижняя граница) :(верхняя гра¬ ница) (список граничных пар): : = (граничная пара)) (список граничных пар), (граничная пара) (сегмент массива): :— (идентификатор массива) [(спи¬ сок граничных пар)] | (идентификатор массива), (сегмент массива) (список массивов): : = (сегмент массива)((список мас¬ сивов), (сегмент массива) (описание массива) :: = array (список массивов) | (ло¬ кальный или собственный тип) array (список массивов) 5.2.2. Примеры array а, Ь, с [7 : п, 2 : /п], s[—2 : 10] own integer array A [if c < 0 then 2 else 1 ; 20J real array q [—7 : —1]
54 Описание эталонного языка 5.2,3. Семантика В описании массива определяется, что один или не¬ сколько идентификаторов представляют многомерные массивы переменных с индексами, и задается размер¬ ность этих массивов, границы индексов и типы пере¬ менных. 5.2.3.1. Границы индексов. Границы индексов любого массива задаются в первых индексных скобках, следую¬ щих за идентификатором данного массива, в виде спи¬ ска граничных пар. Каждый член этого списка задает нижнюю и верхнюю границы индекса в виде двух ариф¬ метических выражений, разделенных ограничителем : . Список граничных пар задает границы всех индексов в порядке их перечисления слева направо. 5.2.3.2. Размерности. Размерности определяются как число членов в списках граничных пар. 5.2.3.3. Типы. Все массивы, данные в одном описа¬ нии, имеют один и тот же предписанный им тип. Если описатель типа отсутствует, то подразумевается тип real. 5.2.4. Выражения для нижних и верхних границ 5.2.4.1. Значения этих выражений вычисляются таю же, как значения индексных выражений (см. разд. 3.1.4.2). 5.2.4.2. Эти выражения могут зависеть только от пе¬ ременных и процедур, не локальных в том блоке, для которого имеет силу данное описание массива. Из этого следует, чго в самом внешнем блоке программы могут быть описаны массивы только с постоянными границами. 5.2.4.3. Массив определен только в том случае, когда значения всех верхних границ индексов не меньше, чем значения соответствующих нижних границ. 5.2.4.4. Значения выражений для границ вычис¬ ляются один раз при каждОхМ входе в блок. 5.2.5. Идентичность переменных с индек¬ сами Идентичность переменных с индексами не связана
5. Описания 55 с границами индексов, задаваемыми в описании мас¬ сива. Однако, даже если массиву приписано свойство own, значения соответствующих переменных с индек¬ сами будут в любой момент времени определены только для той части этих переменных, у которых индексы на¬ ходятся в пределах границ индексов, вычисленных в по¬ следний раз. 5.3. Описания переключателей 5.3.1. Синтаксис (переключательный список):: = (именующее выраже¬ ние) | (переключательный список), (именующее выражение) (описание переключателя) = switch (идентификатор переключателя): = (переключательный список) 5.3.2. Примеры switch S: = S1, S2, Q[/n], if v>—5 then S3 else S4 switch Q: =pl, w 5.3.3. Семантика В описании переключателя задается совокупность значений соответствующих указателей переключателя. Эти значения даны одно за другим, как значения име¬ нующих выражений, перечисленных в переключатель¬ ном списке. С каждым из этих именующих выражений связано положительное целое число 1,2,..., получаемое при пересчете членов списка слева направо. Значением указателя переключателя, соответствующим данному значению индексного выражения (см. разд. 3.5. Именую¬ щие выражения), является значение именующего выра¬ жения в переключательном списке, имеющего данное значение индексного выражения своим порядковым но¬ мером. 5.3.4. Вычисление значений выражений в переключатель и ом списке Значение выражения, входящего в переключательный список, вычисляется каждый раз, когда происходит об¬
56 Описание эталонного языка ращение к члену списка, в который входит данное выра¬ жение. При вычислении значения выражения исполь¬ зуются текущие значения всех входящих в него пере¬ менных. 5.3.5. Влияние областей действия. Если указатель переключателя встречается вне об¬ ласти действия какой-либо величины, входящей в име¬ нующее выражение в переключательном списке, и при вычислении значения этого указателя переключателя вы¬ бирается именно это именующее выражение, то проти¬ воречия между идентификаторами величин в этом вы¬ ражении и идентификаторами, описания которых имеют силу там, где расположен указатель переключателя, устраняются путем соответствующих систематических из¬ менений последних идентификаторов. 5.4. Описания процедур 5.4.1. Синтаксис (формальный параметр): : = (идентификатор) (список формальных параметров): : = (формальный па¬ раметр)! (список формальных параметров) (огра¬ ничитель параметра) (формальный параметр) (совокупность формальных параметров): : = (пусто) ((список формальных параметров)) (список идентификаторов): : = (идентификатор) | (спи¬ сок идентификаторов), (идентификатор) (список значений) :: = value (список идентификато¬ ров);! (пусто) (спецификация): : = string | (тип) | array | (тип) array | label | switch | procedure | (тип) procedure (совокупность спецификаций):: = (пусто) | (специфика¬ ция) (список идентификаторов); | (совокупность спецификаций) (спецификация) (список иденти¬ фикаторов);
5. Описания 57 (заголовок процедуры): :=(идентификатор процедуры) (совокупность формальных параметров); (список значений) (совокупность спецификаций) (тело процедуры): : = (оператор)|(код)1) (описание процедуры) :: = procedure (заголовок про¬ цедуры) (тело процедуры)!(тип) procedure (за¬ головок процедуры) (тело процедуры) 5.4.2. Примеры (см. также примеры в конце сообщения) procedure След (а) Порядок : (/г) Результат; (s); value /г; array a; integer п\ real s; begin integer k\ s: = 0; for k'. = \ step 1 until n do s: = s + a p, k\ end procedure Tранспонирование (а) Порядок'. value n; array a; integer «; begin real w, integer /, k', for i: = 1 step 1 until n do for k: — 1 + i step 1 until n do begin w: =a[i, #]; a [Z, k\'.=a \ky /]; a [k, end end Транспонирования integer procedure Шаг («); real tr, Шаг'. — ii 0<« A «<1 then 1 else 0 * 5 ') (код)—не определенная синтаксическая единица. Подразу¬ мевается запись тела процедуры средствами, лежащими вне языка АЛГОЛ-60. — Прим. ред. 5 Зак. 1659
$8 Описание эталонного языка procedure Абсмакс (а) Размерен, т) Результат', {у) Индексы: (Z, k)\ comment Наибольший по абсолютной величине эле¬ мент матрицы а размером п на т передается в у}), а индексы этого элемента передаются в I и k\ array а\ integer п, т, /, k\ real у\ begin integer р, q\ у :==0; for р: = 1 step 1 until п do for q : = 1 step 1 until m do if abs (a[p, q])>y then begin y: = abs (a[p, 7]); p\ k\ — q end end Абсмакс procedure Скалярное произведение (a, 6) Порядок', (k, p) Результат'. (y)\ value k; integer k, p; real y, a, b\ begin real s; s: = 0; for = 1 step 1 until k do s: = $ + aX6; у : -- s end Скалярного произведения. 5.4.3. С e м а и тика Описание процедуры служит для задания процедуры, связанной с идентификатором процедуры. Главной со¬ ставной частью описания процедуры является оператор или группа кодов, называемые телом процедуры, к кото¬ рому может быть произведено обращение посредством указателей функций и (или) операторов процедуры из других мест блока, в начале которых находится описа¬ ние данной процедуры. С телом процедуры связан заго¬ ловок, который указывает, что некоторые идентифика¬ торы, встречающиеся в теле процедуры, представляют формальные параметры. В момент обращения к проце¬ дуре (см. разд. 3.2. Указатели функций и разд. 4.7. Опе¬ раторы процедур) формальным параметрам в теле про¬ цедуры будут присвоены значения фактических пара- !) В действительности в у передается наибольшая из абсолют¬ ных величин элементов матрицы а. — Прим. pedt
5. Описания 59 метров или же они будут заменены фактическими пара¬ метрами. Те идентификаторы в теле процедуры, которые не являются формальными параметрами, являются либо локальными, либо не локальными в теле в зависимости от того, описаны они в теле процедуры или нет. Те из них, которые не локальны в теле процедуры, могут быть локальными в блоке, в начале которого находится опи¬ сание данной процедуры. Тело процедуры всегда дей¬ ствует подобно блоку независимо от того, имеет оно форму блока или нет. Следовательно, область действия метки, помечающей оператор внутри тела или само тело, никогда не может распространяться за тело процедуры. Кроме того, если идентификатор формального параметра заново описан внутри тела процедуры (включая случай использования его в качестве метки, как это указано в разд. 4.1.3), ему придается тем самым локальное значе¬ ние, и фактические параметры, которые ему соответ¬ ствуют, недоступны во всей области действия этой вну¬ тренней локальной величины. 5.4.4. Значения указателей функции Для того чтобы описание процедуры определяло зна¬ чение указателя функции, необходимо, чтобы внутри тела процедуры встречался один или несколько явных операторов присваивания с идентификатором этой про¬ цедуры в левой части; по крайней мере один из них дол¬ жен выполняться, и тип идентификатора процедуры дол¬ жен быть указан включением описателя типа в качестве самого первого символа описания процедуры. Послед¬ нее значение, присвоенное таким образом, используется для дальнейшего вычисления выражения, в котором встречается указатель функции. Любое другое появле¬ ние идентификатора процедуры внутри ее тела, но не в левой части оператора присваивания означает обраще¬ ние к этой процедуре. 5.4.5. Спецификации В заголовок процедуры можно включить совокуп¬ ность спецификаций, задающую с помощью очевидных обозначений информацию о классах и типах формаль¬ 5*
60 Примеры описаний процедур ных параметров. В эту часть ни один формальный па¬ раметр нельзя вносить более одного раза. Для формаль¬ ных параметров, вызываемых значением (см. разд. 4.7.3.1), всегда следует иметь спецификации, а специфи¬ кации формальных параметров, вызываемых по наиме¬ нованию (см. разд. 4.7.3.2), можно опустить. 5.4.6. Код в качестве тела процедуры Считается, что тело процедуры можно выразить и не на языке АЛГОЛ. Так как имеется в виду, что исполь¬ зование этой возможности является целиком вопросом конкретного представления, то никаких дальнейших пра¬ вил относительно языка этого кода в эталонном языке дать нельзя. ПРИМЕРЫ ОПИСАНИЙ ПРОЦЕДУР Пример 1 procedure Эйлер (fct, sum, eps, titriy, value eps, tim\ integer tim-, real procedure fct; real sum, eps; comment: Процедура эилер вычисляет сумму fct (z) для i от нуля до бесконечности посредством надлежащим образом усовершенство ванного ме¬ тода преобразования Эйлера. Суммирование прекращается, как только подряд tim раз абсо¬ лютные значения членов преобразованных рядов будут меньше, чем eps. Следовательно, необхо¬ димо задать функцию fct с одним целым аргу¬ ментом, верхнюю границу eps и целое Нт. Ре¬ зультатом является сумма sum. Процедура эилер особенно эффективна в случае медленно сходящихся или расходящихся знакопеременных рядов', begin integer z, k, n, t; array zn[0: 15]; real mn, mp, ds; = m [0]: = fct (0); sum: — m [0]/2; продолжение', i: — i + 1; mn'. = fct (z);
Примеры описаний процедур 61 for k: — 0 step 1 until n do begin mp: = (mn-\- m [£] )/2; m[k]; = mn; tnn'.—mp end среднее; if (abs (mn) < abs (m [л])) А (я < 15) then begin ds : =mn/2\ n\—n-\-\; m\n\; — mn end принято else ds: = mn; sum: = sum + ds; if abs (ds) <eps then t: — t + 1 else i: — 0; if t<tim then go to продолжение end эилер. Пример 21) procedure RK(x, y, n, FKT, eps, eta, xE, yE, fi); value x, y; integer n; Boolean fi; real x, eps, eta, xE; array y, yE; proce¬ dure FKT; comment; RK интегрирует систему Уk = fk С*'’ Ур Уv * ’ ■ ’ Уn) (^ = 1 > 2, ..., n) дифференциальных уравнений методом Рунге — Кутта с автоматическим выбором шага. Параме¬ трами являются: начальные значения х и y\k] для х и неизвестных функций Уь(х)> порядок си¬ стемы п, процедура FKT(x, у, п, z), представляю¬ щая интегрируемую систему, т. е. совокупность функций fl{, значения допусков eps и eta, которые определяют точность численного интегрирования, конец интервала интегрирования хЕ, выходной па¬ раметр уЕ, который представляет решение в точ¬ ке х—хЕ, булевская переменная fi, которой при изолированном или первом обращении должно быть присвоено значение true. Если, однако, не- *) Эта RK-программа содержит некоторые новые идеи, связан¬ ные с идеями Гилла [4] и Фреберга [5]. Однако должно быть ясно, что с точки зрения времени вычислений и ошибок округления она, возможно, не будет оптимальной. Кроме того, она не была факти¬ чески проверена на машине.
62 Примеры описаний процедур обходимо получить значения функций у в несколь¬ ких промежуточных точках х0, , хп, то про¬ цедура должна вызываться повторно (с x—xh, xE = xti+l для k = Q,\,...,n—1), при этом после¬ дующие обращения для экономии машинного вре¬ мени можно осуществить с /i = false. Входными па¬ раметрами FKT должны быть х, у, п. Выходной параметр z представляет собой совокупность про¬ изводных z[A] = f/t('x, у[1], у[2], у[п]) для х и фактических у,- Процедура comp входит как нело¬ кальный идентификатор; begin array z, yl, y2, уЗ [1 :nj; real xl, x2, хЗ, H; Boolean out; integer k, j; own real s, Hs; procedure RKIST (x, y, h, xe, ye); real x, h, xe; array y, ye; comment: RK\ST интегрирует один шаг методом Рунге — Кутта с начальными значениями х, у [k\. Выходными парамет¬ рами являются xe = x-\-h и ye[k}, при¬ чем последний вектор есть решение в точке хе. Важно', параметры п, FKT, z входят в RKAST как нелокальные объекты; begin array w[l :п\, а[1 :5|; integer k, j; а[1] '.=а [2]: = а [5] : — h/2; а [3] : = а [4] : = Л; хе; — х; for k : = 1 step 1' until n do ye [£]: = wHJ:=y|A|; for j: — 1 step 1 until 4 do begin FKT (xe, w, n, z); xe: =x-\-a [/]; for k: = 1 step 1 until n do begin w [6] :=y [й]+а[/|Хг[^|; ye(k] :=ye I j-h 1 ] X XzpH/3 end k
Примеры описаний процедур end j end RK\ST; Начало программы. AA: if fi then begin H: — xE — x; s : — 0 end else H:—Hs; out: = false; if (x-f-2.01 ХЯ — xE >Q) = (H>Q) then BB: begin Hs :=H; out: = true; H: = (xE — x)/2 end if. RK\ST (x, y, 2 X//, xl, y\); RKIST (x, у, H, x2, y2); RK\ST (x2, y2, H, x3, t/3); for k: = 1 step 1 until n do if comp (t/1 [&], y3 [£], eta} > eps then go to CC: comment: comp {a, b, c}— функция, значением которой является абсолютное значение разно¬ сти мантисс а и Ь, после того как порядки этих величин выравнены до наибольшего порядка параметров а, Ь, с; CC: х: — хЗ; if out then go to DD; for k: — \ step 1 until n do y[k\: — уЗ[Л]; if s = 5 then begin s : = 0; H : = 2XH end if; s : = $+ И go to AA; H : = 0,5X H; out; = t&\st; x\: — x2; for k: = \ step 1 until n do y\ ]£]: = y2 |£|; go to BB; DD: for k : — 1 step 1 until n do yE [Z?]: = z/3 [Л] end RK
АЛФАВИТНЫЙ УКАЗАТЕЛЬ ОПРЕДЕЛЯЕМЫХ ПОНЯТИЙ И СИНТАКСИЧЕСКИХ ЕДИНИЦ1) Все ссылки даются на номера разделов. Ссылки раз¬ биты на три группы: опр — ссылка, стоящая за сокращением «опр», отсы¬ лает к соответствующему синтаксическому оп¬ ределению; синт — ссылки, стоящие за сокращением «синт», отсы¬ лают к вхождению в металингвистическую фор¬ мулу. Ссылки, перечисленные в группе «опр», не повторяются; текст — ссылки, стоящие за словом «текст», отсылают к определению, данному в тексте. При составлении указателя примеры не принимались во внимание. I. Указатель основных символов Ч- см. плюс — см. минус X см. умножение /, ~ см. деление * см. возведение в степень <<» —, >, >, #= см. (знак операции отношения^ =. zd, V. А* ) см. (знак логической операции) , см. запятая см. десятичная точка *) Ввиду того что лексикографический порядок английских и русских терминов не совпадает, данный указатель разделен на две части: I — указатель основных символов и II — указатель металин¬ гвистических переменных и терминов, употребляемых в тексте.— Прим, ред>
Алфавитный указатель 65 10 () [ ] 1 » см. десять см. двоеточие см. точка с запятой см. двоеточие равенство см. пробел см. скобки см. индексные скобки см. кавычки для строк array синт 2.3, 5.2.1, 5.4.1 begin синт 2.3, 4.1.1 Boolean, синт 2.3, 5.1.1, текст 5.1.3 comment синт 2.3 do синт 2.3, 4.6.1 else. синт 2.3, 3.3.1, 3.4.1, 3.5.1. 4.5.1, текст 4.5.3.2 end синт 2.3, 4.1.1 false синт 2.2.2 for. синт 2.3, 4.6.1 go to синт 2.3, 4.3.1 if синт 2.3, 3.3.1, 4.5.1 integer синт 2.3, 5.1.1, текст 5.1.3 label синт 2.3, 5.4.1 own синт 2.3, 5.1.1, текст 5, 5.2.5 procedure синт 2.3, 5.4.1 real синт 2.3, 5.1.1, текст 5.1.3 step синт 2.3, 4.6.1, текст 4.6.4.2 string синт 2.3, 5.4.1 switch синт 2.3, 5.3.1, 5.4.1 then синт 2.3, 3.3.1, 4.5.1 true синт 2.2.2 until синт 2.3, 4.6.1, текст 4.6.4.2 value синт 2.3, 5.4.1 while синт 2.3, 4.6.1, текст 4.6.4.3 II. Указатель металингвистических переменных и терминов, употребляемых в тексте алфавит — текст 2.1 арифметический — текст 3.3.6 (арифметическое выражение) — опр 3.3.1, синт 3, 3.1.1, 3.3.1, 4.2.1, 4.6.1, 5.2.1, текст 3.3.3 ^безусловный оператор) —опр 4.1.1, 4.5.1
66 Алфавитный указатель (блок) — опр 4.1.1, синт 4.5.1, текст 1, 4.1.3, 5 (буква) — опр 2.1, синт 2, 2.4.1, 3.2.1, 4.7.1 величина — текст 2.7 (верхняя граница)—опр 5.2.1, текст 5.2.4 возведение в степень | —синт 2.3, 3.3.1, текст 3.3.4.3 (вторичное логическое выражение) — опр 3.4.1 (выражение) — опр 3, синт 3.2.1, 4.7.1, текст 3 (весь раздел) границы индексов — текст 5.2.3.1 (граничная пара) —опр 5.2.1 двоеточие :—синт 2.3, 3.2.1, 4.1.1, 4.5.1, 4.6.1. 4.7.1, 5.2.1 двоеточие равенство : = — синт 2.3, 4.2.1, 4.6.1, 5.3.1 деление /-. синт 2.3, 3.3.1, текст 3.3.4.2 десятичная точка . — синт 2.3, 2.5.1 (десятичное число) — опр 2.5.1, текст 2.5.3 десять ю — синт 2.3, 2.5.1 /заголовок процедуры)—опр 5.4.1, текст 5.4.3 (заголовок цикла) —опр 4.6.1, текст 4.6.3 запятая, — синт 2.3, 3.1.1, 3.2.1, 4.6.1, 4.7.1, 5.1.1, 5.2.1, 5.3.1, 5.4.1 (знак арифметической операции) — опр 2.3, текст 3.3.4 (знак логической операции) — опр 2.3, синт 3.4.1, текст 3.4.5 (знак операции) — опр 2.3 (знак операции отношения)—опр 2.3, 3.4.1 (знак операции следования) — опр 2.3 (знак операции типа сложения)—опр 3.3.1 (знак операции типа умножения) — опр 3.3.1 значение — текст 2.8, 3.3.3 (идентификатор) — опр 2.4.1, синт 3.1.1, 3.2.1, 3.5.1, 5.4.1, текст 2.4.3 (идентификатор массива)—опр 3.1.1, синт 3.2.1, 4.7.1, 5.2.1, текст 2.3 (идентификатор переменной) — опр 3.1.1 (идентификатор переключателя) — опр 3.5.1, синт 3.2.1, 4.7.1, 5.3.1 (идентификатор процедуры) — опр 3.2.1, синт 3.2.1, 4.2.1, 4.7.1, 5.4.1, текст 4.7.5.4 (именующее выражение) — опр 3.5.1, синт 3, 4.3.1, 5.3.1, текст 3.5.3
Алфавитный указатель 67 (импликация) — опр 3.4.1 индекс — текст 3.1.4.1 (индексное выражение)—опр 3.1.1, синт 3.5.1 индексные скобки [ ] — синт 2.3, 3.1.1, 3.5.1, 5.2.1 кавычки для строк ‘ ’— синт 2.3, 2.6.1, текст 2.6.3 (код) — синт 5.4.1, текст 4.7.8, 5.4.6 (конец составного) — опр 4.1.1 (левая часть) — опр 4.2.1 (логический одночлен) — опр 3.4.1 (логический терм) —опр 3.4.1 (логическое выражение)—опр 3.4.1, синт 3, 3.3.1, 4.2.1, 4.5.1, 4.6.1, текст 3.4.3 (логическое значение) —опр 2.2.2, синт 2, 3.4.1 локальный — текст 4.1.3 (локальный или собственный тип) — опр 5.1.1, синт 5.2.1, массив — текст 3.1.4.1 (метка) —опр 3.5.1, синт 4.1.1, 4.5.1, 4.6.1, текст 1, 4.1.3 минус синт 2.3, 2.5.1, 3.3.1, текст 3.3.4.1 (множитель) — опр 3.3.1 (начало блока) —опр 4.1.1 нелокальный — текст 4.1.3 (непомеченный блок) —опр 4.1.1 (непомеченный основной оператор)—опр 4.1.1 ^непомеченный составной) — опр 4.1.1 (нижняя граница) — опр 5.2.1, текст 5.2.4 область действия — текст 2.7 (ограничитель) — опр 2.3, синт 2 .(ограничитель параметра)—опр 3.2.1, 4.7.1, синт 5.4.1, текст 4.7.7 (оператор)—опр 4.1.1, синт 4.5.1, 4.6.1, 5.4.1, текст 4 (весь раздел) (оператор «если») —опр 4.5.1, текст 4.5.3.1 (оператор перехода)—опр 4.3.1, синт 4.1.1, текст 4.3.3 (оператор присваивания) —опр 4.2.1, синт 4.1.1, текст 1, 4.2.3 (оператор процедуры)—опр 4.7.1, синт 4.1.1, текст 4.7.3 (оператор цикла) — опр 4.6.1, синт 4.1.1, 4.5.1, текст 4.6 (весь раздел) операторные скобки — см. begin end ^описание) — опр 5, синт 4.1.1, текст 1, 5 (весь раздел)
68 Алфавитный указатель (описание массива)—опр 5.2.1, синт 5, текст 5.2.3 (описание переключателя)—опр 5.3.1, синт 5, текст 5.3.3 (описание процедуры)—опр 5.4.1, синт 5, текст 5.4.3 (описание типа) — опр 5.1.1, синт 5, текст 5.1.3 (описатель) —опр 2.3 (основной оператор) — опр 4.1.1, синт 4.5.1 (основной символ) — опр 2 (открытая строка) — опр 2.6.1 (отношение) — опр 3.4.1, текст 3.4.5 (первичное выражение) —опр 3.3.1 (первичное логическое выражение)—опр 3.4.1 (переключательный список) — опр 5.3.1 (переменная) — опр 3.1.1, синт 3.3.1, 3.4.1, 4.2.1, 4.6.1, текст 3.1.3 (переменная с индексами) — опр 3.1.1, текст 3.1.4.1 плюс Ч синт 2.3, 2.5.1, 3.3.1, текст 3.3.4.1 (порядок) — опр 2.5.1, текст 2.5.3 правила примечаний — текст 2.3 (правильная дробь) — опр 2.5.1 преемник — текст 4 пробел—■— синт 2.3, текст 2.3, 2.6.3 (программа)—опр 4.1.1, текст 1 (простая переменная)—опр 3.1.1, синт 5.1.1, текст 2.4.3 (простое арифметическое выражение) — опр 3.3.1, синт 3.4.1, текст 3.3.3 (простое именующее выражение)—опр 3.5.1 (простое логическое выражение) — опр 3.4.1 (пусто)—опр 1.1, синт 2.6.1, 3.2.1, 4.4.1, 4.7.1, 5.4.1 (пустой оператор)—опр 4.4.1, синт 4.1.1, текст 4.4.3 (разделитель) — опр 2.3 размерность — текст 5.2.3.2 (сегмент массива) —опр 5.2.1 (скобка) — опр 2.3 скобки ( ) —синт 2.3, 3.2.1, 3.3.1, 3.4.1, 3.5.1, 4.7.1, 5.4.1, текст 3.3.5.2 (совокупность спецификаций) — опр 5.4.1, текст 5.4.5 (совокупность фактических параметров) — опр 3.2.1, 4.7.1 (совокупность формальных параметров)—опр 5.4.1 (составной оператор)—опр 4.1.1, синт 4.5.1, текст 1
Алфавитный указатель 6f (спецификатор) — опр 2.3 (спецификация) — опр 5.4.1 (список граничных пар) — опр 5.2.1 (список значений) — опр 5.4.1, текст 4.7.3.1 (список индексов) — опр 3.1.1 (список идентификаторов) —опр 5.4.1 (список левой части) — опр 4.2.1 (список массивов) — опр 5.2.1 (список типа) — опр 5.1.1 (список фактических параметров)—опр 3.2.1, 4.7.1 (список формальных параметров) —опр 5.4.1 (список цикла) —опр 4.6.1, текст 4.6.4 стандартные функции — текст 3.2.4, 3.2.5 (строка)—опр 2.6.1, синт 3.2.1, 4.7.1, текст 2.6.3 (строка букв) — опр 3.2.1, 4.7.1 (тело процедуры) —опр 5.4.1 (терм) — опр 3.3.1 (тип) — опр 5.1.1, синт 5.4.1, текст 2.8 точка с запятой ; — синт 2.3, 4.1.1, 5.4.1 (указатель переключателя)—опр 3.5.1, текст 3.5.3 (указатель функции) — опр 3.2.1, синт 3.3.1, 3.4.1, текст 3.2.3, 5.4.4 умножение X — синт 2.3, 3.3.1, текст 3.3.4.1 (условие) — опр 3.3.1, 4.5.1, синт 3.4.1, 3.5.1, текст 3.3.3. 4.5.3.2 (условный оператор)—опр 4.5.1, синт 4.1.1, текст 4.5.3 (фактический параметр) —опр 3.2.1, 4.7.1 (формальный параметр)—опр 5.4.1, текст 5.4.3 функция преобразования —текст 3.2.5 целая часть — текст 3.2.5 <^целое) — опр 2.5.1, текст 2.5.4 ^целое без знака) — опр 2.5.1, синт 3.5.1 (цифра) —опр 2.2.1, синт 2, 2.4.1, 2.5.1 (число) — опр 2.5.1, текст 2.5.3, 2.5.4 (число без знака) —опр 2.5.1, синт 3.3.1 (чистая строка) — опр 2.6.1 (элемент списка цикла)—опр 4.6.1, текст 4.6.4.1,4.6.4.2, 4.6.4.3
СООБЩЕНИЕ О ПРОЦЕДУРАХ ВВОДА- ВЫВОДА В ЯЗЫКЕ АЛГОЛ-60 1. Введение Рабочей группой 2.1 IFIP было признано, что некото¬ рые процедуры, используемые в связи с вводом и выво¬ дом, рассматриваются как первичные и не могут быть выражены иначе как с телом в виде кода. В их число входят следующие процедуры: insymbol (ввести символ) outsymbol (вывести символ) length (длина) inreal (ввести вещественное) (1) outreal (вывести вещественное) inarray (ввести массив) outarray (вывести массив) Кроме этих первичных процедур, на практике нужна более полная сеть процедур ввода-вывода. Однако язык АЛГОЛ-60 настолько гибок, что в нем широко мо¬ гут быть определены различные схемы процедур ввода- вывода на основе процедур, упомянутых выше. Неко¬ торые примеры будут даны в разд. 4 настоящего сооб¬ щения. 2. Определения Рекомендуется, чтобы идентификаторы (1), если они не описаны иначе, были связаны с процедурами, пере¬ дающими значения между переменными программы и значениями, занесенными на внешнем носителе любого рода и к которым из программы нельзя обра¬ титься никаким другим способом.
Сообщение о процедурах ввода-вывода 71 Соответствующие описания процедур имеют вид: procedure insymbol (канал, строка, назначение}', value канал', integer (канал, назначение, string строка', (тело процедуры} procedure outsymbol (канал, строка, источник}-, value канал, источник', integer канал, источник', string — строка', (тело процедуры) integer procedure length (строка}-, string строка', (тело процедуры) procedure inreal (канал, назначение}', value канал-, integer канал', real назначение-, (тело процедуры) procedure outreal (канал, источник)', value канал, источник', integer канал', real источник', (тело процедуры) procedure inarray (канал, назначение)', value канал', integer канал', array назначение', (тело про¬ цедуры) procedure outarray (канал, источник)', value канал', integer канал', array источник', (тело процедуры) Операторы процедур и указатель функции, обра¬ щающиеся к этим процедурам, должны иметь сле¬ дующую форму: insymbol ((арифметическое выражение) (ограничитель параметра) (строка) (ограничитель параметра) (переменная)) outsymbol ((арифметическое выражение) (ограничитель параметра) (строка) (ограничитель параметра) (арифметическое выражение)) length ((строка)) inreal ((арифметическое выражение) (ограничитель параметра) (переменная)) outreal ((арифметическое выражение) (ограничитель параметра) (арифметическое выражение)) inarray ((арифметическое выражение) (ограничитель параметра) (идентификатор массива))
72 Сообщение о процедурах ввода-вывода outarray ((арифметическое выражение) (ограничитель параметра) (идентификатор массива)). Во всех этих случаях, кроме обращения к length, зна¬ чение первого фактического параметра должно быть по¬ ложительным целым, обозначающим входной или выход¬ ной канал, доступный программе. 3. Действие тел процедур Пара процедур insymbol и outsymbol обеспечивает средства сообщения между внешним носителем и пере¬ менными программы в терминах отдельных основных символов или любых дополнительных символов. В ка¬ ждой процедуре устанавливается соответствие между ос¬ новными символами и значениями переменных програм¬ мы в результате отображения последовательности основ¬ ных символов, заданных в строке, которая служит вто¬ рым параметром, и взятых слева направо по порядку, на последовательность положительных целых 1, 2, 3, ... . Используя это соответствие, процедура insymbol при¬ сваивает переменной типа integer, заданной в качестве третьего параметра, значение, соответствующее очеред¬ ному основному символу, поступающему с внешнего но¬ сителя. Если этот очередной символ не присутствует в строке, заданной вторым параметром, то присваивается число 0. Если очередной символ, поступающий на вход, не является основным символом языка АЛГОЛ-60, то присваивается отрицательное целое, соответствующее этому символу. Аналогично процедура outsymbol передает основной символ, соответствующий значению третьего параметра, на внешний носитель. Если значение третьего параметра отрицательно, передается символ, соответствующий это¬ му значению. Подразумевается, что когда данный внеш¬ ний носитель может быть использован как для процеду¬ ры insymbol, так и для outsymbol, отрицательные це¬ лые значения, связанные с каждым дополнительным сим¬ волом, будут одни и те же для обеих процедур. В более общем случае, если используются дополнительные сим¬ волы, соответствующие значения должны быть заданы в
Сообщение о процедурах ввода-вывода 73 качестве информации, сопровождающей программу (см. примечание к разд. 1 пересмотренного сообщения о язы¬ ке АЛГОЛ-60). Процедура-функция length введена, чтобы сделать возможным вычисление длины данной (фактической или формальной) строки (см. пример outstring), Значение length равно числу основных символов открытой строки, заключенной в самые внешние кавычки для строк. Две процедуры inreal и outreal образуют пару. Про¬ цедура inreal присваивает очередное значение, посту¬ пающее с внешнего носителя, переменной типа real, за¬ данной как второй параметр. Аналогично процедура outreal передает значение второго фактического пара¬ метра на внешний носитель. Представление значений на внешнем носителе далее не описывается, однако имеется в виду, что если неко¬ торый носитель может использоваться как на входе, так и на выходе, то значение, которое было передано на дан¬ ный носитель в результате обращения к outreal, пред¬ ставляется в таком виде, что то же самое в смысле чис¬ ленного анализа (см. разд. 3.3.6) значение может быть вновь передано некоторой переменной с помощью про¬ цедуры inreal в предположении, что выполнены также соответствующие манипуляции с данным внешним но¬ сителем. Процедуры inarray и outarray также составляют пару; они передают упорядоченное множество чисел, об¬ разующее значение массива, заданного в качестве вто¬ рого параметра; границы массива определяются при этом соответствующим описанием массива, а не какими- либо дополнительными параметрами (механизм для этого уже предусмотрен в языке АЛГОЛ-60 для вызова массивов значением). Порядок, в котором передаются элементы массива, соответствует лексикографическому порядку значений индексов, т. е. a\ki, k2, km\ предшествует a[jv, j2, если kt =jt (/=1. 2, ..p — 1) < jp (1 < p<m) (2)
74 Сообщение о процедурах ввода-вывода Следует учитывать, что возможная многомерная структура массива не отражается на соответствующей последовательности чисел на внешнем носителе, где эта последовательность может быть только линейной, как это определено условиями (2). Представление чисел на внешнем носителе следует тем же правилам, что и для inreal и outreal, так что воз¬ можно, например, ввести с помощью процедуры inreal числа, которые ранее были выведены с использованием outarray. 4. Примеры procedure outboolean (канал, логическое); value логи¬ ческое; integer канал; Boolean логическое; com¬ ment эта процедура выводит логическое значе¬ ние в виде основного символа true или false; if логическое then outsymbol (канал, ‘true’, 1) else outsymbol (канал, ‘false’, 1) procedure outstring (канал, строка); value канал; integer канал; string строка; comment вывод строки на внешний носитель; begin integer i; for i: = 1 step 1 until length (строка) do out¬ symbol (канал, строка, i) end procedure ininteger (канал, целое); value канал; integer канал, целое; comment ввод целого числа, кото¬ рое представлено на внешнем носителе в виде последовательности цифр, перед которой, воз¬ можно, стоит знак и за которой следует запя¬ тая. Любой другой символ перед знаком не принимается во внимание, begin integer п, k; Boolean b; целое : = 0; b : = true; for &: = 1, k +1 while ft = 0 do insymbol (канал, ‘0123456789 n)\ if ft =11 then b : = false;
Сообщение о процедурах ввода-вывода 75 if п > 10 then п: = 1; for k : = 1, k~\- 1 while n ¥= 13 do begin целое: — 10 X целое 4- n — 1; insytnbol (канал ‘0123456789 п) end 1; if b then целое: = — целое end begin begin array a [1 : 10]; (операторы) outarray (15, a) end begin array 6 [0 : 1, 1 : 5]; inarray (15, b)', (операторы) end end. Следующий пример иллюстрирует применение про¬ цедур inarray и outarray для обращения матрицы, включая передачу элементов матрицы с внешнего носителя и на него. Требуется, чтобы в соответствую¬ щих местах программы было помещено описание про¬ цедуры обращения матрицы, а также вышеприведен¬ ное описание процедуры outstring. begin integer n; inreal (5, n); comment перед элементами мат¬ рицы должен быть помещен ее порядок, begin array а[1 : п, 1 : /г]; inarray (5, а); обращение матрицы (п, а, особая); outarray (15, а); go to ex end; особая', outstring (15, ‘особая’)', ex', end
76 Сообщение о процедурах ввода-вывода 5. Заключительные замечания Рабочая группа 2.1 не предлагает никаких даль¬ нейших средств для операций ввода-вывода, но хотела бы обратить внимание на „Проект соглашений о вводе-выводе в языке АЛГОЛ-60“, предложенный комитетом АСМ по языкам программирования (под¬ комитет по АЛГОЛу, председатель Д. Э. Кнут), и на обширную библиографию в конце этого отчета.
ЛИТЕРАТУРА [1] Preliminary report—International Algebraic Language, Comm. Assoc. Comp. Mach., 1, № 12 (1958), 8. [2] Report on the Algorithmic Language ALGOL by the ACM Commit¬ tee on Programming Languages and the GAMM Committee on Programming, ed. by A. J. Perlis and K. Samelson, Numerische Mathematik, 1 (1959), 41—60. [3] Backus J. W., The syntax' and semantics of the proposed inter¬ national algebraic language of the Zurich ACM — GAMM con¬ ference ICIP, Paris, June 1959. [4] Gill S., A process for the step by step integration of differential equations with digital computing machine, Proc. Cambr. Philos. Soc., 47 (1951), 96. [5] F г о b e r g С. E., On the solution of ordinary differential equations with digital computing machines, Fysiograf. Sallsk. Lund, Forhd 20, № 11 (1950), 136—152. [6] Backus J. W., Bayer F. L., Green J., Katz C., Mc¬ Carthy J., Naur P. (editor), Perlis A. J., R u t i s h a u- ser H., Samelson K., Vauquois B., We g stein J. H., van Wijngaarden A., Woodger M., Report on the Algorithmic Language ALGOL-60, Nymerische Mathematik, 2, № 2 (1960), 106—136; русский перевод: Сообщение об алго¬ ритмическом языке АЛГОЛ-60, Ж. вычислит, матем. и матем. физики, 1, № 2 (1961), 308—342.
ОГЛАВЛЕНИЕ Предисловие к русскому изданию . . 5 Краткое содержание .... 9 Введение 11 Описание эталонного языка .... ...... 17 1. Структура языка ... 17 1.1. Формализм для синтаксического описания 18 2. Основные символы, идентификаторы, числа и строки. Основ¬ ные понятия . 20 2.1. Буквы 20 2.2. Цифры. Логические значения . . ...... 20 2.3. Ограничители 21 2.4. Идентификаторы ..... ..... 22 2.5. Числа . ... 23 2.6. Строки .24 2.7. Величины, классы и области действия • 24 2.8. Значения и типы . 25 3. Выражения . . . 25 3.1. Переменные ...... . 25 3.2. Указатели функций ..... 27 3.3. Арифметические выражения . 29 3.4. Логические выражения 33 3.5. Именующие выражения 36 4. Операторы .... 37 4.1. Составные операторы и блоки . . 38 4.2. Операторы присваивания . . 40 4.3. Операторы перехода .... 41 4.4. Пустые операторы .... . 42 4.5. Условные операторы 42 4.6. Операторы цикла 44 4.7. Операторы процедуры 47
Оглавление 79 5. Описания ... 51 5.1. Описания типа 52 5.2. Описания массивов .... .... ....... 53 5.3. Описания переключателей 55 5.4. Описания процедур .... 56 Примеры описаний процедур 60 Алфавитный указатель определяемых понятий и синтаксиче¬ ских единиц 64 Сообщение о процедурах ввода-вывода в языке АЛГОЛ-60 70 Литература 77
АЛГОРИТМИЧЕСКИЙ ЯЗЫК А Л Г О Л-60 Редактор И. С. Левина Художник 7И. Л. Компанеец Художественный редактор В. И. Шаповалов Технический редактор Е. С. Потапенкова Сдано в производство 16/VI 1965 г. Подписано к печати 17/XI 1965 г. Бумага 84x108732 1,25 бум. л. 4,2 печ. л. Уч,*изд. л. 3,27. Изд. № 1/3383. Цена 23 коп» Зак. 1659. БЗ-17-65-15 ИЗДАТЕЛЬСТВО „МИР“ Москва, 1-й Рижский пер., 2 Ленинградская типография № 2 имени Евгении Соколовой Главполиграфпрома Государственного комитета Совета Министров СССР по печати. Измайловский проспект, 29.
Цена 23 коп,