Н. Джехани - Язык Ада (1988) (1160771), страница 47
Текст из файла (страница 47)
РЬАМЕ компилируется отдельно. верага!е(РЬАХЕ ТКАСКЕК) -- делает доступным окружение, присутствующее -- в следе тела для СКЕАТЕ РЬАХЕ ргосея$пге СКЕАТЕ Р1.АХЕ(1: РЬАМЕ 1МРО; !Вч оп! Р1.АХЕ П)) (в Р: РЬАХЕ; Ьеа!п Р: пеп ТКАСКЕК; АОО(Р, 1О); -- лобавляем самолет Р к множеству активных самолетов -- и возврашаем его внешнее имя !Р Р.
(Х1Т1А Ы ХЕ(1); ехсербоп пЬеп ТАБК1ХО ЕККОК > га!ве !Ь.ЕОА1. Р1.АХЕ; пЬеп ЗТОКАОЕ ЕККОК > га!ве ТОО МАХУ РЬАХЕБ; спи СКЕАТЕ РЬАМЕ; Возникает ряд проблем, если выполнение операции распределения памяти не является взаимоисключаюшим [ВК173) (язык Ада ничего не говорит об этом), так как многочисленные вызовы задачи СКЕАТЕ РЬАХЕ и одновременное выполнение операции петя могут заканчиваться с одинаковыми значениями для возможно различных динамических объектов.
Выход из создавшегося положения заключается в принудительном последовательном размешении новых задач слежения. Последовательное распределение выполняется задачей АЬЬОСАТОК, по запросам на размещение посредством вызова входа. Все вызовы входа образуют очередь и принимаются последовательно по-одному. Для пакета Р1.АХЕ ТКАСКЕК имеются две модификации: Глава 7 1. Задача АЬЬОСЯТОК описывается в теле РЬАХЕ ТКАСКЕК: гавй А1.ЬОСАТОК!в епггу ХЕзчг РЬАХЕ(Р: опг Р1.АХЕ); епб АЬЬОСАТОК; 1ав)г Ьойу АЬЬОСАТОК 1й Ьек)п 1оор Ьек)п -- начало блока аесер1 ХЕ злу РЬАХЕ(Р: оп1 РЬАХЕ) оо Р: пеп ТКАСКЕК; епд ХЕ% Р1.АХЕ; -- за единицу времени допускается только один вызов - - входа, т. е.
память распределяется эффективно ехеербоп п)зеп БТОКАОЕ ЕККОК > ппИ; епй; еЫ!оор; епд АЬ1.0САТОК; Заметим, что оператор принятия вставлен в блок. Как только возникает исключение в операторе принятия, оно также распространяется и на взаимодействующую задачу. Если исключение не было обработано локально в блоке, задача завершается как результат возбуждения исключения. Конечно, АЬЬОСАТОК не должен завершаться при запросе на обработку 513-го самолета. 2. Вызов распределителя памяти в СКЕАТЕ РЬАХЕ заменяется вызовом входа и АЬ ОСАТОК.ХЕ зйу РЬАХЕ(Р); Процедура КЕМОУЕ-РЬАХЕ, завершающая слежение за самолетом, компилируется как " Во время процесса стандартизации в качестве одной из модификаций языка Ада выдвигалось требование распростраиеиия исключения ТАБК1ХО ЕККОК в вызывающую задачу вместо возбуждеиия исключения, если оио появляется во время рандеву.
Эта модификация в конечном счете ие была включена в язык. Если бы полобиая модификация была осуществлена, АььОСАТОК вызывался бы по-ииому. Несогласованность в подобной модификации привела бы к распространению исключения ТАНК!МО-ЕККОК в вызывающую задачу взамен исключения БТОКАОЕ-ЕККОК. Это изменение требовало бы локальной обработки исключения ТАБК1МО ЕККОК, так что зто могло бы быть определеио в том случае когда при вызове АььОСАТОК распространялось бы вновь исключение ТАБК1МО ЕККОК. После чего исключение ТОО МАХУ РьАХЕБ возбужлалось бы и распростраиялось иа задачу слежения за новым самолетом. Возбужлеиие исключения ТОО МАМУ РьАМЕЯ в вызывающей задаче может быть заверщеио вызовом МЕЗУ РьАМЕ в блоке: Ьей1п АЫ.ОСАТОКХЕ% РЬАХЕ(Р); ексериев ийеп ТАБК1ХО ЕККОК > гане ТОО МАХУ РЕАХЕВ; еве; Ст а а ммы я аяьная комяяяя яя вервгвге(РЬАХЕ ТКАСКЕК) ргоседпге КЕМОЧЕ РЬАХЕ(1Р: 1п оп( РЬАХЕ 1Р) )в ргоседпге РКЕЕ 1в аею ШЧСНЕСКЕР РЕАЬЬОСАТ1ОХ(ТКАСКЕК, РЬАХЕ); Р: РЬАХЕ; Ьеп)п Р: 1ХТЕКХАЬ ХАМЕ(1Р); Р.Р1Е; РЕЬЕТЕ(1Р); -- изъятие самолета из множества активных объектов ГКЕЕ(Р); -- освобождение памяти после того, как самолет уничтожен ехсерйоп пЬеп ТАБК1ХО ЕККОК > га)ве 1ЬЬЕОА1,Р1.АХЕ; епй КЕМОУЕ Р1.АХЕ; Тело задачного типа ТКАСКЕК, который был представлен следом тела в единице компиляции РЬАХЕ ТКАСКЕК, передается компилятору.
Этот объект содержит след тела процедуры РРРАТЕ РОЯТ10Х: верагаге(Р1.АХЕ ТКАСКЕК) (авЬ )ни)у ТКАСКЕК )в РАТА: Р1.АХЕ 1ХГО; ргосеопге \ЗРРАТЕ РОБ1Т10Х гв верагаге; -- коррекция координат самолета -- производится по скорости самолета, его старым -- координатам и времени, прошедшему с момента -- послелней коррекции Ьеа(п ассерг 1Х1Т1АЫЕЕ(1; РЬАХЕ 1ХГО) оо РАТА: 1; епп 1Х1Т1АЫУ,Е; 1оор ве)есг ассере Р1Е; ех)К ог пЬеп Р1Е'СОЫХТ О > ассер$ ЫРРАТЕ(1: Р1.АХЕ 1ХГО) йо РАТА: 1; епо 13РРАТЕ; ог пЬеп Р1Е'СООХТ О апй ЫРРАТЕ'СООХТ О > ассерг КЕАР(1: оп( РЬАХЕ 11ЧРО) йо 1: РАТА; епо КЕАР; ог ое1ау 1.0; УРРАТЕ РОБ1Т1ОХ; епо ве!есй епй 1оор; еаза ТКАСКЕК; 236 Главе 7 Ниже приведено тело процедуры 1)РРАТЕ РОЯТ1ОХ: пее САЬЕХРАК; яерага!е(РЬАг1Е ТКАСКЕК.ТКАСКЕК) -- именованная компонента используется для того, чтобы — специфицировать модуль, содержащий след тела ргоее$аге 13РРАТЕ РОБ1Т10о1 1а )ч)ЕЪЧ Т1МЕ: Т1МЕ: С1.ОСК; РЕ1.ТА Т1МЕ: Р(ЗКАТ101ч': 1чЕ)Ч Т1МŠ— РАТА.Т; — — * определяет умножение скорости на время для получения расстояния 1апе11оп "'"1РТ: 1Н)КАТ101ч; Ч: М1ЬЕЯ геГагп М!ЬЕБ!а Ьеа)п ге1пгп МЬЬЕБ(РТ) е Ч; епд "е"; Ьефп РАТА.Х: РАТА.Х + РЕЬТА Т1МЕ е РАТА.ЧХ; РАТА.У: РАТА.У + РЕЬТА Т1МЕ е РАТА.ЧУ; РАТА.Е: РАТА.е.
+ РЕЬТА Т1МЕ е РАТА Че,; РАТА.Т: )ч)Е% Т1МЕ; еп4 ЫРРАТЕ Р081Т10)ч'; Реализация АСТ1ЧЕ РЬА1чЕБ предоставляется читателю. Глава 8 Спецификаторы представления и особенности, зависящие от реализации [13] 8.1. Введение Главное преимущество использования языка программирования высокого уровня заключается в возможности создания абстрактных алгоритмов, достаточно независимых от архитектуры машины 1%/1К77а] и от представления типов данных, используемых в реализации.
Тем не менее и особенности архитектуры машины, и используемые представления типов данных оказывают существенное влияние на написание программных систем, таких как драйверы, системы управления процессами 1управляющие системы), обработчики прерываний, распределители памяти и другие программы, где эффективность крайне необходима, т.е. где каждый бит памяти и каждый выполняемый цикл должны использоваться максимально эффективно. Например, драйвер для клавишей пишущей машинки должен иметь доступ к буферу аппаратных средств клавиатуры и влиять на вектор прерывания. Следовательно, язык системного программирования должен иметь средства для манипулирования объектами на двух уровнях: — абстрактном, где важны только логические свойства; — Физическом, который имеет дело с аппаратной частью вычислительной машины и способом представления.
Средства работы на этих двух уровнях необходимо разделять и четко идентифицировать, так как в противном случае 1) программы будет труднее понимать, поскольку возникнет путаница между логикой и деталями физической реализации; 2) изменение в представлении типа данных повлечет за собой модификацию значительной части программы вместо модификации маленькой и изолированной части; 3) станет трудно переносить программы с одной машины на другую, так как детали физического уровня, которые необходимо модифицировать, будет трудно увидеть или отделить от программы; 4) доступ к физическому уровню, являющемуся низким, приведет к нежелательным изменениям дисциплины, принятой в языках программирования высокого уровня, Это скажется, например, на строгой типизации, обеспечивающей проверку ошибок.
Следовательно, настоятельной необходимостью является отделение доступа к физическому уровню от программы н выдача предупреждений. Язык программирования Ада содержит возможности для указания логических и физических свойств, причем они отделены и четко отличаются друг от друга. Логические свойства объектов в программе специфицируются их описаниями. Выполнение программы полностью зависит от этих свойств.
Физические детали объектов и интерфейс программы с внешним окружением может явно определять программист путем использования специально предназначенных для этих целей возможностей. Если пользователь точно не определяет детали физического уров- Глава В ня, то это обеспечивает компилятор с языка Ада.
Язык Ада позволяет задавать такие спецификации физического уровня деталей, как представление типов данных, интерфейс со средствами аппаратного прерывания, вставка части программы в машинном коде по указанным адресам в памяти, высвобождение памяти и нарушение строгой типизации — все, что необходимо для системного программирования. Следует отметить, что описанные возможности разрушают механизм проверки ошибок в языке, позтому нми следует пользоваться только в случае крайней необходимости и с большой осторожностью, особенно это касается программистов-новичков. Возможности, которыми обладаег язык Ада для связи с аппаратурой, называются специ1йикаторами представления, которые бывают друх типов — специ1еикаторы представления типа н специ(рикаторы адреса.
8.2. Спецификаторы представления типа [13.1 — 13.41 Представления типов данных обычно выбираются компилятором, так как в большинстве случаев программиста удовлетворяет реализация типа данных по умолчанию. В тех редких случаях, когда программист не удовлетворен предложенным компилятором представлением типа данных, у него есть следующие возможности: 1. Программист может управлять выбором компилятора подходящего представления, используя предопределенные прагмы. Например, прагму РАСК можно использовать для указания компилятору, что используемую прн реализации записи или массива память необходимо свести к минимуму. 2. Программист может использовать специЯикатор представления типа для точного определения отображения между типом данных и средствами машины, специфицируя то представление, которое необходимо использовать, например, размер памяти, внутреннее представление перечислимого типа и формат именуемого типа.