Руководство по Ada (Ada 2022)
2.8 Директивы компилятора
Директива компилятора — это команда для компилятора. Существуют определённые языком директивы компилятора, которые дают инструкции по оптимизации, управлению списком и т. д. Реализация может поддерживать дополнительные (определяемые реализацией) директивы.
Синтаксис
pragma ::=
pragma идентификатор [(ассоциация_аргумента_директивы {, ассоциация_аргумента_директивы})];
pragma идентификатор [(ассоциация_аргумента_директивы {, ассоциация_аргумента_директивы})];
ассоциация_аргумента_директивы ::=
[аргумент_директивы_идентификатор =>] имя
| [аргумент_директивы_идентификатор =>] выражение
| аргумент_директивы_метка_аспекта => имя
| аргумент_директивы_метка_аспекта => выражение
[аргумент_директивы_идентификатор =>] имя
| [аргумент_директивы_идентификатор =>] выражение
| аргумент_директивы_метка_аспекта => имя
| аргумент_директивы_метка_аспекта => выражение
В директиве, все ассоциации_аргумента_директивы без аргумент_директивы_идентификатор или аргумент_директивы_метка_аспекта должны предшествовать любым ассоциациям с аргумент_директивы_идентификатор или аргумент_директивы_метка_аспекта.
Директивы разрешены только в следующих местах программы:
После разделителя точка с запятой, но не внутри формальной_части, части_дискриминантов или выражении_объявления.
В любом месте, где синтаксические правила допускают конструкцию, определённую синтаксической категорией, имя которой оканчивается на «объявление», «элемент», «оператор», «операторная_часть» или «альтернатива», или одной из синтаксических категорий вариант или обработчик_исключений; но не вместо такой конструкции, если конструкция обязательна, или является частью списка, который должен содержать по крайней мере одну такую конструкцию.
Вместо оператора в последовательности_операторов.
Вместо единицы_компиляции, если это разрешено.
Для определенных директив компилятора существуют дополнительные синтаксические правила и ограничения на размещение.
Имя директивы — это идентификатор, следующий за служебным словом pragma. Имя или выражение ассоциации_аргумента_директивы является аргументом_директивы.
Идентификатор, специфичный для директивы, — это идентификатор или служебное слово, используемое в аргументе директивы со специальным значением для данной директивы.
Статическая семантика
Если реализация не распознает имя директивы, то она не влияет на семантику программы. Внутри такой директивы применяются только синтаксические правила.
Динамическая семантика
Любая директива, которая появляется на месте исполняемой конструкции, выполняется. Если для конкретной директивы не указано иное, это выполнение состоит из оценки каждого вычисляемого аргумента директивы в произвольном порядке.
Требования к реализации
Реализация должна выводить сообщение об ошибке для нераспознанного имени директивы.
Разрешения для реализации
Реализация может предоставить директивы, определенные реализацией; имя реализации директивы должно отличаться от имен директив, определенных языком.
Реализация может проигнорировать нераспознанную директиву, даже если она нарушает некоторые из синтаксических правил, если обнаружение синтаксической ошибки слишком сложно.
Рекомендации для реализации
Обычно, директивы, определенные реализацией, не должны оказывать никакого семантического влияния на корректные программы; то есть, если директивы, определенные реализацией, в рабочей программе заменены нераспознанными директивами, программа по-прежнему должна быть корректной и иметь ту же семантику.
Обычно, реализация не должна определять директивы, которые могут сделать некорректную программу корректной, за исключением следующих случаев:
- Директива используется для завершения объявления;
- Директива используется для настройки среды путем добавления, удаления или замены элементов_библиотеки.
Синтаксис
Форматы директив Список, Страница и Оптимизация следующие:
pragma Список(идентификатор);
pragma Страница;
pragma Оптимизация(идентификатор);
Другие директивы определены в этом Руководстве, и кратко описаны в Приложении L.
Статическая семантика
Директива Список принимает один из идентификаторов Вкл или Выкл в качестве единственного аргумента. Эта директива разрешена в любом месте, где разрешена директива. Она указывает, что вывод компиляции должен продолжаться или приостанавливаться до тех пор, пока директива Список с противоположным аргументом не будет указана в той же компиляции. Сама директива всегда выводится, если компилятор генерирует список.
Директива Страница разрешена в любом месте, где разрешена директива. Она указывает, что текст программы, следующий за директивой, должен начинаться с новой страницы (если компилятор в настоящее время генерирует список).
Директива Оптимизация принимает один из идентификаторов Время, Пространство или Выкл в качестве единственного аргумента. Эта директива разрешена в любом месте, где разрешена директива, и действует до конца ближайшей области объявления или, для директивы на месте единицы компиляции, до конца компиляции. Она дает рекомендации реализации, относительно того, является ли время или пространство основным критерием оптимизации, или что необязательные оптимизации должны быть выключены. Как эти рекомендации выполняются — определяется реализацией.
Примеры
Примеры директив:
pragma Список(Выкл); -- отключить генерацию списка
pragma Оптимизация(Выкл); -- отключить необязательные оптимизации
pragma Политика_утверждения(Проверка); -- проверять утверждения
pragma Утверждение(Существует(Имя_файла),
Сообщение => "Файл не существует"); -- утвердить существование файла
pragma Оптимизация(Выкл); -- отключить необязательные оптимизации
pragma Политика_утверждения(Проверка); -- проверять утверждения
pragma Утверждение(Существует(Имя_файла),
Сообщение => "Файл не существует"); -- утвердить существование файла