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

14.2.1.2. Семантика-

Класс SIMULATION служит для того, чтобы делать до­ ступными средства, предназначенные для моделирования — класс process и связанные с этим процедуры — путем исполь­ зования класса SIMULATION в качестве префикса к блоку или к классу. ■ -

Переменная SQS ссылается на некоторый набор, кото­рый называется «управляющим списком» (УС) и служит для представления «оси системного времени». Члены упра­вляющего списка суть «уведомления о событиях», располо­женные в нем по возрастанию значений атрибута EVTIME. «Уведомление о событии» или, короче, «уведомление» ссылает­ся своим атрибутом PROC на некоторый объект класса pro­cess. Оно представляет «событие», запланированное на си­стемное время EVTIME, которое будет очередной «активной фазой» этого объекта. На данный объект класса процесс '(короче: на данный процесс) в любой данный момент может ссылаться не более одного уведомления.

Уведомление, находящееся в начале управляющего списка, относится к процессу, активному (работающему) в данный момент. На этот объект можно ссылаться посредством про­цедуры current (текущий). Значение переменной EVTIME этого .уведомления интерпретируется как текущий момент си­стемного времени; процедура time доставляет, это значение.

14.2.2. Класс process

14.2.2.1. Определение

link class process;

begin ref (EVENT NOTICE) EVENT;

Boolean TERMINATED;

.* Boolean procedure idle; idle: = EVENT = = none; Boolean procedure terminated;

terminated: = TERMINATED; real procedure evtime;

If idle then ERROR ,.; ■■ else evtime : - EVENT. EVTIME; ref (process) procedure nextev;

nextev: —if idle then none " ■

else if EVENT.sue === none then,none else EVENT - sue. PROC; .

** detach; Л " . ., - * -

inner' .:'"'■ ■ ' ^-'

" TERMINATED : = true; , :^ , . ^'-

passivate; ' ., ;-: " ; .*; ' 1?

ERROR . . "' - . ;

end process; - -■•*•*"■

if ■

ш T i

I W

14.2.2.2. Семантика ,; -

Объект класса, имеющего process своим префиксом, будем называть объектом класса процесс или просто процессом. , Процесс имеет свойства класса link; кроме того, он имеет возможность быть представленным в управляющем списке; далее, некоторые управляющие операторы могут манипули­ровать над процессом, изменяя его «состояние». Процесс мо-. жет быть в одном из-четырех состояний: активном, приоста-, новленном, пассивном или завершенном-.

При своем порождении процесс немедленно становится самостоятельным, ЛУ процесса устанавливается перед пер­ вым оператором его правила действий, задаваемого пользо­ вателем. Процесс остается самостоятельным все время своего существования. ■■

Процедура idle имеет^ значение true, если процесс в дан­ ный' момент не представлен в управляющем списке, такой процесс называется бездействующим (idle). Бездействую­ щий процесс или пассивен, или завершен в зависимости от значения процедуры terminated (т. е. завершен). Бездей­ ствующий процесс пассивен, если его ЛУ находится на неко­ тором префиксальном уровне, определенном пользователем. . Когда ЛУ проходит через заключительный end части тела, определяемой пользователем, оно переходит к «заключитель­ ным операциям» на префиксальном уровне класса process, и значение процедуры terminated становится true — процесс «завершен». (Хотя состояние процесса «завершен» в только что определенном смысле не является строго эквивалентным соответствующему основному понятию, определенному в-. разд. 9, в некоторых вариантах реализации «завершенный» процесс можно трактовать как завершенный в строгом; смысле слова.) ■ " '.-"■.- ■ , ■ . ;•

. Процесс, представленный в данный момент в управляю­щем списке, называется «приостановленным», если он не представлен уведомлением в начале управляющего списка. " В последнем, случае процесс активен. Системное время, на /которое запланирована активная фаза приостановленного процесса, указывается атрибутом EVT1ME в уведомлении, ссылающемся на данный процесс. Это значение времени можно получить при помощи процедуры evtime. Процедура ; nextev доставляет ссылку на процесс (если таковой имеется), .^представленный в управляющем списке следующим по по-'•;рядку уведомлением,

: 14.2.3. Операторы активации

> я

