
- •1.3.3. Классы
- •1.3.4. Возможность применения в специальных областях
- •2.1. Синтаксис
- •2.2. Семантика ,; V-
- •2.2.1. Подклассы
- •2.2.2. Сочленение . -
- •2.2.3. Виртуальные величины
- •4.3.2.2. Генераторы объектов ,
- •4.3.2.3. Локальный объект
- •4.3.2.4. Оперативная квалификация «
- •7. Дистанционное обращение
- •7.1.2. Семантика
- •10.8.2. Семантика
- •11.3.2. Семантика
- •1 12.1. Последовательности псевдослучайных чисел
- •14.2.1.2. Семантика-
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)* Условное арифметическое выражение имеет тип integer, если обе его альтернативы имеют этот тип, в противном случае оно имеет тип 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). Этой квалификацией является квалификация под ходящей декларации (если таковая имеется), находящейся на наивысшем префиксальном уровне, не превышающем уровня обращения. Если такой подходящей декларации нет, то квалификацией указателя функции является квалифика ция виртуальной спецификации.