Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 185

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 179 180 181 182 183 184 < 185 > 186 187 188 189 190 191 .. 316 >> Следующая

(5). Любой переход к оператору для его выполнения аналогичен вычисле-ни селектора записи.
(6). Время жизни оператора есть его выполнение после перехода к нему. Время изни записи ире, оно вкл чает выполнение всего контекста, в котором запись описана. Здесь расхо дение полное.
(7). Активность оператора во время его жизни (при исполнении) противопо-ло на пассивности полей записи.
(8). ператоры использу т данные, тогда как записи не использу т операторы. днако при объектно-ориентированном подходе или при функциональном программировании оператор в некоторой степени становятся даннми.
9.3.3. Объединения
пределение объединения мало отличается от записи на уровне конкретного синтаксиса, к примеру, в С/С++ оно задается служебным словом union вместо struct. Однако семантика этих двух конструкторов принципиально различна. При объединении явно указывается, что компоненты в реализационном представлении объединения слива тся, налага тся друг на друга. Соответственно, здесь речи нет о селектировании всех объединеннх компонент как отдельных объектов, можно выделить лишь один из вариантов налагаемых компонент.
Каким способом можно обеспечить эту установку, используя возможности универсального конструктора набора компонент? Объединение строится как статический неупорядоченный набор. з этого следует, что для определения селекторов мо но воспользоваться именами компонент, типами компонент или значениями теговых компонент. Соответственно есть три вида объединений.
• Размеченное — вводятся разные наименования полей, употребление которх в операции селектирования определяет трактовку компонен-
520
9.
та (case <тип> языка Pascal; считается, что множество значений этого типа достаточно для отображения в него объединяемых полей). Пример:
union (A : T1, B : T2 );
• еразмеченное, когда одно и то же поле трактуется в разных смыслах в зависимости от контекста. мя поля (совпадаее для всех вариантов, иначе объединение превраается в размеченное) мо ет употребляться или нет, в зависимости от того, каким способом идентифициру тся или селектиру тся все объединяемые вариант . Это наиболее ненадежный вид объединений, оставляющий контроль лишь за программистом. ример:
union ( T1, T2 );
• Тегированное, когда используется специальное поле, значение которого указвает на то, как тракту тся объединяеме компоненты (case <описатель поля> языка Pascal):
case tag : Tp of
зн1 : A : T1, зн2 : B : T2); end;
егко видеть, что тегированное объединение — это запись, состояая из двух полей:
(<тег>, <размеченное или неразмеченное объединение>). Этот вид объединений вделяется явно по той причине, что он наиболее наде ен и удобен в работе9.
Есть еще один вид объединений, часто предлагаемый в языках программирования. Это так называемые варианне записи — комбинация двух конструкторов: записей и объединения. Тег, если он есть, последнее поле перед объединением, которое размеается после постоянной (безвариантной) части записи (причин такого ограничения — чисто реализационные).
Таким образом, функции Sv и Sa дают возможность по-разному трактовать одну и ту же память в зависимости от того, как идентифицируется компонента.
9 По причине изоморфности логической дизъюнкции в конструктивной логике.
9.3.
521
С прагматической точки зрения здесь речь идет о том, что программист принимает обязательство никогда не обращаться к объединяемым компонентам одновременно в нескольких смыслах (т. е. с разными типами). Языки программирования поддерива т эту точку зрения, определяя указанные вые виды объединений. В этом суть обсу даемой структур данных.
Ничто не запрещает (хотя и не поощряет!) реализацию, когда в памяти действительно представлены все компоненты объединения. Но в этой реализации придется каждое присваивание значения одной компоненте сопрово-дать подходяим изменением значений других компонент, что не соответствует прагматике и логическому смслу объединения.
В соответствии со смыслом объединения, правильно располагать объединяемые компоненты по одному и тому же адресу и трактовать их так, как того требует ситуация. Однако это решение не со всем сочетается. Так, обычное для него автоматическое приведение значений совсем не то, что чае всего ну но. аглядный пример: перевод декартовых координат в полярне, когда оба представления — пара веественных чисел, а потому автоматическое приведение тривиально, но лиено всякого смсла.
При объединении неприводимых значений обычно память выделяется по максимуму либо используется сслочная структура (пример — тип variant).
Как оформля тся селекторы компонент в языках программирования? зависимости от того, какие виды объединений предусматрива тся, возмо -н следуие реения:
• имя поля — применяется для размеченного объединения;
• тип поля — неразмеченное объединение (обычно выглядит как явное приведение);
• тег — обычно сопровождается оператором выбора вариантов действий.
В контексте обсуждения объединений уместно рассмотреть некоторые средства распределения памяти между программными единицами: общие блоки, см. определение 8.3.1. Например, на языке FORTRAN при описании процедур мо но указать, что некоторые ее данные явля тся обими, т. е. принадлежащими к определенному COMMON-блоку (см. пример 8.3.2). При этом структура общих данных может быть различна. Язык согласует структуры на уровне размещения данных в COMMON-блоке так, что при использовании их разными процедурами происходит обраение к одним и тем е ("обим") адресам. Отметим, что дисциплинированное использование COMMON-блоков,
Предыдущая << 1 .. 179 180 181 182 183 184 < 185 > 186 187 188 189 190 191 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100