14.2.3.1. Синтаксис . ь

активатор)::» activate (reactivate

активация) :: = (активатор) (объектное выражение) простое указание времени):: = at (арифметическое

выражение)! delay (арифметическое

выражение) (указание времени)::« (простое указание времени)!

(простое указание времени) prior (планирование):: — (пусто) | (указание времени) [

before (объектное выражение) | after (объектное выражение) (оператор активации):: *= (активация) (планирование)

+ i

14.2.3.2. Семантика

.. Применение оператора активации допустимо только по отношению к объектам подкласса класса SIMULATION, или внутри блока с префиксом, префиксальная часть которого является таким объектом.

Действие оператора активации определяется как обраще­ние к управляющей процедуре ACTIVATE, локализованной в классе SIMULATION.

procedure ACTIVATE (REAC, X/CODE,T, Y,PRIOR); value CODE; ref (process) X9Y; Boolean REAC,PRIOR; text CODE; real T\

Список фактических параметров определяется видом опе­ратора активации в соответствии с ниже следующими пра­вилами: -

Фактический параметр, соответствующий параметру REAC, есть true, если активатор есть reactivate, в противном случае — false.

Фактическим параметром, соответствующим параметру X, является объектное выражение, которым заканчивается активация.

Фактическим параметром, соответствующим параметру 7, является арифметическое выражение, которым заканчи­ вается простое указание времени, е,сли указание имеется; в противном случае фактический параметр равен нулю.

Фактический параметр, соответствующий параметру PRIOR, есть true, если указание времени заканчивается сим­ волом prior; в противном случае — false.

Фактическим параметром, соответствующим параметру Г, является объектное выражение, которым заканчивается планирование, если такое объектное выражение имеется; в противном случае фактическим параметром является попе.

Фактический параметр, соответствующий "параметру CODE, определяется видом конструкции планирование:

*

(конструкция планирование) ■ (фактический параметр)

(пусто) 1 'direct'

at (арифметическое выражение) 'at*

delay (арифметическое выражение) 'delay' ■ " ,

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

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

14.2.4. Управляющие процедуры

14.2.4.1. Определение

.procedure hold (Г); real T; inspect FIRSTEV do begin if Г>0 then EVTIME: = ЕУТ1МЕ if sue = / = none then begin if suc.EVTIME<EVTIME then begin out; RANK (false);

resume (current) end end

-■

end hold;

procedure passivate;

begin inspect current do

begin EVENT. out; EVENT: — none end; f if SQS.empty then ERROR

else resume (current) end passivate;

procedure wait (S); ref (head) S;

begin current. into (S); passivate end wait;

procedure cancel (X); ref (process) X; if X = = current then passivate else inspect X do if EVENT = / — none then

begin EVENT. out; EVENT: — none end cancel;

procedure ACTIVATE (REAC , X, CODE, T, Y, PRIOR);

value CODE;

ref (process) X, Y; Boolean REAC, PRIOR; text CODE;

real T;

inspect X do if ~| terminated then begin ref (process) Z; ref (EVENT NOTICE) EV; if REAC then EV:-EVENT else if EVENT = / = none then go to exit; Z : — current; if CODE = 'direct' then direct: begin EVENT:-new EVENT NOTICE (time,*);

EVENT. precede (FIRSTEV) end direct

else if CODE = 'delay' then begin T : = T + time; go to at end delay else if CODE = 'at' then at: begin if T < time then T : = time;

if T = time Л PRIOR then go to DIRECT;

EVENT:-new EVENT NOTICE (T,X);

EVENT.RANK (PRIOR) end at

else if (if F= = none then true else Y. EVENT = = none) then EVENT: — none else

begin EVENT:-new EVENT NOTICE (F. EVENT.

EVTIME,*);

if CODE ='before' then EVENT.precede (F. EVENT)

else EVENT.follow (F. EVENT)

end before or after ;"

if EV = / = none then

begin EV.out; if SQS.empty then ERROR end;

if Z = / = current then resume (current);

exit:, end ACTIVATE;

1. ВВЕДЕНИЕ

1.1. УНИВЕРСАЛЬНЫЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ

Высокоразвитые языки программирования, такие, как ФОРТРАН, АЛГОЛ-60 и КОБОЛ, первоначально считались полезными прежде всего в двух отношениях:

они содержали понятия и операторы, позволявшие точно и формально описывать вычислительные про­ цессы, а также облегчали обмен информацией между программистами;

они предоставляли в распоряжение пользователей ма­ шин инструмент, позволявший решать небольшие и средние задачи без помощи программиста'

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

Эти задачи предъявляют к языку новые требования:

язык должен дать средство для разбиения задачи нз естественные, легко обозримые компоненты, каждая из которых могла бы быть описана отдельной программой; кроме того, язык, должен содержать средства для опи­ сания совместного взаимосвязанного выполнения таких программ-компонент;

язык должен иметь мощные средства обработки спи­ сков и -организации порядка выполнения действий, чтобы осуществить управление совместным исполне­ нием множества программ;

язык должен обеспечивать так называемую «безопас­ ность ссылок» для того, чтобы уменьшить и без того значительные затруднения, связанные с отладкой. Иными словами, язык должен давать возможность по­ строить для него такой транслятор, который обнару­ живал бы и не разрешал незаконное использование данных посредством ссылок при неправильных пред- ■ положениях.

«... 14.2.4.2. Семантика ;

Управляющие процедуры служат для организации квази­параллельной работы процессов в модели. Следует избегать явного употребления основных средств управления (detach, resume) внутри процессов.

Оператор hold (Г), где Т имеет неотрицательное веще­ ственное значение, заканчивает активную фазу текущего процесса и планирует его следующую активную фазу на си­ стемное время time + Т. Таким образом, этот оператор пред­ ставляет неактивный период длительности Г. В течение неак­ тивного периода ЛУ остается внутри оператора hold. Процесс, становится приостановленным. .

Оператор passivate заканчивает'активную фазу текущего процесса и удаляет текущее уведомление из УС. Процесс становится пассивным. Его следующая активная фаза дол­жна быть запланирована вне этого процесса. Таким образо,м, оператор представляет неактивный период неопределенной длительнрсти. ЛУ этого процесса остается внутри оператора passivate.

Процедура wait включает текущий процесс в некоторый указанный набор, а затем вызывает процедуру passivate.

Оператор cancel (X), где X есть ссылка на некоторый про­цесс, удаляет соответствующее уведомление из УС, если оно там присутствует. Если процесс в данный момент активен или приостановлен, то он становится пассивным. В противном случае оператор никаких действий не производит. Оператор cancel (current) эквивалентен оператору passivate.

Процедура -ACTIVATE представляет оператор активации, как описано в разд. 14.2.3. Опишем действие этой процедуры в терминах соответствующего оператора активации. Назна­чение оператора активации состоит в том, чтобы запланиро­вать активную фазу некоторого процесса.

Пусть X является значением объектного выражения в ак- .„тивации. Если активатором является activate, оператор ни­ каких действий не производит (за исключением вычисления входящих в него выражений), если*только X не является пас­ сивным процессом. Если активатором является reactivate, а X приостановлен или активен, то соответствующее уведом-. ление исключается из УС (после предшествующей операции., планирования) и текущая активная фаза заканчивается. В оральном эти два случая (activate и reactivate) не разли­ чаются, .. ^ ■ - - . . ' ■ ■ "'"■■'..

Планирование состоит в порождении уведомления для .процесса X и включении его1 в управляющий список. Тип пла-' нирования определяется конструкцией планирование, *:>; -

Пустое планирование означает «непосредственную» акти­вацию, при ^которой активная фаза процесса X начинается немедленно. Уведомление вставляется ■ в УС на первое ме­сто, перед уведомлением, ссылающимся на активный процесс, и процесс X становится активным. Системное время не ме­няется. Процесс, бывший активным, становится приостано­вленным.

Указание времени служит для указания времени плани­руемого события. Конструкция delay Г, где Т — арифметиче­ское выражение, эквивалентна конструкции at time + Т. Но­вое уведомление вставляется' в управляющий список на место, определяемое указанным планируемым временем. При отсутствии символа prior в указании времени уведомление вставляется непосредственно вслед за последним уведомле­нием с непревосходящими значениями EVTIME. Если же в указании времени имеется символ prior, то уведомление вставляется непосредственно перед первым уведомлением е неменьшим значением EVTIME.

. Пусть Y есть ссылка на активный или приостановленный процесс. Тогда, если планирование имеет вид before F, новое уведомление вставляется непосредственно перед уведомле­нием для процесса У, а если планирование имеет вид after У, то непосредственно вслед за уведомлением для процесса Y. Порожденное уведомление получает то же системное время, что и У. Если У не является активным или приостановленным-процессом, то никакой активной фазы запланировано не бу­дет.

I " %

Пример: Операторы

activate X; activate X before current;

activate,X delay 0 prior ; activate X at time prior;

эквивалентны. Все они вызывают непосредственную актива­цию. Оператор

_ * reactivate current delay T

ч

эквивалентен оператору hold (Г). .

14.2.5. Главная программа

г *

14.2.5.1. Определение

process class MAIN PROGRAM; ■

-: begin L : detach ; go to L end MAIN PROGRAM j

14.2.5.2. Семантика

Желательно, чтобы главная программа (main program) всей модели, т. е. экземпляр блока с префиксом SIMULA­TION, так реагировала на управляющие процедуры, указан­ные в разд. 14.2.4, как если бы она сама была процессом. Это достигается тем, что процесс класса MAIN PROGRAM всегда является компонентой квазипараллельной системы. Указан­ный процесс будет представлять главную программу по от­ношению к управляющим процедурам. Каждый раз, когда он начинает работать, УП (а также ВУ) немедленно войдет в главную программу в результате действия оператора detach (см. разд. 9.2.1). Процедура current будет ссылаться на этот процесс каждый раз, когда главная программа будет активна.

Моделирование начинается в результате порождения объ-

екта MAIN

PROGRAM и планирования активной фазы для

него в системное время, равное нулю. Затем УП переходит к первому заданному пользователем оператору блока с пре­фиксом SIMULATION.

14.2.6. Служебные процедуры

14.2.6.1. Определение .

. procedure accum (a, b, с, d) ; name a, b, с;real af btctd}

