СТЕК_ЦЕЛ.В_СТЕК (К);
СТЕК-ЛОГ. В-СТЕК (TRUE);
Возможна другая организация стека (Тело пакета опущено) :
generic
type ЭЛЕМЕНТ is private;
package РАБОТА-СО_СТЕКОМ is
type СТЕК (РАЗМЕР: POSITIVE) is limited private;
procedure B-CTEK (C: in out СТЕК; E: in ЭЛЕМЕНТ) ;
procedure ИЗ-СТЕКА (C: in out СТЕК; E: out ЭЛЕМЕНТ) ;
ПЕРЕПОЛНЕНИЕ, ПУСТОТА: exception;
private
type ТАБЛИЦА is array (POSITIVE range < >) of ЭЛЕМЕНТ;
type СТЕК (РАЗМЕР: POSITIVE) is
record
МЕСТО: ТАБЛИЦА (1. .РАЗМЕР) ;
ИНДЕКС: NATURAL: = 0;
end record;
end;
При использовании такого пакета сначала должна быть осуществлена конкретизация, после чего можно описать стеки с элементами соответствующего типа:
declare
package СТЕК_ВЕЩЕСТВ is new РАБОТА_СО_СТЕКОМ (ВЕЩЕСТВ);
use СТЕК_ВЕЩЕСТВ;
С: СТЕК (100);
begin
В-СТЕК (С, 2.54); end;
13. СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ И ОСОБЕННОСТИ, ЗАВИСЯЩИЕ
ОТ РЕАЛИЗАЦИИ
В этой главе описываются спецификаторы представления, зависящие от реализации особенности, а также некоторые возможности, используемые в системном программировании.
Спецификаторы представления
Спецификаторы представления задают способ представления типов в объектной машине для более эффективного представления или для интерфейса с внеязыковой сферой (например, с периферийным оборудованием).
спецификатор_представления : : =
спецификатор_представления_типа | спецификатор_адреса спецификатор_представления_типа : : = спецификатор_длины
I спецификатор_представления_перечисления
I спецификатор_представления_записи
Спецификатор представления типа применяется либо к типу, либо к первому именованному подтипу (т. е. подтипу, заданному описанием типа, базовый тип которого является анонимным). Такой спецификатор представления применяется ко всем объектам данного типа или данного первого именованного подтипа. Для конкретного типа допустимо не более одного спецификатора представления перечисления или записи: спецификатор представления перечисления допустим только для. перечислимого типа; спецификатор представления записи — только для именуемого типа. (С другой стороны, для конкретного типа может быть задано более одного спецификатора длины; более того, могут быть одновременно заданы спецификатор длины и спецификатор представления записи или перечисления.) Спецификатор длины — это единственный из спецификаторов представления, допустимый для производного от родительского типа, имеющего (определенные пользователем) наследуемые подпрограммы.
Спецификатор адреса применяется либо к объекту, либо к подпрограмме, пакету или заданному модулю, либо к входу. Для любого из этих понятий допустимо не более одного спецификатора адреса.
Спецификатор представления и описание понятия, к которому применяется спецификатор, должны оба находиться непосредственно в одном и том же разделе описаний, спецификации пакета или спецификации задачи; описание должно помещаться до спецификатора. В отсутствие спецификатора представления для данного описания реализация определяет представление по умолчанию. Место нахождения такого подразумеваемого определения представления по умолчанию — не позже конца непосредственно объемлющего раздела описаний, спецификаций пакета или задачи. Для описания из раздела описаний место нахождения подразумеваемого определения по умолчанию — до любого вложенного тела.
В случае типа некоторые вхождения его имени неявно предполагают, что представление типа уже должно быть определено. Следовательно, такие вхождения требуют определения по умолчанию любого способа представления, еще не определенного предшествующим спецификатором представления типа. Аналогичные вхождения имени подтипа этого типа или имени любого типа или подтипа с подкомпонентами данного типа также требуют определения по умолчанию. Требующее вхождение — это любое вхождение, отличное от вхождения в описание типа или подтипа, спецификацию подпрограммы, описание входа, описание субконстанты, прагму или спецификатор представления для самого типа. В любом случае вхождение в выражение является всегда требующим.
Спецификатор представления для данного понятия не должен помещаться после вхождения имени понятия, если вхождение требует определения представления этого понятия по умолчанию.
Аналогичные ограничения существуют для спецификатора адреса. Любое вхождение имени объекта (после описания объекта) требует определения представления. Для подпрограммы, пакета, заданного модуля или входа любое вхождение атрибута представления таких понятий является требуемым вхождением.
Результат предвыполнения спецификатора представления — определение соответствующих аспектов представления.
Интерпретация некоторых выражений, помещенных в спецификаторах представления, зависит от реализации, например, выражений, задающих адреса. Реализация может ограничивать использование спецификаторов представления лишь теми, которые можно просто обрабатывать на имеющемся оборудовании. Для учитываемых реализацией спецификаторов представления компилятор должен гарантировать независимость конечного результата работы программы от наличия или отсутствия таких спецификаторов представления, исключая спецификатор адреса и те разделы программы, где используются атрибуты представления. Если программа содержит спецификатор представления, который не учитывается реализацией, она неправильна. Для каждой реализации в обязательном приложении 4 даются правила составления руководства по языку, в котором должны быть описаны допустимые ею спецификаторы представления и соглашения для выражений, зависящих от реализации.
Если спецификатор представления используется для того, чтобы предписывать некоторые характеристики отображения понятия в объектной машине, то могут быть использованы прагмы, чтобы реализация обеспечила выбор такого отображения. Прагма РАСК указывает, что минимизация размера памяти является главным критерием при выборе представления именуемого или индексируемого типов. Ее форма такова:
pragma РАСК (простое_имя_гмиа);
Упаковка означает, что промежутки между областями памяти, выделенные под последовательные компоненты, следует минимизировать. Упаковка не влияет на отображение в памяти каждого компонента. На отображение компонентов можно повлиять прагмой (или спецификатором представления) для компонента или типа компонента. Место прагмы РАСК в программе и ограничение на именуемый тип подчинены тем же правилам, что и для спецификатора представления; в частности, прагма должна помещаться до любого использования атрибута представления упакованного понятия.
Прагма РАСК — единственная определенная в языке прагма, связанная с представлением. Реализация может вводить дополнительные Прагмы; они должны быть перечислены в руководстве по реализации в соответствии с обязательным приложением 4. (В отличие от спецификаторов представления, прагма, которая не принята в реализации, игнорируется.)
Примечание. Для формального типа настройки не допустим спецификатор представления.
Спецификаторы длины
Спецификатор длины задает объем памяти, выделяемой для объектов указанного типа.
спецификатор—длины : : = for атрибут use простое—выражение;
Выражение должно быть некоторого числового типа; оно вычисляется при предвыполнении спецификатора длины (кроме случая, когда оно является статическим). Префикс атрибута должен обозначать либо тип, либо первый именованный подтип. Далее этот префикс обозначается буквой Т. В спецификаторе длины в качестве обозначений атрибутов допустимы только SIZE, STORAGE-SIZE и SMALL. Результат применения спецификатора длины зависит от обозначения атрибута:
Спецификация размера: T'SIZE
Выражение должно быть статическим выражением некоторого целого типа. Его значение определяет максимальное число бигов, используемых для размещения в памяти объектов типа (или первого именованного подтипа) Т. Спецификация размера должна задавать объем памяти, достаточный для размещения любого допустимого значения таких объектов. Спецификация размера для составного типа может повлиять на размер промежутков между областями памяти, отводимыми под последовательные компоненты. С другой стороны, нет необходимости влиять на размер области памяти, отводимой для каждого компонента.
Спецификация размера допустима, только если ограничения на Т и его компоненты (если они есть) являются статическими. Для неограниченного индексируемого типа статическими должны быть также подтипы индексов.
Спецификация размера набора: TSTORAGE_SIZE
Префикс Т должен обозначать ссылочный тип. Выражение должно быть некоторого целого типа (но не обязательно статическим); его значение определяет число квантов памяти, выделяемых для набора, т. е. объем памяти, необходимый для размещения всех объектов, указанных значениями ссылочного типа и значениями других типов, непосредственно или косвенно производных от ссылочного типа. Эта форма спецификатора длины недопустима для типа, производного от ссылочного типа.
Спецификация объема памяти для активизации задачи:
T'STORAGE-SIZE
Префикс Т должен обозначать заданный тип. Выражение должно быть некоторого целого типа (но не обязательно статическим); его значение определяет число квантов памяти, выделяемых для активизации (но не для кода) задачи данного типа.
Спецификация дискрета для фиксированных типов: T'SMALL
Префикс Т должен обозначать первый именованный подтип фиксированного типа. Выражение должно быть статическим некоторого вещественного типа; его значение должно быть не больше чем дельта этого первого поименованного подтипа. Результат применения спецификатора длины — использование этого дискрета значения для представления значений фиксированного базового типа. (Спецификатор длины, таким образом, также влияет на выделяемый для объектов этого типа объем памяти.)
Примечание. Спецификация размера допустима для ссылочного, заданного или фиксированного типов независимо от того, задана или нет для такого типа какая-либо другая форма спецификатора длины.
От реализации зависит, что понимается под резервированием части памяти для набора или активизации задачи. Поэтому управление с помощью спецификаторов длины зависит от соглашений в реализации. Например, в языке не определено, включается ли в память, выделяемую для активизации задачи, память, необходимая для размещения набора, сопоставленного ссылочному типу, описанному в теле задачи. Метод распределения памяти под объекты, обозначенные значениями ссылочного типа, также не определяется. Например, место может выделяться в стеке, можно использовать схему настраиваемого динамического распределения памяти или может быть использована фиксированная память.
Размещенные объекты набора не обязаны занимать одинаковые размеры памяти, если указанный тип - это неограниченный индексируемый тип или неограниченный тип с дискриминантами. Заметим также, что сам генератор может требовать некоторый объем памяти для размещения внутренних таблиц и связей. Следовательно, спецификатор длины для набора ссылочного типа не всегда позволяет точно управлять максимальным числом генерируемых объектов.
Примеры:
- предполагаемые описания:
type СРЕДА is range 0. .65000;
type КОРОТКИЙ is delta 0.01 range - 100.0. .100.0;
type ГРАДУС is delta 0.1 range - 360.0. .360.0;
БАЙТ: constant: = 8;
СТРАНИЦА: constant: = 2000;
- спецификаторы длины:
for UBET'SIZE use 1 * Б АЙТ; - - см. 3.5.1
for CPEflA’SIZE use 2 * БАЙТ;
for КОРОТКИЙ'БКЕ use 15;
for ИМЯ_МАШИНЬҐ STORAGE-SIZE use - - примерно 2000 машин
2000 * ((МАШИНА'SIZE/SYSTEM. STORAGE-UNIT) + 1);
for KJIABHATYPA'STORAGE_SIZE use 1 * СТРАНИЦА;
for ГРАДУС'БМАЕЬ use 360.0/2 ** (SYSTEM. STORAGE-UNIT -1);
Примечание к примерам. В спецификаторе длины для КОРОТКИЙ минимально необходимы пятнадцать разрядов, так как определение типа требует
KOPOTKHH'SMALL = 2.0 ** (-7) и KOPOTKHH'MANTISSA = 14.
Спецификатор длины для ГРАДУС вводит модельные числа, которые занимают в точности весь диапазон типа.
Спецификаторы представления перечисления
Спецификатор представления перечисления задает внутренние коды для литералов перечислимого типа, указанного в спецификаторе.
спецификатор—представления—перечисления : : = for простое—имя. .типа use агрегат;
Используемый в спецификаторе агрегат записывается как одномерный агрегат, в котором подтип индекса — перечислимый тип, а тип компонента — универсальный—целый тип.
Для всех литералов перечислимого типа должны быть заданы различные целые коды, и все выборы и значения всех компонентов в агрегате должны быть статическими. Целые коды, заданные для перечислимого типа, должны удовлетворять предопределенному отношению упорядоченности типа.
Пример:
type МАШ_КОДЫ is (СЛОЖ, ВЫЧ, УМН, ЗАГР, ВЫГР, ВЫГР_ЗН);
for МАШ_КОДЫ use
(СЛОЖ => 1, ВЫЧ => 2, УМН = > 3,ЗАГР => 8, ВЫГР = > 24, ВЫГР_ЗН => 33) ;
Примечание. Атрибуты SUCC, PRED и POS определены даже для перечислимых типов с разрывным представлением; их определение соответствует (логическому) описанию типа и на них не влияет спецификатор представления перечисления. В примере из-за того, что значения даны с пропуском, эти функции реализуются менее эффективно, чем это могло быть в отсутствие спецификатора представления. Это же справедливо и при использовании таких типов для индексации.
Спецификаторы представления записей
Спецификатор представления записи задает представление записи в памяти, т. е. порядок, позицию и размер компонентов записи (включая дискриминанты, если они есть).
спецификатор—представления—записи : : =
for простое—имя—Гмиа use