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

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 или в резуль­тате выполнения оператора перехода, объект становится за­вершенным.

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

Считается, что экземпляр блока (назовем его Л), охва­тывает некоторый другой экземпляр блока (назовем его В), если:

экземпляр блока В прикреплен и динамически охваты­вается экземпляром блока Л, или

экземпляр блока В самостоятелен или завершен и ло­кален по отношению либо к Л, либо к некоторому экземпляру блока, динамически охватываемому экземпляром блока Л, или

имеется самостоятельный объект С, локальный по от­ношению либо к Л, либр к некоторому экземпляру блока, динамически охватываемому экземпляром блока А, такой, что С охватывает В.

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

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