begin a: = a + cX (time — b);

: = time; c:~c + d end accum;

■m

14.2.6.2. Семантика

л

Оператор вида accum (Л, Б, С, D) можно использовать для того, чтобы накапливать интеграл по системному вре­мени от переменной С, которая считается ступенчатой функ­цией системного времени. Значение интеграла накапливается в переменной Л. Переменная В содержит то значение систем­ного времени, когда Л и С в последний раз изменяли свое значение. Переменная D задает текущее приращение функ­ции С.

/15. РАЗДЕЛЬНАЯ КОМПИЛЯЦИЯ

Если некоторая конкретная реализация языка допускает раздельную (независимую) компиляцию деклараций процедур и классов, заданных пользователем, то программа должна

иметь средства обращаться к таким декларациям (являю­щимся внешними по отношению к программе).

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

15.1. СИНТАКСИС

л

(внешняя величина):: = (внешний идентификатор)

(идентификатор) = (внешний

идентификатор) (список внешних)*: . = (внешняя величина)!

(список внешних), (внешняя

величина) (внешняя декларация) :: = " ' '

external procedure (список внешних) | external (тип) procedure (список внешних) | . external class (список внешних)

15.2. СЕМАНТИКА

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

Внешняя декларация является представителем всех раз­дельно скомпилированных деклараций процедур или клас­сов, указанных в ее списке внешних.

В каждой копии такой отдельно скомпилированной декла­рации все вхождения исходных идентификаторов процедур и классов заменяются новыми заданными «локальными» иден­тификаторами;

16. ОГРАНИЧЕНИЯ БАЗЫ ЯЗЫКА

База языка СИМУЛА-67 имеет следующие языковые .ограничения:

1) системные процедуры нельзя передавать в качестве пара­ метров;г

.по наименованию могут вызываться лишь параметры со спецификатором (тип);

" I k - —

3) оператор арифметического присваивания должен подчи­няться правилам языка АЛГОЛ-60.

i "■

Ограничение 1 может быть полезно для того, чтобы полу­чить максимальную эффективность при реализации систем­ных процедур. Ограничения 2 и 3 могут упростить расшире­ние существующих реализаций языка АЛГОЛ-60.

- л

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