Rationale for Ada 2005: Introduction
RUSTOPBACKNEXT
ENG |
3.2 Access types
@ It has been said that playing with pointers is like playing with fire - properly used all is well but carelessness can lead to disaster. In order to avoid disasters, Ada 95 takes a stern view regarding the naming of access types and their conversion. However, experience has shown that the Ada 95 view is perhaps unnecessarily stern and leads to tedious programming. @ We will first consider the question of giving names to access types. In Ada 95 all access types are named except for access parameters and access discriminants. Thus we might have
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rationale for Ada 2005: Introduction
ENGRUSTOPBACKNEXT3.2 Ссылочные типы
@ Несомненно, игра с указателями походит на игру с огнем - при их корректном использовании всё хорошо, но небрежность с ними может привести к непредсказуемым последствиям. Чтобы избежать подобных проблем Ада 95 имеет строгие правила относительно обозначения и преобразования ссылочных типов. Однако опыт показал, что эти правила в Аде 95, возможно излишне строги и приводят к утомительному программированию.
@ Рассмотрим сначала вопрос предоставления имен ссылочным типам. В Аде 95 все ссылочные типы именуются (за исключением ссылочных параметров и ссылочных дискриминантов). Таким образом, мы могли бы написать:
|
@ Кроме того, есть определённая асимметрия между именованными ссылочными типами и ссылочными параметрами. В случае именованных ссылочных типов у них всех есть нулевое значение (и это - значение по умолчанию при объявлении, если явно не задано другое значение). Но в случае ссылочных параметров, нулевое значение как фактический параметр не разрешается. Кроме того, именованные ссылочные типы могут ссылаться на константные типы:
|
@ что означает, что мы не можем изменить значение Animal через ссылку типа Rigid_Animal. Но в случае ссылочных параметров, мы не можем написать:
|
@ В Аде 2005 почти все эти ограничения отменены в интересах гибкости и однородности.
@ Прежде всего, мы можем явно определить есть ли у ссылочного типа (строго подтипа) нулевое значение. Мы можем написать:
|
@ Это означает, что нам гарантируется, что объект типа Acc_Animal не может иметь нулевую ссылку. Поэтому при объявлении такой объект должен быть инициализирован, например так:
|
@ (Empress of Blandings - известная свинья в романах по отношению к лорду Emsworth в последнем G P Wodehouse). Если мы забудем инициализировать My_Animal, то возбуждается исключение Constraint_Error; технически основному типу всё ещё разрешается иметь нулевое значение, но Acc_Animal уже нет. Конечно, мы можем также использовать не пустой указатель для обращения к константе.
@ Преимущество запрета нулевого указателя состоит в этом, что когда мы делаем разыменовывание:
|
@ при этом не выполняется никакой проверки того что мы не разыменовываем нулевой указатель. Это делает код быстрее.
@ Так же мы можем добавить атрибуты constant и/или not null access к ссылочным параметрам. Таким образом, на Аде 2005 мы можем написать:
|
@ Отметим, что не всё разрешено в этом контексте, так как ссылочные параметры всегда являются общими (то есть, они могут ссылаться как к объявленным (declared) объектам так и к распределенным (allocated)).
@ Отметим небольшое отличие, на Аде 2005 теперь разрешается нулевое значение в качестве фактического параметра, тогда как это запрещено в Аде 95. Это - фактически изменение во время выполнения, которое обычно считается отвратительным. Но в этом случае это только означает, что любая проверка, которая все еще возбуждает исключение Constraint_Error будет в другом месте - и, в любом случае, это означает что программа была, скорее всего, неправильной.
@ Другое изменение в Аде 2005 состоит в том, что мы также можем использовать анонимные ссылочные типы в качестве параметров (и дискриминантов). Мы также можем использовать анонимные ссылочные типы:
@ Таким образом, мы можем расширить свой пример фермерского двора:
|
@ и можем объявить массив животных:
|
@ (За подтверждениями к Джорджу Орвеллу). Обратите внимание, что компоненты массива имеют анонимный ссылочный тип. У нас могут также быть компоненты записи анонимного типа
|
@ Это не очень хороший пример, так как я уверен, что Ной позаботился бы взять в Ковчег реальных животных а не их адреса.
@ Более полезный пример представлен классическим связанным списком. На Аде 95 (и Аде 83) мы делали бы это так:
|
@ На Аде 2005 мы не обязаны объявлять тип Cell_Ptr чтобы объявить тип Ceil и, таким образом, мы не должны использовать неполное объявление, чтобы избежать зацикливания:
|
@ Здесь мы имеем пример использования типа по имени Ceil в пределах его собственного объявления. В некоторых случаях это интерпретируется как обращение к текущему экземпляру типа (например, в теле задачи), но это правило было изменено чтобы разрешить его использование здесь.
@ Мы можем также использовать анонимный ссылочный тип для единственной переменной:
|
@ Мы тогда можем написать:
|
@ Анонимные ссылочные типы могут также использоваться в объявлении переименования. Это и другие детали, такие как доступность будут обсуждаться в более поздних публикациях.
@ Последнее важное изменение в проблемах ссылочных типов относится к ссылочным типам на подпрограммы. Ссылки к типам подпрограммы были введены в Аду 95 в значительной степени для реализации обратного вызова. Но важные приложения этих типов в других языках (таких как Паскаль, и даже Алгол 60) применяются для математических приложений, таких как интеграция, где функцию, которая будет вычисляться, передают как параметр. На Аде 83 и Аде 95 в этом случае мы должны были всегда использовать настраиваемые средства. Но это было весьма неуклюже и теперь этому есть прямая альтернатива.
@ На Аде 95 мы написали бы:
|
@ Идея состоит в том, что функция Integrate вычисляет значение определённого интеграла функции передаваемой параметром Fn с границами Lo и Hi. Это прекрасно работает на Аде 95 для простого случая когда функция объявлена на библиотечном уровне. Таким образом, чтобы вычислить определённый интеграл квадратного корня по переменной X в диапазоне от 0.0 до 1.0 мы можем написать:
|
@ где функция Sqrt из библиотеки Ada.Numerics.Elementary_Functions.
@ Однако, если функция для интегрирования более сложна, тогда на Аде 95 мы сталкиваемся с трудностями если мы пытаемся использовать ссылочный тип на подпрограмму. Рассмотрим следующий пример, в котором собираемся вычислять интеграл произведения X * Y в квадратной области 0.0 < X, Y > 1.0
|
@ Но это недопустимо на Аде 95 из-за правила для именованных ссылочных типов запрещающего провисание ссылок. Таким образом, мы должны предотвратить возможность сохранения указателя на локальную подпрограмму в глобальной структуре. Это означает, что использование F'Access и G'Access незаконно в вышеупомянутом.
@ Заметим, что, хотя мы могли сделать внешнюю глобальную переменную функции G так, чтобы G'Access был разрешен, однако функция F должена быть вложена в функцию G чтобы получить доступ к параметру X из G. Это типично для функций интегрирования, им нужно передавать информацию глобально - число параметров конечно устанавливается конфигурацией используемой функции Integrate.
@ На Аде 2005 решение состоит в том, чтобы ввести анонимный доступ к типу подпрограммы по аналогии с анонимными ссылками на типы объекта. Таким образом, функция Integrate становится:
|
@ Заметим, что определяя функцию Fn внутри спецификации функции Integrate мы фактически получаем вложение спецификаций. Это может казаться немного замысловатым, но такая же картина получается и на Паскале.
@ Вложенный пример выше теперь правилен, и никаких проблем доступа здесь не возникает. (Читатель возразит, что проблемы доступа с анонимным доступом к типам объекта предотвращаются динамической проверкой; в случае анонимного доступа к типам подпрограммы соответствующие проблемы предотвращаются подразумевая, что уровень доступности фактически бесконечен, RM говорит больший чем тот из любого задачника, который прибывает в ту же самую вещь).
@ Анонимный доступ к ссылочным типам на подпрограммы также полезен во многих других приложениях, таких как итерация, но он будет обсуждаться позже.
@ Заметим, что мы можем также указать префикс чтобы обозначить ссылку на тип подпрограммы как анонимный и как константу с не пустым указателем.
2010-10-24 00:26:52
мужское нижнее белье . .