Раздел 2.4 - Компилируемые модули

Теперь, когда мы знаем о существовании программных модулей, пакетов и различиях между описаниями и телом, можно перейти к рассмотрению компилируемых модулей.

Компилируемый модуль состоит либо из описания, либо из тела программного модуля, которому предшествует необходимый в данном случае спецификатор контекста (спецификатор 'with' или 'use'). Таким образом, компилируемым модулем может быть и описание пакета, и тело пакета, и описание подпрограммы, и тело подпрограммы вместе со спецификатором контекста.

Ada скомпилирует только набор из одного и более компилируемых модулей. Поэтому, важно понять концепцию компилируемых модулей - корректная компиляция кода возможна только тогда, когда он преставляет собой часть корректного модуля компиляции.

Ниже приведен упрощенный BNF-синтаксис модуля компиляции. Полное описание приведено в разделе 10.1 RM

  1. компилируемый_модуль ::= спецификатор_контекста библиотечная_единица
  2. спецификатор_контекста ::= {единица_контекста}
  3. единица_контекста ::= спецификатор_with | спецификатор_use
  4. спецификатор_with ::= "with" имя_библиотечного_модуля { "," имя_библиотечного_модуля} ";"
  5. спецификатор_use ::= "use" имя_библиотечного_модуля { "," имя_библиотечного_модуля} ";"
  6. библиотечная_единица ::= описание_пакета | тело_пакета | описание_подпрограммы | тело_подпрограммы

Заметим, что компилируемые модули начинаются со спецификаторов"with" и "use" , за которыми следует описание программного модуля или его тело. Мы уже рассмотрели три компилируемых модуля: упрощенное описание пакета Text_IO и два варианта программы "Hello" (в двух различных формах). Вернемся назад и рассмотрим программу "Hello2" для того, чтобы продемонстрировать, что она действительно является корректным компилируемым модулем:


Verbose Configure

Ada может скомпилировать только модуль_компиляции. В соответствии с определением BNF в начале модуля компиляции находится спецификатор, за которым следует библиотечная_единица. BNF также указывает на то, что спецификатор является пустым или непустым набором элементов типа единица_спецификации, которые могут быть спецификаторами "with" или "use". Так как Hello2 начинается с "with" и "use", то спецификатор состоит из двух элементов типа единица_спецификации. Мы не приводили описание элемента типа библиотечная_единица, но, очевидно, что оставшаяся часть Hello2 - корректная библиотечная_единица, и, следовательно, мы имеем рабочий модуль компиляции.

Несмотря на то, что большинство компиляторов допускают размещение нескольких компилируемых модулей в одном файле, их все-таки лучше размещать раздельно. Только компилятор GNAT требует, чтобы компилируемые модули располагались в отдельных файлах.

Кстати, когда говорят `покажите мне описание пакета Х', на самом деле имеют ввиду `покажите мне компилируемый модуль, который содержит описание пакета Х'.


Упражнение:

Что из приведенного ниже не может быть частью компилируемого модуля, описанного после спецификатора контекста?

  1. Описание пакета
  2. Описание процедуры
  3. Тело процедуры
  4. Объявление типа

Вы можете также:

PREVIOUS Перейти к предыдущему разделу

NEXT     Перейти к следующему разделу

OUTLINE  Вернуться к содержанию Урока 2

David A. Wheeler (dwheeler@ida.org)

Перевод: Юрий Королев   Общая редакция перевода: Г.Ю. Сисюк

Исходная копия этого документа находится по адресу "http://www.adahome.com/Tutorials/Lovelace/s2s4.htm".

Исходная копия перевода размещена на сайте http://www.ada-ru.org