Цели и источники разработки
Язык был разработан, исходя из трех противоречивых требований:
• обеспечить надежность и сопровождение программ;
• поддерживать программирование как вид человеческой деятельности;
• обеспечить эффективность программ.
Необходимость в языках, повышающих надежность и упрощающих сопровождение, является установленным фактом. В языке Ада предпочтение было отдано удобочитаемости программы по сравнению с легкостью ее написания. Например, правила языка требуют, чтобы все переменные и их типы были явно описаны в программе. Далее, тип переменной неизменен, и компилятор может гарантировать совместимость операций над переменными со свойствами, присущими объектам этого типа. Более того, чтобы избежать обозначений, которые могут привести к ошибкам, в синтаксисе языка было отдано предпочтение конструкциям, которые ближе к естественному языку, чем к каким-то кодированным формам. Наконец, язык поддерживает раздельную компиляцию программных модулей способом, облегчающим разработку и сопровождение программ и обеспечивающим один и тот же уровень контроля для межмодульных и внутримодульных связей.
При разработке языка также учитывался человеческий фактор в программировании. Прежде всего была сделана попытка ограничить язык настолько, насколько это позволяла широкая область его применения. Авторы попытались путем систематизации и выявления однородности охватить всю область применения небольшим числом основных понятий, а также постарались вложить в языковые конструкции такую семантику, которая совпадает с интуитивным представлением о них у пользователя.
Как и многие другие виды человеческой деятельности, разработка программ становится все более децентрализованной и разобщенной. Следовательно, одной из центральных идей при разработке языка было обеспечение возможности составлять программу из независимо разработанных компонент. Концепции пакетов, личных типов и настраиваемых модулей прямо служат этой идее, которая повлияла на многие другие аспекты языка.
При создании любого языка нельзя избежать проблемы эффективности. Языки, которые требуют сверхсложных компиляторов или приводят к неэффективному использованию памяти и времени выполнения программы, дают неэффективные результаты на всех машинах и для всех программ. При создании языка Ада каждая его конструкция оценивалась с точки зрения современных методов реализации. Отвергались все те конструкции, которые были недостаточно ясными или требовали чрезмерных машинных ресурсов.
Ни одна из указанных выше целей разработки языка не откладывалась на будущее. Все они учитывались одновременно и с самого начала разработки.
При разработке любого языка трудность заключается в том, что необходимо определить не только возможности, которыми должен обладать язык и которые диктует предполагаемая область применения, но и собственно разработать средства языка, обеспечивающие эти возможности. Подобная трудность существовала и при разработке языка Ада, хотя благодаря стилмановским требованиям она была меньше, чем обычно. Стилмановские требования, коль скоро требования уже существуют, позволяли сконцентрировать внимание собственно на создании системы, удовлетворяющей этим требованиям, что часто упрощало процесс разработки.
Другое обстоятельство, существенно упростившее разработку, было следствием приобретенного ранее опыта реализации удачных проектов с целями, подобными указанным выше, на базе языка Паскаль. Такими языками являются языки Евклид, Лис, Меса, Модула и Сью. Многие из ключевых идей и синтаксических форм этих языков имеют аналоги в языке Ада. Некоторые существующие языки, такие как Алгол-68 и Симула, а также современные проекты языков Альфард и Клу, также повлияли на разработку языка, хотя и в меньшей степени, чем языки семейства Паскаль.
Наконец, большое значение для определения стандарта языка имели его начальная разработка (язык «Зеленый»), проекты языков «Красный», «Голубой» и «Желтый», рассмотрение различных стадий проекта и тысячи замечаний, полученных из 15 стран на предварительных этапах разработки и в процессе голосования при стандартизации, — все это оказало значительное влияние на определение стандарта языка.
Введение
Содержание
ОБЛАСТЬ ДЕЙСТВИЯ СТАНДАРТА СТРУКТУРА СПРАВОЧНОГО РУКОВОДСТВА ЦЕЛИ И ИСТОЧНИКИ РАЗРАБОТКИ ОБЗОР СВОЙСТВ ЯЗЫКА МЕТОД ОПИСАНИЯ И СИНТАКСИЧЕСКИЕ ОБОЗНАЧЕНИЯ КЛАССИФИКАЦИЯ ОШИБОКАда — это язык программирования, разработанный в соответствии с так называемыми стилмановскими требованиями, определенными МО США. Более того, эти требования определили язык с мощными выразительными возможностями, пригодный для широкого класса задач. Вследствие этого языку Ада присущи как свойства классических языков, подобных языку Паскаль, так и свойства, характерные для специализированных языков. Таким образом, этот язык является современным алгоритмическим языком с традиционными управляющими структурами и средствами определения типов и подпрограмм. Он также удовлетворяет требованию модульности; данные, типы и подпрограммы могут образовывать пакеты. Модульность понимается и в физическом смысле, что обеспечивается раздельной компиляцией модулей.
В дополнение к указанному язык обеспечивает программирование задач реального времени с возможностями моделирования параллельных задач и обработки исключений. Он пригоден также для системного программирования; это требует прецизионного управления представлением данных и доступа к зависимым от системы параметрам. Наконец, в языке определены пользовательский и машинный уровни ввода-вывода.
Классификация ошибок
Определение языка делит ошибки на несколько различных категорий:
а) Ошибки, которые должны быть обнаружены во время компиляции любым компилятором с языка Ада.
Эти ошибки соответствуют любому нарушению правил, данных в этом стандарте, кроме нарушений, соответствующим пунктам б) и в). В частности, к этой категории относятся нарушения правил, в которых использованы слова должно, допустимо, правильный или неправильный. Любая содержащая такую ошибку Ада-программа не является правильной; с другой стороны, тот факт, что программа правильна в этом смысле, не означает, что в ней нет других ошибок.
б) Ошибки, которые должны быть обнаружены во время выполнения Ада-программы.
Соответствующим ошибочным ситуациям сопоставлены имена предопределенных исключений. Каждый компилятор с языка Ада должен генерировать код, возбуждающий соответствующее исключение, если такая ошибочная ситуация встретится во время выполнения программы. Если исключение обязательно будет возбуждаться при выполнении данной программы, то компиляторы могут (но не обязательно) сообщить об этом во время компиляции.
в) Ошибочное выполнение.
В языке определен ряд правил, которым должна подчиняться Ада-программа, хотя от компилятора и не требуется обнаружение нарушений этих правил ни во время компиляции, ни во время выполнения программы. Слово ошибочный квалифицирует выполнение конструкций, содержащих ошибки этой категории. Результат выполнения ошибочной конструкции непредсказуем.
г) Некорректная зависимость от порядка.
Когда в справочном руководстве указывается, что различные части данной конструкции должны быть выполнены в порядке, который не определен в языке, это означает, что реализация допускает выполнение этих частей в любом порядке, но не параллельно. Более того, конструкция некорректна, если выполнение этих частей в различном порядке дает различный результат. Во время компиляции и во время выполнения программы (этот процесс называется выполнением) компилятор не всегда обеспечивает проверку некорректной зависимости результата от порядка. Термин выполнение в равной мере применим к процессам, которые называют вычислением и предвыполнением.
Если компилятор способен распознать во время компиляции, что конструкция ошибочна или содержит некорректную зависимость от порядка, то допускается, чтобы компилятор генерировал код, заменяющий конструкцию кодом, возбуждающим предопределенное исключение PROGRAM-ERROR. Компилятор также может сгенерировать код, который во время выполнения проверяет ошибочность конструкции, некорректную зависимость от порядка или и то и другое. Предопределенное исключение PROGRAM-ERROR возбуждается, если проверка покажет наличие такой ошибки.
Метод описания и синтаксические обозначения
Контекстно-свободный синтаксис программных модулей языка Ада вместе с контекстно-зависимыми требованиями выражается правилами в повествовательной форме.
Семантика программных модулей описана правилами определения результата выполнения каждой конструкции и правилами их построения. В изложении используются термины, точное определение которых дано в тексте (ссылки на содержащие определения разделы помещены в конце каждого использующего понятие раздела).
Все другие понятия имеют свое естественное значение, определенное в словаре русского языка Ушакова [2] .
Контекстно-свободный синтаксис языка описывается с помощью простого варианта форм Бэкуса-Наура. В частности:
а) Записанные строчными буквами слова, возможно содержащие в некоторых случаях символ подчеркивания, используются для обозначения синтаксических понятий, например:
аддитивная - операция
В названиях синтаксических понятий, используемых вне контекста синтаксических правил, вместо символа подчеркивания используется пробел (например, аддитивная операция).
б) Полужирным шрифтом выделены зарезервированные слова, например:
array
в) В квадратные скобки заключены необязательные элементы. Поэтому два следующих правила эквивалентны:
оператор-возврата ::= return [выражение];
оператор-возврата ::= return; | return выражение;
г) Повторяющиеся элементы заключаются в фигурные скобки. Этот элемент может встретиться нуль или более раз; повторение осуществляется слева направо в соответствии с правилом левой рекурсии. Таким образом, два следующих правила эквивалентны:
слагаемое ::= множитель (операция-умножения множитель)
слагаемое ::= множитель 1 слагаемое операция-умножения множитель
д) Вертикальная черта разделяет альтернативные элементы, кроме тех случаев, когда черта встречается непосредственно за открывающейся фигурной скобкой, тогда она обозначает знак вертикальной черты:
буква-или-цифра ::= буква 1 цифра
сопоставление-компонента ::= [выбор (I выбор) =>] выражение
е) Если название какого-нибудь синтаксического понятия содержит выделенную курсивом часть, оно эквивалентно названию синтаксического понятия без выделенной курсивом части. Выделенная курсивом часть предназначена для выражения некоторой семантической информации. Например, имя-типа и имя-задачи эквивалентны просто понятию имя.
Примечание. Описывающие структурные конструкции синтаксические правила представлены в форме, соответствующей рекомендованному делению на абзацы. Например, условный оператор определяется так:
условный-оператор ::= if условие then последовательность - операторов {elsif условие then последовательность - операторов} [else последовательность - операторов] end if;Синтаксические правила записываются в несколько строчек, если соответствующие части конструкции рекомендуется располагать на разных строчках. Все отступы от начала строчки рекомендованы в правилах для сдвига соответствующих частей конструкции. Все отступы должны быть кратны базовому шагу отступа (число пробелов в базовом шаге не определяется). Переход на новую строчку рекомендуется после точки с запятой. С другой стороны, если вся конструкция умещается на одной строчке, то это также допустимо.
[2] В оригинале: третий новый международный словарь английского языка Уэбстера. - Прим. перев. стр.360
Область действия стандарта
В данном стандарте описаны форма представления и семантика программных модулей, написанных на языке Ада. Цель стандарта — повысить переносимость Ада-программ.
1. СОДЕРЖАНИЕ СТАНДАРТА
Данный стандарт определяет:
а) форму представления программного модуля, написанного на языке Ада;
б) результаты трансляции и выполнения такого программного модуля;
в) способ получения Ада-программ из набора программных модулей;
г) предопределенные программные модули, которые должна обеспечивать согласованная со стандартом реализация (далее в тексте — согласованная реализация);
д) допустимые в рамках стандарта изменения и способы их задания;
е) те нарушения стандарта, которые обязана обнаруживать согласованная реализация, а также результат попытки транслировать или выполнить программный модуль, содержащий такие нарушения;
ж) те нарушения стандарта, которые согласованная реализация не обязана обнаруживать.
Этот стандарт не определяет:
з) средства преобразования программного модуля, написанного на языке Ада, в объектный код, выполняемый процессором;
и) средства запуска трансляции, выполнения программных модулей и управления ими;
к) размер и скорость выполнения объектного кода, а также относительную скорость выполнения различных языковых конструкций;
л) форму и содержание любых листингов, создаваемых реализациями, в частности форму и содержание сообщений об ошибках или предупреждающих сообщений;
м) результат выполнения программного модуля, содержащего любое нарушение стандарта, которое согласованная реализация не обязана обнаруживать;
н) предельный размер программы или программного модуля для конкретной согласованной реализации.
Там, где стандарт предписывает, что программный модуль, написанный на языке Ада, имеет точный результат, этот результат является функциональным значением данного программного модуля, и его должны обеспечить все согласованные реализации. Там, где стандарт допускает неоднозначность результата выполнения программного модуля, под функциональным значением программного модуля в целом понимается множество возможных результатов, и согласованная реализация может обеспечить любой из этих возможных результатов. Примерами допустимых неоднозначностей являются:
• значения фиксированных и плавающих числовых величин, а также результаты операций над ними;
• порядок выполнения операторов в различных параллельных задачах при отсутствии явной синхронизации.
2. СОГЛАСОВАННОСТЬ РЕАЛИЗАЦИИ СО СТАНДАРТОМ
Согласованная реализация должна:
а) корректно транслировать и выполнять правильные программные модули, написанные на языке Ада, если только их объем находится в допустимых для реализации пределах;
б) отвергать все программные модули, объем которых больше допускаемого реализацией;
в) отвергать все программные модули, содержащие ошибки, обнаружение которых предусмотрено стандартом;
г) обеспечивать всеми предопределенными программными модулями, предусмотренными стандартом;
д) содержать только те изменения, которые допускает стандарт;
е) описывать допустимые изменения способом, разрешенным стандартом.
Обзор свойств языка
Ада-программа представляет собой один или несколько программных модулей, которые могут компилироваться раздельно. Программные модули — это подпрограммы (определяющие выполняемый алгоритм), пакеты (определяющие наборы понятий), модули-задачи (определяющие параллельные вычисления) или настраиваемые модули (определяющие параметризованные пакеты и подпрограммы). Каждый модуль обычно состоит из двух частей: спецификации, содержащей видимую для других модулей информацию, и тела, содержащего детали реализации, о которых другие модули не обязаны знать.
Это различие между спецификацией и телом, а также возможность компилировать модули раздельно позволяют разрабатывать, кодировать и тестировать программу как множество в достаточной степени независимых программных компонент.
Ада-программа обычно будет использовать библиотеку программных модулей общего назначения.
Язык предоставляет средства, с помощью которых отдельные организации могут создавать свои собственные библиотеки. В тексте раздельно компилируемого программного модуля должны быть указаны имена библиотечных модулей, которые ему требуются.
Программные модули . Подпрограмма является основным модулем для представления алгоритма. Существует два вида подпрограмм: процедуры и функции. Процедура — это средство вызова последовательности действий. Например, она может считывать данные, изменять значения переменных или выводить информацию. Процедура может иметь параметры для управления механизмом передачи информации между процедурой и точкой вызова.
Функция — это средство вызова действий по вычислению значения. Она подобна процедуре, но в результате выполнения еще и возвращает значение.
Пакет — это основной модуль для определения набора логически связанных понятий. Например, пакет может быть использован для определения общей группы данных и типов, набора взаимосвязанных подпрограмм или же множества описаний типов и соответствующих операций. Части пакета могут быть скрыты от пользователя, разрешая, таким образом, доступ только к тем логическим свойствам, которые описаны в спецификации пакета.
Задачный модуль — это основной модуль для определения задачи, последовательность действий которой может выполняться параллельно с выполнением других задач. Такие задачи могут быть реализованы на многомашинной или многопроцессорной системе либо чередованием выполнения задач на одном процессоре. Задачный модуль может определить или одну выполняемую задачу, или задачный тип, позволяющий создать любое количество подобных задач.
Описания и операторы . Тело программного модуля, как правило, содержит две части: раздел описаний, который определяет логические понятия, используемые в программном модуле, и последовательность операторов, определяющую выполнение этого программного модуля.
Раздел описаний связывает имена с описанными понятиями. Например, имя может обозначать тип, константу, переменную или исключение. Раздел описаний также может вводить имена и параметры других вложенных подпрограмм, пакеты, задачные модули и настраиваемые модули, используемые в этом программном модуле.
Последовательность операторов описывает последовательность действий, которые должны быть выполнены. Операторы выполняются последовательно (если только оператор возврата, перехода, выхода или возбуждения исключения не вызовет продолжения выполнения с другого места).
Оператор присваивания изменяет значение переменной. Вызов процедуры инициирует выполнение процедуры после сопоставления каждого фактического параметра, заданного в вызове, соответствующему формальному параметру.
Оператор выбора и условный оператор позволяют выполнить одну из входящих в них последовательностей операторов, определяемую значением выражения или значением условия.
Оператор цикла обеспечивает основной итерационный механизм в языке. Оператор цикла задает повторение выполнения некоторой последовательности операторов по заданной итерационной схеме или до выполнения оператора выхода.
Оператор блока включает в себя последовательность операторов, которым предшествуют описания локальных понятий, используемых в этих операторах.
Некоторые операторы применимы только к задачам. Оператор задержки приостанавливает выполнение задачи на указанный интервал времени. Оператор вызова входа записывается как оператор вызова процедуры; он показывает, что выполнившая этот вызов задача готова для рандеву с другой задачей, имеющей указанный вход. Вызываемая задача готова принять вызов входа, когда ее выполнение достигает соответствующего оператора принятия, который определяет выполняемые далее действия. После завершения рандеву обе задачи, как вызывающая, так и имеющая вход, продолжают свое параллельное выполнение. Одна из форм оператора отбора допускает отбор с ожиданием для одного из нескольких альтернативных рандеву. Другие формы оператора отбора допускают условные или временные вызовы входа.
Выполнение программного модуля может привести к ошибочным ситуациям, вследствие чего продолжение нормального выполнения программы невозможно: например, когда результат арифметического вычисления превышает максимально допустимое числовое значение или когда, делается попытка доступа к компоненте массива с неправильным значением индекса. Для работы с такими ошибочными ситуациями текстуально за операторами программного модуля могут следовать обработчики исключений, определяющие предпринимаемые при возникновении ошибочных ситуаций действия. Исключения могут быть возбуждены и явно оператором возбуждения.
Типы данных . Каждый объект языка имеет тип, характеризующий множество значений и множество применимых к ним операций. Основные классы типов — это скалярные типы (включающие перечислимые и числовые типы), составные, ссылочные и личные типы.
Перечислимый тип определяет упорядоченное множество различных литералов перечисления, например список состояний или перечень символов. Перечислимые типы BOOLEAN и CHARACTER предопределены.
Числовые типы обеспечивают средства выполнения точных или приближенных числовых вычислений. Для точных вычислений используются целые типы, которые обозначают множе ства последовательных целых чисел. В приближенных вычислениях используются либо фиксированные типы (типы чисел с фиксированной точкой), представимые с абсолютной погрешностью, либо плавающие типы (типы чисел с плавающей точкой), представимые с относительной погрешностью. Числовые типы INTEGER, FLOAT и DURATION предопределены.
Составные типы допускают определения структурных объектов из сгруппированных компонент. Составные типы в языке представлены массивами и записями. Массив — это объект с индексируемыми компонентами одного и того же типа. Запись — это объект с именованными компонентами, возможно, различных типов. Индексируемый тип STRING предопределен.
Запись может иметь специальные компоненты, называемые дискриминантами. В записях можно определить альтернативные структуры, зависящие от значений дискриминантов.
Ссылочные типы позволяют вычислением генератора создавать связанные ссылками структуры данных. Они позволяют нескольким переменным ссылочного типа указывать на один и тот же объект, а компонентам одного объекта указывать на тот же самый или другие объекты. Элементы такой связанной ссылками структуры данных и их связи с другими элементами могут быть изменены во время выполнения программы.
Личные типы могут быть определены в пакете, скрывающем внутреннюю структуру, несущественную вне пакета. Пользователю таких типов видны логически существенные их свойства (включая дискриминанты).
Концепция типа уточняется концепцией подтипа, благодаря чему пользователь может ограничить множество допустимых значений данного типа. Подтипы могут быть использованы для определения поддиапазонов скалярных типов, массивов с ограниченным множеством значений индексов, а также именованных и личных типов с конкретными значениями дискриминантов.
Другие свойства языка . Для определения отображения типов на архитектуру объектной машины можно использовать спецификаторы представления. Например, пользователь может задать число битов для представления объектов данного типа или размещение в памяти машины компонент записи. Другие свойства языка допускают управляемое использование особенностей, связанных с низким уровнем, непереносимостью или зависимостью от реализиции, включая прямое использование машинного кода.
Ввод-вывод в языке определен средствами предопределенных библиотечных пакетов. Предоставляются средства для ввода-вывода значений типов, определенных пользователем, а также значений предопределенных типов; обеспечивается представление изображений значений в стандартной форме.
Наконец, язык предоставляет мощные средства параметризации программных модулей, называемых настраиваемыми программными модулями. Параметрами настройки могут быть типы и подпрограммы (а также объекты), и, таким образом, допустимы общие алгоритмы, применимые для всех типов данного класса.
Структура справочного руководства
Это справочное руководство содержит четырнадцать глав, три дополнения, три приложения, указатель терминов и синтаксис.
Каждая глава делится на разделы, которые имеют общую структуру. В каждом разделе вводятся соответствующие понятия, даются все необходимые синтаксические правила и описывается семантика соответствующих конструкций. В конце раздела могут быть даны примеры, примечания и ссылки.
Примеры предназначены для иллюстрации возможных форм описанных конструкций. Примечание предназначено для пояснения следствий из правил, описанных в данном или других разделах. Ссылки нужны, чтобы обратить внимание читателей на термины и терминологические обороты, имеющие специальный смысл и определенные в других разделах.
Определение стандарта языка программирования Ада, состоящее из четырнадцати глав и трех дополнений, предполагае, следующее ограничение: материал каждого из перечисленных ниже пунктов носит информативный характер и не является частью определения стандарта языка.
• Цели и источники разработки
• Обзор свойств языка
• Примеры, примечания и ссылки, приведенные в конце любого раздела
• Каждый подраздел, заголовок которого начинается со слов «Пример» или «Примеры»