Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Симула.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
393.73 Кб
Скачать

2.2.3. Виртуальные величины

Виртуальные величины служат двоякой цели:

дать возможность обращения на одном префиксаль­ ном уровне некоторого объекта к атрибутам, объявленным на более высоком префиксальном уровне, и

позволить, декларировать атрибут заново на некотором префиксальном уровне так, чтобы эта новая декларация была действительна на более низком префиксальном уровне.

В совокупности виртуальных допускаются следующие спецификации:

label, switch, procedure и (тип) procedure.

Виртуальная величина некоторого объекта может быть или «холостой» (т.е. «без подходящего к ней атрибута»), или отождествляться с некоторым «подходящим» атрибу­том, каковым является атрибут, декларированный на не ме­нее низком префиксальном уровне, чем уровень данной вир­туальной величины, и имеющий идентификатор, совпадаю­щий с идентификатором виртуальной величины. Подходящий атрибут должен быть того же самого рода, что и данная вир­туальная величина. Тип подходящей процедуры должен сов­падать или быть подчиненным типу данной виртуальной про­цедуры и типу любой подходящей процедуры, декларирован­ной на более низких префиксальных уровнях.

Следствием определенного выше механизма сочленения является то, что виртуальная величина некоторого данного объекта может иметь не более одного подходящего атрибута. Если ' подходящие декларации заданы на нескольких пре­фиксальных уровнях данной иерархии классов, то (для неко­торого объекта) действует декларация, заданная на наивыс­шем уровне, меньшем или равном уровню ядра этого объек­та. Действие подходящей декларации распространяется на все префиксальные уровни объекта, не меньшие уровня вир­туальной спецификации.

Пример:

В следующем классе, выражающем понятие «расстанов­ка», алгоритм «оценка» (функция расстановки) является «сменной, частью».

class расстановка (п)'; integer п; virtual: integer procedure оценка;

begin integer procedure оценка (T); value T; text T; begin integer i;

L: if T . more then - begin /: = / + rank (T. getchar); "

go to L; end;

оценка : — / — (/-5-n X n) end оценка ;

text array табл [0:n— 1]; integer procedure номер(Tt стар); name стар;

value T; Boolean стар; text T;

begin integer i;

/: = оценка {Т); стар: = false; L : if табл [i\. length = 0 then

. табл M : — T else if табл [i] = T then стар: = true else

in i: ~i + 1;

if f« « then /: «r 0; go to L end;

J номер : = /

. end номер

end расстановка ; ; ,

расстановка class АЛГОЛ оценка',

begin integer procedure оценка (T); value 71; text 71;

begin integer г; character С; . . ■ L : if Г . more then

begin С: = T. getchar ;

, . if С ¥="_'' then

f: = t + rank (Г . getchar);

go to L;

■ end; < *

оценка : = f —(г-ь nXft); end оценка; ■ _ > ... end АЛГОЛ оценка; . " " , * •

3. ТИПЫ И ПЕРЕМЕННЫЕ

3.1. СИНТАКСИС

■-(декларация типа) : : = (тип) (список типа) (декларация массивов); : = array (список массивов)

(тип) array (список массивов) тип) :: = (обыкновенный тип) | (ссылочный тип) , обыкновенный тип):: = (АЛГОЛ-тип) (character ' ,

ссылочный тип):: = (тип ссылок на объект)!text тип ссылок на объект) :: = ref ((квалификация)) (квалификация) :: = (идентификатор класса) ■■-, .

3.2. СЕМАНТИКА

. Синтаксис языка СИМУЛА-67 для декларации типа отли­ чается от принятого в языке АЛГОЛ-60 тем, что в первом нет понятия own. v - . , т ' ;:

. - «Значение» — это информация, интерпретируемая во вре> мя исполнения программы как представляющая сама себя.

- Примерами значений являются: экземпляр некоторого веще-ственного числа, некоторый объект или отрезок'"текста* .«Ссылка» — это информация, указывающая на (или ссылаю­щаяся на) некоторое значение. Для удобства обозначения

различие между ссылкой и значением, на которое она ссы­лается, определяется из контекста.

= Понятие ссылки интуитивно соответствует известному по­ нятию «имени» или «указателя». Оно также отражает воз­ можности вычислительных машин обращаться по адресу: в ряде простых случаев ссылка могла бы быть реализо­ вана в виде адреса некоторого сохраняемого в памяти зна­ чения. ■

