Н. Джехани - Язык Ада (1988) (1160771), страница 99
Текст из файла (страница 99)
9.10). Ссылки: вход 9.5, генератор 4.8, завершение задачи 9.4, эадачный объект 9.2, задачный тип 9.1, законченная задача 9.4, исключение 1.1, предвыполнение 3.9, 11.1, обработка исключения П,4, оператор 5, параллельное выполнение 9, подкомпонента 3.3, раздел описаний 3.9, тело задачи 9.1, тело пакета 7.1. ° Задача зависит от некоторого родителя, выполнениа которого закончено (следовательно, не от библиотвчного пакета). ° Каждая задача, зависящая от рассмотренного родителя, либо уже завершена, либо также ожидает открытой альтернативы завершения в операторе отбора. Когда оба условия удовлетворены, задача становится завершенной вместе со всеми задачами, зависящими от этого же родителя.
Пример: Пзэе 6ЬОВАь Н ееееее ЯЕВОЦВСЕ; А, В : НЕВООЯСЕ; 6 ; 6(.ОВАШ вЂ” ем. 9.1 9.4. ЗАВИСИМОСТЬ ЗАДАЧ. ЗАВЕРШЕНИЕ ЗАДАЧ Каждая задача зависит по крайней мере от одного родителя. Родитель — зто конструкция, являющаяся либо задачей, либо в данный момент выполняемым оператором блока или подпрограммой, либо библиотечным пакетом (но не описанным в другом программном модуле). Зависимость от родителя является непосредственной зависимостью в следующих двух случаях: а) Задача, указанная эадачным объектом, который является объектом или подкомпонен.
той объекта, созданными при выполнении генератора, зависит от родителя, предвыполняющего соответствующее описание ссылочного типа. б) Задача, указанная другим эадачным объектом, зависит от родителя, выполнение которого создает задачный объект. Более того, если задача зависит от данного родителя, являющегося оператором блока, выполняемым другим родителем, то задача также косвенно зависит и от этого родителя; то. же справедливо, если данный родитель является подпрограммой, вызванной другим родите. лем, а также если данный родитель — задача (прямо или косвенно), зависящая от другого родителя.
Зависимости существуют и для объектов личного типа, полное описание которого задано в терминах задачного типа. Говорят, что задача закончила свое выполнение, когда осуществилось выполнение последовательности операторов, помещенных в ев теле за зарезервированным словом ЬВВ)п. Аналогично говорят, что блок или подпрограмма закончили свое выполнение, когда осуществилось выполнение соответствующей последовательности операторов. В случае оператора блока также говорят, что выполнение его закончилось при достижении операторов выхода, возврата или перехода, передающих управление из блока.
В случае процедуры также говорят, что ее выполнение закончилось при достижении соответствующего оператора возврата. В случае функции также говорят, что ее выполнение закончилось после вычисления результирующего выражения в операторе возврата. Наконец, выполнение задачи, оператора блока или подпрограммы закончено, если при выполнении содержащихся в них соответствующих последовательностей операторов возбуждено исключение и нет соответствующего ему обработчика, а при его наличии — по окончании выполнения соответствующего обработчика.
Если у задачи нет зависимых задач и закончено ее выполнение, имеет место ее заверив. ние. После завершения задачи говорят, что она завершена. Если задача имеет зависимые задачи, то ее завершение имеет место после окончания выполнения задачи и завершения всех зависимых задач.
Из оператора блока или тела подпрограммы, чье выполнение закончено, нельзя выйти до завершения всех зависимых задач. С другой стороны, завершение задачи имеет место тогда и только тогда, когда ее выло. лнение достигло открытой альтернативы завершения в операторе отбора (см. 9.7.1) и удовлет. ворены следующие условия: яоз ьевш — активизация А и В веавее Лзм ЬОСАь 1е ееееее ЯЕЕООЛСЕ; х: аьовяь:= пме йевооясе; — активизация хев ; ЬОСАЬ:= пеш ЯЕ8008СЕ; — аКтИВИЗаЦИЯ Сее С: ЛЕВООйСЕ; Ьеа1п — активизация С О .= Х; — О и Х указывают один и тот же задачный объект ° м(, — ожидание завершения С и ь.ай, но не Хзл) мш; — ожидание завершения А, В и В.ай Примечание.
Правила завершения подразумевают, что все задачи, зависящие (прямо или косвенно) от заданного родителя и еще не завершенные, могут завершиться (коллективно) тогда и только тогда, когда каждая иэ них ожидает открытой альтернативы завершения в операторе отбора и выполнение данного родителя закончено. Те же правила справедливы и для главной программы.
Следовательно, для завершения главной программы необходимо завершение всех зависимых задач, даже если соответствую. щий задачный тип описан в библиотечном пакете. С другой стороны, завершение главной про. граммы не зависит от завершения задач, в свою очередь зависящих от библиотечных пакетов; в языке не определено, требуется ли завершение таких задач. Для ссылочного типщ являющегося производным другого ссылочного типа, соответствующее определение ссылочного типа является определением родительского типа; зависимость в данном случае является зависимостью от родителя, который предвыполняет основные опре. деления родительского ссылочного типа.
Описание переименования вводит новое имя для уже существующего понятия и, следовательно, не порождает дальнейшей зависимости. Ссыпки: альтернатива завершения 9.7.1, библиотечный модуль 10.1, вызов подпрограммы 6.4, генератор 4.8, главная программа 10.1, задачный объект 9.2, исключение 11, обработчик исключения 11.2, объект 3.2, оператор 5, оператор блока 5.6, оператор возврата 5.8, оператор выхода 5.7, оператор перехода 5.9, описание 3.1, описание пвреименования 8.5, отбор с ожиданием 9.7.1, открытая альтернатива 9.7.1, пакет 7, подкомпонента 3.3, последовательность опе. раторов 5.1, программный модуль 6, ссылочный тип 3.8, тело задачи 9.1, тело подпрограммы 6.3, указывать 9.1, функция 6.5. 9.5.
ВХОДЫ, ВЫЗОВЫ ВХОДОВ И ОПЕРАТОРЫ ПРИНЯТИЯ Вызовы входов и операторы принятия являются основными средствами синхронизации задач и передачи значений между задачами. Описание входа подобно описанию подпрограммы и допустимо только в спецификации задачи. Действия, которые следует выполнить после вызова входа, задаются соответствующими операторами принятия. описание входа:: = еп(гу идентификатор [0(искретный диапазон)] [раздел формальных параметровВ оператор вызова входа :: = имя входа [раэдел фактических параметров]; огаратор принятия;:= ассер( простое имя входа [(индекс входа)] [раздел формальных параметров! [бо последовательность операторов епб [простое имя входа]]; индекс входа::= выражение Описание входа, включающее дискретный диапазон (см.
3.6.1), описывает семейство раз. личных входов с одним и тем же формальным разделом (если он есть), а именно по одному входу для каждого значения дискретного диапазона. Термин одиночный вход используется при определении правил, применимых к любому входу, отличному от члена семейства. Задача, указанная объектом задачного типа, имеет вход (входы), который (которые) описан (описаны) в спецификации этого эадачного типа. Глава 9 В теле задачи каждый из ее одиночных входов или семейства входов может быть имено. ван соответствующим простым именем.
Имя входа семейства записывается в форме индексируемой компоненты; за простым именем семейства в круглых скобках следует индекс; тип этого индекса должен быть тем же, что и тип дискретного диапазона в соответствующем описании семеиства входов. Вне тела задачи имя входа записывается в форме именованной ком. поненты, префикс которой обозначает задачный объект, а постфикс является простым именем одного из одиночных входов или семейства входов. Одиночный вход совмещается с подпрограммой, литералом перечисления или другим одиночным входом, если у них одинаковые идентификаторы.
Совмещение для семейства входов не определено. Одиночный вход или вход семейства могут быть переименованы в процедуру, как поясняется в равд. 8.5. Виды параметров, определенные для параметров формального раздела описания входа, такие же, как в описании подпрограммы, и имеют тот же смысл (см. 6.2). Синтаксически опе. ратор вызова входа подобен оператору вызова процедуры; правила сопоставления параметров остаются теми же, что и для вызовов подпрограмм (см. 6.4.1 и 6.4.2). Оператор принятия задает действия, которые выполняются при вызове упомянутого в этом операторе входа (им может быть и вход семейства).
Раздел формальных параметров оператора принятия должен быть согласован с разделом формальных параметров, заданным в описании одиночного входа или семейства входов, упомянутых в операторе принятия (см. равд. 6.3.1 о согласовании). Если в конце оператора принятия используется простое имя, оно должно повторять простое имя, заданное в начале этого оператора. Оператор принятия входа данной задачи допускается только в соответствующем теле задачи, исключая тело программного модуля, вложенного в тело задачи, и оператор принятия этого же одиночного входа илн входа того же семейства.(Из этих правил следует, что задача может выполнять операторы принятия только своих входов.) Тело задачи может содержать несколько операторов принятия одного и того же входа.
При предвыполнении описания входа вначале вычисляется дискретный диапазон (если он есть), затем так же, как в описании подпрограммы, предвыполняется раздел формальных параметров (если он есть]. Выполнение оператора принятия начинается с вычисления индекса входа(в случае входа семеиства). Выполнение оператора вызова входа начинается с вычисления имени входа, затем следуют вычисления, требуемые для фактических параметров, как и при вызове подпрограммы (см. 6.4).
Дальнейшее выполнение оператора принятия и соответствующего оператора вызова входа синхронизовано. Если данный вход вызывается только одной задачей, то предоставляются две воз. можности: ° Если вызывающая задача перешла к оператору вызова входа раньше, чем имеющая этот вход задача достигла оператора принятия, то выполнение вызывающей задачи приостанавливается.
° Если задача достигла оператора принятия раньше любого вызова этого входа, то выпол. нение задачи приостанавливается до получения такого вызова. Если вход был вызван и соответствующий оператор принятия достигнут, то его последо. вательность операторов (если она есть) выполняется вызванной задачей (вызывающая задача остается приостановленной). Это взаимодействие задач называется рандеву.