Н. Джехани - Язык Ада (1988) (1160771), страница 49
Текст из файла (страница 49)
Изменения представления выполняются посредством явных преобразований типа. Например, первый из следующих операторов распаковывает объект Р типа РАСКЕ0 0ЕБСК1РТОК в объект 0 типа 0ЕБСК1РТОК, а второй оператор осуществляет упаковку объекта 0 обратно в объект Р. 0: 0ЕБСК1РТОК(Р); -- распаковка Р: РАСКЕ0 0ЕБСК1РТОК(0); — упаковка 8.5. Особенности, зависящие от конфигурации, и константы 113.71 Язык программирования Ада позволяет программисту специфицировать в программе особенности, зависящие от конфигурации, чтобы помочь Ада-ком- пилятору использовать зти особенности во время генерации кода и в то же время не нарушить наложенные ими ограничения.
Можно специфицировать такие зави- сящие от конфигурации особенности, как: 1) модель машины и ее производителя, 2) операционную систему, 3) объем доступной памяти, 4) выбор специальной аппаратуры. Эти особенности специфицируются посредством зависящих от реализации прагм. Некоторые примеры приведены ниже: ргарва БУБТЕМ ХАМЕ(ь)Х1Х); ргаязва БТОКАОЕ $ЛЧ1Т(32); ргаяаза МЕМОР Б1л.Е(262144); ргаяаза МАСН1ХЕ ХАМЕ(ЧАХ11 780); н доступ к компонентам массива в упакованном виде осушествляется очень медленно, так как различные компоненты массива могут быть упакованы в одни и тот же квант памяти (т.е, машинное слово). Например, изменение значения, которое не занимает адресуемый квант памяти, может потре- бовать извлечения из памяти кванта, содержашего изменяемую величину, запоминания этого блока, извлечения из него изменяемой величины и, наконец, преобразования изменяемого значения в упако- ванную форму.
Глава В Язык Ала также разрешает программисту доступ к зависящим от реализации константам, которые известны компилятору посредством пакета БУВТЕМ и (описанного в предопределенном пакете ВТАХРАКР). Ниже приводятся некоторые примеры констант, доступных в пакете БУБТЕМ: АР1ЖЕББ Тип адресов, предусмотренных в спецификато- ре адреса. Это также и тип значения, возвра- щаемый атрибутом АРРКЕББ (Х'АР1ЖЕ% — начальный адрес объекта, программного модуля, метки или входа Х) Имя системы Количество битов в кванте памяти Общее число доступных квантов памяти в за- поминающем устройстве Наименьшее целое число, определенное в ре- ализации Наибольшее целое число, определенное в ре- ализации Основной период времени в секундах БУЯТЕМ ХАМЕ ЗТОКАОЕ ЫХ1Т МЕМОКУ 51к.Е М1Х 1ХТ МАХ 1ХТ Т1СК Примером случая, когда необходим доступ к таким константам, является определенная пользователем подпрограмма ввода-вывода низкого уровня, которая обращается к различным подпрограммам в зависимости от операционной системы.
Это иллюстрируется следующим фрагментом программы: саве БУДЕМ.ЗУВТЕМ ХАМЕ !и хг!аеп ЫХ1Х > код с с(зответствующими вызовами программ для системы ЫХ!Х яг)аеп М!)ЬТ1СВ > кол с соответствующими вызовами программ для системы МЫЬТ!СЯ ппеп ЧБ 370 > код с соответствующими вызовами программ для системы Чб 370 епй сам; Рассмотренный выше оператор выбора может условно компилироваться (т.е. выполняться во время компиляции), но это уже предоставлено Ада-компилятору. 8.6. Включение машинного кода [13.81 и В каждой реализации имеется предопределенный пакет оуБТЕМ (пакет системы программироаання), солержагций зааисяглие от конфигурации характеристики. — Прим. дед.
В языке Ада предусмотрена возможность включения машинного кода непосредственно в программу. Включение команд машинного кода часто вызывает многочисленные трудности и ошибки, и потому использовать данную возможность следует как можно реже. Однако включение машинного кода в программу целесообразно в следующих ситуациях: 245 Слв и като и л сгавлвииа и особливости, завися иа ог ализа ии при выполнении специальных машинно-зависимых команд; при невозможности осуществления доступа к регистрам как к ячейкам памяти; при написании программ, критичных к зффективности; ° при выполнении прдграммой некоторых функций аппаратуры ". 8.7. Связь с другими языками [13.91 Одна из проблем, связанных с переходом от одного языка программирования к другому, — что делать с уже сугцествующим программным обеспечением.
Затраты на переписывание программного обеспечения на другой язык могут оказаться достаточно высокими и явиться существенным препятствием для перехода на новый язык, и зто подчас заставляет использовать устаревший язык программирований, несмотря на то что он по техническим возможностям хуже нового языка.
Язык программирования Ада в значительной степени облегчаег переписывание программного обеспечения за счет прагмы, позволяющей связать Адапрограммы с подпрограммами, написанными на других языках. Эта'прагма имеет форму ргайвза Ич)ТЕКРАСЕ(имя языка, лмя подпрограммы) Следующий пример 11зоьэ831 показывает, как две подпрограммы БОКТ и ЕХР, написанные на языке фортран, могут быть вызваны из Ада-программ. рвсйайе РОКТ с1В 18 -- Ада-спецификации 8ОКТ и ЕХР 1ввсг(ов В()КТ(Х1 Н.ОАТ) гейвп Н.ОАТ; (вве81ов ЕХР(Х: Н.ОАТ) гегвгв ГЬОАТ1 рг1чаге -- зти подпрограммы реализованы на языке Фортран ргайнза 1МТЕКРАСЕ(РОКТКАгч, 3(1КТ)1 ргайвза 1)ч(ТЕКРАСЕ(ГОКТКА)ч1, ЕХР); еве) ГОКТ 11В; 8.8.
Неконтролируемое освобождение памяти ~13.10, 13.10. Ц Язык Ада содержит настраиваемую подпрограмму 1Лх(СНЕСКЕО ГгЕА1: 1ОСАТ)О)х) для явного освобождения или повторного использования памяти, отведенной для ссылочных переменных. Явное освобождение динамических объектов может понадобиться, если в реализации языка не предусмотрена сборка мусора ийили возникает необходимость в явном управлении памятью.
Программист сам должен следить за тем, чтобы освобождалась только нетребуемая более память. и Например, ядро операпионной системы 111Ч!Х™ содержит около 1О 000 строчек кода, написанных на языке системного программирования Си, н около 1000 строчек ассемблерного кода. 800 строк этого ассемблерного кода можно было бы написать на языке Си. Олнако (не только по причинам эффективности)текст остался написанным на языке ассемблера, чтобы выполнять функпии аппаратуры, исполнение которых невозможно в языке Си (тН078].
Глава В Настраиваемая подпрограмма 1)ХСНЕСКЕ)э ОЕАЬ ОСАТ1ОХ имеет следующую спецйфикацию: . денег)с суре ОВЯЕСТ Ыв11ео рпгаге; 1уре ХАМЕ 1в ассеяв ОВУЕСТ; ргосеовге ЫХСНЕСКЕ)) ОЕАЬЬОСАТ1ОХ(Х: 1в овг ХАМЕ); Предположим, что две ссылочные переменные Х и У указывают на один и тот же объект, а РйЕŠ— подходящая конкретизация настраиваемой процедуры ЫХСНЕСКЕО ОЕАЬЬОСАТ1ОХ. Ссылка на это объект с использованием ссылочной переменной У после выполнения оператора РзчЕЕ(Х); вызывает выдачу сообщения об ошибке, так как первоначально занятая под этот объект память освободилась и содержит значение некоторого неизвестного типа.
Поэтому программист обязан следить за тем, чтобы подобные ситуации не возникали. 8.9. Неконтролируемые преобразования типов [13.10, 13.10.2] Доступ к представлению, которое в языке Ада называется неконтролируемым преобразованием, можно получить, используя настраиваемую подпрограмму 1)ХСНЕСКЕО СОХЧЕКЯ10Х. При этом допускается рассмотрение любого битового изображения в памяти как значения любого требуемого типа. Программист обязан следить за тем, чтобы битовое изображение, рассматриваемое как значение некоторого желаемого типа, представляло осмысленное значение этого типа. Такие неконтролируемые преобразования могут оказаться необходимыми для определенных пользователем процедур распределения и освобождения памяти; адреса памяти, представленные целыми числами, должны преобразовываться в ссылочные значения подходящего типа, и наоборот ').
Спецификация настраиваемой подпрограммы УХСНЕСКЕ)) СОХЧЕКБ1ОХ имеет вид яепег)с гуре 301ЖСЕ 1я Ипи1е$ рг)уа1е; куре ТАКОЕТ 1й Вв)сео рг1таге; Ввсбоп ЫХСНЕСКЕ1) СОХЧЕй81ОХ1Е: БОЫзсСЕ) гегвгп ТАзчОЕТ; о Другой пример использования неконтролируемого преобразования — реализация записей с вариентвми в языке Фортран (нв свмом деле в Фортране нет записей). Для определения стека, элементами которого могут быть либо целык либо вешественные числа, задается мессин целых чисел. Элементы этого массива рассматриваются непосредственно кек целые числа или косвенно (используя опервтор эквивалентности) квк действительные Это может явиться причиной ошибки, ткк ккк целые числа могут ошибочно рассматриваться квк вешественныц и наоборот.
Но в данном случае у прогрвммиста нет выборе, твк ккк в Фортране иет записей с вариантами или эквивалентной им замены. 247 Спв и кат и ставявиия и особенности завися ивог ализа ии 8.10. Примеры Использование спецификаций представления показано на двух примерах. Первый пример — это программа, которая читает символы с клавиатуры печатающего устройства и выводит их на печать. Этот пример иллюстрирует связь программных переменных с аппаратными буферами и аппаратными прерываниями.