Выполнение программного модуля может привести к ошибочным ситуациям, вследствие чего продолжение нормального выполнения программы невозможно. Например, когда результат арифметического вычисления превышает максимальное допустимое числовое значение или когда делается попытка доступа к компоненту массива с неправильным значением индекса. Для работы с такими ошибочными ситуациями текстуально за операторами программного модуля могут следовать обработчики исключений, определяющие предпринимаемые при возникновении ошибочных ситуаций действия. Исключения могут быть возбуждены и явно оператором возбуждения.
Типы данных. Каждый объект языка имеет тип, характеризующий множество значений и множество применимых к ним операций. Основные классы типов — это скалярные типы (включающие перечислимые и числовые типы) , составные, ссылочные и личные типы.
Перечислимый тип определяет упорядоченное множество различных литералов перечисления, например, список состояний или перечень символов. Перечислимые типы BOOLEAN и CHARACTER предопределены.
Числовые типы обеспечивают средства выполнения точных или приближенных числовых вычислений. Для точных вычислений используются целые типы, которые обозначают множество последовательных целых чисел. В приближенных вычислениях используются либо фиксированные типы (типы чисел с фиксированной точкой), представимые с абсолютной погрешностью, либо плавающие типы (типы чисел с плавающей точкой), представимые с относительной погрешностью. Числовые типы INTEGER, FLOAT и DURATION предопределены.
Составные типы допускают определения структурных объектов из сгруппированных компонентов. Составные типы в языке представлены массивами и записями. Массив — это объект с индексируемыми компонентами одного и того же типа. Запись — это объект с именованными компонентами,: возможно, различных типов. Индексируемый тип STRING предопределен.
Запись может иметь специальные компоненты, называемые дискриминантами. В записях можно определить альтернативные структуры, зависящие от значений дискриминантов.
Ссылочные типы позволяют вычислением генератора создавать связанные ссылками структуры данных. Они позволяют нескольким переменным ссылочного типа указывать на один и тот же объект, а компонентам одного объекта указывать на тот же самый или другие объекты. Элементы такой связанной структуры данных и их связи с другими элементами могут быть изменены во время выполнения программы.
Личные типы могут быть определены в пакете, скрывающем внутреннюю структуру, несущественную вне пакета. Пользователю таких типов видны лишь логически существенные их свойства (включая дискриминанты).
Концепция типа уточняется концепцией подтипа, благодаря чему пользователь может ограничить набор допустимых значений данного типа. Подтипы могут быть использованы для определения поддиапазонов скалярных типов, массивов с ограниченным множеством значений индексов, а также именованных и личных типов с конкретными значениями дискриминантов.
Другие средства языка. Для определения отображения типов на архитектуру объектной машины можно использовать спецификатор представления. Например, пользователь может задать число битов для представления объектов данного типа или размещение в памяти машины компонентов записи. Другие свойства языка допускают управляемое использование особенностей, связанных с низким уровнем, непереносимостью или зависимостью от реализации, включая прямое использование машинного кода.
Ввод-вывод в языке определен средствами предопределенных библиотечных пакетов. Предоставляются средства для ввода-вывода значений типов, определенных пользователем, а также значений предопределенных типов; обеспечивается представление изображений значений в стандартной форме.
Наконец, язык предоставляет мощные средства параметризации программных модулей, называемых настраиваемыми программными модулями. Параметрами настройки могут быть типы и подпрограммы (а также объекты), и, таким образом, допустимы общие алгоритмы, применимые для всех типов данного класса.
Метод описания и синтаксические обозначения
Контекстно-свободный синтаксис программных модулей языка Ада вместе с контекстно-зависимыми требованиями выражаются в повествовательной форме.
Семантика программных модулей описана правилами определения результата выполнения каждой конструкции и правилами их построения. В изложении используются термины, точное определение которых дано в тексте.
Все другие понятия имеют свое естественное значение, определенное в словаре русского языка Ушакова?.
Контекстно-свободный синтаксис языка описывается с помощью простого варианта форм Бэкуса-Наура, в частности:
Записанные строчными буквами слова, возможно содержащие в некоторых случаях символ подчеркивания, используются для обозначения синтаксических понятий, например:
аддитивная операция
В названиях синтаксических понятий, используемых вне контекста синтаксических правил, вместо символа подчеркивания используется пробел, например:
аддитивная операция
Полужирным шрифтом выделены зарезервированные слова, например:
array
В квадратные скобки заключены необязательные элементы. Поэтому два следующих правила эквивалентны:
оператор возврата : : = return [выражение] ;
оператор возврата : : = return ; | return выражение;
Повторяющиеся элементы заключаются в фигурные скобки. Этот элемент может встретиться нуль или более раз; повторение осуществляется слева направо в соответствии с правилом левой рекурсии. Таким образом, два следующих правила эквивалентны:
слагаемое : : = множитель {операция умноження множитель]-
слагаемое : : = множитель | слагаемое операция умножения множитель
Вертикальная черта разделяет альтернативные элементы, кроме случаев, когда черта встречается непосредственно за открывающей фигурной, скобкой, тогда она обозначает знак вертикальной черты:
буква_или_цифра : : = буква I цифра сопоставление_компонентов : : =
[выбор ■£ I выбор]- = >] выражение
Если название какого-нибудь синтаксического понятия содержит выделенную курсивом часть, оно эквивалентно названию синтаксического по-
* Толковый словарь русского языка/Под ред. Д.Н. Ушакова. - М.: Государственное издательство иностранных и национальных словарей, 1938.
нятия без выделенной курсивом части. Выделенная курсивом часть предназначена для выражения некоторой семантической информации. Например, имя_типа и шля—задачи эквивалентны просто понятию имя.
Примечание. Описывающие структурные конструкции синтаксические правила представлены в форме, соответствующей рекомендованному делению на абзацы. Например, условный оператор определяется так:
условный оператор : : =
if условие then
поел едовательность-операто ров
{elsif условие then
последовательность_операторов}
[else
последовательность-операторов]
end if;
Синтаксические правила записываются в несколько строк, если соответствующие части конструкции рекомендуется располагать на разных строчках. Все отступы от начала строчки рекомендованы в правилах для сдйига соответствующих частей конструкции. Все отступы должны быть кратны базовому шагу отступа (число пробелов в базовом шаге не определяется) . Переход на новую строчку рекомендуется после точки с запятой. Допускается размещение всей конструкции в одной строчке.
Классификация ошибок
Определение языка делит ошибки на несколько различных категорий:
Ошибки, которые должны быть обнаружены во время компиляции любым компилятором с языка Ада.
Эти ошибки соответствуют любому нарушению правил, данных в этом стандарте, кроме нарушений, соответствующих подпунктам б и в. В частности, к этой категории относятся нарушения правил, в которых использованы слова должно, допустимо (или недопустимо), правильный или неправильный. Любая содержащая такую ошибку Ада-программа не является правильной; с другой стороны, тот факт, что программа правильна в этом смысле, не означает, что в ней нет других ошибок.
Ошибки, которые должны быть обнаружены во время выполнения Ада-программы.
Соответствующим ошибочным ситуациям сопоставлены имена предопределенных исключений. Каждый компилятор с языка Ада должен генерировать код, возбуждающий соответствующее исключение, если такая ошибочная ситуация обнаружится во время выполнения программы. Если исключение обязательно будет возбуждаться при выполнении данной программы, то компиляторы могут (но не обязательно) сообщить об этом во время компиляции.
Ошибочное выполнение.
В языке определен ряд правил, которым должна подчиняться Ада-программа, хотя от компилятора и не требуется обнаружение нарушений этих правил ни во время компиляции, ни во время выполнения программы. Слово ошибочный квалифицирует выполнение конструкций, содержащих ошибки этой категории. Результат выполнения ошибочной конструкции — непредсказуем.Некорректная зависимость от порядка выполнения.
Когда в стандарте указывается, что различные части данной конструкции должны быть выполнены в порядке, который не определен в языке, это означает, что реализация может выполнять эти части в любом порядке, но не параллельно. Более того, конструкция некорректна, если выполнение этих частей в различном порядке дает различный результат. Во время компиляции и во время выполнения программы (этот процесс называется выполнением) компилятор не обязан обеспечивать проверку некорректной зависимости результата от порядка. Термин выполнение в равной мере применим к процессам, которые называются вычислением и предвыполнением.
Если компилятор способен распознать во время компиляции, что конструкция ошибочна или содержит некорректную зависимость от порядка, то допускается, чтобы компилятор генерировал код, заменяющий конструкцию кодом, возбуждающим предопределенное исключение PROGRAM_ER- ROR. Компилятор также может сгенерировать код, который во время выполнения проверяет ошибочность конструкции, некорректную зависимость от порядка или и то и другое. Предопределенное исключение PROGRAM—ER- ROR возбуждается, если проверка покажет наличие такой ошибки.
ЛЕКСИКА
Текст программы состоит из текстов одной или нескольких компиля- Ций.Текст компиляции — это последовательность лексических элементов (лексем), каждый из которых состоит из символов. В этой главе приведены правила составления лексем. Кроме того, в ней описаны прагмы, задающие определенную информацию для компилятора.
Набор символов
Символами текста программы должны быть только графические символы и символы управления форматом. Каждый графический символ представляется (визуально) графическим знаком. Описание определения языка в этом документе использует стандартный набор графических символов по ГОСТ 27465-87.
графический символ : : = основной—графический—символ
I строчная_буква | дополнительный_специальный_символ основной—графический—символ : : = прописная—буква
I цифра I специальный— символ I символ -Пробела основной—символ : : = основной—графический—символ
I символ-управления—форматом
Набор основных символов достаточен для написания любой программы. Основные графические символы подразделяются на следующие подклассы:
прописные буквы
ABCDEFGHIJKLMNOPQRSTUVWXYZ
АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ б) цифры
0123456789специальные символы
”#&’()* + , — ./:;< = >_!
символ пробела
Символы управления форматом (часть символов формата) — это символы по ГОСТ 27465—87, называющиеся: горизонтальная табуляция, вертикальная табуляция, возврат каретки, перевод строчки и перевод формата.
Остальные подклассы графических символов определяются следующим образом:
строчные буквы
abcdefghijklmnopqrstuvwxyz
абвгдеёжзийклмнопрстуфхцчшщъыьэюя
дополнительные специальные символы
! Й%?@ [] А' { } ’
В разд. 2.10 определены допустимые замены для специальных символов вертикальной черты (|), номера (#) и кавычки (”).
Примечание. Шрифтовые выделения графических символов (например, курсив или полужирный шрифт) не являются частью стандартного набора.
Для ссылок на специальные и дополнительные специальные символы в табл. 2.1 приведены их наименования.
Таблица 2.1
Символ |
Наименование |
Символ |
Наименование |
|
Кавычки |
|
Больше |
# |
Номер |
— |
Подчеркивание |
& |
Коммерческое И |
1 |
Вертикальная черта |
|
Апостроф |
1 |
Восклицательный знак |
( |
Круглая скобка левая |
ц |
Знак денежной единицы |
) |
Круглая скобка правая |
% |
Проценты |
♦ |
Звездочка |
9 |
Вопросительный знак |
+ |
Плюс |
@ |
Коммерческое ЭТ |
|
Запятая |
[ |
Квадратная скобка левая |
— |
Минус |
Обратная дробная черта |
|
|
Точка |
1 |
Квадратная скобка правая |
/ |
Дробная черта |
А |
Сиркюмфлекс |
|
Двоеточие |
5 |
Слабое ударение |
|
Точка с запятой |
-С |
Фигурная скобка левая |
< |
Меньше |
|
Фигурная скобка правая |
= |
Равно |
— |
Черта сверху |