Понятие ссылки не вводится во всей его общности, что объясняется стремлением сохранить эффективность исполне­ ния программы на вычислительной машине. В частности, нет ссылок, указывающих на значения переменных обыкновен­ ного типа. , ■

Переменная, локальная в некотором экземпляре блока,— .это некоторый участок памяти (ячейка), содержащий или значение (если переменная обыкновенного типа), или ссыл­ку (если переменная ссылочного типа). Переменная ссылоч­ного типа имеет то значение, на которое ссылается «содер­жимое» этой переменной. Содержимое переменной может из­меняться соответствующими операторами присваивания (см. разд. 6.1).

4

р

3.2.1. Ссылки на объекты

С объектом связана единственная ссылка на объект, опре­деляющая его однозначно. Д с каждым классом С связан тип ссылок на объект ref (С). О некоторой величине такого типа говорят, что ее квалификация распространяется на класс С или что она квалифицирована классом С. Ее значе­нием может быть или некоторый объект, или специальное значение попе, означающее «нет объекта». Квалификация ограничивает область значений ссылочной величины объек­тами классов, содержащихся в квалифицирующем классе. Такая область значений независимо от квалификации все­гда включает значение попе.

3.2.2. Литеры

f Литерное значение (значение типа character) — это эк-'земпляр «внутренней литеры». В любой конкретной реали­зации языка должно быть установлено взаимно однознач­ное соответствие между некоторым подмножеством мно­жества всех внутренних литер и внешними («печатными») литерами. Алфавиты литер (внутренних и внешних) опреде­ляются в каждой конкретной реализации языка- :.,

. 3.2.2.1. Упорядоченность алфавита

Совокупность внутренних литер упорядочена. Этот поря­док определяется в каждой конкретной реализации языка; тем самым устанавливается взаимно однозначное соответ­ствие между внутренними литерами и некоторым подмноже­ством совокупности целых чисел. Это соответствие выра­жается следующими процедурами-функциями:

integer procedure rank (С); character С;

значение такой функции лежит в пределах [О, N— 1], где N есть количество внутренних литер, и

character procedure char (n); integer n;

значение параметра должно лежать в пределах [О, TV—1], в противном случае во время исполнения программы будет выдано сообщение об ошибке.

В большинстве случаев цифры (0—9) кодируются во вну­треннем представлении последовательными значениями, при­чем возрастание значения цифры соответствует порядку во внутреннем алфавите. В таких условиях выражения

rank (С) —rank ("О") и

char (rank ("0")+ 1)

ч

дают независимое от реализации преобразование цифр в их арифметические значения.

3.2.2.2. Подмножества литер

■ Имеются две стандартные нелокальные процедуры, опре­деляющие два подмножества алфавита литер:

Boolean procedure digit (С); character С;

эта процедура вырабатывает значение true, когда значение С является цифрой, и

Boolean procedure letter (С); character С;

эта процедура доставляет значение true, когда значение С является буквой.

F

3.2.3. Тексты

Текстовое значение (значение типа text) — это упорядо­ченная последовательность (быть может, пустая) внутрен­них литер. Количество литер в такой последовательности на­зывается «длиной» текста. Непустое текстовое значение является или «текстовым объектом», или частью более длин-

ной последовательности литер, являющейся текстовым объектом. г

« Текстовая ссылка ссылается на текстовое значение. Не­которые свойства текстовых ссылок представлены процеду­рами, к которым можно обращаться дистанционными иден­тификаторами. Более подробно понятие «текст» описано в разд. 10.

3.2.4. Начальные значения

Каждая декларированная переменная получает начальное содержимое (значение) в момент входа в блок, в котором эта переменная локальна. Начальное значение определяется типом переменной:

real 0

integer 0

Boolean false

character ■ в зависимости от

конкретной реализации

языка

ссылка на объект попе

text ■ notext (см. разд. 10)

л

w-

3.2.5. Подчинение типов

Тип ссылок на объект называется «подчиненным» дру­гому типу ссылок на объект, если квалификацией первого является подкласс класса, квалифицирующего второй.

Считается, что собственно процедура имеет «универ­сальный тип». Любой тип подчинен универсальному. (См. разд. 2.2.3, 8.2.2 и 8.2.3.)

4. ВЫРАЖЕНИЯ

