
- •6.1.2.2. Присваивание ссылок на объект
- •7. Дистанционное обращение
- •7.1. Дистанционные идентификаторы
- •7.2. Присоединения
- •9.2. Квазипараллельное исполнение
- •Integer procedure pos;
- •Inspect sysout do inspect sys in do
- •11.4.2. Семантика
- •1 12.1. Последовательности псевдослучайных чисел
- •14.2.3.2. Семантика
- •14.2.4. Управляющие процедуры
7.2. Присоединения
Присоединяющий блок сам может быть присоединяющим оператором, каковым в этом случае является наибольший присоединяющий оператор, обнаруживаемый на месте при соединяющего блока.
Механизм присоединения обеспечивает неявное определение вышеупомянутых первых и вторых элементов для некоторых обращений к атрибутам внутри' присоединяющих блоков.
Присоединяющий оператор выполняется следующим образом:
Вычисляется объектное выражение присоединяющего оператора. Пусть X есть полученное значение.
Если в присоединяющем операторе имеются присоединения, то они рассматриваются по очереди одно за другим. Если Л" — объект, принадлежащий к классу, содержащемуся в указанном вслед за символом when, то выполняется (при соединяющий блок 1) этого присоединения, а последующие присоединения (и альтернатива) пропускаются. В противном случае очередное присоединение пропускается.
Если в присоединяющем операторе имеется (присоединяющий блок 2), то он выполняется только при условии, что X не есть попе; если это условие не выполняется, то (присоединяющий блок 2) пропускается.
Оператор в альтернативе выполняется, если X есть попе или если X есть объект, не принадлежащий ни одному из классов, указанных вслед за символами when, и ни одному из подклассов таких классов. В противном случае оператор в альтернативе пропускается.
Оператор, являющийся (присоединяющим блоком 1) или (присоединяющим блоком 2), действует подобно блоку независимо от того, имеет ли он форму блока или нет. Кроме того, он действует так, как если бы он был вложен в некоторый другой фиктивный блок, называемый «присоединенным блоком». Во время выполнения присоединяющего блока объект X называется присоединенным. Присоединяющий блок имеет «квалификацию блока», каковой является предшествующий идентификатор класса для (присоединяющего блока 1) и квалификация предшествующего объектного выражения для (присоединяющего блока 2).
Пусть квалификация блока данного присоединяющего блока есть С, и пусть А — идентификатор атрибута, определенный на префиксальном уровне класса С. Тогда любое не-экранированное вхождение идентификатора А в присоединенный блок получает локальный смысл: оно является идентификацией атрибута, первым элементом которой является присоединенный объект, а вторым — квалификация присоединяющего блока, т. е. С.
Следовательно, присоединяющий блок действует так, как если бы атрибуты присоединенного объекта вплоть до уровня С включительно были его локальными величина-ми. (Конфликты наименований между атрибутами, определенными на различных префиксальных уровнях, разрешаются выбором атрибута на наивысшем префиксальном уровне.)
..Пример: ' ' .
Пусть Гаусс есть класс, декларированный в примере разд. 2.2. Тогда внутри оператора (присоединяющий блок 2) присоединяющего оператора
inspect new Гаусс (5) do begin end
доступна процедура интеграл для численного интегрирования по формуле Гаусса с 5 абсциссами.
ш\
9. ПОРЯДОК ВЫПОЛНЕНИЯ
9.1. БЛОКИ И ДИНАМИЧЕСКИЕ ОБЛАСТИ
Составными частями процесса исполнения, программы являются динамические экземпляры блоков. Все блоки распадаются на три категории в зависимости от возможных взаимоотношений и возможных состояний их динамических эк-земпляров.
1. Блоки с приставкой. .
2. Подблоки, тела процедур и присоединяющие блоки.
3. Тела классов.
Экземпляр блока в каждый данный момент находится в одном из трех состояний исполнения: «прикреплен», «самостоятелен» («откреплен») или.«завершен». Возможные и начальные состояния экземпляров блоков указаны в следующей таблице: П—прикреплен, С—самостоятелен, 3—завершен. Программа на языке АЛГОЛ-60 содержит лишь блоки категорий 2 (за исключением самого внешнего блока программы, который естественно считать блоком категории 1, см. разд. 11).Исполнению любой такой программы соответствует обычная структура Динамически вложенных друг в друга экземпляров блоков.
Экземпляр блока категории 2 находится всегда в прикрепленном состоянии; считается, что он «прикреплен к» наименьшему динамически охватывающему , его экземпляру блока. Например, экземпляр тела процедуры прикреплен к экземпляру, блока, содержащему соответствующее обращение к процедуре.
Управление программой (УП) указывает в каждый дан-ный момент на ту точку программы внутри некоторого экземпляра блока, которая исполняется в этот момент. Для краткости будем говорить, что УП установлено на эту точку программы и находится в некотором экземпляре блока. Если Л есть экземпляр блока, в котором находится УП, то Л и все
экземпляры блоков, динамически охватывающие Л, называются работающими.
Вход в блок вызывает порождение некоторого нового экземпляра блока, после чего УП входит в этот экземпляр блока. Если УП-покидает экземпляр блока категории 1 или 2 через замыкающий его символ end или в результате выпол- нения оператора перехода, то этот экземпляр блока уничтожается.- "
Некоторый объект (т. е. экземпляр блока категории 3) вначале прикреплен к экземпляру блока, содержащему соответствующий генератор объекта. Он может- стать самостоятельным (перейти в открепленное состояние) при выполне-' нии оператора detach (см. разд. 9.2.1). Если УП покидает объект через замыкающий его тело символ end или в результате выполнения оператора перехода, объект становится завершенным.
Об экземпляре блока говорят, что он «локален по отношению к» экземпляру блока, содержащему текст, описывающий первый экземпляр. Например, объект, принадлежащий к некоторому данному классу, локален по отношению к экземпляру блока, содержащему декларацию этого класса.
Считается, что экземпляр блока (назовем его Л), охватывает некоторый другой экземпляр блока (назовем его В), если:
экземпляр блока В прикреплен и динамически охватывается экземпляром блока Л, или
экземпляр блока В самостоятелен или завершен и локален по отношению либо к Л, либо к некоторому экземпляру блока, динамически охватываемому экземпляром блока Л, или
имеется самостоятельный объект С, локальный по отношению либо к Л, либр к некоторому экземпляру блока, динамически охватываемому экземпляром блока А, такой, что С охватывает В.
Всякий раз, когда некоторый экземпляр блока уничтожается, все экземпляры блоков, охватываемые им, также уничтожаются. Структура языка такова, что после уничтожения объекта к этому объекту нельзя обратиться каким бы то ни было объектным выражением. Следовательно, динамическая область существования объекта ограничена динамической областью существования декларации его класса. Однако при реализации языка фактический период, жизни объектов может быть еще-несколько сокращен посредством таких приемов Листки памяти, как «сборка мусора».
Заметим, что массивы и текстовые значения, вообще .говоря, нельзя уничтожать вместе с экземпляром блока, где они декларированы.