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

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
Индикатор переопределения overriding_indicator не разрешён в subprogram_declaration, generic_instantiation или subprogram_renaming_declaration, которые объявляют библиотечную единицу.
Библиотечная единица — это единица программы, объявленная элементом библиотеки library_item. Когда единица программы является библиотечной единицей, используется префикс «библиотека» (или «обобщённая библиотека», если обобщённая), а также для её объявления и тела, как в «библиотечная процедура», «библиотечный package_body» или «обобщённый библиотечный пакет». Термин единица компиляции используется для обозначения compilation_unit. Когда смысл ясен из контекста, этот термин также используется для обозначения library_item единицы компиляции или тела subunit (то есть единицы компиляции без context_clause и separate (parent_unit_name)).
Объявление родительской единицы элемента библиотеки library_item (и библиотечной единицы) — это объявление, обозначенное именем parent_unit_name, если таковое имеется, имени defining_program_unit_name элемента library_item. Если parent_unit_name отсутствует, родительским объявлением является объявление Standard, элемент library_item является корневым, и библиотечная единица (переименование) является корневой библиотечной единицей (переименованием). У объявления и тела самого Standard нет родительского объявления. Родительская единица элемента library_item или библиотечной единицы — это библиотечная единица, объявленная её родительским объявлением.
Потомки библиотечной единицы находятся непосредственно внутри области объявления объявления библиотечной единицы. Предки библиотечной единицы — это сама единица, её родитель, родитель родителя и т. д. (Standard является предком каждой библиотечной единицы). Потомковое отношение является обратным отношению предок-потомок.
Объявление library_unit_declaration или переименование library_unit_renaming_declaration является частным, если объявлению непосредственно предшествует ключевое слово private; в противном случае оно является общественным. Библиотечная единица является частной или публичной в соответствии с её объявлением. Общественные потомки библиотечной единицы — это сама единица и общественные потомки её общественных потомков. Все остальные потомки являются частными потомками.
Для каждого библиотечного package_declaration в среде существует неявное объявление ограниченного представления этого библиотечного пакета. Ограниченное представление пакета содержит:
  • Для каждого package_declaration, находящегося непосредственно внутри видимой части, объявление ограниченного представления этого пакета с тем же именем defining_program_unit_name.
  • Для каждого type_declaration, находящегося непосредственно внутри видимой части, который не является incomplete_type_declaration, неполное представление типа без discriminant_part; если type_declaration помечен, то представлением является помеченное неполное представление.
Ограниченное представление библиотечного package_declaration является частным, если этому библиотечному package_declaration непосредственно предшествует ключевое слово private.
Нет синтаксиса для объявления ограниченных представлений пакетов, так как они всегда неявны. Неявное объявление ограниченного представления библиотечного пакета не является объявлением библиотечной единицы (библиотечное package_declaration есть); тем не менее, это элемент библиотеки library_item. Неявное объявление ограниченного представления библиотечного пакета образует (неявную) единицу компиляции, чья context_clause пуста.
Библиотечное package_declaration является завершением объявления своего ограниченного представления.

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

Родительская единица элемента library_item должна быть библиотечным пакетом или обобщённым библиотечным пакетом.
Если имя defining_program_unit_name данного объявления или тела имеет имя parent_unit_name, то данное объявление или тело должно быть элементом библиотеки library_item. Тело единицы программы должно быть элементом библиотеки library_item тогда и только тогда, когда объявление единицы программы является элементом библиотеки library_item. В library_unit_renaming_declaration имя (старое) name должно обозначать элемент библиотеки library_item.
END_OF_DOCUMENT_MARKER
A parent_unit_name (which can be used within a defining_program_unit_name of a library_item and in the отдельном пункте subunit), and each of its prefixes, shall not denote a renaming_declaration. On the other hand, a name that denotes a library_unit_renaming_declaration is allowed in a nonlimited_with_clause and other places where the name of a library unit is allowed.
If a library package is an instance of a generic package, then every child of the library package shall either be itself an instance or be a renaming of a library unit.
A child of a generic library package shall either be itself a generic unit or be a renaming of some other child of the same generic unit.
A child of a parent generic package shall be instantiated or renamed only within the declarative region of the parent generic.
For each child C of some parent generic package P, there is a corresponding declaration C nested immediately within each instance of P. For the purposes of this rule, if a child C itself has a child D, each corresponding declaration for C has a corresponding child D. The corresponding declaration for a child within an instance is visible only within the scope of a with_clause that mentions the (original) child generic unit.
A library subprogram shall not override a primitive subprogram.
The defining name of a function that is a compilation unit shall not be an operator_symbol.

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

A subprogram_renaming_declaration that is a library_unit_renaming_declaration is a renaming-as-declaration, not a renaming-as-body.
Существует два вида зависимостей между блоками компиляции:
  • Семантические зависимости (см. ниже) — это те, которые необходимы для проверки правил компиляции на границах блоков компиляции; блок компиляции зависит семантически от других блоков компиляции, необходимых для определения его законности. Правила видимости основаны на семантических зависимостях.
  • Зависимости от расширения (см. 10.2) определяют порядок расширения library_items.
A library_item depends semantically upon its parent declaration. A subunit depends semantically upon its parent body. A library_unit_body depends semantically upon the corresponding library_unit_declaration, if any. The declaration of the limited view of a library package depends semantically upon the declaration of the limited view of its parent. The declaration of a library package depends semantically upon the declaration of its limited view. A compilation unit depends semantically upon each library_item mentioned in a with_clause of the compilation unit. In addition, if a given compilation unit contains an attribute_reference of a type defined in another compilation unit, then the given compilation unit depends semantically upon the other compilation unit. The semantic dependence relationship is transitive.

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

Elaboration of the declaration of the limited view of a package has no effect.
ПРИМЕЧАНИЯ
1 Программа может состоять из одного блока компиляции. Блок компиляции может не содержать блоков компиляции; например, его текст может состоять из pragmas.
2 designator библиотечной функции не может быть operator_symbol, но небиблиотечная renaming_declaration может переименовать библиотечную функцию в оператор. Внутри раздела две библиотечные подпрограммы должны иметь разные имена и поэтому не могут перегружать друг друга. Однако renaming_declarations разрешено определять перегруженные имена для таких подпрограмм, и локально объявленная подпрограмма может перегрузить библиотечную подпрограмму. Расширенное имя Standard.L может использоваться для обозначения корневого библиотечного блока L (если объявление Standard не скрыто), так как объявления корневых библиотечных блоков происходят непосредственно в области объявления пакета Standard.

Примеры

Примеры блоков библиотечных единиц:
package Rational_Numbers.IO is -- public child of Rational_Numbers, see 7.1
procedure Put(R : in Rational);
procedure Get(R : out Rational);
end Rational_Numbers.IO;
private procedure Rational_Numbers.Reduce(R : in out Rational);
-- private child of Rational_Numbers
with Rational_Numbers.Reduce; -- refer to a private child
package body Rational_Numbers is
...
end Rational_Numbers;
with Rational_Numbers.IO; use Rational_Numbers;
with Ada.Text_io; -- see A.10
procedure Main is -- a root library procedure
R : Rational;
begin
R := 5/3; -- construct a rational number, see 7.1
Ada.Text_IO.Put("The answer is: ");
IO.Put(R);
Ada.Text_IO.New_Line;
end Main;
with Rational_Numbers.IO;
package Rational_IO renames Rational_Numbers.IO;
-- a library unit renaming declaration
Each of the above library_items can be submitted to the compiler separately.


Spec-Zone.ru

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