Компилируемый модуль состоит либо из описания, либо из тела программного модуля, которому предшествует необходимый в данном случае спецификатор контекста (спецификатор 'with' или 'use'). Таким образом, компилируемым модулем может быть и описание пакета, и тело пакета, и описание подпрограммы, и тело подпрограммы вместе со спецификатором контекста.
Ada скомпилирует только набор из одного и более компилируемых модулей. Поэтому, важно понять концепцию компилируемых модулей - корректная компиляция кода возможна только тогда, когда он преставляет собой часть корректного модуля компиляции.
Ниже приведен упрощенный BNF-синтаксис модуля компиляции. Полное описание приведено в разделе 10.1 RM
Заметим, что компилируемые модули начинаются со спецификаторов"with" и "use" , за которыми следует описание программного модуля или его тело. Мы уже рассмотрели три компилируемых модуля: упрощенное описание пакета Text_IO и два варианта программы "Hello" (в двух различных формах). Вернемся назад и рассмотрим программу "Hello2" для того, чтобы продемонстрировать, что она действительно является корректным компилируемым модулем:
Ada может скомпилировать только модуль_компиляции. В соответствии с определением BNF в начале модуля компиляции находится спецификатор, за которым следует библиотечная_единица. BNF также указывает на то, что спецификатор является пустым или непустым набором элементов типа единица_спецификации, которые могут быть спецификаторами "with" или "use". Так как Hello2 начинается с "with" и "use", то спецификатор состоит из двух элементов типа единица_спецификации. Мы не приводили описание элемента типа библиотечная_единица, но, очевидно, что оставшаяся часть Hello2 - корректная библиотечная_единица, и, следовательно, мы имеем рабочий модуль компиляции.
Несмотря на то, что большинство компиляторов допускают размещение нескольких компилируемых модулей в одном файле, их все-таки лучше размещать раздельно. Только компилятор GNAT требует, чтобы компилируемые модули располагались в отдельных файлах.
Кстати, когда говорят `покажите мне описание пакета Х', на самом деле имеют ввиду `покажите мне компилируемый модуль, который содержит описание пакета Х'.
Что из приведенного ниже не может быть частью компилируемого модуля, описанного после спецификатора контекста?
Перейти к предыдущему разделу | Перейти к следующему разделу | Вернуться к содержанию Урока 2 |
---|
David A. Wheeler (dwheeler@ida.org)
Исходная копия этого документа находится по адресу
"http://www.adahome.com/Tutorials/Lovelace/s2s4.htm".
Исходная копия перевода размещена на сайте http://www.ada-ru.org
Перевод: Юрий Королев
Общая редакция перевода: Г.Ю. Сисюк