Spec-Zone.ru › Ada 95
Справочник по Ada 95

10.1.1 Единицы компиляции — библиотечные единицы

Элемент библиотеки library_item — это единица компиляции, которая является объявлением, телом или переименованием библиотечной единицы. Каждая библиотечная единица (кроме Standard) имеет родительскую единицу, которая является библиотечным пакетом или обобщённым библиотечным пакетом. Библиотечная единица является дочерней единицей родительской единицы. Корневые библиотечные единицы являются дочерними по отношению к предопределённому библиотечному пакету Standard.

Синтаксис

compilation ::= {compilation_unit}
compilation_unit ::=
context_clause library_item
| context_clause subunit
library_item ::= [private] library_unit_declaration
| library_unit_body
| [private] library_unit_renaming_declaration
library_unit_declaration ::=
subprogram_declaration | package_declaration
| generic_declaration | generic_instantiation
library_unit_renaming_declaration ::=
package_renaming_declaration
| generic_renaming_declaration
| subprogram_renaming_declaration
library_unit_body ::= subprogram_body | package_body
parent_unit_name ::= name
Библиотечная единица library_unit — это единица программы, объявляемая элементом library_item. Когда единица программы является библиотечной единицей, используется префикс «библиотека» (или «обобщённая библиотека», если обобщённая), а также для её объявления и тела, как в «библиотечная процедура», «библиотечное тело пакета» или «обобщённый библиотечный пакет». Термин единица компиляции используется для обозначения compilation_unit. Когда смысл понятен из контекста, этот термин также используется для обозначения элемента library_item единицы компиляции или для собственного тела подмодуля (compilation_unit без context_clause и separate (parent_unit_name)).
Объявление родителя элемента library_item (и библиотечной единицы) — это объявление, обозначаемое parent_unit_name, если таковое имеется, из defining_program_unit_name элемента library_item. Если parent_unit_name отсутствует, родительским объявлением является объявление Standard, library_item является корневым library_item, а библиотечная единица (переименование) является корневой библиотечной единицей (переименование). Объявление и тело самого Standard не имеют родительского объявления.
Дочерние единицы библиотечной единицы находятся непосредственно в области объявления объявления библиотечной единицы. Предки библиотечной единицы — это сама единица, её родитель, родитель родителя и так далее. (Standard является предком каждой библиотечной единицы.) Потомок — это обратное отношение предка.
Объявление library_unit_declaration или переименование library_unit_renaming_declaration является приватным, если перед объявлением стоит зарезервированное слово private; в противном случае — публичным. Библиотечная единица является приватной или публичной в соответствии с её объявлением. Публичные потомки библиотечной единицы — это сама библиотечная единица и публичные потомки её публичных дочерних единиц. Все остальные потомки — приватные потомки.

Правила легальности

Родительская единица элемента library_item должна быть библиотечным пакетом или обобщённым библиотечным пакетом.
Если defining_program_unit_name данного объявления или тела имеет parent_unit_name, то данное объявление или тело должно быть элементом library_item. Тело единицы программы должно быть элементом library_item тогда и только тогда, когда объявление единицы программы является элементом library_item. В library_unit_renaming_declaration имя (старое) name должно обозначать элемент library_item.
parent_unit_name (который может использоваться в defining_program_unit_name элемента library_item и в separate-оператор подмодуля), и каждый его prefix, не должен обозначать renaming_declaration. С другой стороны, имя, обозначающее library_unit_renaming_declaration, допускается в with_clause и других местах, где разрешено имя библиотечной единицы.
Если библиотечный пакет является экземпляром обобщённого пакета, то каждый ребёнок библиотечного пакета должен быть либо экземпляром, либо переименованием библиотечной единицы.
Ребёнок обобщённого библиотечного пакета должен быть либо сам обобщённой единицей, либо переименованием какой-либо другой дочерней единицы того же обобщённого пакета. Переименование ребёнка обобщённого пакета должно происходить только в области объявления обобщённого пакета.
Дочерний элемент родительского обобщённого пакета должен быть проинициализирован или переименован только в области объявления родительского обобщённого пакета.
Для каждого объявления или переименования обобщённой единицы в качестве ребёнка некоторого родительского обобщённого пакета существует соответствующее вложенное объявление в каждом экземпляре родителя. Это объявление видно только в области with_clause, который упоминает обобщённую дочернюю единицу.
Библиотечная подпрограмма не должна перезаписывать примитивную подпрограмму.
Определяющее имя функции, являющейся единицей компиляции, не должно быть operator_symbol.

Статическая семантика

subprogram_renaming_declaration, являющаяся library_unit_renaming_declaration, является переименованием как объявлением, а не переименованием как телом.
Существует два типа зависимостей между единицами компиляции:
  • Семантические зависимости (см. ниже) — это зависимости, необходимые для проверки правил компиляции через границы единиц компиляции; единица компиляции зависит семантически от других единиц компиляции, необходимых для определения её легальности. Правила видимости основаны на семантических зависимостях.
  • Зависимости обработки (см. 10.2) определяют порядок обработки элементов library_item.
Элемент library_item семантически зависит от своего родительского объявления. Подмодуль зависит семантически от своего родительского тела. Тело библиотечной единицы library_unit_body семантически зависит от соответствующего объявления library_unit_declaration, если оно есть. Единица компиляции семантически зависит от каждого элемента library_item, упомянутого в with_clause единицы компиляции. Кроме того, если данная единица компиляции содержит ссылку на атрибут attribute_reference типа, определённого в другой единице компиляции, то данная единица компиляции семантически зависит от другой единицы компиляции. Отношение семантической зависимости транзитивно.
ПРИМЕЧАНИЯ
1 Простая программа может состоять из одной единицы компиляции. Компиляция compilation может не содержать никаких единиц компиляции; например, её текст может состоять из pragmas.
2 Обозначатель designator библиотечной функции не может быть operator_symbol, но небиблиотечное renaming_declaration допускается для переименования библиотечной функции в оператор. В рамках раздела две библиотечные подпрограммы должны иметь различные имена и, следовательно, не могут перегружать друг друга. Однако renaming_declaration разрешено определять перегруженные имена таких подпрограмм, а локально объявленная подпрограмма может перегружать библиотечную подпрограмму. Расширенное имя Standard.L может быть использовано для обозначения корневой библиотечной единицы L (если объявление Standard не скрыто), так как объявления корневых библиотечных единиц находятся непосредственно в области объявления пакета Standard.

Примеры

Примеры библиотечных единиц:
пакет Rational_Numbers.IO является -- общедоступный дочерний элемент Rational_Numbers, см. 7.1
процедура Put(R : вход Rational);
процедура Get(R : выход Rational);
конец Rational_Numbers.IO;
приватная процедура Rational_Numbers.Reduce(R : вход-выход Rational);
-- приватный дочерний элемент Rational_Numbers
с Rational_Numbers.Reduce; -- ссылка на приватный дочерний элемент
тело пакета Rational_Numbers является
...
конец Rational_Numbers;
с Rational_Numbers.IO; используется Rational_Numbers;
с Ada.Text_io; -- см. A.10
процедура Main является -- процедура корневой библиотеки
R : Rational;
начало
R := 5/3; -- создание рационального числа, см. 7.1
Ada.Text_IO.Put("Ответ: ");
IO.Put(R);
Ada.Text_IO.New_Line;
конец Main;
с Rational_Numbers.IO;
пакет Rational_IO переименовывает Rational_Numbers.IO;
-- объявление переименования единицы библиотеки
Каждый из вышеперечисленных library_itemов может быть передан компилятору по отдельности.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API