Н. Джехани - Язык Ада (1988) (1160771), страница 8
Текст из файла (страница 8)
Такая свобода делает невозможной проверку типов, поскольку компилнтор не может определить тип объекта. В некоторых языках программирования разрешено выполнять операции над указателями, однако если отсутствует строгий контроль за правильным выполнением операций, то может произойти неправильный доступ к другим участкам памяти. Зб Ввв вняв зриведем примеры создания динамических объектов: Г1: = пезв БТК11чО (1..40); — ограничение индекса Г2:=нее БТК11чО' (1..40 = > ' '); — заданы начальные значения А:=пезг РОБ1Т1О)ч' (У = >5.0, Х = > 10.0); В:=пеп РОБ1Т101ч; Р: = пезв ОЕОМЕТК1С - Р1О13КЕ(С1КСЬЕ); — задано ограничение дискриминанта Ссылоцюе значение, на которое указывает объект ссылочного типа Р, обозначается через Р.
Для указания динамических объектов используется обозначение Р.ай, где Р— это объект ссылочного типа или вызова функции, возвращающей значение ссылочного типа. Если Р— объект комбинированного типа, то его компонента С указывается как Р.С. Например, если использованы определенные ранее переменные А и В, то присваивание В.ай:= А.ай; копирует значение объекта, указанного с помощью ссылки А, в объект, на который указывает ссылка В.
Это присваивание эквивалентно присваиваниям компонент А компонентам В: В.Х := А.Х; ВХ:= Аз'; С другой стороны, присваивание В := А; только копирует значение А в В, и в результате В указывает на тот же объект, на который указывает А. Тот объект, на который ранее указывала ссылка В, становится недоступным, если только другой объект ссылочного типа не указывает на него.
1.2.6.1. Время жизни динамических объектов Динамический объект существует до тех пор, пока на него есть ссылка. Концептуально на динамический объект можно ссылаться до тех пор, пока доступно описание соответствующего ссылочного типа. Память, занятая под динамические объекты, может быть возвращена, если она либо больше не нужна, либо освобождена. Если в реализации предусмотрена сборка мусора, то ненужные объекты будут освобождаться автоматически. В противном случае их необходимо освобождать явно,.если занятую ими память требуется использовать для других целей. Явное освобождение памяти осуществляется с помощью конкретизации наСтраИВаЕМОй ПрОцЕдурЫ (ЛЧСНЕСКЕ1) )ЗЕАЬЬОСАТ1О1ч.
СЛЕдуЕт Обращатъ особое внимание на возможные ошибки, возникающие в результате появления «висячих ссылок» 1РКА751, т. е. ссылок на уже явно освобожденные объекты. Общий объем памяти для объектов определенного ссылочного типа можно указать посредством спецификации длины (см. гл. 8 о спецификататорах представления и средствах, зависящих от реализации). вв Глввв; 1.3. ВыРажениЯ 14.41 13.1.Старшинство операций [4.51 Операции перечислены в порядке возрастания их старшинства: апез ! ог ) хог ( апек Г)зеп ) ог е)йе = )/= ! < ! <= ( > ! >= (зп ( пег зп +! — )й +~— * ~ у ~ оез ~ еш ии ! авй ! по( логические отношения/включения аддитивные (бинарные) аддитивные (унарные) мультипликативные наивысшее старшинство 1.3.2.
Семантика операций 1.3.2.1. Логические операции 14.5.11 Операиип Типы иперипдае гьп Везупылапиг Действие Логический Такой же логический массив Конъюнкция Логический Логический массив Логический Такое же логический массив див ъюнкция Логический Логический массив ог Логический Такой же логический массив Исключающая Лизъюнкция Логический Логический массив ког Сокращенная конъюнкция Логический Логический внв гвен ог езве Сокращенная лизъюнкция Логический Логический Погический тип — это либо предопределенный тип ВООЬЕА)з(, либо любой производный тип логического типа (производные типы обсуждаются в гл. 2: дополнительные сведения о типах). Результат выражения, образованного с использованием операций апз), ог или хог, определяется путем вычисления значений обоих операндов. В случае сокрашенных логических операций (апчз, Гйеп или ог е!ве) второй операнд вычисляется, Выражения образуются из операций и операндов.
При вычислении выражения операции с ббльшим старшинством применяются в их текстуальном порядке слева направо. Круглые скобки используются для изменения порядка вычисления, накладываемого старшинством операций. Статическое вьзрвзкение 14.91 — это такое выражение, операнды которого имеют значения, определяемые без выполнения программы. Статические выражения поэтому можно вычислить во время компиляции (без выполнения программы).
Статические выражения состоят из литералов, литеральных выражений, констант, инициализированных статическими выражениями, агрегатов, образованных из статических выражений, предопределенных операций, статических атрибутов, функций со статическими выражениями в качестве фактических параметров и т.д. Старшинство операций и их семантика приведены ниже.
ат Ввв виме только если результат выражения нельзя определить в результате вычисления первого операнда. Фраза оптимизация логических выралсений '1 используется для обозначения того, что при генерации объектного кода для логических выражений обычные логические операции (апд, ог) будут трактоваться, как если бы они были сокращенными логическими операциями [Ой!71]. Пока логические выражения не содержат побочного эффекта, такие оптимизации не вызывают проблем. Программы, учитывающие, что логические выражения оптимизируются в конкретной реализации, могут оказаться зависящими от реализации, поскольку в реализациях, где оптимизация не производится, они могут не давать правильного результата. Например, вычисление выражения 1/=О апд А(1) в котором нижняя граница массива А есть 1, не вызывает никаких затруднений в случае 1, равного О, если производится оптимизация кода, но в противном случае возникнет ошибка выход за границы индекса.
Разделение логических операций на регулярную и сокращенную форму позволяет программисту выбрать точное описание желаемого действия. Использование сокращенных операций может привести к изящной записи программ [О!176!. Например, без использования сокращенной операции апд !Ьеп фрагмент программы на языке Ада 1:=1; чуЫ1е 1 < = !х! апг! !йеп Х(1) /= КЕУ !оор 1:=1ф1; епд 1оор; — если 1 <= М, то 1 — это индекс КЕУ в Х Осуществляющий поиск отрезка массива Х(1..Х) для значения КЕУ можно переписать (менее изящно), используя дополнительную логическую переменную РЕЕМ)х!Т, так: 1:= О; РзхЕБЕ[х!Т 1= РАЕЧКЕ; зч!11!е 1 <!ч! апд по! РКЕБЕ)х!Т 1оор 1:=1+ 1; РЕЕМ!х)Т 1= Х(1) = КЕУ; еЫ !оор; — если РКЕБЕ)х)Т равно Тй(!Е, то 1 — это — индекс КЕУ в Х Дополнительную переменную необходимо использовать для предотвращения выхода за границы индекса в случае, когда КЕУ не присутствует в массивез' Операция апд !)зеп вызывает вычисление второго операнда Х(1)/= КЕУ только тогда, когда 1 < = !х! имеет значение ггпе, т.
е. Х(1) — это корректный элемент Х. о Оптимнзания — это неверно! Вместо этого лучше использовать «улучшение кода», поскольку кол, полученный после так называемой оптимизании, обычно не самый эффективный код. гг Простое переписывание первого фрагмента с использованием апв вместо апа гьеп, т.е. пьйе ! < = 1Ч апа ХО)/=КЕу !оор 1: = 1 + 1; епа !оор; вызывает выход за гранины индекса при ! > !Ч. гланд у 1.3.2.2.
Операции отношения и включения 14.5.2] 1.3.2.3. Бинарные алдитивные операции 14.5.3] Дейснмие Олеравил Тии левого анероида Тин «равого анероида Тин резулининж Сложение Числовой Такой же числовой Такой же числовой Вычитание Катенадия Числовой Такой же числовой Такой же числовой Операция катенапдеи ос используется для катенации двух массивов, расширения массива на один элемент или формирования массива из двух элементов. 1.3.2.4. Унарные аддитивные операции 14.5.4] 1.3.2.5. Мультипликативные операции [4.5.5] В первой таблице в данном разделе приведены мультипликативные операции для целых значений и вещественных значений с плавающей точкой; во второй таблице — мультипликативные операции для значений с фиксированной точкой: Индексируемый Элемент Индексируемый Элемент Такой же, как и слева Индексируемый Элемент Элемент Такой же, как и слева Такой же индексируемый Такой же индексируемый Любой индексируемый 39 Вее ение Операции геш и шее), используемые для операндов с одними и теми же абсолют- ными значениями, дают одинаковый результат только в том случае, когда оба операнда имеют одинаковые знаки.