
- •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. Семантика-
14.2.1.2. Семантика-
Класс SIMULATION служит для того, чтобы делать до ступными средства, предназначенные для моделирования — класс process и связанные с этим процедуры — путем исполь зования класса SIMULATION в качестве префикса к блоку или к классу. ■ -
Переменная SQS ссылается на некоторый набор, который называется «управляющим списком» (УС) и служит для представления «оси системного времени». Члены управляющего списка суть «уведомления о событиях», расположенные в нем по возрастанию значений атрибута EVTIME. «Уведомление о событии» или, короче, «уведомление» ссылается своим атрибутом PROC на некоторый объект класса process. Оно представляет «событие», запланированное на системное время 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) всей модели, т. е. экземпляр блока с префиксом SIMULATION, так реагировала на управляющие процедуры, указанные в разд. 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.
- л