СТЕК_ЦЕЛ.В_СТЕК (К);

СТЕК-ЛОГ. В-СТЕК (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. СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ И ОСОБЕННОСТИ, ЗАВИСЯЩИЕ
ОТ РЕАЛИЗАЦИИ

В этой главе описываются спецификаторы представления, зависящие от реализации особенности, а также некоторые возможности, используемые в системном программировании.

  1. Спецификаторы представления

Спецификаторы представления задают способ представления типов в объектной машине для более эффективного представления или для интер­фейса с внеязыковой сферой (например, с периферийным оборудованием).

спецификатор_представления : : =

спецификатор_представления_типа | спецификатор_адреса спецификатор_представления_типа : : = спецификатор_длины

I спецификатор_представления_перечисления

I спецификатор_представления_записи

Спецификатор представления типа применяется либо к типу, либо к первому именованному подтипу (т. е. подтипу, заданному описанием типа, базовый тип которого является анонимным). Такой спецификатор пред­ставления применяется ко всем объектам данного типа или данного перво­го именованного подтипа. Для конкретного типа допустимо не более одно­го спецификатора представления перечисления или записи: спецификатор представления перечисления допустим только для. перечислимого типа; спе­цификатор представления записи — только для именуемого типа. (С другой стороны, для конкретного типа может быть задано более одного специфи­катора длины; более того, могут быть одновременно заданы спецификатор длины и спецификатор представления записи или перечисления.) Специфи­катор длины — это единственный из спецификаторов представления, допус­тимый для производного от родительского типа, имеющего (определенные пользователем) наследуемые подпрограммы.

Спецификатор адреса применяется либо к объекту, либо к подпрограм­ме, пакету или заданному модулю, либо к входу. Для любого из этих поня­тий допустимо не более одного спецификатора адреса.

Спецификатор представления и описание понятия, к которому приме­няется спецификатор, должны оба находиться непосредственно в одном и том же разделе описаний, спецификации пакета или спецификации задачи; описание должно помещаться до спецификатора. В отсутствие спецификато­ра представления для данного описания реализация определяет представле­ние по умолчанию. Место нахождения такого подразумеваемого опреде­ления представления по умолчанию — не позже конца непосредственно объ­емлющего раздела описаний, спецификаций пакета или задачи. Для описа­ния из раздела описаний место нахождения подразумеваемого определения по умолчанию — до любого вложенного тела.

В случае типа некоторые вхождения его имени неявно предполагают, что представление типа уже должно быть определено. Следовательно, такие вхождения требуют определения по умолчанию любого способа представле­ния, еще не определенного предшествующим спецификатором представле­ния типа. Аналогичные вхождения имени подтипа этого типа или имени лю­бого типа или подтипа с подкомпонентами данного типа также требуют оп­ределения по умолчанию. Требующее вхождение — это любое вхождение, отличное от вхождения в описание типа или подтипа, спецификацию под­программы, описание входа, описание субконстанты, прагму или специфи­катор представления для самого типа. В любом случае вхождение в выра­жение является всегда требующим.

Спецификатор представления для данного понятия не должен поме­щаться после вхождения имени понятия, если вхождение требует определе­ния представления этого понятия по умолчанию.

Аналогичные ограничения существуют для спецификатора адреса. Лю­бое вхождение имени объекта (после описания объекта) требует определе­ния представления. Для подпрограммы, пакета, заданного модуля или вхо­да любое вхождение атрибута представления таких понятий является требу­емым вхождением.

Результат предвыполнения спецификатора представления — определе­ние соответствующих аспектов представления.

Интерпретация некоторых выражений, помещенных в спецификаторах представления, зависит от реализации, например, выражений, задающих ад­реса. Реализация может ограничивать использование спецификаторов пред­ставления лишь теми, которые можно просто обрабатывать на имеющемся оборудовании. Для учитываемых реализацией спецификаторов представле­ния компилятор должен гарантировать независимость конечного результа­та работы программы от наличия или отсутствия таких спецификаторов представления, исключая спецификатор адреса и те разделы программы, где используются атрибуты представления. Если программа содержит специфи­катор представления, который не учитывается реализацией, она неправиль­на. Для каждой реализации в обязательном приложении 4 даются правила составления руководства по языку, в котором должны быть описаны до­пустимые ею спецификаторы представления и соглашения для выражений, зависящих от реализации.

Если спецификатор представления используется для того, чтобы пред­писывать некоторые характеристики отображения понятия в объектной ма­шине, то могут быть использованы прагмы, чтобы реализация обеспечила выбор такого отображения. Прагма РАСК указывает, что минимизация раз­мера памяти является главным критерием при выборе представления име­нуемого или индексируемого типов. Ее форма такова:

pragma РАСК (простое_имя_гмиа);

Упаковка означает, что промежутки между областями памяти, выделен­ные под последовательные компоненты, следует минимизировать. Упаков­ка не влияет на отображение в памяти каждого компонента. На отображе­ние компонентов можно повлиять прагмой (или спецификатором представ­ления) для компонента или типа компонента. Место прагмы РАСК в про­грамме и ограничение на именуемый тип подчинены тем же правилам, что и для спецификатора представления; в частности, прагма должна помещать­ся до любого использования атрибута представления упакованного понятия.

Прагма РАСК — единственная определенная в языке прагма, связанная с представлением. Реализация может вводить дополнительные Прагмы; они должны быть перечислены в руководстве по реализации в соответствии с обязательным приложением 4. (В отличие от спецификаторов представле­ния, прагма, которая не принята в реализации, игнорируется.)

Примечание. Для формального типа настройки не допустим спецификатор пред­ставления.

  1. Спецификаторы длины

Спецификатор длины задает объем памяти, выделяемой для объектов указанного типа.

спецификатор—длины : : = for атрибут use простое—выражение;

Выражение должно быть некоторого числового типа; оно вычисляется при предвыполнении спецификатора длины (кроме случая, когда оно явля­ется статическим). Префикс атрибута должен обозначать либо тип, либо первый именованный подтип. Далее этот префикс обозначается буквой Т. В спецификаторе длины в качестве обозначений атрибутов допустимы только SIZE, STORAGE-SIZE и SMALL. Результат применения спецификатора длины зависит от обозначения атрибута:

  1. Спецификация размера: T'SIZE

Выражение должно быть статическим выражением некоторого целого типа. Его значение определяет максимальное число бигов, используемых для размещения в памяти объектов типа (или первого именованного подти­па) Т. Спецификация размера должна задавать объем памяти, достаточный для размещения любого допустимого значения таких объектов. Специфика­ция размера для составного типа может повлиять на размер промежутков между областями памяти, отводимыми под последовательные компонен­ты. С другой стороны, нет необходимости влиять на размер области памяти, отводимой для каждого компонента.

Спецификация размера допустима, только если ограничения на Т и его компоненты (если они есть) являются статическими. Для неограниченного индексируемого типа статическими должны быть также подтипы ин­дексов.

  1. Спецификация размера набора: TSTORAGE_SIZE

Префикс Т должен обозначать ссылочный тип. Выражение должно быть некоторого целого типа (но не обязательно статическим); его значение оп­ределяет число квантов памяти, выделяемых для набора, т. е. объем памя­ти, необходимый для размещения всех объектов, указанных значениями ссылочного типа и значениями других типов, непосредственно или косвен­но производных от ссылочного типа. Эта форма спецификатора длины не­допустима для типа, производного от ссылочного типа.

  1. Спецификация объема памяти для активизации задачи:

T'STORAGE-SIZE

Префикс Т должен обозначать заданный тип. Выражение должно быть некоторого целого типа (но не обязательно статическим); его значение определяет число квантов памяти, выделяемых для активизации (но не для кода) задачи данного типа.

  1. Спецификация дискрета для фиксированных типов: T'SMALL

Префикс Т должен обозначать первый именованный подтип фиксиро­ванного типа. Выражение должно быть статическим некоторого веществен­ного типа; его значение должно быть не больше чем дельта этого первого поименованного подтипа. Результат применения спецификатора длины — ис­пользование этого дискрета значения для представления значений фиксиро­ванного базового типа. (Спецификатор длины, таким образом, также влия­ет на выделяемый для объектов этого типа объем памяти.)

Примечание. Спецификация размера допустима для ссылочного, заданного или фиксированного типов независимо от того, задана или нет для такого типа какая-либо другая форма спецификатора длины.

От реализации зависит, что понимается под резервированием части памяти для на­бора или активизации задачи. Поэтому управление с помощью спецификаторов длины зависит от соглашений в реализации. Например, в языке не определено, включается ли в память, выделяемую для активизации задачи, память, необходимая для размещения набора, сопоставленного ссылочному типу, описанному в теле задачи. Метод распре­деления памяти под объекты, обозначенные значениями ссылочного типа, также не оп­ределяется. Например, место может выделяться в стеке, можно использовать схему на­страиваемого динамического распределения памяти или может быть использована фиксированная память.

Размещенные объекты набора не обязаны занимать одинаковые размеры памяти, если указанный тип - это неограниченный индексируемый тип или неограниченный тип с дискриминантами. Заметим также, что сам генератор может требовать некото­рый объем памяти для размещения внутренних таблиц и связей. Следовательно, специ­фикатор длины для набора ссылочного типа не всегда позволяет точно управлять мак­симальным числом генерируемых объектов.

Примеры:

  1. - предполагаемые описания:

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;

  1. - спецификаторы длины:

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.

Спецификатор длины для ГРАДУС вводит модельные числа, которые занимают в точности весь диапазон типа.

  1. Спецификаторы представления перечисления

Спецификатор представления перечисления задает внутренние коды для литералов перечислимого типа, указанного в спецификаторе.

спецификатор—представления—перечисления : : = for простое—имя. .типа use агрегат;

Используемый в спецификаторе агрегат записывается как одномерный агрегат, в котором подтип индекса — перечислимый тип, а тип компонен­та — универсальный—целый тип.

Для всех литералов перечислимого типа должны быть заданы различ­ные целые коды, и все выборы и значения всех компонентов в агрегате должны быть статическими. Целые коды, заданные для перечислимого ти­па, должны удовлетворять предопределенному отношению упорядоченнос­ти типа.

Пример:

type МАШ_КОДЫ is (СЛОЖ, ВЫЧ, УМН, ЗАГР, ВЫГР, ВЫГР_ЗН);

for МАШ_КОДЫ use

(СЛОЖ => 1, ВЫЧ => 2, УМН = > 3,ЗАГР => 8, ВЫГР = > 24, ВЫГР_ЗН => 33) ;

Примечание. Атрибуты SUCC, PRED и POS определены даже для перечислимых ти­пов с разрывным представлением; их определение соответствует (логическому) опи­санию типа и на них не влияет спецификатор представления перечисления. В примере из-за того, что значения даны с пропуском, эти функции реализуются менее эффектив­но, чем это могло быть в отсутствие спецификатора представления. Это же справедли­во и при использовании таких типов для индексации.

  1. Спецификаторы представления записей

Спецификатор представления записи задает представление записи в па­мяти, т. е. порядок, позицию и размер компонентов записи (включая дис­криминанты, если они есть).

спецификатор—представления—записи : : =

for простое—имя—Гмиа use