Н. Джехани - Язык Ада (1988) (1160771), страница 48
Текст из файла (страница 48)
Эти прагмы и спецификаторы представления могут задаваться в декларативной части или в спецификации задачи или пакета. Тем не менее прагмы должны предшествовать спецификаторам представления. Специфнкаторы представления типа делятся на трн вида: специвЗикаторы длины, представления перечисления н представления записи. 8.2.1. Специ4икатоР длины [13.21 Объем памяти, которую необходимо связать с объектом, определяется спецификатором длины. Этот спепификатор имеет следующую форму: гог атрибут пзе количество где количество — целое выражение, указывающее максимальный объем памяти, который будет связан с указанным в атрибуте объектом. Термин квант памяти будет использоваться для обозначения основной единицы прн распределении памяти в реализации языка Ада, т.е.
байт или слово. Атрибуты, которые можно указать, следующие: ° Размер обьекта. Атрибут размера типа Т (Т' 517Е) используется для того, чтобы определить максимальный объем памяти (в битах), который будет выде- Спв квт ы и стввпвння н особенности, эввнсн нв от впнав нн лен под объект типа Т. Указанное число битов должно быть не меньше, чем минимальное число битов, требуемых для реализации объекта типа Т. Если спецификатор длины не указан, компилятор может выделить некоторый подходящий объем памяти. Например, для объектов целого типа, имеющих значения от О до 3, может быть выделен целый байт или целое слово, хотя в данном случае для этого достаточно двух битов. ° Размер набора.
Атрибут размера набора ссылочного типа Т (Т'ВТОРОЕ Я1ХЕ) используется для указания общего объема памяти (в квантах), которое выделяется для набора объектов, связанных со ссылочным типом Т. Этот атрибут позволяет программисту указать верхнюю границу для числа объектов, указанных ссылочным типом Т, которые могут быть созданы (или распределены в любой момент времени; предполагается, что память, занятая ненужными объектами, автоматически восстанавливается системой или явно освобождается программистом). ° Память под задачу. Максимальный объем памяти (в квантах), отведенный для активизации задачи Т (или задач типа Т), определяется атрибутом память под задачу (Т'ВТОРОЕ $1УЕ).
Эта память будет использоваться только для области данных задачи Т, а не под код для Т. Определение максимума памяти, который задача может использовать, препятствует ей использовать больше той памяти, что ей выделена. Наименьший. Значение наименьший, которое должно использоваться при реализации фиксированного типа Т, специфицируется атрибутом Т'ЯМАЬЬ. При выходе за границы, определенные спецификатором длины„может возникнуть исключение ЯТОКАОЕ ЕКАВ.
8.2.2. Спеии4икапуор представления перечисления 113.31 Внутреннее представление, используемое для перечислимого типа, может задаваться путем указания внутренних кодов (которые должны быть целыми числами) для литералов перечнслимого типа. Такая спецификация может понадобиться при установлении связи с внешними файлами и устройствами. Рассмотрим в качестве примера программу, которая использует перечислимый тип ОАУ, описанный как (уре (ЗАУ 1й (МОХ, ТЫЕ, %Е1э, ТНЫ, НИ, ЕАТ, ЯЛЧ); Значения типа ОАт' должны считываться из внешнего двоичного файла 'э, в котором эти значения представлены целыми числами от 1 до 7.
Этн целые значения могут не соответствовать внутреннему представлению, которое компилятор с языка Ада использует для представления ОАх'. Например, Ада-компилятор для внутреннего представления типа ОАз' может использовать целые числа от О до 6. Эта проблема легко решается путем задания инструкций компилятору о том, что для типа ОАт' будут использоваться целые значения от 1 до 7. Эта инструк- " Значения двончного файла являются внутренннм представлением значений объектов, запнсанных в файл. Все файлы, за исключением текстовых, являются двоичными. По сравнению с текстовымн файлами такая форма является более эффективной для ввода-вывода, так как значення этих файлов не нужно преобразовывать, что необходимо в случае выдачи зтнх значений в удобной для человека форме Полобное преобразование также не нужно н прн чтеннн этих значений.
Глава в ция выглядит следующим образом: гог РАУ вяе (МОХ > 1, Т()Е > 2, зЧЕР > 3, ТН!3 > 4,РК! > 5,ВАТ > 6,ЯЗХ > 7); Другой пример — это программа, генерирующая объектный код для некоторых ЭВМ (РОР79б!. В данной программе коды операций определяются значениями перечислимого типа ОР СОРЕ, который описан как !уре ОР СОРЕ 1я (АРР, ВЫВ, МШ., Р1Ч, МОЧЕ, ЗМР); Необходимо отобразить символические коды операций, представленные литераламн перечисления, в машинные коды операций.
Кодами операций, соответствующими операциям АРР, Я)В, МШ, Р1Ч, МОЧЕ и 3МР, для ЭВМ являются 1, 2, 5, 6, 10 и 12 соответственно. Требуемое отображение задается следующим спецнфикатором представления перечисления: гогОР СОРЕ иве (АРР > 1,ВЫВ > 2, МШ. > 5, Р1Ч > 6, МОЧЕ > !0,3МР > !2); Внутреннее представление перечисления не обязательно состоит из последовательных значений. 8.2.3. Специгрикатор предапавления записи !13.41 Выравнивание записи, а также порядок, позиция и размер ее компонент определяются специа)икатором представления записи. Каждая запись размещается с адреса„кратного некоторому значению выражения, указанному в специауикаторе выравнивания.
Местоположение каждой компоненты записи определяется смещением от начала первого кванта памяти (он помечен нулем), отведенного под запись. Порядок следования битов (слева направо или справа налево) зависит от ЭВМ. Число битов, отведенных под компоненту, определяется указанием первого и последнего битов. Количество битов в кванте памяти машины задается зависящей от реализации константой ВУБТЕМ.БТОКАОЕ ОХ1Т.
В качестве примера рассмотрим представление слова состояния программы на машине типа 1ВМ/360 (РОР831. Слово состояния программы занимает 2 слова (каждое слово состоит из 4 байт) и предназначается для хранения признаков состояния программы, с которой оно связано. Слово состояние программы должно быть размещено, начиная с границы двойного слова (т.е. начинаться с четного адреса). Объекты, представляющие слово состояния программы, описаны как имеющие тип РКООВАМ оТАТ(78 %ОйР, определенный вместе с другими связанными описаниями следующим образом: %ОКР: сова!авг:- 4; -- 4 байт на слово !уре ШТАТЕ !я (А, М, %, Р); (уре МОРЕ !я (Р1Х, РЕС, ЕХР, Б1ОХ1Р); Фуре ВУТЕ МАЯК )я аггау(0..7) оу ВОО1.ЕАХ; Фуре ШТАТЕ МАЯК !я аггау(ШТАТЕ) о( ВООЬЕАХ; !уре МОРЕ МАЯК !в аггау(МОРЕ) оу ВОО1.ЕАХ; 241 Сле икат ы и стаалеиил и осооеииости, эааиси ие от ализа ии Фуре РКООКАМ БТАТ138 %0КР 1е гееоп$ БУБТЕМ МАБК: РТЕ МАЯК; РКОТЕСТ1ОХ КЕУ: ПЧТЕОЕК гапКе 0..3; МАСН1ХЕ ШТАТЕ: ШТАТЕ МАЕК; 1ХТЕКК1)РТ СА1)БЕ: 1ХТЕККс)РТ10Х СОРЕ; Н.С: 1ХТЕОЕК гапКе О..З; СС: 1ХТЕОЕК гапКе 0..3; РКООКАМ МАЯК: МОРЕ МАЯК; 1ХБТ А1МЖЕБЯ: АР1ЖЕББ; епй гееогп; Объекты типа РКООКАМ ЯТАТ1)8 %ОКР отображаются на структуру машины в соответствии со следуюшими спецификаторами представления записи и длины.
1ог РКООКАМ БТАТ1)Б %ОКР пее гесогй а1 пнн) 8; -- выравнивание по четным (8-байт) адресам БУЯТЕМ МАЯК аг Ое%ОКР гапКе 0..7; -- размешение первых восьми битов первого слова -- для компоненты БУЯТЕМ МАЯК вЂ” биты 8 и 9 не используются РКОТЕСТ10Х КЕУ ае 0 %0КР гапКе 10..11; МАСН11ЧЕ ШТАТЕ а1 0 %0КР гапКе 12..15; 1ХТЕКМЗРТ СА1ЛЕ ае Ое%0КР гапКе 16..31; Н.С а1 1е%0КР гапКе 0..1; -- размешение первых двух битов второго слова -- для компоненты 11.С СС а1 1е%ОКР гапКе 2..3; РКООКАМ МАЯК аг 1е%ОКР гапКе 4..7; 1НБТ АРРКЕБЗ а1 1е%0КР гапйе 8..31; епп' гееого; 1ог РКООКАМ ВТАБ)Б %0КР'БЕЕ пее 2 ° ЯУБТЕМ.ЯТОКАОЕ 1ЛМ1Т; -- размешение точно двух слов для каждого — слова состояния программы 8.3.
Спецификатор адреса [13.51 Слециатикатор адреса используется для 1) указания начального адреса объекта в памяти. Этот механизм позволяет связать объекты программы с аппаратурой, например с регистрами устройства и аппаратными буферами; 2) определения, что подпрограмма, пакет или задача должны быть размещены, начиная с определенного адреса памяти.
Спецификация адреса полезна, так как некоторые машины и операционные системы требуют, чтобы определенные программы были размешены в строго определенных областях памяти. Например, если происходит генерация кода для ЭВМ, в которой отсутствует управле- глллл В 242 ние памятью, то адреса ячеек физической памяти, в которых этот код располагается, должны передаваться компилятору; 3) связи аппаратных прерываний с входами [не может быть семейства входов). Появление прерывания влечет вызов соответствующего входа. Приоритет таких вызовов выше, чем приоритеты вызовов из любых задач пользователя.
Спецификатор адреса имеет следующую форму: гог имя вле а[ адрес где имя — программная единица, которая связывается с адресом и памяти. Некоторые примеры: аког НАзх[з%АКЕ В(ЗРРЕК вле аг 8№177562№; — аппаратный буфер устройства, расположенный — ло адресу 8 Ф 177562 № , доступен через -- переменную НАК[)%АКЕ В[)РРЕК гог Р[.[Т вае а[ 8№60№; прерывание по адресу 8 вл 60 ул связывается с входом Р[зт.
Эта спецификация приводит к вызову входа Р[зТ всякий раз, когда возникает прерывание 8.4. Изменение представления [13.б1 Язык Ада допускает указание единственного представления для типа данных. Однако разнообразные представления могут оказаться желательными в определенных случаях, когда 1) представления перечислимого типа на различных внешних носителях соответствуют различным внутренним представлениям; 2) одно внутреннее представление каждый мог бы использовать для экономии памяти и быстрого доступа. Необходимо также иметь возможность прямого и обратного преобразований между различными представлениями Разнообразные представления для типа Т реализуются порождением новых типов из Т и связыванием внутреннего представления с типом Т и с каждым типом, производным от него.
Объекту этого типа присваивается значение с желаемым внутренним представлением. Изменение представления осуществляется посредством явных преобразований типа. Предположим, например, что существует большое число записей типа [гЕБСК[РТОК. Для экономии памяти они должны запоминаться в упакованной или компактной форме, но перед обращением их необходимо преобразовать в "Адрес должен иметь тип А[З[ЗКЕББ, определенный в пакете БУЗТЕМ. — Прим.
дед. э'В языке паскаль [юе[ч741 в целях экономии памяти пользователь может хранить массив в упакованном виде Однако доступ к отдельным компонентам упакованного массива дорог, и поэтому программисту обычно советуют распаковывать массив перел доступом к элементам и затем вновь упаковать. для этих целей в языке Паскаль используются стандартные процелуры раса и цпраск Спо и иляг ы п стянлоиия и особоииости, зояися о от ализа ии неупакованную форму для быстрого доступа 'з. Тип РАСКЕ0 0ЕБСК1РТОК является производным от 0ЕБСК1РТОК, и для него специфицируется компактное представление. гуре 0ЕБСК1РТОК Ь а — компоненты дескриптора оай гееоп1; туре РАСКЕ0 0ЕБСК1РТОК 1я аозт 0ЕБСК1РТОК; Фуре РАСКЕ0 0ЕБСК1РТОК Ь генон) -- компактное представление, которое будет использоваться для компонент ев$ гееов$; 0ЕБСК1РТОК и РАСКЕ0 0ЕБСК1РТОК имеют общие логические характеристики, но различные физические представления. Представление 0ЕБСК1РТОК было неявно определено компилятором, в то время как представление РАСКЕ0 0ЕБСК1РТОК было явно определено пользователем.