4.1.1. Синтаксис

(метка):: — (идентификатор) (выражение) ::== (выражение для значения)

(выражение для ссылки) | (указательное выражение)

(выражение для значения) :: = (арифметическое выражение)]

логическое выражение)! хлитерное выражение)

(выражение для ссылки) :: = (объектное выражение)

(текстовое выражение)

4.1.2. Семантика . , "" ;u ■

Синтаксис для метки исключает использование целых без ■ знака в качестве меток.

Выражение для значения — это правило для получения

значения. ' .

Выражение для ссылки — это правило для получения ссылки и значения, на которое она ссылается. . Указательное выражение1) — это правило для получения -ссылки (указателя) на некоторую точку программы. '. Любое выражение для значения или выражение для ссылки имеет связанный с ним тип, который определяется текстом выражения. Тип арифметического выражения являет­ся типьм его значения. Приняты следующие отличия от языка АЛГОЛ-60 (см. также разд. 8.2.3.); . 1) Выражение вида

(множитель) f (первичное) . , .

' всегда имеет тип real. J •

2)* Условное арифметическое выражение имеет тип inte­ger, если обе его альтернативы имеют этот тип, в противном случае оно имеет тип real. В случае необходимости осуще­ствляется преобразование значения выбранной альтернативы.

4.2. ЛИТЕРНЫЕ ВЫРАЖЕНИЯ

4.2.1. Синтаксис

(простое литерное выражение) :: —

^литерная константа)! (переменная) | (указатель функции) | ((литерное выражение))

(литерная константа):: = "(обозначение литеры)" (литерное выражение) :: = (простое литерное выражение) | , ., . if (логическое выражение)

then (простое литерное выражение) else (литерное выражение)

н

т " ^ ™=

4.2.2. Семантика

Литерное выражение имеет тип character. Оно является .правилом для получения литерного значения. ". , - ,

Обозначение литеры — это или внешняя литера, или ка­кое-либо иное представление-внутренней литеры, определен­ное в каждой конкретной реализации языка. . ... '-/г/ -

ЗА ОБЪЕКТНЫЕ ВЫРАЖЕНИЯ

■ ■

4.3.1. Синтаксис

(простое объектное выражение)::— none | (переменная) | ^указатель функции)! (генератор объектов) | (локальный объект)! (квалифицированный объект) 1 ■ ((объектное выражение))

(объектное выражение): : = (простое объектное выражение)! :*. ■ if (логическое выражение) then

■ " (простое объектное выражение)

else (объектное выражение)

(генератор объектов) :: = new (идентификатор класса)' : - , (совокупность фактических

• ■ параметров)

(локальный объект):: = this (идентификатор класса) (квалифицированный объект):: «= (простое объектное

выражение) :- qua (идентификатор класса)

4.3.2. Семантика

i '

Объектное выражение имеет тип вида ref ((квалифика­ция)). Оно является правилом для получения ссылки на объект. Значением такого выражения является или объект, с которым связана полученная ссылка, или попе.

4.3.2.1. Квалификация ■ .

.■ ' Квалификация объектного выражения определяется сле­дующими правилами:

Выражение попе квалифицируется фиктивным клас­ сом, содержащим все декларированные классы.

Переменная или4 указатель функции квалифицируется в соответствии с декларацией (или спецификацией, см. ниже) этой переменной (или массива) или декларацией процеду­ ры-функции.

■ 3) Генератор объектов, локальный объект или квалифи­цированный объект квалифицируются классом, идентифика­тор которого следует за символом new, this или qua соответ­ственно.

4) Условное объектное выражение квалифицируется клас­сом на самом высоком префиксальном уровне, еще охваты­вающим квалификации обеих альтернатив. Если такого клас-■ са не существует, то выражение недопустимо.

Любой формальный параметр типа ссылок на объект квалифицируется в соответствии с его спецификацией неза­ висимо от квалификации соответствующего фактического па­ раметра.

Квалификация указателя функции с идентификатором процедуры, являющимся идентификатором некоторой вир­ туальной величины, зависит от уровня обращения (см. разд. 7). Этой квалификацией является квалификация под­ ходящей декларации (если таковая имеется), находящейся на наивысшем префиксальном уровне, не превышающем уровня обращения. Если такой подходящей декларации нет, то квалификацией указателя функции является квалифика­ ция виртуальной спецификации.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]