Текст
                    ОГЛАВЛЕНИЕ
Предисловие к русскому изданию...............5
Предисловие..................................8
1.	ВВЕДЕНИЕ ....................................9
4.1.	Универсальные языки программирования	.	.	9
1.2.	Специализированные языки программирования	10
1.3.	Основные характеристики языка	СИМУЛА-67	11
1.3.1.	Алгоритмические возможности...........11
1.3.2.	Разложимость .........................11
1.3.3.	Классы ...............................13
1.3.4.	Возможность применения в специальных об-
, пастях ......................................14
1.3.5.	Возможность обработки списков .... 16
1.3.6.	Обработка строк.......................17
1.3.7.	Ввод — вывод .........................17
1.4.	Стандартизация .........................17
1.5.	Определение языка.......................17
2.	ДЕКЛАРАЦИИ КЛАССА.........................18
2.1.	Синтаксис .	  18
2.2.	Семантика...............................  18
2.2.1.	Подклассы........................ . 2Э
2.2.2.	Сочленение ...........................22
2.2.3.	Виртуальные величины..................24
3.	ТИПЫ И ПЕРЕМЕННЫЕ ........................  26
3.1.	Синтаксис ................................26
3.2.	Семантика ..............................26
3.2.1.	Ссылки на объекты.....................27
3.2.2.	Литеры..............................  27
З.2.2.1.	Упорядоченность алфавита.........28
3.2.2.2.	Подмножества литер . . . ..........28
3.2.3.	Тексты . . . . •......................28
3.2.4.	Начальные значения.............  ...	29
3.2.5.	Подчинение типов......................29
4.	ВЫРАЖЕНИЯ...................................29
4.1.1.	Синтаксис.............................29
4.1.2.	Семантика ........................... 30
4.2.	Литерные выражения . .....................30
4.2.1.	Синтаксис.............................30
4.2.2.	Семантика.............................30
4.3.	Объектные выражения.......................31
4.3.1.	Синтаксис...........................  31
4,3,2-	Семантика^ .........................  31
4.3.2.1.	Квалификация .. . . . . .	. 31
4.3.	р.2. Генераторы объектов...........  32
4.3.2.3.	Локальный объект.................32
4.3.2.4.	Оперативйая квалификация ..'... 33
4.4.	Текстовые выражения ...	 33
4.4.1.	Синтаксис...........................33
4.4.2.	Семантика...........................34
5.	ОТНОШЕНИЯ ............................... 34
5.1.	Отношения литер........................ 34
5.1.1.	Синтаксис ....	....... 34
5.1.2.	Семантика...........................34
5.2.	Отношения	текстовых	значений............35
5.2.1.	Синтаксис...........................35
5.2.2.	Семантика	 35
5.3.	Отношения объектов ....... 35
5.3.1.	Синтаксис...........................35
5.3.2.	Семантика.........................  35
5.4.	Отношения	ссылок........................36
5.4.1.	Синтаксис	. ........................36
5.4.2.	Семантика	.	 36
6.	ОПЕРАТОРЫ ................................36
6.1.	Операторы	присваивания..................37
6.1.1.	Синтаксис	. .	 37
6.1.2.	Семантика.......................... 37
6.1.2.1.	Присваивание арифметических значений . 38
6.1.2.2.	Присваивание ссылок на объект ... 39
6.2.	Операторы цикла.........................40
6.2.1.	Синтаксис ...	..............40
6.2.2.	Семантика.........................  40
6.3.	Блоки с префиксами	  40
6.3.1.	Синтаксис ...	...	40
6.3.2.	Семантика	....	40
7.	ДИСТАНЦИОННОЕ ОБРАЩЕНИЕ	.....	41
7.1.	Дистанционные идентификаторы............42
7.1.1.	Синтаксис.......................... 42
7.1.2.	Семантика........................ .	43
7.2.	Присоединения...........................44
7.2.1.	Синтаксис................... ... 44
7.2.2.	Семантика...........................45
8.	ПРОЦЕДУРЫ И ПЕРЕДАЧА ПАРАМЕТРОВ 46
8.1.	Синта^сще . .	......... -46
8.2.	СемаЙтйка	  46
8.2.1.	Ёызов по значению.................. 48
8.2.2.	Вызов по ссылке .- . ...............48
8.2.3.	Вы'йоё по наименованию..............49
9.	ПОРЯДОК ВЫПОЛНЕНИЯ....................... 50
9.1.	Блоки и динамические области............50
9.2.	Квазипараллельное	исполнение............52
9,2.1.	Оператор detach	(открепить)	63
9.2.2.	Оператор resume (возобновить]) ..... 54
9.2.3.	Выход через «end» объекта................55
9.2.4.	Операторы перехода.......................55
10.	ТИП «ТЕКСТ» . .............................55
10.1	Атрибуты текста . ........................55
10.2.	Процедуры-атрибуты length и main .... 56
10.3.	Доступ к литерам ....	.........56
10.4.	Порождение текстов ......................58
10.5.	Присваивание текстовых ссылок............58
10.6.	Присваивание текстовых значений..........59
10.7.	Подтексты ...............................59
10.8.	Числовые текстовые значения..............60
10.8.1.	Синтаксис ...........................60
”10.8.2. Семантика ............................61
10.9.	Процедуры дередактирования...............61
10.10.	Процедуры редактирования................62
11.	ВВОД —ВЫВОД ...............................64
11.1.	Класс FILE...............................66
11.1.1.	^Определение.........................66
»11.1.2. Семантика ............................66
11.2.	Класс infile.................... ;	. . 67
11.2.	Г. Определение.........................67
11.2.2.	Семантика ...........................68
11.3.	Класс outfile............................70
11.3.1.	Определение .........................70
11.3.2.	Семантика ...........................71
11.4.	Класс directfile.......................  72
11.4.1.	Определение .................	. . . 72
11.4.2.	Семантика ...........................72
11.5.	Класс printfile..........................73
11.5.1.	Определение . .	 73
11.5.2.	Семантика ..........................,74
12.	СЛУЧАЙНЫЙ ВЫБОР ...........................75
12.1.	Последовательности псевдослучайных чисел 75
12.2,	Процедуры случайного выбора............. 76
13.	СЛУЖЕБНЫЕ ПРОЦЕДУРЫ........................78
14.	СИСТЕМНЫЕ КЛАССЫ...............................79
14.1.	Класс SIMSET..................................79
14.1.1.	Общая структура...........................79
14.1.1.1.	Определение	 .........................79
14.1.1.2.	Семантика	..........................80
14.1.2.	Класс linkage.............................80
14.1.2.1.	Определение............................80
14.1.2.2.	Семантика	..........................80
14.1.3.	Класс link .	;.........................81
14.1.3.1.	Определение ...........................81
14.1.3.2.	Семантика	..........................82
14.1.4.	Класс head .............................  82
14.1.4.1.	Определение............................82
14Д.4-2. Семантика , ........................	. 83
14.2.	Класс SIMULATION...........................83
14.2.1.	Общая структура........................84
14'.2.1.1. Определение .......................84
14.2.1.2.	Семантика ..........................85
14.2.2.	Класс process..........................85
14.2.2.1.	Определение ........................85
14.2.2.2.	Семантика ..........................86
14.2.3.	Операторы активации....................87
14.2.3.1.	Синтаксис	 87.
14.2.3.2.	Семантика ..........................87
14.2.4.	Управляющие процедуры..................88
14.2.4.1.	Определения ........................88
14.2.4.2.	Семантика ..........................90
14.2.5.	Главная программа.............. . . 91
14.2.5.1.	Определение........................91-
14.2.5.2.	Семантика ..........................92
, 14.2.6. Служебные процедуры....................92
14.2.6.1.	Определение ......................  92
14.2.6.2.	Семантика ..........................92
15.	РАЗДЕЛЬНАЯ КОМПИЛЯЦИЯ........................92
15.1.	Синтаксис..................................93
15.2.	Семантика ...............................  93
16.	ОГРАНИЧЕНИЯ БАЗЫ ЯЗЫКА.......................93
Литература...................'...............~. 95
ПРЕДИСЛОВИЕ К РУССКОМУ ИЗДАНИЮ
Широкому использованию электронных вычислительных машин в различных областях науки и техники в значительной мере содействовали алгоритмические языки, обеспечивавшие автоматизацию программирования и удобный обмен информацией. В то же время множество специфических приложений стимулировало появление большого количества независимых специализированных языков, что в свою очередь возрождало трудности в обмене информацией, характерные для времен так называемого «ручного программирования».
Проблема создания единого унифицированного языка программирования фактически не решена до настоящего времени. Это связано прежде всего с противоречием между естественным стремлением к единству и общности и специфическими потребностями каждой конкретной области применения. Предлагаемая книга является интересной попыткой разрешить указанное противоречие в рамках одного языка.
Книга содержит формальное определение универсального языка СИМУЛА-67, разработанного в 1968 г. в Норвежском вычислительном центре У.-И. Далом, Б. Мюрхаугом и К- Ню-гордом. В настоящее время этот язык внедряется многими ведущими фирмами по производству вычислительных машин в Европе и США.
В языке СИМУЛА-67 все родственные объекты объединяются в классы, описание которых и составляет программу. В процессе выполнения последней объекты возникают динамически, а их структуры данных и правила действий соответствуют описаниям тех классов, к которым эти объекты принадлежат. Классы могут использоваться в качестве префиксов (приставок) к другим классам, которые становятся в" этом случае подклассами первых. Объект, соответствующий классу с префиксом, имеет сложную структуру: он включает в себя данные, описанные как в классе, так и в его Префиксе, а его поведение определяется объединенным
правилом действий, состоящим из правил действий класса и префикса. В результате указанного сочленения все понятия и операции, определенные в префиксе, становятся доступными для объектов класса, имеющего этот префикс.
Пользователь может по своему усмотрению создавать структуры классов, соответствующие содёржанию решаемых задач. Каждый из классов может иметь последовательность префиксов произвольной глубины.
С другой стороны, классы, используемые в качестве префиксов, могут разрабатываться заранее и входить в язык как его составные части. В этом случае пользователь получает возможность обращаться к понятиям и методам, описанным в таком «системном» классе, употребив его в качестве префикса к своей программе или к ее части.
Содержание таких системных классов может быть самым разнообразным: класс ПЛАНИМЕТРИЯ, класс БУХГАЛТЕРСКИЙ УЧЕТ, класс МЕДИЦИНСКАЯ ДИАГНОСТИКА и т. п. Системный класс может описывать те или иные свойства» методы и понятия в терминах, принятых в соответствующей области, и представлять, таким образом, некоторый специализированный язык. В результате программа, имеющая этот класс в качестве своего префикса, может быть также написана на специализированном языке.
Таким образом, введение классов позволяет не только описывать различные иерархически построенные структуры данных и правила действий, но и легко осуществлять специализацию языка.
Читателю, возможно, известен язык СИМУЛА-1, предназначенный для описания сложных систем с дискретными событиями. Не будет преувеличением сказать, что до последнего времени этот язык был наилучшим инструментом моделирования на ЭВМ, завоевавшим популярность в нашей стране и за рубежом.
Отрадно отметить, что все средства моделирования, соответствующие языку СИМУЛА-1 (параллельное функционирование объектов, управление последовательностью действий, получение случайных чисел, обработка статистики и т. п.), являются частью языка СИМУЛА-67 и ими можно воспользоваться через системный класс МОДЕЛИРОВАНИЕ.
Введение в язык классов заставило разработать новые средства для ссылок на объекты. Предложенные авторами решения этой проблемы привлекают своим удобством, наглядностью и эффективностью с точки зрения их реализации.
Интересной особенностью языка является использование Так называемых виртуальных величин, которые сцецифицц-
руются в декларации класса, а точный смысл их может быть определен (или даже переопределен) в его подклассах.
Заслугой авторов является также разработка стандартных средств ввода — вывода и текстовых операций для обработки строк.
Наконец, следует подчеркнуть, что язык СИМУЛА-67 представляет собой расширение языка АЛ ГОЛ-60 и содержит последний в качестве своего подмножества. Таким образом, Имеется возможность разработки транслятора, который позволял бы выполнять программы, написанные как на языке СИМУЛА-67, так и на языке АЛГОЛ-60. Учитывая широкое распространение языка АЛГОЛ-60 в нашей стране, можно надеяться, что внедрение в практику языка СИМУЛА-67 будет означать не только дальнейшее развитие в области автоматизации программирования, но и необходимую преемственность.
Предлагаемая вниманию читателя книга не претендует на роль учебного пособия и несколько страдает недоработанно-стью в методическом отношении. Для понимания ее требуется знание общих основ программирования, а также языков АЛ-ГОЛ-60 и СИМУЛА-1. Тем не менее фактическое содержание книги представляет большой интерес для широкого круга специалистов, занятых применением вычислительных машин и моделированием сложных систем.
В заключение следует отметить большую помощь, оказанную при переводе этой книги И. Е. Миши.евым.
А. С. Кузьмин, Е. И. Яковлев
ПРЕДИСЛОВИЕ
СИМУЛА-67 является универсальным языком программирования, разработанным авторами в Норвежском вычислительном центре.
-'’Важным свойством языка СИМУЛА-67 является то, что он может быть легко ориентирован на специальные области задач и поэтому может служить базой для разработки специализированных языков.
Настоящее сообщение является официальным документом по общей базе языка СИМУЛА-67. Эта база включает сред-ств*а языка, обязательные для каждого транслятора с языка СИМУЛА-67. Во введении освещены некоторые особенности языка. Последующие разделы содержат точное определение языка. Руководства по использованию языка и учебники будут опубликованы позже.
Во время работы над языком СИМУЛА-67 мы пользовались идеями и предложениями многих наших коллег. Прежде всего мы хотели отметить С. Хоара, идеи которого об аппарате ссылок были использованы и развиты в нашей работе, С. Кубоша, который был для нас важным источником полезных и критических замечаний, и г-жу И. Сигуэнца, помощь которой при напечатании этого сообщения была совершенно неоценимой.
Мы хотели бы также выразить нашу признательность Д. Белснесу, Р. Блундену, Дж. Бакстону, Дж. В. Гарвику, ,Е. Яртэю, Е. Хоупу, Р. М. Хьелдосу, Д. Кнуту, Дж. Ласки, А. Лунде, Дж. Ныои, Т. Нотту, К. С. Скугу, К. Стречи, И. Вирту, а также всем пользователям языка СИМУЛА-1, давшим советы на основе своего опыта. Наконец, авторы хотели бы выразить благодарность участникам конференции по языку СИМУЛА-67, состоявшейся в Осло в июне 1967 года и принесшей авторам большую пользу.
Осло, май 1968
У ле-Йохан Дал	Бьерн Мюрхауг Кристен Нюгорд
1.	ВВЕДЕНИЕ
1.1.	УНИВЕРСАЛЬНЫЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ
Высокоразвитые языки программирования, такие, как ФОРТРАН, АЛГОЛ-60 и КОБОЛ, первоначально считались полезными прежде всего в двух отношениях:
—	они содержали понятия и операторы, позволявшие точно и формально описывать вычислительные процессы, а также облегчали обмен информацией между программистами;
—	они предоставляли в распоряжение пользователей машин инструмент, позволявший решать небольшие и средние задачи без помощи программиста.
В этом отношении высокоразвитые языки программирования с успехом выполнили свою роль. Теперь, однако, эти языки привлекают внимание новой группы специалистов, перед которыми стоит задача организации и осуществления очень сложных программ, таких, как, например, большие программы моделирования.
Эти задачи предъявляют к языку новые требования:
—	язык должен дать средство для разбиения задачи на естественные, легко обозримые компоненты, каждая из которых могла бы быть описана отдельной программой; кроме того, язык должен содержать средства для описания совместного взаимосвязанного выполнения таких программ-компонент;
—	язык должен иметь мощные средства обработки списков и организации порядка выполнения действий, чтобы осуществить управление совместным исполнением множества программ;
— язык должен обеспечивать так называемую «безопасность ссылок» для того, чтобы уменьшить и без того значительные затруднения, связанные с отладкой. Иными словами, язык должен давать возможность построить для него такой транслятор, который обнаруживал бы и не разрешал незаконное использование данных посредством ссылок при неправильных предположениях.
Хотя организационная сторона системного программирования становится все более и более важной, его вычислительные возможности должны быть по меньшей мере столь же мощными, что и у современных высокоразвитых языков программирования.
Очевидно также, что такой общий язык должен быть рас-читан иа весьма широкую область применения. Нынешнее неудержимое размножение языков не может быть долго терпимо с экономической точки зрения.
1.2.	СПЕЦИАЛИЗИРОВАННЫЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ
До сих пор вычислительная машина была мощным, но в то же бремя пугающим многих инструментом. Это положение должно со временем измениться, и вычислительная машина станет делом обычным. Все больше людей будут учиться «разговаривать на ты» с машинами и получать от них* информацию, которая им необходима в сфере их профессиональной деятельности, и, таким образом, расширять свои производственные и творческие возможности. А необходимым условием для этого является уменьшение требований к человеку, т. е. облегчение и упрощение способов' его общения с машиной.
В настоящее время общение с машиной для неспециалиста облегчается в значительной мере за счет так называемых «пакетов применения», охватывающих различные области знания и применяемых методов. Но эти «пакеты», вообще говоря, не являются достаточно гибкими, области их применения трудно расширять и для их использования также нередко требуется помощь специалиста по программированию.
Будущее, по-видимому, принадлежит «специализированным языкам», которые будут, по всей вероятности, предельно специализированными. Такие языки могут содержать основные понятия и методы, связанные с данной областью. Они позволят пользователю формулировать конкретные задачи на основе его предшествующего опыта и знаний. В то же время необходимо, чтобы такие языки были способны к расширению в том смысле, что все новое в данной области исследования могло бы легко включаться в язык самими пользователями.
Потребность в специализированных языках лишь кажущимся образом противоречит желанию иметь универсальный язык программирования вместо множества различных языков, существующих в настоящее время. Задача состоит в том, чтобы разработать такой универсальный язык программирования, который служил бы базой для построения спецй'Ялй-
зированных .языков. Такой язык должен легко приспосабливаться для применения в специальных областях путем создания на его базе составных понятий и конструкций, которые служили бы «строительными блоками» при программировании в специальной области.
Если сделать универсальный язык высоко стандартизированным и реализовать его на машинах многих различных типов, то и специализированные языки, построенные на его основе, окажутся легко переносимыми с одной машины на другую. Кроме того, это будет сдерживать нынешний быстрый рост затрат на разработку систем математического обеспечения.
1.3.	ОСНОВНЫЕ ХАРАКТЕРИСТИКИ ЯЗЫКА СИМУЛА-67
1.3.1.	Алгоритмические возможности
Язык СИМУЛА-67 содержит в качестве своего подмножества почти все средства универсального алгоритмического языка АЛГОЛ-60. Основанием для выбора языка АЛГОЛ-60 в качестве исходной базы было то, что основная структура этого языка допускает его расширение. Было бы непрактичным и неудобным положить в основу языка СИМУЛА-67 какой-нибудь новый алгоритмический язык, в то время как АЛ-ГОЛ-60 уже имеет широкий круг пользователей, главным образом В'Европе и Советском Союзе.
1.3.2.	Разложимость
При работе с задачами и системами, состоящими из большого количества элементов, возможность разложения на составные части приобретает первостепенное значение. Внимание человека должно сосредотачиваться; чтобы мыслить точно и связно, необходимо по возможности сокращать количество одновременно охватываемых понятий. Разлагая большую задачу на части, можно получить задачи-компоненты с таким небольшим количеством деталей, чтоб каждую из этих задач можно было обдумывать и анализировать в целом. Разложение на составные части абсолютно необходимо, если в анализе и программировании задачи принимает участие несколько человек.
Фундаментальным механизмом для разложения на части в языке АЛГОЛ-60 является понятие блока. Пока дело касается лишь локальных величин, блок совершенно не зависит от остальной части программы. Принцип локализации
позволяет любое обращение к локальной величине понимать правильно независимо от окружения данного блока.
Понятие блока соответствует интуитивному понятию «подзадачи» или «подалгоритма», которое является удобной единицей разложения при решении задач обычных типов. Блок является формальным описанием («образцом») некоторой структуры данных и связанных с ней алгоритмов и действий. Когда блок исполняется, порождается динамический «экземпляр» этого блока. В машине экземпляр блока может осуществляться в виде области памяти, содержащей необходимую динамическую информацию о блоке и место для хранения значений переменных, локализованных в этом блоке.
Экземпляр блока можно представлять как буквальную копию его формального описания, в которой локальные переменные обозначают участки памяти, выделенной данному экземпляру блока. Все внутренние блоки некоторого данного экземпляра блока тоже являются «образцами», в которых вхождения нелокальных идентификаторов, однако, обозначают величины, локализованные в текстуально объемлющих экземплярах блоков. Такое «связывание» нелокальных идентификаторов внутреннего блока остается действительным для любого последующего динамического экземпляра этого внутреннего блока.
Понятие экземпляра блока подразумевает возможность порождать несколько различных экземпляров одного и того же блока, которые могут сосуществовать и взаимодействовать, как, например, экземпляры рекурсивной процедуры. Это в свою очередь позволяет понимать блок как «класс объектов», каждый из которых является динамическим экземпляром этого блока и поэтому следует одному и тому же образцу.
Расширенное понятие блока вводится в язык СИМУЛА-67 через декларации «класса» и соответствующие механизмы взаимодействия, такие, как «ссылки на объекты» (указатели), «дистанционные обращения», «квазипараллельное исполнение» и «сочленение» блоков.
В то время как исполнение программы на АЛГОЛЕ-60 сопровождается образованием последовательности динамически вложенных друг в друга экземпляров блоков, при исполнении программы на языке СИМУЛА-67 экземпляры блоков могут образовывать произвольные списочные структуры. Механизмы взаимодействия, введенные в язык, служат для расширения силы понятия блока как средства разложения и разбиения на классы,
1.3.3.	Классы
Центральным новым понятием языка СИМУЛА-67 является «объект». Объект — это экземпляр блока, имеющий свои собственные локальные данные и действия1), описанные в «декларации класса». Декларация класса определяет образец программы (т. е. ее данные и действия), поэтому об объектах, следующих этому образцу, говорят, что «они принадлежат к одному и тому же классу».
Если в декларации класса не указано никаких действий вовсе, то такая декларация определяет просто класс структур данных.
Пример:
class заказ (номер)-, integer номер-, • begin integer количество, время прибытия-, real время, обработки-, end;
Новый объект, принадлежащий классу заказ, порождается выражением вида
new заказ (103);
Посредством таких выражений можно создать столько заказов, сколько требуется.
Потребность манипулировать с объектами и связывать их друг с другом заставляет ввести в язык средства обработки списков (как описано ниже).
Класс можно использовать в качестве «префикса» к декларации другого класса; тем самым свойства, заданные префиксом, будут внесены в объекты, задаваемые новой декларацией класса.
Примеры:
заказ class групповой заказ ;
begin integer размер партии; real время установки-, end ; заказ class отдельный заказ;
begin real время установки, время окончания, вес; end ; отдельный заказ class плита ;
begin real длина, ширина; end;
Объекты, принадлежащие к подклассам групповой заказ, отдельный заказ и плита, имеют данные, определенные для объекта заказ, плюс дополнительные данные, объявленные
') Декларация класса определяет правило действий всех- объектов, принадлежащих этому классу. Каждый объект может «совершать» индивидуальные действия в области, определенной декларацией класса. Поэтому объект можно рассматривать как самостоятельную программу, присущую этому объекту. — Прим, перев.
в различных объявлениях классов с префиксами. Например, объекты, принадлежащие к классу плита, будут состоять из следующих элементов информации: номер, количество, время прибытия, время обработки, время установки, время окончания, вес, длина, ширина.
Если в' декларации класса описаны какие-либо действия, то все объекты, принадлежащие этому классу, могут исполнять действия по заданному таким образом образцу. Все действия, принадлежащие одному объекту, могут быть исполнены последовательно друг за другом (как для процедуры.), но имеется и другая возможность, когда действия, принадлежащие одному объекту, исполняются как последовательность отдельных подпоследовательностей, называемых «активными фазами». Между двумя последовательными активными фазами одного объекта может иметь место любое количество активных фаз других объектов.
Общая база языка СИМУЛА-67 содержит элементарные операторы, необходимые для того, чтобы организовать исполнение всей программы в виде последовательности активных фаз объектов. Однако в случае некоторых специальных применений пользователь должен иметь в своем распоряжении удобные средства для специальной (т. е. соответствующей конкретной задаче) организации последовательности выполнения программы.
1.3.4.	Возможность применения в специальных областях
Язык СИМУЛА-67 может быть модифицирован для применения в специальных областях путем определения подходящего класса, содержащего необходимые для данной области понятия. Такой класс используется затем в качестве префикса к программе, составленной для данной области. Не специалист в программировании может ограничиться каким-либо специальным языком, построенным на базе языка СИМУЛА-67; он будет пользоваться в таком случае лишь знакомыми ему агрегированными понятиями, употребляя их в качестве составляющих «строительных блоков» своей программы. Ему нет надобности знать полный язык СИМУЛА-67. В то же время опытный программист’ имеет в своем распоряжении общий язык, и он может расширять «специальный язык», включая в него новые, определяемые им самим понятия.
Например, при моделировании систем с дискретными событиями обычно употребляется понятие «моделируемое время
.системы» («системное время»). Язык СИМУЛА-67 превращается в язртк моделирования, поскольку в нем предусмотрен класс SIMULATION (т. е. МОДЕЛИРОВАНИЕ)1). В декларации этого класса:
class-SIMULATION; begin..............................  end;
определены «ось времени», двунаправленные списки, которые могут служить в качестве очередей и реестров, а также класс процесс, придающий своим объектам способность организовывать свои действия в виде активных фаз, упорядоченных в соответствии с «системным временем».
Пользователь, желающий написать программу моделирования, начинает ее словами
SIMULATION begin..........'...
Если же он хочет сам создать специализированный язык моделирования для использования его в своей области, например для анализа работы механического цеха, то он может написать:
SIMULATION class МЕХАНИЧЕСКИЙ ЦЕХ; begin...............................end;
Между begin и end он определяет необходимые ему строительные блоки; например;
process class кран;
begin....................end;
process class машина;
begin procedure сбор данных',.......
end;
И т. д.
Для описанного таким образом класса транслятором составляется программа, после чего каждый раз, когда возникает необходимость воспользоваться СИМУЛОЙ-67 для моделирования механического цеха, можно написать
МЕХАНИЧЕСКИЙ ЦЕХ begin......................
и включить таким путем в программу понятия МОДЕЛИРОВАНИЕ и МЕХАНИЧЕСКИЙ ЦЕХ.
Рассмотренные средства специализации языка требуют, чтобы транслятор имел механизм для включения в
*) Класс SIMULATION является так называемым системным классом, он должен быть реализован вместе с транслятором.
общую программу отдельно скомпилированных классов (см. разд. 15).
1.3.5.	Возможность обработки списков
Когда имеется много объектов, принадлежащих различным классам и сосуществующих как части одной программы, необходимо иметь возможность присваивать имена отдельным объектам, а также связывать объекты друг с другом (например, в бинарные деревья или в списочные структуры других типов).
Поэтому в язык вводятся величины новых типов — «ссылки». Ссылки «квалифицируются», благодаря чему каждая данная ссылка может указывать (ссылаться) только на те объекты,'--которые принадлежат к классу, упомянутому в квалификации (или к подклассам квалифицирующего класса).
Пример:
* ref (заказ) следующий, предыдущий;
Операция, в результате которой ссылка становится именем некоторого объекта (т. е. обозначает этот объект), записывается при помощи символа:—(читается — обозначает).
Пример:
следующий : — new заказ (101); предыдущий : — следующий ; или
следующий : — new плита (50);
(что также допустимо, так как плита есть подкласс класса заказ).
На данные, принадлежащие другим объектам, можно ссылаться и ими пользоваться посредством так называемого «дистанционного обращения», обозначаемого специальной точкой «.»
Пример:
if следующий. номера предыдущий. номер then ...;
Здесь сравнивается номер заказа по имени следующий с номером заказа по имени предыдущий.
Таким образом специальная точка дает возможность обращаться к отдельным элементам «чужой» (т. е. находящейся не в том объекте, который действует) информации.
«Групповое обращение» достигается посредством «присоединяющих операторов».
Пример:
inspect следующий when плита do begin ..... end;
В операторе между begin и end можно непосредственно обращатьсягко всем элементам информации, содержащимся в объекте следующий, принадлежащем к классу плита.
В языке СИМУЛА-67 в качестве его части предусматривается системный класс SIMSET, который содержит понятия, связанные с циклическими двунаправленными списками.
1.3.6.	Обработка строк
Язык СИМУЛА-67 содержит новый основной -тип величин — «литера». Представление литер зависит от конкретной реализации.
Чтобы обеспечить необходимую гибкость при обработке строк, вводится составной тип, называемый «text». Это понятие «текст» тесно связано со средствами ввода — вывода.
1.3.7.	Ввод — вывод
Серьезным недостатком АЛГОЛА-60 является отсутствие стандартных приемов ввода — вывода и методов для манипулирования строками.
Поскольку универсальный язык программирования должен иметь в этих областях большую гибкость, в языке СИМУЛА-67 приемы ввода — вывода определены и составляют часть языка.
1.4.	СТАНДАРТИЗАЦИЯ
Для языка универсального программирования крайне важно, чтобы он был однозначно определен и в то же время допускал возможность расширения (под строгим контролем) в будущем. Такой контроль будет осуществляться Группой Стандарта языка СИМУЛА, состоящей из представителей фирм и организаций, ответственных за трансляторы языка СИМУЛА-67. В уставе Группы указаны твердые правила относительно стандартизации и расширения языка в будущем.
Определение языка СИМУЛА, которое должно соблюдаться при любой реализации языка СИМУЛА-67, составляет «Определение Общей Базы языка СИМУЛА-67».
1.5.	ОПРЕДЕЛЕНИЕ ЯЗЫКА
Определение языка, данное в последующих разделах, должно быть дополнено формальным определением языка АЛ-ГОЛ-60 [1]. Синтаксические определения, содержащиеся в
настоящем сообщении, необходимо понимать следующим о -разом:	'
1)	Синтаксические понятия, упомянутые, но не определенные в этом сообщении, относятся к синтаксическим определениям, данным в работе [1].
2)	Определения в этом сообщении синтаксических понятий, имеющихся и в работе [1], отменяют данные в ней соответствующие определения.
3)	Обозначение вида
(АЛГОЛ — некоторое синтаксическое понятие) представляет правую часть синтаксического определения, данного в работе [1J для соответствующего синтаксического понятия.
2.	ДЕКЛАРАЦИИ КЛАССА1)
2.1.	СИНТАКСИС
/декларация):: = (АЛГОЛ-декларация) |
(декларация класса) | (пусто) (идентификатор класса):: = (идентификатор) (префикс):: = (пусто) | (идентификатор класса) (совокупность виртуальных):: = (пусто) (virtual:
(совокупность спецификаций)
(тело класса) :: = (оператор) | (расщепленное тело) (начальные действия):: = (пусто) |
(начальные действия); (оператор) (расщепленное тело):: = (начало блока) (начальные действия);
inner; (конец составного) (декларация класса) :: = (префикс) (ядро)
(ядро) :: = class (идентификатор класса)
(совокупность формальных параметров) (список значений) (совокупность спецификаций) (совокупность виртуальных) (тело класса)
2.2.	СЕМАНТИКА
Декларация класса служит для определения класса, связанного с идентификатором класса. Класс состоит из «объектов», каждый из которых является динамическим представи
1 В данном переводе в отличие от перевода «Сообщения о языке АЛГОЛ» слово «declaration» переводится словом «декларация», а не словом «описание». — Прим, перев. .
телем. (динамическим экземпляром, или короче — экземпляром) тела класса.
Объект порождается в результате вычисления «генератора объекта», аналогичного обращению к процедуре (см. разд. 4.3.2.2.).
Тело класса всегда действует как блок. Если оно имеет форму оператора, который не является непомеченным блоком, тело класса отождествляется с блоком (т. е. действует так, как будто бы на его месте стоит блок) вида
begin ; S end
где S есть буквальная копия данного тела. Расщепленное тело действует как блок, в котором символ inner представляет пустой оператор (см. также следующий раздел).
Для каждого данного объекта формальные параметры, величины, специфицированные в совокупности виртуальных, и величины, декларированные локальными в теле класса, называются «атрибутами» объекта. Декларация или спецификация атрибута называется «определением» этого атрибута.
Для каждого формального параметра требуется спецификация в совокупности спецификаций. Параметры считаются переменными, локальными в теле класса. Они получают первоначальные значения в соответствии с правилами передачи параметров (см. разд. 8.2). Вызов по наименованию пара» метров декларации класса не допускается.
Разрешаются следующие спецификации:
(тип), array и (тип) array.
Атрибуты, определенные в совокупности виртуальных, называются «виртуальными величинами». Они не должны встречаться в списке формальных параметров.
Виртуальные величины имеют некоторые свойства, сближающие их с формальными параметрами, вызываемыми по наименованию. Однако для каждого данного объекта окружением соответствующих «фактических параметров» *) является сам этот объект, а не окружение соответствующего генератора объектов (см. разд. 2.2.3).
Конфликты наименований между формальными параметрами и прочими атрибутами, определенными в декларации класса, не допускаются.
’) Взятые в кавычки слова «фактические параметры» относятся к тем величинам, которые по отношению к виртуальным играют роль, аналогичную роли фактических параметров по отношению к формальным (см, разд. 2.2.3). — Прим, перед..
В выражениях для граничных пар в декларации атрибута-массива допускается употребление формальных параметров декларации класса, атрибутом которого является рассматриваемый атрибут-массив.
Пример:
Следующая декларация класса описывает интегрирование по Гауссу с п абсциссами как составное понятие:
class Гаусс (n); integer п;
begin array W, X [1 :п];
real procedure интеграл (F, a, b) real procedure F:
»	real a, b ;
begin real сумма; integer i;
for i: = 1 step 1 until n do
сумма: = сумма + F (a + 0.5 X(6' — a) X
(X[z] + l))X lF[z];
интеграл : = 0.5 X (b — a) X сумма
• end интеграл;
comment вычисление значений элементов массивов W и X как функций от п;
end Гаусс;
Оптимальные веса W и, абсциссы X могут быть вычислены как функции от п. Поскольку алгоритм вычисления W и X является частью тела класса, вычисление и присваивание этих значений может выполняться в момент порождения объекта. Могут сосуществовать несколько объектов класса Гаусс с различными значениями п. Каждый такой объект имеет локальную процедуру интеграл для вычисления интеграла по соответствующей формуле с п абсциссами (см. также примеры в разд. 6.1.2.2 и 7.1.2).
2.	2.1. Подклассы
Декларация класса с префиксом С и идентификатором класса D определяет некоторый подкласс D класса С. Объект, принадлежащий к этому подклассу, состоит из «префиксной части», которая сама по себе является объектом класса С, и из «ядра», описываемого ядром декларации класса. Эти две части «сочленяются» в один составной объект. Класс С сам может иметь префикс.
Пусть Ch С2, ..., Сп суть классы, причем С[ не имеет префикса, a Ck имеет префикс Ск^ (k = 2,3,... ,п). Тогда Сь С%,.,., Cfe-i называются последовательностью префиксов для
Ck (k = 2,3, ..., n). Индекс k у (k = 1, 2, ;.., n) называется «префиксальным уровнем» класса Ch. Говорят, что класс Ci объемлет класс С, (или что класс С, содержится в классе С^), если i-С/, и класс С,- называется подклассом класса С}, если z > / (z, j — 1,2, ..., п). Считается, что префиксальный уровень класса D «выше» префиксального уровня класса С, если D является подклассом класса С.
Ниже на схеме графически представлены иерархия классов и структура объектов, принадлежащих к каждому из них.
class А ..
A class В ...;
В class С ...;
В class D ..
A class Е ..
Взаимоотношения	Структуры
классов	объектов
Заглавные буквы обозначают классы. Малые буквы представляют атрибуты ядра объекта, принадлежащего классу, обозначенному соответствующей заглавной буквой. При реализации языка структуры объектов, показанные на схеме, могли бы соответствовать размещению в памяти значений атрибутов, являющихся простыми переменными.
При употреблении префиксов необходимо соблюдать следующие ограничения:
1)	ни один класс не должен встречаться в своей собственной последовательности префиксов;
2)	класс может быть употреблен в качестве префикса лишь на том блочном уровне, где он декларирован. Идентификатор системного класса, употребленный в качестве префикса, считается относящимся к некоей фиктивной декларации этого системного класса, якобы имеющейся в начале наименьшего объемлющего блока. При реализации языка может быть наложено ограничение на количество различных блочных уровней, на которых можно употреблять такие префиксы (см. разд. 11, 14 и 15).
2.	2.2. Сочленение
Пусть Сп — класс, имеющий последовательность префиксов Сь С2,..., Cn-i, и пусть X — объект, принадлежащий классу Сп. Тогда механизм сочленения приводит по существу к следующему:
1)	Совокупность атрибутов объекта X является объединением совокупностей атрибутов, определенных в Сь С2,... ..., Сп. Относительно атрибута, декларированного в классе Ck (1 -^/г-^n), говорят, что он определен йа префиксальном уровне k.
2)	Xя и^еет «правило действий», состоящее из операторов, взятых в некотором определенном порядке (см. ниже) из тел упомянутых классов. Считается, что оператор, содержащийся в теле класса Сь, принадлежит префиксальному уровню k.
3)	Из оператора префиксального уровня k можно обращаться ко всем атрибутам объекта X, определенным на префиксальном уровне k. или ниже, за исключением атрибутов, сделавшихся недоступными из-за противоречащих определений на более высоких уровнях (k).
.4) Из оператора префиксального уровня k объекта X невозможно непосредственно обращаться к атрибутам этого объекта, определенным на префиксальных уровнях выше k, кроме как через виртуальные величины (см. разд. 2.2.3).
5) В расщепленном теле класса уровня k символ inner представляет те операторы правила действий объекта X, которые принадлежат уровням выше, чем k, или пустой оператор, если k = п. Если ни один из классов Съ ..., Сп_! не имеет расщепленного тела, операторы правила действий объекта X упорядочены по возрастанию префиксальных уровней.
Формально составной объект может быть описан некоторой «сочлененной» декларацией класса. Считается, что процесс сочленения осуществляется до выполнения программы. Для того чтобы дать точное определение этого процесса, необходимо следующее определение.
Некоторое вхождение некоторого идентификатора в некоторый данный блок называется «неэкранированным вхождением в этот блок», если оно не является идентификатором атрибута, входящим в дистанционный идентификатор (см. разд. 7.1), и не входит в меньший блок, в котором ему придан локальный смысл. Здесь слово «блок» означает также: «декларация класса без ее префикса и без идентификатора класса» или «декларация процедуры без ее идентификатора». ^Отметим, что неэкранированное вхождение идентификатора
в некоторый блок вполне может иметь локальный в этом блоке смысл.)
Процесс сочленения деклараций классов выполняется в порядке возрастания блочного уровня.
Декларации классов некоторой данной иерархии классов сочленяются в порядке возрастания префиксальных уровней. Декларация класса с непустым префиксом заменяется сочлененной декларацией класса, для получения которой исходная декларация сперва модифицируется в соответствии со следующими двумя правилами:
1)	Если префикс отсылает к сочлененной декларации класса, в которой уже выполнены замены идентификаторов, то такие же замены выполняются для всех неэкранированных вхождений идентификаторов в ядро.
2)	Если затем идентификаторы атрибутов, определенные в ядре, имеют неэкранированные вхождения в префикс-класс, то для того, чтобы избежать конфликтов наименований,- все неэкранированные вхождения таких идентификаторов в ядро систематически заменяются. Однако идентификаторы,, соответствующие виртуальным величинам, определенным в пре-фикс-классе, изменению не подлежат..
Сочлененная декларация класса может быть теперь определена в терминах данной декларации (модифицированной, как только что было описано) и сочлененной декларации префикс-класса.
Г.' Список формальных параметров сочлененной декларации состоит из списка формальных параметров префикс-класса, за которым следует список формальных параметров ядра.
' 2. Список значений, совокупность спецификаций и совокупность виртуальных сочлененной декларации являются объединениями (в неформальном, но очевидном смысле) соответственно списков значений, совокупностей спецификаций и совокупностей виртуальных префикс-класса и ядра. Если получающаяся таким образом совокупность виртуальных содержит несколько вхождений одного и того же идентификатора, то совокупность виртуальных данного класса считается недопустимой.
3.	Тело класса сочлененной декларации получается из тела ядра (в предположении, что тело префикс-класса является расщепленным) следующим образом. Символ begin начала блока заменяется копией начала блока тела префикс-класса; вслед за началом блока ядра вставляется копия начальных действий тела префикс-класса; символ end, замыкающий ядро, заменяется копией конца составного, которым
оканчивается расщепленное тело префикс-класса. Если же тело префикс-класса не является расщепленным, то оно интерпретируется так, как если бы перед замыкающим его символом end были вставлены символы ; inner
Если в получившемся таким образом теле класса оказались две декларации для одной виртуальной величины, то та из них, которая возникла при копировании из тела префикс-класса, удаляется (ср. разд. 2.2.3). Декларацией метки является ее вхождение в блок в качестве метки некоторого оператора.
Примеры;
class $ очка (х, у); real х, у;
begin ref (точка) procedure плюс (Р); ref (точка) Р; плюс: — new точка (х + Р .х, у + Р.у);
end точка;
Объект класса точка является представлением некоторой точки декартовой плоскости. Он имеет атрибуты х, у и плюс, причем плюс представляет операцию сложения векторов.
точка class поляр;
begin real г, v;'
ref (поляр) procedure плюс (Р); ref (точка) Р; плюс : — new поляр (х + Р. х, у + Р.у);
г : = sqrt (xf 2 + z/ф 2);
v : = arctg (x, у) end поляр;
Объект класса поляр — это объект точка с дополнительными атрибутами г и о и с заново определенной операцией плюс. Значения переменных г и v вычисляются и присваиваются этим переменным во время порождения объекта, (arctg — это нелокальная процедура).
2.2.3. Виртуальные величины
Виртуальные величины служат двоякой цели:
1) дать возможность обращения на одном префиксальном уровне некоторого объекта к атрибутам, объявленным на более высоком префиксальном уровне, и
2) позволить, декларировать атрибут заново на некотором префиксальном уровне так, чтобы эта новая декларация была действительна на более низком префиксальном уровне.
В совокупности виртуальных допускаются следующие спецификации:
label, switch, procedure и (тип) procedure.
Виртуальная величина некоторого объекта может быть или «холостой» (т. е. «без подходящего к ней атрибута»), или отождествляться с некоторым «подходящим» атрибутом, каковым является атрибут, декларированный на не менее низком префиксальном уровне, чем уровень данной виртуальной величины, и имеющий идентификатор, совпадающий с идентификатором виртуальной величины. Подходящий атрибут должен быть того же самого рода, что и данная виртуальная величина. Тип подходящей процедуры должен совпадать или быть подчиненным типу данной виртуальной процедуры и типу любой подходящей процедуры, декларированной на более низких префиксальных уровнях.
Следствием определенного выше механизма сочленения является то, что виртуальная величина некоторого данного объекта может иметь не более одного подходящего атрибута. Если подходящие декларации заданы на нескольких префиксальных уровнях данной иерархии классов, то (для некоторого объекта) действует декларация, заданная на наивысшем уровне, меньшем или равном уровню ядра этого объекта. Действие подходящей декларации распространяется на все префиксальные уровни объекта, не меньшие уровня виртуальной спецификации.
Пример:
В следующем классе, выражающем понятие «расстановка», алгоритм «оценка» (функция расстановки) является «сменной частью».
class расстановка (n)’; integer и;
virtual: integer procedure оценка;
begin integer procedure оценка (T); value T; text T; begin integer i;
L: if T . more then
- begin i: == I + rank (T. getchar);
go to L;
end;
оценка : = i — X n)
end оценка;
text array табл [0:n — 1];
integer procedure номер(Т, стар)-, name стар-, value T; Boolean стар-, text T;
begin integer i;
I: = оценка (T); стар: = false;
L : if табл [i]. length = 0 then табл [i]: — T else
if табл [i] = T then стар: = true else
begin i: = i + 1;
if i = n then I: = 0; go to L end;
J номер : = I end номер end расстановка; расстановка class АЛГОЛ оценка;
begin integer procedure оценка (Г); value T; text T; begin integer i; character C;
L : if T . more then begin C: = T. getchar ;
if C then
i: = i + rank (T . getchar);
go to L;
end;
оценка : = i — nXn);
end оценка-	i
end АЛГОЛ оценка-,
Й»
. 3. ТИПЫ И ПЕРЕМЕННЫЕ
3.1.	СИНТАКСИС
-(декларация типа) :: = (тип)(список типа)
(декларация массивов):: = array (список массивов) |
(тип) array (список массивов)
(тип) :: = (обыкновенный тип) | (ссылочный тип) (обыкновенный тип):: = (АЛГОЛ-тип) | character (ссылочный тип):: = (тип ссылок на объект)!text (тип ссылок на объект) :: = ref ((квалификация)) (квалификация):: = (идентификатор класса)
3.2.	СЕМАНТИКА
Синтаксис языка СИМУЛА-67 для декларации типа отличается от принятого в языке АЛГОЛ-60 тем, что в первом нет понятия own.
«Значение» — это информация, интерпретируемая во время исполнения программы как представляющая сама себя. Примерами значений являются: экземпляр некоторого вещественного числа, некоторый объект или отрезок текста. «Ссылка» — это информация, указывающая на (или ссылающаяся на) некоторое значение. Для удобства обозначения
различие между ссылкой и значением, на которое она ссылается, определяется из контекста.
Понятие ссылки интуитивно соответствует известному понятию «имени» или «указателя». Оно также отражает возможности вычислительных машин обращаться по адресу: в ряде простых случаев ссылка могла бы быть реализована в виде адреса некоторого сохраняемого в памяти значения.
Понятие ссылки не вводится во всей его общности, что объясняется стремлением сохранить эффективность исполнения программы на вычислительной машине. В частности, нет ссылок, указывающих на значения переменных обыкновенного типа.
Переменная, локальная в некотором экземпляре блока,— это некоторый участок памяти (ячейка), содержащий или значение (если переменная обыкновенного типа), или ссылку (если переменная ссылочного типа). Переменная ссылочного типа имеет то значение, на которое ссылается «содержимое» этой переменной. Содержимое переменной может изменяться соответствующими операторами прйсваивания (см. разд. 6.1).
3.2.1.	Ссылки на объекты
С объектом связана единственная ссылка на объект, определяющая его однозначно. А с каждым классом С связан тип ссылок на объект ref (С). О некоторой величине такого типа говорят, что ее квалификация распространяется на класс С или что она квалифицирована классом С. Ее значением может быть или некоторый объект, или специальное значение попе, означающее «нет объекта». Квалификация ограничивает область значений ссылочной величины объектами классов, содержащихся в квалифицирующем классе. Такая область значений независимо от квалификации всегда включает значение попе.
3.2.2.	Литеры
Литерное значение (значение типа character) — это экземпляр «внутренней литеры». В любой конкретной реализации языка должно быть установлено взаимно однозначное соответствие между некоторым подмножеством множества всех внутренних литер и внешними («печатными») литерами. Алфавиты литер (внутренних и внешних) определяются в каждой конкретной реализации языка-
З.2.2.1.	Упорядоченность алфавита
Совокупность внутренних литер упорядочена. Этот порядок определяется в каждой конкретной реализации языка; тем самым устанавливается взаимно однозначное соответствие между внутренними литерами и некоторым подмножеством совокупности целых, чисел. Это соответствие выражается следующими процедурами-функциями:
integer procedure rank (С); character С;
значение такой функции лежит в пределах [О, N — 1], где W есть количество внутренних литер, и
character procedure char (и); integer п;
значение параметра должно лежать в пределах [О, N — 1], в противном случае во время исполнения программы будет выдано сообщение об ошибке.
В большинстве случаев цифры (0—9) кодируются во внутреннем представлении последовательными значениями, причем возрастание значения цифры соответствует порядку во внутреннем алфавите. В таких условиях выражения
rank (С) — rank (”0”) и
char (rank (”0”)+ 1)
дают независимое от реализации преобразование цифр в их арифметические значения.
3.2.2.2.	Подмножества литер
Имеются две стандартные нелокальные процедуры, определяющие два подмножества алфавита литер:
Boolean procedure digit (С); character С;
эта процедура вырабатывает значение true, когда значение С является цифрой, и
Boolean procedure letter (С); character С;
эта процедура доставляет значение true, когда значение С является буквой.
3.2.3.	Тексты
Текстовое значение (значение типа text) — это упорядоченная последовательность (быть может, пустая) внутренних литер. Количество литер в такой последовательности называется «длиной» текста. Непустое текстовое значение является или «текстовым объектом», или частью более длин*
ной последовательности литер, являющейся текстовым объектом. г
Текстовая ссылка ссылается на текстовое значение. Некоторые свойства текстовых ссылок представлены процедурами, к которым можно обращаться дистанционными идентификаторами. Более подробно понятие «текст» описано в разд. 10.
3.2.4. Начальные значения
Каждая декларированная переменная получает начальное
содержимое (значение) в эта переменная локальна, типом переменной:	момент входа в блок, в котором Начальное значение определяется
real integer Boolean character	0 0 false в зависимости от конкретной реализации языка
ссылка на объект text	попе notext (см. разд. 10)
3.2.5. Подчинение типов
Тип ссылок на объект называется «подчиненным» другому типу ссылок на объект, если квалификацией первого является подкласс класса, квалифицирующего второй.
Считается, что собственно процедура имеет «универсальный тип». Любой тип подчинен универсальному. (См. разд. 2.2.3, 8.2.2 и 8.2.3.)
4. ВЫРАЖЕНИЯ
4.1.1.	Синтаксис
/метка):: — (идентификатор)
(выражение) :: = (выражение для значения) |
(выражение для ссылки) |
(указательное выражение)
(выражение для значения) :: = (арифметическое выражение) |
(логическое выражение) | (литерное выражение)
(выражение для ссылки):: = (объектное выражение) | (текстовое выражение)
4.1.2.	Семантика
Синтаксис для метки исключает использование целых без знака в качестве меток.
Выражение для значения — это правило для получения значения.
Выражение для ссылки — это правило для получения ссылки и значения, на которое она ссылается.
Указательное выражение1) — это правило для получения ссылки (указателя) на некоторую точку программы.
Любое выражение для значения или выражение для ссылки имеет связанный с ним тип, который определяется текстом выражения. Тип арифметического выражения является типом его значения. Приняты следующие отличия от языка АЛГОЛ-60 (см. также разд. 8.2.3.): .
1)	Выражение вида
(множитель) f (первичное) всегда имеет тип real.
2)» Условное арифметическое выражение имеет тип integer, если обе его альтернативы имеют этот тип, в противном случае оно имеет тип real. В случае необходимости осуществляется преобразование значения выбранной альтернативы.
4.2. ЛИТЕРНЫЕ ВЫРАЖЕНИЯ
4.2.1. Синтаксис
(простое литерное выражение)::=
(литерная константа) | (переменная)|
(указатель функции) |
((литерное выражение))
(литерная константа):: = ’’(обозначение литеры)”
(литерное выражение) :: = (простое литерное выражение) | .
if (логическое выражение) then (простое литерное выражение) else (литерное выражение)
4.2.2. Семантика
Литерное выражение имеет тип character. Оно является правилом для получения литерного значения.
Обозначение литеры — это или внешняя литера, или какое-либо иное представление-внутренней литеры, определенное в каждой конкретной реализации языка.
’) В данном переводе вместо ранее применявшегося термина «именующее выражение» употреблен термин «указательное выражение». — Прцщ, перрв.
3.4.	ОБЪЕКТНЫЕ ВЫРАЖЕНИЯ
4.3.1.	Синтаксис
(простое объектное выражение):: = попе | (переменная) | (указатель функции)! (генератор объектов) | (локальный объект)! (квалифицированный объект)!
((объектное выражение))
(объектное выражение):: = (простое объектное выражение)! if (логическое выражение) then (простое объектное выражение) else (объектное выражение)
(генератор объектов):: = new (идентификатор класса)
(совокупность фактических
параметров)
/локальный объект):: = this (идентификатор класса) (квалифицированный объект):: — (простое объектное выражение) qua (идентификатор класса)
4.3.2.	Семантика
Объектное выражение имеет тип вида ref ((квалификация)). Оно является правилом для получения ссылки на объект. Значением такого выражения является или объект, с которым связана полученная ссылка, или попе.
4.3.2.1.	Квалификация
' Квалификация объектного выражения определяется следующими правилами:
1)	Выражение попе квалифицируется фиктивным классом, содержащим все декларированные классы.
2)	Переменная или4 указатель функции квалифицируется в соответствии с декларацией (или спецификацией, см. ниже) этой переменной (или массива) или декларацией процедуры-функции.
3)	Генератор объектов, локальный объект или квалифицированный объект квалифицируются классом, идентификатор которого следует за символом new, this или qua соответственно.
4)	Условное объектное выражение квалифицируется классом на самом высоком префиксальном уровне, еще охватывающим квалификации обеих альтернатив. Если такого класса не существует, то выражение недопустимо.
5)	Любой формальный параметр типа ссылок на объект квалифицируется в соответствии с его спецификацией независимо от квалификации соответствующего фактического параметра.
6)	Квалификация указателя функции с идентификатором процедуры, являющимся идентификатором некоторой виртуальной величины, зависит от уровня обращения (см. разд. 7). Этой квалификацией является квалификация подходящей декларации (если таковая имеется), находящейся на наивысшем префиксальном уровне, не превышающем уровня обращения. Если такой подходящей декларации нет, тс квалификацией указателя функции является квалификация виртуальной спецификации.
4.3.2.2.	Генераторы объектов
Генератор объектов вызывает порождение и исполнение некоторого объекта, принадлежащего указанному в генераторе классу. Этот объект является новым представителем (экземпляром) соответствующего (сочлененного) тела класса. Вычисление генератора объектов состоит в следующем;
1)	порождается объект и вычисляются фактические параметры генератора объектов. Передаются параметры-значения и (или) параметры-ссылки (о способах передачи параметров см. разд. 8);	»
2)	управление входит в объект через его начальный символ begin, в силу чего объект оказывается работающим в «прикрепленном состоянии» (см. разд. 9). Вычисление генератора объектов заканчивается в следующих случаях:
а)	когда выполняется основная процедура detach «по поручению» порожденного объекта (см. разд. 9.1);
б)	при выходе из порожденного объекта через его .замыкающий символ end.
Значением генератора объектов является сам объект, порожденный в результате вычисления генератора. После вычисления генератора объект или «самостоятелен» (случай «а»), или «завершен» (случай «б»),
4.3.2.3.	Локальный объект
Локальный объект вида this С является допустимым выражением, если оно находится
1)	в теле класса С или в теле подкласса класса С, или
2)	в присоединяющем блоке с классом С или с подклассом этого класса в качестве квалификации блока (см., разд. 7.2).
Значение выражения (локальный объект) в некотором данном контексте — это объект, который является (или который присоединен) наименьшим статически охватывающим экземпляром блока, где локальный объект является допустимым выражением. Если такого блока нет, то данное выражение (локальный объект) незаконно (в этом контексте). Для экземпляра процедуры или тела класса термин «статически охватывающий» означает «содержащий ее (его) декларацию».
4.3.2.4.	Оперативная квалификация
Пусть X представляет какое-либо простое выражение для ссылки, и пусть С и D суть идентификаторы класса, причем D является квалификацией выражения X. Тогда квалифицированный объект X qua С является допустимым объектным выражением при условии, что класс С содержит класс D или является подклассом класса D. В противном случае, т. е. если С и D не принадлежат к одной последовательности префиксов, квалифицированный объект X qua С недопустим. Если значением выражения X является попе или объект класса, не содержащегося в классе С, то при вычислении X qua С выдается Сообщение об ошибке *); во всех других случаях значением X qua С является значение выражения X.
4.4.	ТЕКСТОВЫЕ ВЫРАЖЕНИЯ
4.4.1.	Синтаксис
(простое текстовое выражение) = notext | (переменная) | (указатель функции)! (текстовое выражение) (текстовое выражение) :: = (простое текстовое выражение) | if (логическое выражение) then (простое текстовое выражение) else (текстовое выражение)
(простое текстовое значение).:: = (простое текстовое выражение) | (строка) (текстовое выражение) = (простое текстовое значение)! if
(логическое выражение) then (простое текстовое значение) else (текстовое значение)
') При выдаче сообщения об ошибке исполнение программы прекращается. — Прим, перев.
4.4.2.	Семантика
Составляющими строк являются внешние литеры и (или) другие представления внутренних литер, определенные в конкретной реализации языка.
Строка является текстовым значением, а не текстовой ссылкой. Не являясь текстовым выражением, она может выступать в качестве источника (т. е. правой части) оператора присваивания текстового значения (см. разд. 10.6), в качестве операнда отношения текстовых значений (см. разд. 5.2) и в качестве фактического параметра, вызываемого по значению (см. разд. 8.2.1).
В Некоторой конкретной реализации обе кавычки для строк могут представляться одной и той же внешней литерой. В данном сообщении оба эти символа представляются апострофом (’).	.
notext означает ссылку на пустой текст. Дальнейшие сведения о текстах см. в разд. 10.-
5. ОТНОШЕНИЯ
(отношение)
АЛГОЛ-отношение) | отношение литер) | (отношение текстовых значений) | (отношение объектов) | (отношение ссылок)
5.1.	ОТНОШЕНИЯ ЛИТЕР
5.1,1.	Синтаксис
(отношение литер):: = (простое литерное выражение)
(знак операции отношения) (простое литерное выражение)
5.1.2.	Семантика
Литерные значения можно проверять на равенство и неравенство и оценивать в соответствии с упорядоченностью алфавита (определенной в каждой конкретной реализации). Отношение
х rel у,
где х и у имеют литерные значения, a rel есть какой-нибудь знак операции отношения, имеет то же самое логическое
значение, что и отношение г rank (х) rel rank (у).
5.2.	ОТНОШЕНИЯ ТЕКСТОВЫХ ЗНАЧЕНИЙ
5.2.1.	Синтаксис
(отношение текстовых значений) ::= (простое текстовое значение)
(знак операции отношения) (простое текстовое значение)
5.2.2.	Семантика
Два текстовых значения считаются равными, если они или оба пусты, или оба суть экземпляры одной и той же последовательности литер. В противном случае они считаются неравными.
Текстовое значение Т ниже, чем текстовое значение U, тогда и только тогда, когда они не равны и выполняется одно из следующих условий:
1)	Т пусто;
2)	U равно Т, пополненному справа одной или несколькими литерами;
3)	i-я литера из Т ниже, чем i-я литера из U, где i (iS> 1) есть наименьшее целое, при котором i-e литеры из Т и U не равны.
5.-3. ОТНОШЕНИЯ ОБЪЕКТОВ
5.3.1. Синтаксис
(отношение объектов) :: = (простое объектное выражение) is (идентификатор класса) | (простое объектное выражение) in (идентификатор класса)
5.3.2. Семантика
Знаки операций is и in служат для проверки принадлежности объекта классу.
Отношение X is С имеет значение true, если X ссылается на объект класса С, в противном случае оно имеет значение false. Отношение X in С имеет значение true, если X ссылается на объект класса, содержащегося в С, в противном случае оно имеет значение false.
5.4.	ОТНОШЕНИЯ ССЫЛОК
5.4.1.	Синтаксис
(знак операции отношения ссылок) :: = = = | = / = (отношение ссылок) :: = (отношение ссылок на объект) | (отношение ссылок на текст)
(отношение ссылок на объект) :: = (простое объектное
выражение)
(знак операции отношения ссылок) (простое объектное выражение) (отношение ссылок на текст) :: = (простое текстовое
'й	выражение)
(знак операции отношения ссылок) (простое текстовое выражение)
5.4.2.	Семантика
Знаки операций отношения ссылок = = и =/-= служат1) для сравнения ссылок (но не значений, на которые эти ссылки указывают!). Две ссылки на объект (на текст) X и Y называются «идентичными», если они ссылаются на один и тот же объект (экземпляр текстового значения) или обе суть попе (суть ссылки на пустой текст); в этом случае отношение X— = Y имеет значение true, в противном случае оно имеет значение false.
Отношение X =/— U является отрицанием ' отношения Х= = У.
Пусть Т и U суть, ссылки на текст. Отметим, что оба отношения Т = / = U и Т= = U могут (одновременно) иметь значение true, когда Т и U ссылаются на одинаковые, но физически различные последовательности литер.
6. ОПЕРАТОРЫ
(оператор) :: = (АЛГОЛ-оператор) | (присоединяющий оператор) | (оператор активации)
О присоединяющих операторах см. разд. 7.2. Об операторах активации см. разд. 14.2.3.
’) Знаки операций == и =/= можно читать соответственно: «идентична» и «неидентична» или «указывает на то же, что и» и «указывает не на то же, что». — Прим, перев.
6.1.	ОПЕРАТОРЫ ПРИСВАИВАНИЯ
6.1.1.	Синтаксис 9
(оператор присваивания):;=
(присваивание значений) | (присваивание, ссылок) (ЛЧ значений) : : = (переменная) | (идентификатор процедуры) | S простое текстовое выражение) выражение для значения) | текстовое значение)|
 (присваивание значения) /присваивание значения) :: = (ЛЧ значений): = (ПЧ значений) (ЛЧ ссылок) :: = (переменная) [(идентификатор процедуры) (ПЧ ссылок) :: = (выражение для ссылки) |
(присваивание ссылки) (присваивание ссылок)::=
(ЛЧ ссылок) : — (ПЧ ссылок)
6.1.2.	Семантика
Знак операции := (читается — становится равным) означает:
—	присваивание некоторого значения переменной обык-- новенного типа или идентификатору процедуры обыкновенного типа, являющемуся ЛЧ значений, или
—	присваивание текстового значения тексту, на который ссылается ЛЧ значений.
Знак операции : — (читается — начинает обозначать) означает:
—	присваивание ' ссылки переменной ссылочного типа или идентификатору процедуры ссылочного типа, являющемуся ЛЧ ссылок.
В этом контексте идентификатор процедуры означает участок памяти (ячейку), локальный в соответствующем экземпляре процедуры. Содержимое этого участка и является значением или ссылкой, доставляемой соответствующим указателем функции при его вычислении.
Присваиваемое значение (или ссылка) является копией значения (или ссылки), получающегося при вычислении ПЧ значений (или ссылок). Если ПЧ сама есть присваивание, то
*	) Сокращения ЛЧ и ПЧ соответствуют терминам «левая часть присваивания» и «правая часть присваивания». — Прим, перев.
доставляемое ею значение является копией значения, присвоенного при ее выполнении в качестве присваивания.
Любое выражение, которое является ЛЧ или его составной частью, вычисляется раньше вычисления ПЧ. Подробное описание присваивания текстовых значений см. в разд. 10.6.
Для объектов не существует присваивания значений.
Тип значения или ссылки, получающейся при вычислении ПЧ, должен совпадать с типом ЛЧ. Из этого правила допускаются исключения, рассматриваемые ниже.
Если ЛЧ является формальным параметром, а тип соответствующего фактического параметра не совпадает с типом формально^ спецификации, то операция присваивания выполняется в два этапа:
1) выполняется присваивание значения ПЧ некоторой фиктивной переменной типа, специфицированного для формального параметра;
- 2) выполняется присваивание, ЛЧ которого является фактический параметр, а ПЧ — упомянутая фиктивная переменная.
Значением (или ссылкой), получающимся при вычислении присваивания, является в этом случае содержимое' упомянутой фиктивной переменной.
Относительно присваивания ссылок на текст см. разд. 10.5.
6.1.2.1. Присваивание арифметических значений
Так же как и в языке АЛГОЛ-60, любое арифметическое значение может быть присвоено ЛЧ типа real или integer. При необходимости выполняется соответствующая функция преобразования.
В качестве примера рассмотрим оператор (не допустимый, однако, в языке АЛГОЛ-60)
Х: = г-;= у F := 3.14
где X и Y суть переменные типа real, i — переменная типа integer, a F— формальный параметр, вызываемый по наименованию и специфицированный как real. Если фактическим-параметром, соответствующим F, является переменная типа real, то X, I, Y и F получают значения 3, 3, 3.14 и 3.14 соответственно. Если же фактическим параметром, соответствующим F, является переменная типа integer, то X, i, Y и F получают значения 3, 3, 3.14 и 3 соответственно.
6.1.2.2. Присваивание ссылок на объект
Пусть ЛЧ присваивания ссылок на объект квалифицирована идентификатором класса С1, и пусть ПЧ квалифицирована идентификатором класса Сг. Если ПЧ сама является присваиванием ссылок, то Сг по определению является квалификацией ЛЧ этого последнего присваивания. Пусть V есть значение, получающееся при вычислении ПЧ. Законность и результат присваивания ссылок зависят от соотношения между С1, Сг и V.
Случай 1. Класс С1 содержит класс Сг. Присваивание ссылок законно, и операция присваивания выполняется.
Случай 2. Класс С1 является подклассом класса Сг. Присваивание законно. Оно выполняется, если V есть попе, или является объектом класса С1, или подкласса класса С1. В противном случае выдается сообщение об ошибке.
Случай 3. С1 и Сг не удовлетворяют ни одному из указанных выше условий. Присваивание незаконно.
Аналогичные правила приложимы также к неявным присваиваниям параметру цикла и к передаче параметров.
' Пример 1:
Пусть Гаусс есть класс, декларированный в примере в разд. 2.2.
ref (Гаусс) "G5, G10 ;
G5: — new Гаусс (5); G10: —new Гаусс (10);
Значениями переменных G5 и G10 являются теперь объекты класса Гаусс. См. также пример 1 в разд. 7.1.2.
Пример 2:
Пусть точка и поляр — это классы, декларированные в примере разд. 2.2.2.
ref (точка) Pl, Р2\ ref (поляр) РЗ-, Pl : — new поляр (3, 4); Р2 : — new точка (5, 6);
Оператор РЗ Р\ присвоит переменной РЗ ссылку на объект класса поляр, который сам является значением переменной Р1. Оператор РЗ Р2 привел бы к выдаче сообщения об ошибке во время его выполнения.
6.2.	ОПЕРАТОРЫ ЦИКЛА
6.2.1.	Синтаксис
(заголовок цикла) :: = (АЛГОЛ-заголовок цикла) | for (переменная):—(список объектов)
(список объектов)::— (элемент списка объектов)| (список объектов), (элемент списка объектов)
(элемент списка объектов)::=(объектное выражение)| (объектное выражение) while (логическое выражение)
6.2.2.	Семантика
Конструкция (список объектов) аналогична по смыслу конструкции (АЛГОЛ-список цикла). Расширение оператора цикла облегчает обработку списочных структур.
Каждое неявное присваивание ссылок подчиняется правилам из разд. 6.1.2.2.
6.3.	БЛОКИ С ПРЕФИКСАМИ
6.3.1.	Синтаксис
(блок) = (АЛГОЛ-блок) | (блок с префиксом) (префикс блока) :: =
(идентификатор класса) (совокупность фактических
параметров)
(ядро блока) :: = (непомеченный блок) J (непомеченный составной) (непомеченный блок с префиксом) :: = (префикс блока) (ядро блока)
(блок с префиксом) :: — (непомеченный блок с префиксом) | . (метка):(блок с префиксом)
6.3.2.	Семантика
Экземпляр блока с префиксом является составным объектом, префиксная часть которого есть объект класса, указанного префиксом блока, а ядро — экземпляром ядра блока. Формальные параметры префиксной части получают исходные значения в соответствии с фактическими параметрами префикса.
Сочленение производится в соответствии с правилами, аналогичными правилам разд. 2.2.2.
При образовании блоков с префиксами необходимо соблюдать следующие ограничения;
1)	Объект, в котором встречается ссылка на него самого через некоторый локальный объект, не может быть префиксной частью экземпляра блока с префиксом.
2)	Идентификатор класса некоторого префикса блока должен идентифицировать класс, локальный в наименьшем блоке, охватывающем блок с префиксом. Если этот идентификатор является идентификатором системного класса, то он относится к некоторой фиктивной декларации этого системного класса, как' бы находящейся в начале наименьшего охватывающего блока. В конкретных реализациях языка можно ограничить количество различных блочных уровней, на которых можно пользоваться такими префиксами (см. разд. 11 и 14).
' Экземпляр блока с префиксом является самостоятельным объектом (см. разд. 9). Программа считается вложенной в некоторый блок с префиксом (см. разд. 11), поэтому она является самостоятельным объектом.
Пример:
Пусть расстановка означает класс, декларированный в примере разд. 2.2.3. Тогда внутри блока с префиксом
расстановка (64) begin integer procedure оценка (Т); text Т ;.........................;
end
можно обращаться к процедуре номер (декларированной в классе расстановка), использующей процедуру оценка, декларированную в ядре блока.
7. ДИСТАНЦИОННОЕ ОБРАЩЕНИЕ
Атрибут объекта полностью идентифицируется следующими элементами информации:
1)	объектом;
2)	некоторым классом, содержащим класс этого объекта;
3)	идентификатором атрибута, определенным в этом классе или в любом классе, из последовательности префиксов первого.
Второй элемент определяется по тексту обращения к атрибуту. Префиксальный уровень класса (являющегося
вторым элементом) называется «уровнем» данного обращения к атрибуту.
Рарсмотрим обращение к атрибуту (идентификацию атрибута), второй элемент которого есть класс С. Идентификатор атрибута в этом обращении, т. е. третий элемент, подвергается тем же самым заменам идентификаторов, которые должны были быть выполнены над неэкранированным вхождением этого идентификатора в ядро класса С во время сочленения. Поэтому конфликты наименований атрибутов, декларированных на различных префиксальных уровнях объекта, разрешаются выбором атрибута, декларированного на самом высоком префиксальном уровне, не превышающем уровня данного обращения к атрибуту.
Неэкранированное вхождение идентификатора атрибута в данный объект является само по себе полной идентификацией атрибута. В этом случае первый и второй элементы определены неявно как соответственно данной объект и класс, связанный *с префиксальным уровнем вхождения идентификатора.	\
 Если такое вхождение идентификатора находится в теле декларации процедуры (являющейся частью объекта), то для любого динамического экземпляра этой процедуры данное вхождение идентифицирует некоторый атрибут упомянутого объекта независимо от того, где находится обращение, вызвавшее процедуру.
Дистанционное обращение к атрибутам, т. е. обращение к ним извне объекта, осуществляется или при помощи «дистанционных идентификаторов», или при помощи , механизма «присоединения». Первое является видоизменением приемов, предложенных в работе [3], второе соответствует механизму присоединения в языке СИМУДА-1, изложенному в работе {2].
Текстовая ссылка является сама составной структурой в том смысле, что она имеет атрибуты, обращение к которым возможно с помощью дистанционного идентификатора.
7.1.	ДИСТАНЦИОННЫЕ ИДЕНТИФИКАТОРЫ
7.1.	Г. Синтаксис
/идентификатор атрибута) :: = /идентификатор) (дистанционный идентификатор) : : =
(простое объектное выражение) . (идентификатор атрибута)|
(простое текстовое выражение). (идентификатор атрибута)
(идентификатор 1):: = (идентификатор) | (дистанционный
'	'	идентификатор)
(идентификатор переменной 1):; = (идентификатор 1) (простая переменная 1):: = (идентификатор переменной 1) (идентификатор массива 1):: = (идентификатор 1) (переменная)::=(простая переменная 1)|
(идентификатор массива 1) [(список
индексов)] (идентификатор процедуры 1) :: = (идентификатор 1) (указатель функции) :: =
(идентификатор процедуры 1) (совокупность
фактических параметров) (оператор процедуры) :: =
(идентификатор процедуры 1) (совокупность
фактических параметров) (фактический параметр):: = (выражение) |
(идентификатор массива 1) | (идентификатор переключателя) |
(идентификатор процедуры 1)
7.1.	2. Семантика
Пусть X есть простое объектное выражение, квалифицированное классом С, и пусть А — некоторый идентификатор атрибута. Тогда дистанционный идентификатор X. А (если он законен) идентифицирует соответствующий атрибут, причем в качестве первого элемента идентифицирующей информации выступает значение выражения X, а в качестве второго — класс С.
Дистанционный идентификатор законен, если выполнены следующие требования:
1)	значение выражения X отлично от попе;
2)	объект не имеет атрибутов-классов на префиксальных уровнях, не превосходящих уровня С.
Первое требование должно обнаруживаться во время выполнения программы и вызывать соответствующее сообщение об ошибке.
Второе требование выдвинуто для того, чтобы упростить язык и его реализации.
Дистанционный идентификатор вида
(простое текстовое выражение) . (идентификатор атрибута) идентифицирует некоторый атрибут текстовой ссылки, получающейся путем вычисления простого текстового выражения, при условии, что идентификатор атрибута является одним из идентификаторов процедур, перечисленных в разд. 10.1.
Пример 1:
Пусть G5 и G10— переменные, декларированные и получившие значения в соответствии с примером 1 разд. 6.1.2.2. Тогда значение выражения
G5. интеграл (...) или
G10. интеграл (...)
есть приближение к определенному интегралу, полученное применением формулы Гаусса с 5 или 10 абсциссами соответственно.
Пример 2:
Пусть Р\ и Р2— переменные, объявленные и получившие значения в. соответствии с примером 2 разд. 6.1.2.2. То/да значением выражения
Р\.плюс (Р2) является новая точка (объект класса точка), представляющая векторную сумму точек Р1 и Р2. Значением выражения
Р\ qua поляр, плюс (Р2) является новый объект класса поляр, представляющий ту же самую векторную сумму.
7.2.	ПРИСОЕДИНЕНИЯ
7.2.1.	Синтаксис
/присоединяющий блок 1) :: = (оператор)
(присоединяющий блок 2):: = (оператор) (присоединение)::=
when (идентификатор класса) do (присоединяющий блок 1) (альтернатива) :: — (пусто) | otherwise (оператор) (совокупность присоединений):: = (присоединение) |
(совокупность присоединений) (присоединение) (присоединяющий оператор) :: =
inspect (объектное выражение) (совокупность присоединений) (альтернатива)|
inspect (объектное выражение) do
(присоединяющий блок 2) (альтернатива)
Присоединяющий блок сам может быть присоединяющим оператором, каковым в этом случае является наибольший присоединяющий оператор, обнаруживаемый на месте присоединяющего блока.
7.2.2.	Семантика
Механизм присоединения обеспечивает неявное определение вышеупомянутых первых и вторых элементов для некоторых обращений к атрибутам внутри' присоединяющих блоков.
Присоединяющий оператор выполняется следующим образом:
1)	Вычисляется объектное выражение присоединяющего оператора. Пусть X есть полученное значение.
2)	Если в присоединяющем операторе имеются присоединения, то они рассматриваются по очереди одно за другим. Если X — объект, принадлежащий к классу, содержащемуся в указанном вслед за символом when, то выполняется (присоединяющий блок 1) этого присоединения, а последующие присоединения (и альтернатива) пропускаются. В противном случае очередное присоединение пропускается.
3)	Если в присоединяющем операторе имеется (присоединяющий блок 25, то он выполняется только при условии, что X не есть попе; если это условие не выполняется, то (присоединяющий блок 2) пропускается.
4)	Оператор в альтернативе выполняется, если X есть попе или если X есть объект, не принадлежащий ни одному из классов, указанных вслед за символами when, и ни одному из подклассов таких классов. В противном случае оператор в альтернативе пропускается.
Оператор, являющийся (присоединяющим блоком 1) или (присоединяющим блоком 2), действует подобно блоку независимо от того, имеет ли он форму блока или нет. Кроме того, он действует так, как если бы он был вложен в некоторый другой фиктивный блок, называемый «присоединенным блоком». Во время выполнения присоединяющего блока объект X называется присоединенным. Присоединяющий блок имеет «квалификацию блока», каковой является предшествующий идентификатор класса для (присоединяющего блока 1) и квалификация предшествующего объектного выражения для (присоединяющего блока 2).
Пусть квалификация блока данного присоединяющего блока есть С, и пусть А — идентификатор атрибута, определенный на префиксальном уровне класса С. Тогда любое неэкранированное вхождение идентификатора А в присоединенный блок получает локальный смысл: оно является идентификацией атрибута, первым элементом которой является присоединенный объект, а вторым — квалификация присоединяющего блока, т. е. С.
Следовательно, присоединяющий блок действует так, как если бы атрибуты присоединенного объекта вплоть до уровня С включительно были его локальными величинами. (Конфликты наименований между атрибутами, определенными на различных префиксальных уровнях, разрешаются выбором атрибута на наивысшем префиксальном уровне.)
.Пример:
Пусть Гаусс есть класс, декларированный в примере разд. 2.2. Тогда внутри оператора (присоединяющий блок 2) присоединяющего оператора
inspect new Гаусс (5) do begin...........end
доступна процедура интеграл для численного интегрирования по формуле Гаусса с 5 абсциссами.
8.	ПРОЦЕДУРЫ ‘И ПЕРЕДАЧА ПАРАМЕТРОВ
8.1.	СИНТАКСИС
(заголовок процедуры) := (идентификатор процедуры) (совокупность формальных параметров); (вид передачи) (совокупность спецификаций)
(вид передачи)::=(совокупность значений)
(совокупность имен)| (совокупность имен)
(совокупность значений) (совокупность значений) : :=value (список идентификаторов);! (пусто) (совокупность имен) :: = паше (список идентификаторов); | (пусто) (спецификатор) :: == (тип) | array | (тип) array | label |
switch | procedure | (тип) procedure
О фактических параметрах см. разд. 7.1.1.
8.2.	СЕМАНТИКА ,
В описании процедур языка СИМУЛА-67 имеются следующие отличия от АЛГОЛа-60:
1)	Спецификации требуются для всех формальных параметров.
2)	Вместо спецификатора string, принятого в АЛГОЛе, употребляется спецификатор text.
3)	В качестве необязательной части заголовка процедуры введена конструкция (совокупность имен),- указывающая параметры, вызываемые по наименованию. Отсутствие упоминания параметра в конструкции (вид. передачи) не означает еще, что параметр должен передаваться по наименованию.
4)	Вызов по наименованию переопределяется в случае, когда тип фактического параметра не совпадает с типом спецификации.
Имеется три способа передачи параметров: «вызов по значению», «вызов по ссылке», «вызов по наименованию». Параметр, не упомянутый в конструкции (вид передачи), передается по значению, если он обыкновенного типа, и по ссылке, если он любого иного типа.
Способы передачи параметров процедур показаны в следующей таб'лице. Выделенная рамкой часть таблицы соответствует. передачам параметров деклараций классов.
Парамер	Способы передачи				
	по значению		по ссылке		по наименованию
(обыкновенный тип)		в	НР		р
(тип ссылок на объект)		HP	в		р
text		р	в		р
(обыкновенный тип) array		р	в		р
(ссылочный тип) array		НР	в		р
((тип)) procedure	НР		в		р
label	HP		в		р
switch	HP		в .		р
Обозначения в таблице: В—выполняется при отсутствии указания о виде передачи, В—разрешается при наличии указания о виде передачи, HP—не разрешается.
8.2.1.	Вызов по значению
’Формальный параметр, вызываемый по значению, сначала обозначает локальную копию значения (или массива), получаемого вычислением соответствующего фактического параметра. Вычисление происходит в момент входа в процедуру или в момент порождения объекта.
Вызов по значению параметра обыкновенного типа и параметров-массивов обыкновенного типа происходит, как и в АЛГОЛЕ-60.
Текстовый параметр, вызываемый по значению, — это локальная переменная, получающая начальное значение в два этапа, которые неформально описываются операторами
ФО : —blanks (ФЛ . length); ФО : = ФЛ;
где ФО есть формальный параметр, а ФА есть значение фактического параметра. Так что любое текстовое значение является в этом случае допустимым фактическим параметром.
Для параметра обыкновенного типа упоминание в совокупности значений является избыточным. Для параметров типа ссылки на объект и параметров-массивов ссылочного типа вызов по значению не допускается.
8.2.2.	Вызов по ссылке
Формальный параметр, вызываемый по ссылке, сначала обозначает локальную копию ссылки, полученную в результате вычисления соответствующего фактического параметра. Вычисление производится в момент обращения к процедуре или в момент порождения объекта.
Формальный параметр типа ссылки есть локальная переменная, получающая начальное значение в результате присваивания ссылок
ФО ФА
где ФО есть формальный параметр, а ФА есть ссылка, полученная в результате вычисления фактического параметра. Такое присваивание ссылок подчиняется правилам из разд. 6.1.2.2. Поскольку в этом случае параметр является переменной ссылочного типа, его содержимое можно изменить присваиванием ссылок внутри тела процедуры или класса. Строка не является допустимым фактическим параметром для текстового параметра, вызываемого по ссылке.
Хотя идентификаторы массивов, процедур, меток и переключателей не обозначают ссылок на значения, имеется полная аналогия между ссылками в строгом смысле слова и
ссылками на массивы, процедуры (т. е. декларации процедур), точки программы и переключатели. Поэтому вызов по ссылке определен и для этих случаев.
Параметр-массив, параметр-процедура, параметр-метка или параметр-переключатель, вызываемый по ссылке, нельзя изменить внутри тела процедуры или класса. Таким образом, параметр указанного вида ссылается на одно и то же во всей своей области действия. Однако содержимое массива, вызываемого по ссылке, вполне может быть' изменено соответствующими присваиваниями его элементам.
Для параметра-массива, вызываемого по ссылке, тип фактического параметра должен совпадать с типом формальной спецификации. Для параметра-процедуры, вызываемого по ссылке; тип фактического параметра должен совпадать с типом формальной спецификации или подчиняться ему.
8.2.3.	Вызов по наименованию
Вызов по наименованию является допустимым видом передачи параметров процедур при наличии указания о таком виде передачи. Как и в АЛГОЛЕ-60, в этом случае имеется в виду текстуальная замена формального параметра фактическим. Однако, если выражение внутри тела процедуры является формальным параметром, вызываемым по наименованию; переменной с индексом, идентификатор массива в которой является формальным параметром, вызываемым по наименованию; указателем функции, идентификатор процедуры в котором является формальным параметром, вызываемым по наименованию, имеют место следующие правила:
1)	типом выражения является тип, предписанный соответствующей спецификацией;
2)	если тип фактического параметра не совпадает с .типом формального параметра, то вслед за вычислением выражения выполняется присваивание полученного значения или ссылки некоторой фиктивной переменной того же типа, что и формальный параметр. Это присваивание происходит по правилам из разд' 6.1.2. Значением, или ссылкой, полученной в результате вычисления данного выражения, является содержимое этой фиктивной переменной.
Смысл присваивания переменной, являющейся формальным параметром, вызываемым по наименованию, или переменной с индексами, идентификатор массива в которой является таким формальным параметром, в случае несовпадения
ее типа с типом актического параметра определен в разд. 6.1.2.
Присваивание идентификатору процедуры, который является формальным параметром, не допустимо независимо от способа передачи.
Заметим, что любое динамическое вхождение формального параметра, вызываемого по наименованию, независимо от его рода может вызвать вычисление нетривиального выражения (например, если отвечающий ему фактический параметр является дистанционным идентификатором). -
9.	ПОРЯДОК ВЫПОЛНЕНИЯ
9.1.	БЛОКИ И ДИНАМИЧЕСКИЕ ОБЛАСТИ
Составными частями процесса исполнения, программы являются динамические экземпляры блоков. Все блоки распадаются на три категории в зависимости от возможных взаимоотношений и возможных состояний их динамических экземпляров.
1.	Блоки с приставкой.
2.	Подблоки, тела процедур и присоединяющие блоки.
3.	Тела классов.
Экземпляр блока в каждый данный момент находится в одном из трех состояний исполнения: «прикреплен», «самостоятелен» («откреплен») или. «завершен». Возможные и начальные состояния экземпляров блоков указаны в следующей таблице:
Категория блоков	Возможные состояния	Начальное состояние
1	с	с
	п	п
3	п,с,з	п
П—прикреплен, С—самостоятелен, 3—завершен.
Программа на языке АЛГОЛ-60 содержит лишь блоки категории 2 (за исключением самого внешнего блока программы, который естественно считать блоком категории 1, см. разд. 11). Исполнению любой такой программы соответствует обычная структура Динамически вложенных друг в друга экземпляров блоков.
Экземпляр блока категории 2 находится всегда в прикрепленном состоянии; считается, что он «прикреплен к» наименьшему динамически охватывающему его экземпляру блока. Например, экземпляр тела процедуры прикреплен к экземпляру, блока, содержащему соответствующее обращение к процедуре.
Управление программой (УП) указывает в каждый данный момент на ту точку программы внутри некоторого экземпляра блока, которая исполняется в этот момент. Для краткости будем говорить, что УП установлено на эту точку программы и находится в некотором экземпляре блока. Если А есть экземпляр блока, в котором находится УП, то Л и все экземпляры блоков, динамически охватывающие А, называются работающими.
Вход в блок вызывает порождение некоторого нового экземпляра блока, после чего УП входит в этот экземпляр блока. Если УП-покидает экземпляр блока категории 1 или 2 через замыкающий его символ end или в результате выполнения оператора перехода, то этот экземпляр блока уничтожается.
Некоторый объект (т. е. экземпляр блока категории 3) вначале прикреплен к экземпляру блока, содержащему соответствующий генератор объекта. Он может- стать самостоятельным (перейти в открепленное состояние) при выполнении оператора detach (см. разд. 9.2.1). Если УП покидает объект через замыкающий его тело символ end или в результате выполнения оператора перехода, объект становится завершенным.
Об экземпляре блока говорят, что он «локален по отношению к» экземпляру блока, содержащему текст, описывающий первый экземпляр. Например, объект, принадлежащий к некоторому данному классу, локален по отношению к экземпляру блока, содержащему декларацию этого класса.
Считается, что экземпляр блока (назовем его Л), охватывает некоторый другой экземпляр блока (назовем его В), если:
1)	экземпляр блока В прикреплен и динамически охватывается экземпляром блока Л, или
2)	экземпляр блока В самостоятелен или завершен и локален по отношению либо к А, либо к некоторому экземпляру блока, динамически охватываемому экземпляром блока Л, или
3)	имеется самостоятельный объект С, локальный по отношению либо к А, либр к некоторому экземпляру блока,
динамически охватываемому экземпляром блока А, такой, что С охватывает В.
Всякий раз, когда некоторый экземпляр блока уничтожается, все экземпляры блоков, охватываемые им, также уничтожаются. Структура языка такова, что после уничтожения объекта к этому объекту нельзя обратиться каким бы то ни было объектным выражением. Следовательно, динамическая область существования объекта ограничена динамической областью существования декларации его класса. Однако при реализации языка фактический период, жизни объектов может быть еще -несколько сокращен посредством таких приемов Листки памяти, как «сборка мусора».
Заметим, что массивы и текстовые значения, вообще .говоря, нельзя уничтожать вместе с экземпляром блока, где они декларированы.
.9.2. КВАЗИПАРАЛЛЕЛЬНОЕ ИСПОЛНЕНИЕ
Состояние выполнения программы лучше всего можно описать структурой дерева, узлы которого являются экземплярами блоков с префиксами. Поддерево, «корнем» которого является экземпляр блока с префиксом, называется «квази-параллельной системой». Экземпляр блока с префиксом, включая экземпляры блоков, динамически вложенных в него, называется «главной программой» данной квазипараллельной системы.
С каждой квазипараллельной системой связан «уровень системы», т. е. количество экземпляров блоков с префиксами, объемлющих ее главную программу. Программа в целом является квазипараллельной системой с уровнем системы, равным нулю.
Квазипараллельная система состоит из «компонент» системы, каковыми являются главная программа и самостоятельные объекты (содержащие, разумеется, экземпляры бло= ков, динамически вложенные в такие объекты), для которых минимальным объемлющим экземпляром блока с префиксом является главная программа системы. Компоненты квазипараллельной системы по определению считаются «самостоятельными на» уровне данной квазипараллельной системы.
С любой компонентой системы связано «локальное управление» (ЛУ), а с каждой квазипараллельной системой в целом— «внешнее управление» (ВУ), Внешнее, управление на уровне системы, равном нулю, совпадает с УП. ВУ некоторой квазипараллельной системы на уровне k I) совпадает
с ЛУ той компоненты на (k— 1)-м уровне системы, которая объемлет данную систему.
' Для любой данной квазипараллельной системы в каждый данный момент одна и только одна из ее компонент является «активной». ЛУ этой компоненты совпадает с ВУ квазипараллельной системы.
Экземпляр блока с префиксом вначале активен, т. е. вначале ВУ его собственной квазипараллельной системы находится в нем самом. ВУ некоторой системы может переходить из компоненты в компоненту в результате действия некоторых операторов, которые будут описаны в последующих разделах. ЛУ некоторой компоненты, не содержащей ВУ, остается в той точке программы, в которой ВУ покинуло объект в последний раз.
В любой данный момент существует такая последовательность компонент систем Xo, Xt, ..., Хп, что
1)	Xh активна на уровне системы k (& = 0, 1, ..., п);
2)	Xh вложена в Xft_i (k = 1, 2, ..., п);
3)	в Хп не вложено никакой квазипараллельной системы.
Эта последовательность называется «работающей цепочкой». Все компоненты системы в работающей цепочке содержат УП и поэтому называются работающими. ЛУ некоторой компоненты остается неподвижным до тех пор, пока эта компонента не станет членом работающей цепочки1).
9.2.1. Оператор detach (открепить)
Пусть X — наименьший работающий экземпляр блока. Если X является прикрепленным объектом, оператор открепить производит следующие действия:
1) объект становится самостоятельным (открепленным) на уровне системы наименьшего объемлющего экземпляра блока с префиксом, а его ЛУ останавливается в конце оператора detach;
2) УП возвращается в экземпляр блока, к которому X был прикреплен, и возобновляет работу с оператора, стоящего вслед за генератором объектов, который вызвал порождение объекта X. Результатом вычисления выражения (генератор объектов) является ссылка на X.
*) ЛУ представляет собой обобщение понятия «точка реактивации процесса» языка СИМУЛА-1.
Если X является самостоятельным объектом, являющимся компонентой некоторой квазипараллельной системы S, то оператор detach производит следующие действия:
1)	ВУ системы S покидает X. В результате X удаляется из работающей цепочки, а его ЛУ останавливается в конце оператора detach;
2)	ВУ системы S входит в главную программу системы S на текущую позицию "ее Л У. В результате главная программа системы S и, возможно, компоненты систем на уровнях, более высоких, чем уровень S, станут работающими.
Если X есть экземпляр блока с префиксом, то оператор detach никаких действий не производит.
Если X есть экземпляр блока, но не объект и не экземпляр блока с префиксом, то использование оператора detach представляет собой ошибку.
9.2.2.	Оператор resume (возобновить)
Оператор resume формально является процедурой с одним параметром типа ссылок на объект, квалифицированным некоторым фиктивным классом, объемлющим все классы.
Пусть фактический параметр'оператора resume ссылается на' некоторый самостоятельный объект У, являющийся компонентой некоторой квазипараллельной системы S. Согласно правилам языка на У можно сослаться только изнутри экземпляра блока (назовем его X), являющегося компонентой той же системы S или вложенного в некоторую компоненту этой системы. Экземпляр блока X является в данный момент работающим. Оператор resume производит следующие действия:
1)	ВУ системы S покидает X. В результате сам X и все работающие компоненты на более высоких уровнях системы удаляются из работающей цепочки. ЛУ каждой компоненты останавливается в конце оператора resume;
2)	ВУ системы S входит в У на текущую позицию его ЛУ. В результате У и, возможно, последовательность компонент на более высоких уровнях системы становятся работающими.
Если фактический параметр оператора resume не ссылается на самостоятельный объект, то при выполнении оператора выдается сообщение об ошибке.
9.2.3.	Выход через «end» объекта
Результат того, что УП выходит через замыкающий символ end объекта, совпадает с действием оператора detach с тем отличием, что объект становится завершенным (а не самостоятельным) и, таким образом, теряет свое ЛУ.
9.2.4.	Операторы перехода
Результатом выполнения оператора перехода, передающего управление из данного объекта в некоторую точку вне него, является то, что УП покидает объект, который становится завершенным.
На любой оператор перехода накладывается следующее ограничение: он может передавать управление только в точку программы внутри какого-нибудь работающего экземпляра блока. Из этого ограничения следует, что оператор перехода, передающий управление из самостоятельного объекта, означает также выход из минимального объемлющего блока с префиксом.
10. ТИП «ТЕКСТ»
См. разд. 3.2.3, 4.4, 5.2 и 5.4.
10.1. АТРИБУТЫ ТЕКСТА
Приводимые ниже процедуры являются атрибутами любой ссылки на текст. К ним можно обращаться посредством дистанционных идентификаторов вида
(простое текстовое выражение) . (идентификатор процедуры).
integer procedure length text procedure main integer procedure pos procedure setpos Boolean procedure more character procedure getchar procedure putchar text procedure sub text procedure strip integer procedure getint real procedure getreal integer procedure getfrac procedure putint
(cm. 10.2) (cm. 10.2) (cm. 10.3) (cm. 10.3) (cm. 1Q.3) (cm. 10.3) (cm. 10.3) (cm. 10.7)
(cm. 10.7)
(cm. 10.9)
(cm. 10.9)
(cm. 10.9) (cm. 10.10)
procedure putfix	(см.	10.10)
procedure putreal	(cm.	’10.10)
procedure puttext	(см.	10.10)
procedure putfrac	(cm.	10.10)
В следующих разделах буква X, если не оговорено противное, означает ссылку на текст.
Ю.2. процедуры-атрибуты length и main integer procedure length ;
Процедура X . length доставляет в качестве своего значения количество литер текстового значения, на которое ссылается X (ср. разд. 3.2.3).
Выражение notext. length имеет значение, равное нулю, text procedure main ;
Процедура X. main доставляет в качестве своего значения ссылку на текстовый объект, являющийся текстом, на который ссылается X, или содержащий такой текст (ср. разд. 3.2.3).
Выражение notext. main эквивалентно выражению notext.
Для любой ссылки на текст выполняются следующие отношения:
X. main . length	X. length
X. main . main = = X. main
10.3.	ДОСТУП к л ИТЕРАМ
Литеры текста доступны по одной. Любая ссылка на текст имеет «указатель позиции», указывающий на литеру этого текста, доступную в данный момент (если таковая имеется).
Указатель позиции ссылки X — это целое число в интервале [1, X . length + 1].
Указатель позиции для notext равен единице. Ссылка на текст, получаемая в результате вызова любой системной текстовой процедуры, имеет указатель позиции, равный единице.
Указатель позиции данной ссылки на текст можно изменить процедурами setpos, getchar и putchar. Кроме того, любая из процедур, определенных в разд. 10.9 и 10.10, может изменить указатель позиции ссылки на текст, атрибутом которого является такая процедура.
Указатели позиций не принимаются во внимание и не изменяются при вычислении отношений ссылок на текст, отно
шений текстовых значений и при присваиваниях текстовых значений. <
Следующие процедуры употребляются для получения доступа к литерам. Они приспособлены к организации последовательного доступа.
integer procedure pos;
Процедура X. pos доставляет в качестве своего значения текущее значение указателя позиции ссылки на текст X.
procedure setpos (t); integer i:
Действие процедуры X. setpos (i) состоит в том, что указателю позиций ссылки на текст X присваивается значение i, если i находится в интервале [1, X. length + 1]. В противном случае присваивается значение X. length + 1.
Boolean procedure more;
Процедура X . more доставляет значение true, если указатель позиции ссылки X находится в интервале [1, X. length], В противном случае она имеет значение false.
character procedure getchar;
Процедура X. getchar доставляет в качестве своего значения копию доступной в данный момент литеры текста X при условии, что значением Х.тоге является true. В противном случае выдается сообщение об ошибке. Если ошибки не произошло, после выполнения копирования указатель позиции текста X увеличивается на единицу.
procedure putchar (с); character (с);
Действие процедуры X. putchar (с) состоит в том, что доступная в данный момент литера текста X заменяется копией литеры с при условии, что значением /.more является true. В противном случае выдается сообщение об ошибке. Если не произошло ошибки, после выполнения замены указатель позиции текста X увеличивается на единицу.
Пример:
procedure уплотнить (Т); text 7’;
begin text U; character c;
T. setpos (1); U : - T ;
for c: = c while U . more do
begin c : = U . getchar;
if с Ф then T . putchar (c) end;
for c:~c while T. more do T . putchar
end уплотнить ;
Процедура переупорядочивает литеры текстового значения, на которое ссылается параметр Т. Литеры, отличные от пробела, собираются в левой части текста, а оставшаяся часть, если таковая имеется, заполняется литерами пробела. Поскольку параметр вызывается по ссылке, то его указатель позиции не меняется. Значением литерной константы является литера пробела.
10.4.	ПОРОЖДЕНИЕ ТЕКСТОВ
Для порождения объектов типа текст, в дальнейшем для краткости называемых просто текстами, имеются следующие основные процедуры. Эти процедуры в отличие от рассмотренных выше не локализовании в текстовых объектах.
text procedure blanks (n); integer n;
Эта процедура доставляет в качестве своего значения ссылку’на новый текстовый объект длины п, заполненный литерами пробела.
text procedure text (Г); value Т ; text Т;
Эта процедура доставляет в качестве своего значения ссылку на новый текстовый объект, являющийся копией текстового значения, на которое ссылается или которым является фактический параметр.
Пример:
оператор Т :—text (’АВС’), где Т есть текстовая переменная, эквивалентен составному оператору
begin Т : — blanks (3); Т : = ’ABC’ end
10.5.	ПРИСВАИВАНИЕ ТЕКСТОВЫХ ССЫЛОК
(Синтаксис см. разд. 6.1).
Результатом текстового присваивания ссылок является то, что присваиваемая ссылка становится новым содержимым ЛЧ. Это новое содержимое ЛЧ является копией ссылки, получающейся при вычислении ПЧ (см. .разд. 6.2). Присваиваемая ссылка включает в себя также копию указателя позиции ПЧ.
Если X есть текстовая переменная, а У — ссылка на текст, то после выполнения присваивания ссылок X: — У оба отношения X = =У и X.pos= y.pos имеют значение true.
10.6.	ПРИСВАИВАНИЕ ТЕКСТОВЫХ ЗНАЧЕНИЙ
(Синтаксис см. разд. 6.1).
Пусть значением ЛЧ присваивания текстового значения является текст длины LI, а значением ПЧ — текст длины Lr. Если ПЧ сама является присваиванием текстового значения, то Lr по определению есть длина текста, присвоенного при выполнении этой ПЧ в качестве присваивания. Результат присваивания текстового значения зависит от соотношения между Ы и Lr.
LI = Lr: Литеры значения ПЧ переписываются последовательно в значение ЛЧ.
LI > Lr: Литеры значения ПЧ переписываются последовательно в первые Lr позиции значения ЛЧ.
Остальные LI — Lr позиций значения ЛЧ заполняются пробелами.
Ll<Lr: При исполнении такого присваивания выдается сообщение об ошибке.
Если ЛЧ и ПЧ ссылаются на пересекающиеся тексты, то результат присваивания текстового значения определяется конкретной реализацией языка.
При выполнении присваивания текстового значения указатели позиций ЛЧ и ПЧ во внимание не принимаются и не изменяются.
Если X и Y суть тексты одинаковой длины, то после исполнения присваивания текстового значения X: = Y отношение X = Y имеет значение true.
10.7.	ПОДТЕКСТЫ
Имеются две процедуры для обращений к подтекстам:
1)	text procedure sub (i, n); integer i, n;
Пусть i и n — такие целые числа, что t^l,	й
i + n^.X. length + 1. Тогда выражение / .sub (i, n) ссылается на ту часть текстового значения X, первая литера которой является i-й литерой значения X и которая содержит п последующих литер. Указатель позиции в получаемой ссылке на текст равен единице и определяет местную нумерацию литер в подтексте. Указатель позиции значения X во внимание не принимается и не изменяется. В особом случае, когда п = 0, получаемая ссылка есть notext. Если i и п не удовлетворяют указанным выше условиям, то при выполнении процедуры выдается сообщение в ошибке.
Логические выражения:
X.sub(i, n).sub(/, т) =	. sub(i + /—1, tn)
и
п =/= 0 гэ X. main = = Х. sub(i, п). main
если они законны, оба имеют значение true.
2)	text procedure strip ;
Выражение A', strip эквивалентно выражению X. sub (1, и), где п есть наибольшее целое число, такое, что литеры значения X в позициях под номерами, большими п, если таковые имеются, все суть литеры пробела.
Пусть X и У —ссылки на текст. Тогда после присваивания значения X := У, если оно не приводит’к ошибке, отно; шение X . strip = У. strip имеет значение true.
10.8.	ЧИСЛОВЫЕ ТЕКСТОВЫЕ ЗНАЧЕНИЯ
10.8.1.	Синтаксис
/ПУСТО):: =
(ТЕРМИНАЛЬНЫЙ СИМВОЛ) :: = (ЦИФРА) | +1 -1 • lio I, I (ПРОБЕЛ) | (РАЗДЕЛИТЕЛЬ)
(ЦИФРА):: = 0|1 |2|3|4|5|6|7|8 |9
(ЦИФРЫ) :: = (ЦИФРА)| (ЦИФРЫ) (ЦИФРА)
(ПРОБЕЛЫ) :: = (ПУСТО)| (ПРОБЕЛЫ) (ПРОБЕЛ)
(ЗНАК) :: = (ПУСТО) | + | -
(ЗНАКОВАЯ ЧАСТЬ): : = (ПРОБЕЛЫ) (ЗНАК) (ПРОБЕЛЫ) (ЗАПИСЬ ЦЕЛОГО) ::= (ЗНАКОВАЯ ЧАСТЬ) (ЦИФРЫ) (ЗАПИСЬ ДРОБНОГО): : = .(ЦИФРЫ>
(ЗАПИСЬ МАНТИССЫ):: = (ЗАПИСЬ ЦЕЛОГО) |
(ЗНАКОВАЯ ЧАСТЬ)
(ЗАПИСЬ ДРОБНОГО) |
(ЗАПИСЬ ЦЕЛОГО)
(ЗАПИСЬ ДРОБНОГО)
(ПОРЯДОК):: = 10(ЗАПИСЬ ЦЕЛОГО)
(ЗАПИСЬ ВЕЩЕСТВЕННОГО): : = (ЗАПИСЬ МАНТИССЫ)|
(ЗНАКОВАЯ ЧАСТЬ)
(ПОРЯДОК) I
(ЗАПИСЬ МАНТИССЫ)
(ПОРЯДОК)
(РАЗДЕЛИТЕЛЬ) :: = (ПРОБЕЛ) |,
(ГРУППЫ) :: = (ЦИФРЫ) |(ГРУППЫ) (РАЗДЕЛИТЕЛЬ)
(ЦИФРЫ)
(ЗАПИСЬ ГРУППАМИ) :: = (ЗНАКОВАЯ ЧАСТЬ)
(ГРУППЫ) |
(ЗНАКОВАЯ ЧАСТЬ).
(ГРУППЫ) |
(ЗНАКОВАЯ ЧАСТЬ)
'	(ГРУППЫ). (ГРУППЫ)
(ЗАПИСЬ ЧИСЛА) :: = (ЗАПИСЬ ЦЕЛОГО) |
(ЗАПИСЬ МАНТИССЫ) |
(ЗАПИСЬ ВЕЩЕСТВЕННОГО) |
(ЗАПИСЬ ГРУППАМИ)
10.8.2.	Семантика
Синтаксис, определенный в разд. 10.8.1, относится к последовательностям литер, т. е. текстовым значениям.
Каждый ТЕРМИНАЛЬНЫЙ СИМВОЛ означает подходящую литеру из внешнего набора литер, определяемого конкретной реализацией. ПРОБЕЛ означает литеру пробела. РАЗДЕЛИТЕЛЬ означает некоторую литеру, определяемую реализацией. Эта литера может быть, например, пробелом или запятой.
Запись числа — это последовательность литер, являющаяся продукцией понятия (ЗАПИСЬ ЧИСЛА).
Для преобразования арифметических значений в текстовые (являющиеся записями чисел) и обратно имеются процедуры редактирования и дередактирования.
10.9.	ПРОЦЕДУРЫ ДЕРЕДАКТИРОВАНИЯ
Любая процедура дередактирования данной ссылки на текст X работает следующим образом:
1)	разыскивается самая длинная запись числа (если таковая имеется) требуемого типа, содержащаяся в X и содержащая первую литеру текста X (заметим, что запись числа любого типа может начинаться с любого количества пробелов) ;
' 2) если такой записи числа нет, то выдается сообщение об ошибке.
3)	в противном случае найденная запись числа интерпретируется как число;
4)	если это число выходит за пределы диапазона значений, определяемого реализацией, то выдается сообщение об ошибке;
5)	в противном случае вычисляется арифметическое значение, которое равно или приближенно равно этому числу;
6)	указатель позиции ссылки X становится на единицу больше,,чем номер последней литеры рассмотренной записи числа.
Имеются три процедуры дередактирования:
1)	integer procedure getint;
Процедура разыскивает (ЗАПИСЬ ЦЕЛОГО). Значение, доставляемое этой процедурой-функцией, равно целому значению, представляемому найденной записью целого.
2)	real procedure getreal;
Процедура разыскивает (ЗАПИСЬ ВЕЩЕСТВЕННОГО). Значение, доставляемое этой процедурой-функцией, равно или приблизительно равно вещественному значению, представляемому найденной записью вещественного. Если это значение целое и находится в пределах диапазона, допустимого в данной реализации для целых чисел, то преобразование происходит точно.
3)	integer procedure getfrac ;
Процедура разыскивает (ЗАПИСЬ ГРУППАМИ). При интерпретации записи группами процедура игнорирует любой (РАЗДЕЛИТЕЛЬ) или десятичную точку, если таковые имеются. Значение, доставляемое этой процедурой-функцией, равно получающемуся таким образом целому значению.
10.10.	ПРОЦЕДУРЫ РЕДАКТИРОВАНИЯ
Процедуры редактирования данной ссылки на текст X служат для преобразования арифметических значений в записи чисел. После операции редактирования полученная запись числа (если таковая получена) выравнивается вправо в тексте X и ей предшествует столько пробелов, сколько необходимо для заполнения всего текста. Окончательное значение указателя позиции ссылки X- равно X . length + 1.
Положительное число редактируется без знака, отрицательное число редактируется со знаком минус, который непо-.средственно предшествует следующей значащей литере. Ведущие незначащие нули подавляются, кроме, быть может, нуля, непосредственно предшествующего первой значащей литере.
Если X = notext, то выдается сообщение об ошибке. В противном случае, если - текстовое значение слишком коротко, чтобы вместить получающуюся запись числа, происходит «переполнение при редактировании» и в текст помещается некоторая последовательность литер по правилам, определенным реализацией языка. Кроме того, если в ходе выполнения программы произошло переполнение при редактировании, то по окончании выполнения программы выдается соответствующее сообщение об этом факте.
Имеются четыре процедуры редактирования
1)	procedure putint (i); integer i;
Значение параметра преобразуется в (ЗАПИСЬ ЦЕЛОГО), обозначающую это значение.
2)	procedure putfix (г, n); real г; integer п;
Получающаяся запись числа есть ЗАПИСЬ ЦЕЛОГО, если п = 0, или ЗАПИСЬ МАНТИССЫ, у которой ЗАПИСЬ ДРОБИ содержит п цифр, если п > 0. Она обозначает число, равное или приближенно равное значению параметра г, правильно округленному до n-го десятичного знака. Если п < 0, то выдается сообщение об ошибке.
3)	procedure putreal (г, и); real г ; integer п ;
Процедура формирует ЗАПИСЬ ВЕЩЕСТВЕННОГО, содержащую ПОРЯДОК- Если п = 0, то эта запись вещественного имеет вид (ЗНАКОВАЯ ЧАСТЬ) (ПОРЯДОК); если п = 1, то вид (ЗАПИСЬ ЦЕЛОГО) (ПОРЯДОК), причем (ЗАПИСЬ ЦЕЛОГО) содержит точно одну цифру; если м> 1, то вид (ЗАПИСЬ МАНТИССЫ) (ПОРЯДОК), причем в дробной части мантиссы содержится ровно п— 1 цифр; если п < 0, то выдается сообщение об ошибке.
Сформированная запись вещественного обозначает число, представимое в указанной форме и ближайшее к значению параметра.
В случае когда имеется два таких числа, берется большее по модулю.
4)	procedure putfrac (Z, n); integer i, n;
Процедура формирует ЗАПИСЬ ГРУППАМИ без десятичной точки, если п = 0, и с десятичной точкой, за которой следует п цифр, если п > 0. Каждая группа за исключением, быть может, первой и последней (если она в дробной части), состоит из трех цифр. Сформированная запись числа является точным представлением числа i.10п.
Процедуры редактирования и дередактирования предназначены для обработки текстов «фиксированной длины».
Пример;
text Тг, тип, количество, цена , сумма ;
integer сум, итого-,
Тг\ — blanks (80); тип : — Тг . sub (1,10);
количество : — Тг . sub (20,5); цена : — Тг. sub (30,6);
сумма : — Тг . sub (60,10):
if тип . strip = 'заказ' then
begin сум : = количество. getint X цена . getfrac;
итого : = итого + сум ;
сумма . putfrac {сум, 2) end
11. ВВОД —ВЫВОД
Семантика средств языка, описывающих процессы ввода— вывода, основана на понятии «файл» (т. е. картотеки, наборов данных и т. п.). Файл представляет собой массив данных, внешних по отношению к программе. Мы будем говорить о «последовательном файле» или об «адресном файле» в зависимости от его организации.
Примеры последовательных файлов:
—	пачка перфокарт,
—	последовательность печатных строк,
—	ввод с клавиатуры,
—	данные на ленте. *
Примером. адресного файла является массив элементов информации на магнитном барабане или диске, когда каждый элемент обозначается посредством некоторого индекса.
Отдельные элементы информации, составляющие файл, будут называться «образами». Каждый «образ» является упорядоченной последовательностью литер. Средства для «без-форматного ввода — вывода» не являются частью базы языка СИМУЛА-67.
Средства языка, описывающие процессы ввода — вывода, вводятся посредством префиксов к блокам. В дальнейшем изложении такой набор средств будет описываться классом под названием BASICIO. Этот класс не может быть явно доступным для какой-либо программы пользователя. Программа действует так, как если бы она была заключена в следующие блоки:
BASICIO (и) begin
inspect SYSOUT do inspect SYS IN do (программа) end
где n есть целая константа, представляющая максимальную длину строки печатающего устройства, определяемую при конкретной реализации языка.
Ниже идентификаторы, напечатанные заглавными буквами, представляют величины, недоступные для программы пользователя.' Многоточие заменяет части алгоритмов или приведенные где-либо в другом месте данного изложения, или описанные неформально, или зависящие от реализации.
Ниже приводится общая организация класса BASICIO.
class BASICIO (LINELENGTH); integer LINELENGTH; begin ref (infile) SYSIN;
ref (infile) procedure sysin;
sysin : — SYSIN ;
ref (printfile) SYSOUT;
ref (printfile) procedure sysout;
sysout: — SYSOUT;
class FILE.................;
, FILE class	infile.........;
FILE class	outfile........;
FILE class directfile.......;
outfile class printfile   ..;
SYSIN:-new infile (’SYSIN’);
SYSOUT:-new printfile (’SYSOUT’);
SYS IN. open (blanks (80));
SYSOUT.open (blanks (LINELENGTH));
inner;
SYS IN. close;
SYSOUT. close;
end BASICIO;
Параметр LINELENGTH типа integer представляет определяемое реализацией количество литер в строке печатающего устройства.
Переменные SYSIN и SYSOUT представляют соответственно стандартное устройство ввода с перфокарт и стандартное выводное печатающее устройство. Программа может ссылаться на соответствующие объекты класса FILE при помощи sysin и sysout соответственно. Большинство атрибутов этих объектов непосредственно доступны в результате подразумеваемых присоединяющих операторов, охватывающих программу пользователя.
Файлы SYSIN и SYSOUT открываются и закрываются внутри BASICIO, т. е. вне самой программы-.
11.1.	КЛАСС FILE
11.1.1.	Определение
class FILE (NAME,......); value NAME; text NAME; ...
virtual: procedure open, close ;
begin text image;
Boolean OPEN;
procedure setpos (i); integer i;
image.setpos (z);
integer procedure pos; -
pos : = image. pos;
Boolean procedure more;
more : = image . more ;
integer procedure length;
length: = image. length;
end FILE ; '
11.1.2.	Семантика
Внутри программы объект какого-либо подкласса класса FILE служит для представления файла. Четыре подкласса класса FILE определены в самого языке:
 infile, представляющий последовательные файлы с операцией ввода (передачи данных из файла в программу);
outfile, представляющий последовательные файлы с операцией вывода (передачи данных из программы в файл);
directfile, представляющий адресные файлы с операциями и ввода, и вывода;
printfile (подкласс класса outfile), представляющий последовательные файлы с некоторыми возможностями управления печатающим устройством.
При конкретной реализации можно в произвольной степени ограничить использование этих классов в качестве префиксов к классам или префиксов к блокам. С другой, стороны, при конкретной реализации можно предусмотреть новые системные подклассы, которые могут быть определены в каждой частной системе. '
Каждый объект класса FILE имеет текстовый атрибут NAME, вызываемый по значению. Подразумевается, что это текстовое значение идентифицирует некоторый внешний файл, который тем или иным способом, определяемым реализацией, связывается с этим объектом класса FILE. Последствия появления нескольких объектов класса FILE, представляющих один и тот же (внешний) файл, определяются конкретной реализацией.
Текстовая переменная image служит для обозначения текстового значения, которое работает, как «буфер», в том смысле, что эта переменная содержит обрабатываемый в данный момент образ внешнего файла. В конкретной реализации можно потребовать, чтоб.ы переменная image в момент ввода или вывода ссылалась на целый текстовый объект.
Процедуры setpos, pos, more и length включены по соображениям удобства.
Файл может быть либо «открыт», либо «закрыт», что указывается значением переменной OPEN. Ввод или вывод образов может происходить только на открытом файле. Первоначально файл закрыт (за исключением SYSIN и SYSOUT, которые «с точки зрения программы» всегда открыты).
Процедуры open и close выполняют операции открытия и закрытия файла. Поскольку эти процедуры являются виртуальными величинами, их можно полностью .переопределить (на всех уровнях доступа) для объектов, принадлежащих к специальным подклассам -классов infile, outfile и т. д. Хотя эти процедуры определяются конкретной реализацией, они должны следовать следующей схеме:
procedure open (Г, ....); text Т; .... begin if OPEN then ERROR;
OPEN: = true;
image: — T;
setpos (1);
end open;
procedure close (...); .....
begin if “| OPEN then ERROR;
OPEN: = false;
image : — notext end close;
здесь многоточия обозначают возможные дополнительные параметры и операторы.
11.2.	класс infile
,11.2.1. Определение
FILE class infile; virtual: procedure endfile inimage;
begin procedure open ... ; begin ....; ENDFILE: = false;
inimage; ... end open;
procedure close.....;
Boolean ENDFILE;
Boolean procedure endfile ; endfile : = ENDFILE; procedure inimage; begin if endfile then ERROR; .........................; setpos (1) end ;
character procedure inchar;
begin if “] more then
begin if endfile then ERROR else inimage end;
inchar : = image . getchar
end inchar;
Boplean procedure lastitem;
begin lastitem  = false ;
L: if endfile then lastitem : = true else if inchar = then go to L else setpos (pos — 1) end lastitem;
integer procedure inint;
begin text T; if lastitem then ERROR;
T: — sub (pos, length — pos + 1);
inint: = T . getint;
setpos (pos + T . pos — 1) end inint;
real procedure inreal;.......;
integer procedure infrac;.......;
text procedure intext (u?); integer w ;
begin if pos + w — 1 > length then
begin if w > length then ERROR else inimage end
else if w < 0 then ERROR ; iritext: = sub (pos,w); setpos(pos + w)
end intext;
end infile;
11.2.2. Семантика
Объект класса infile служит для представления йоследо* вательно организованных входных файлов.
Процедура inimage передает (очередной) образ внешнего файла в текстовую переменную image. При выполнении процедуры выдается сообщение об ошибке, если в результате передачи image получает значение notext или не может вместить образ внешнего файла. Если же image может вместить
больше, чем (очередной) образ внешнего файла, то последний выравнивается влево, а оставшаяся часть поля переменной image заполняется пробелами. Указатель позиции становится равным единице.
Когда достигается конец файла, переменной image присваивается некоторое текстовое значение (определяемое реализацией), а переменная ENDFILE получает значение true. Обращение к процедуре inimage, когда ENDFILE имеет значение true, считается ошибкой.
Процедура open даёт переменной ENDFILE значение false и обращается один раз к процедуре inimage. В остальном она следует схеме, приведенной в разд. 11.1.2.
Процедура endfile' дает доступ к значению переменной ENDFILE.
Остальные процедуры обеспечивают механизмы для «по-литерного» ввода, позволяя трактовать файл как «непрерывную» последовательность литер с «указателем позиции» (pos) относительно первой литеры текущего образца.
Процедура inchar доставляет очередную литеру и продвигает указатель позиции на единицу.
Процедура lastitem вырабатывает значение true, если все литеры вплоть до конца файла (если таковые имеются) являются литерами пробела. Она может иметь побочный эффект, состоящий в том, что пропускается (просматривается) любое количество литер пробела.
Процедуры inreal и infrac определяются в терминах соответствующих процедур дередактирования «образа». В остальном определение каждой из этих двух процедур аналогично определению процедуры mint. Все эти три процедуры просматривают и преобразуют запись числа, содержащую первую отличную от пробела литеру и содержащуюся в одном образе, пропуская произвольное количество литер пробела вначале.
Выражение intext (и), где п есть целое число, не превышающее image. length, доставляет ссылку на первую последовательность из п литер, содержащихся в одном образе. Указатель позиции pos продвигается на следующую литеру.
Процедуры inchar и intext обе могут давать доступ к содержимому текстовой переменной image, соответствующему концу файла.
Пример:
Следующий фрагмент программы вводит матрицу столбец за столбцом. Подразумевается, что последовательные элементы разделены пробелами или содержатся в различных
образах. За последним элементом каждого столбца должна непосредственно следовать звездочка.
begin array n[l :n, integer i, j; procedure error; .... ;
for j : = 1 step 1* until m do
begin for i: = 1 step 1 until n — 1 do begin a [i, j]: = inreal;
if (if more then inchar =f= else false) then error
end;
a[n, fl:=inreal; if inchar #= then error;
fiext:end ; .... end
11.3	класс outfile
11.3.1.	Определение
FILE class outfile ; virtual: procedure outimage;
begin procedure open...........;
procedure close .... begin ___; if pos #= 1
then outimage;......end close;
procedure outimage ;
begin......; image: = notext; setpos (1)
' end outimage;
procedure outchar (c); character c; begin if ~] more then outimage ;
image . putchar (c) end outchar;
text procedure FIELD (w); integer w ;
begin if pos + w — 1 > length then
begin if w<0 then ERROR else outimage end
else if w<0 then ERROR;
FIELD : — image. sub (pos, w);
setpos (pos + w) end FIELD;
procedure outint (z, w); integer i, w;
FIELD (w)l. putint (z);
procedure outfix (r, n, w); real r; integer n, w;
FIELD (w).putfix (r, n);	,
procedure outreal (r, n, w); real r; integer n, w; FIELD (w). putreal (r, ,n);
procedure outfrac (z, n, w); integer z, n, w;
FIELD (w). putfrac (z‘, n);
procedure outtext (T); value T; text T; FIELD (T. length): = Г;
end outfile;
11.3.2.	Семантика
Объект класса outfile служит для представления последовательно организованного выходного файла.
Передача образа из^текста image в файл осуществляется процедурой outimage. В случае когда длина текста image не соответствует свойствам внешнего файла, эта процедура действует по правилам, определенным при реализации языка. После передачи текста процедура заполняет image пробелами и устанавливает индикатор позиции равным единице.
 Процедура close вызывает один раз процедуру outimage, если указатель позиции отличается от единицы. В остальном процедура действует по схеме, приведенной в разд. 11.1.2.
Процедура outchar трактует файл как непрерывный поток литер.
Остальные процедуры обеспечивают средства для «поэлементного» вывода. Каждый элемент редактируется в некоторый подтекст image, на первую литеру этого подтекста указывает указатель позиции текста image, а длина подтекста равна параметру w. Указатель позиции увеличивается на значение параметра w. Если элемент не умещается до конца текста image, то перед редактированием происходит обращение к процедуре outimage.
Процедуры outint, outreal и outfrac определяются в терминах соответствующих процедур редактирования, принадлежащих тексту image, и имеют дополнительный параметр типа integer, который указывает длину формируемого подтекста.
Для процедуры outtext размер элемента равен длине текстового параметра. Заметим, что этот параметр вызывается по значению, т. е. (строка) является возможным фактическим параметром для этой процедуры.
Пример  1:
Следующий фрагмент программы мог бы быть процедурой error для примера, приведенного в разд. 11.2.2.
procedure error; begin character с;
outtext (’столбец')- outint (/, 4);
setpos (pos — 1); c : = inchar ;
if c #= A c =# then outtext ('_засорен');
else outtext (’_имеет_слишком_много~элементов’)-,
if c =/=”*” then begin . sysout. setpos (sysout. pos — 15);
outtext (’лшло_’) end
else L: if inchar =/=„*“ then go to L; outimage; go to next end error;
ид. класс directfile
11.4.1.	Определение
FILE class directfile; virtual: procedure locate, endfile, inimage, outimage;
begin integer LOC;
integer procedure location; location: = LOC;
procedure locate (i); integer i;
begin...........;	LOC : = i end locate;
procedure open.......begin............; locate (1) end open;
procedure close......;
Boolean procedure endfile;.........;
procedure inimage;
begin if endfile then ERROR; _________; locate (LOC + 1);
setpos (1); end inimage; procedure outimage;
begin.........; locate (LOC + 1); image: = notext;
setpos (1) end outimage;
character procedure inchar.........;
Boolean procedure lastitem.........;
integer procedure inint............;
real procedure inreal..............;
integer procedure infrac...........;
text procedure intext..............;
procedure outchar..................;
text procedure FIELD...............;
procedure outint...................;
procedure outfix...................;
procedure outreal..................;
procedure outfrac..................;
procedure outtext..................;
end directfile;
11.4.2.	Семантика
Объект класса directfile служит для представления внешнего файла, в котором отдельные образы адресуемы порядковыми (целыми) числами — номерами,
Переменная LOC обычно содержит порядковый номер некоторого внешнего образа. Процедура location дает доступ к текущему значению переменной LOC. Процедура locate может быть использована для присваивания этой переменной данного значения. Присваивание может сопровождаться определенными в реализации проверками и командами обращения к устройству внешней памяти, соответствующему данному файлу.
Процедура open разыскивает первый образ файла. В остальном она следует схеме, приведенной в разд. 11.1.2.
Процедура endfile вырабатывает значение true тогда и только тогда, когда текущее значение переменной LOC не указывает ни на какой образ внешнего файла. Процедура определяется конкретной реализацией.
Процедура inimage передает в текст image копию внешнего образа, на который в данный момент указывает переменная LOC (если таковой образ имеется). Затем значение переменной LOC увеличивается на единицу процедурой locate. Если файл не содержит образа с порядковым номером, равным значению LOC, то действие процедуры inimage определяется реализацией языка. В остальном эта процедура аналогична процедуре из разд. 11.2.
Процедура outimage передает копию текстового значения -переменной image на внешний файл, добавляя тем самым к файлу еще один внешний образ, порядковый номер которого равен текущему значению переменной LOC. Если файл не вмещает передаваемого текстового значения в качестве внешнего образа, то выдается сообщение об ошибке. Если файл уже содержал некоторый образ с тем же самым порядковым номером, то такой образ уничтожается. Значение переменной LOC увеличивается на единицу процедурой locate. В остальном процедура outimage аналогична процедуре из разд. 11.3.
Другие процедуры класса directfile аналогичны соответствующим процедурам из разд. 11.2. и 11.3.
its. класс printfile
11.5.1.	Определение
outfile class printfile;
begin integer LINES PER PAGE, SPACING, LINE;
integer procedure line; line : = LINE; procedure lines per page (n); integer n;
begin....; LINES PER PAGE ; = n end;
procedure spacing (n); integer n;
begin......; SPACING : —n end ;
procedure eject (n); integer n;
begin if n^0An>LINES PER PAGE then ERROR;
.... ; LINE : = n end eject;
procedure open .... begin .... ; eject (1); .... end ;
procedure close .... begin .... ; if pos =# 1
then outimage end;
procedure outimage;
begin......;
image: = notext; setpos (1);
» LINE : = LINE + SPACING;
if LINE > LINES PER PAGE then eject (1) end;
LINES PER PAGE: =.........;
SPACING: = 1
end printfile;
11.5.2.	Семантика
Объект класса printfile служит для представления выходного файла, реализуемого печатающим устройством. Класс printfile является подклассом класса outfile. Переменная image в объекте класса printfile представляет строчку (является образом строчки) на печатной странице.
Переменная LINES PER PAGE указывает максимальное число физических строчек, которые могут быть напечатаны на каждой странице, включая пробельные строчки. В момент порождения объекта этой переменной присваивается определяемое реализацией значение. Для изменения этого значения можно воспользоваться процедурой lines per page.
Переменная SPACING указывает количество строк, пропускаемых между двумя последовательными операциями выдачи на печать. Переменная получает значение 1 в момент порождения объекта. Ее значение можно изменить посредством процедуры spacing. (В некоторой реализации эта процедура может иметь побочный эффект, состоящий в изменении значения переменной LINE.) Если переменная SPACING равна 0, то последовательные образы печатаются на одном и том же физическом месте (без протяжки бумаги).
Переменная LINE указывает порядковый номер строчки, подлежащей выдаче на печать, считая от начала текущей страницы. Значение этой переменной можно получить про, цедурой line,
Процедура eject служит для установки печатающего устройства на строчку, указываемую параметром п. Предусматриваются следующие.два случая:
1< и CLINE:
очередной образ будет напечатан на строчке номер п следующей страницы;
LINE < п < LINES PER PAGE:
очередной образ будет напечатан на строчке номер п текущей страницы.
Процедура outimage работает по правилам разд. 11.3. Кроме того, она обновляет переменную LINE и заставляет ее указывать на первую строчку следующей страницы, когда текущая страница оказывается заполненной.
Процедуры open и close следуют правилам разд. 11.1. Кроме того, процедура open устанавливает печатающее устройство на начало страницы, a close выдает текущее значение текста image, если pos отлична от единицы.
12.	СЛУЧАЙНЫЙ ВЫБОР
12.1.	ПОСЛЕДОВАТЕЛЬНОСТИ ПСЕВДОСЛУЧАЙНЫХ ЧИСЕЛ
Все. процедуры случайной выборки в языке СИМУЛА-67 используют один и тот же прием получения «главной выборки» из равномерного распределения на интервале (0,1).
Процедура главной выборки заменяет значение указанной целой переменной, скажем U, новым значением в соответствии с некоторым алгоритмом, определяемым в данной реализации языка. Например, для двоичных машин удобен следующий алгоритм:
Ui+i — остаток ((U{X б2^1) -ь 2"),
где L7i есть i-е значение переменной U. Можно показать, что если Йо — положительное нечетное число, то такими же будут и все Ui и последовательность Uo,- U\, U2, ..., периодическая с периодом 2"~2. (Младшие два бита значений U остаются неизменными, тогда как прочие пробегают все возможные комбинации.)
Вещественные числа = Ui X 2~п принадлежат интервалу (0,1). Последовательность 1ц, и2, ... называется последовательностью псевдослучайных чисел и (i='l, 2, ,..)
является t-м результатом главной выборки из последовательности U. Последовательность однозначно определяется начальным значением Uo, соответствующей целой переменной. Тем не менее она является «хорошим приближением» к настоящей последовательности случайных чисел.
12.2.	ПРОЦЕДУРЫ СЛУЧАЙНОГО ВЫБОРА
Каждая из перечисленных далее процедур осуществляет случайный выбор того или иного рода. Если явно не указано противного, выбор выполняется посредством одной процедуры Главной выборки, т. е. процедуры с побочным эффектом продвижения на один шаг по указанной последовательности псевдослучайных чисел. Для формальных параметров процедур случайного выбора в случае необходимости выполняется преобразование типа фактических параметров, кроме последнего фактического параметра, которым всегда должна быть ‘переменная типа integer, указывающая последовательность псевдослучайных чисел.
1.	'Boolean procedure draw (a, U)\ name U', real a; integer U;
Доставляет значение true с вероятностью а и значение false с вероятностью 1 — а. При a 1 всегда доставляет значение true, а при a^O всегда доставляет значение false.
2.	integer procedure randint (a, b, U); name I/; integer a, b, U;
Доставляет с равной вероятностью одно из целых значений: а, а 4- 1, b — 1, Ь. Предполагается, что Ь^ а-, при b < а выдается сообщение об ошибке.
3.	real procedure uniform (a, b, U); name U; real a, b; integer U-
. 'Доставляет значение, равномерно распределенное по полусегменту [а, Ь). При b <а выдается сообщение об ошибке.
4.	real procedure normal (a, b, U); name U; real a, b; integer U;
Доставляет значение, распределенное по нормальному закону со средним а и стандартным отклонением Ь. Применяется аппроксимационная формула для нормальной функции распределения *)•
’) См. Abramowitz М., St egun I. A. (ed), Handbook of Mathematical Functions, National Bureau of Standard. Applied Mathematics Series, Ns 55, стр. 952 и формула (26.2.23) на стр. 933.
5.	real procedure negexp (a, U); name U; real a; integer U; '
Доставляет значение, распределенное по экспоненциальному закону со средним l/а. Эго значение определяется по формуле —In (и) /а, где и получается процедурой главной выборки. Это совпадает с временем ожидания события при пуассоновском распределении числа наступлений события, если их среднее число в единицу времени равно а.
6.	integer procedure Poisson (a, U); name U; real a; integer U;
Доставляет значение, распределенное по закону Пуассона с параметром а. Это значение получается в результате (п + 1)-кратной главной выборки, доставляющей значения и0, и\, ип, где п определяется как наименьшее неотрицательное целое, для которого
•	п
i»0 t
Это п и является значением процедуры. Справедливость используемой формулы следует из эквивалентности ее с
п
2 — In (мг)/а> 1.
«=о
где в левой части стоит сумма «времен ожидания», распределенных по экспоненциальному закону. Если параметр больше, чем некоторая определенная при реализации граница, например больше чем 20.0, то искомое значение может быть аппроксимировано выражением entier (normal (a, sqrt (а), Д) + + 0.5) или нулем, если получается- отрицательное значение.
7.	real procedure Erlang (a, b, U); name U; integer U; real a, b ;
Доставляет значение, распределенное по закону Эрланга со' средним 1/а и стандартным отклонением 1/(а Это значение определяется при целом b в виде суммы
ь
~axb^ (3Десь ui ~ значения главной выборки), £ = 1
а при нецелом b — в виде
С
_ V1 In (Uj) _ (£> — с) In (»с+1)
Zu aXb aXb ’
«=1
где c — entier (b). И а и b должны быть положительными.
8.	integer procedure discrete (A, U); name U\ array A; integer U;	,
Одномерный массив А дополняется справа элементом, равным 1, и интерпретируется как интегральная функция распределения, аргументом которой является индекс. Массив А предполагается имеющим тип real. Доставляемое целочисленное значение лежит в пределах [нижнгр,, верхнгр + 1], где нижнгр и верхнгр суть нижняя и верхняя границы индекса массива А. Оно определяется как наименьшее i, для которого A [i] > и, где и есть значение главной выборки и А [верхнгр + + 1]= I-
9.	real procedure linear (Л, В, U)-, name V; array А, В \ integer U ;
Доставляемое значение распределено в соответствии с интегральной функцией распределения F, получающейся линейной интерполяцией из неравношаговой таблицы, определенной массивами А м В так, что A [i] = F(В [г]).
. Предполагается, что А и В суть одномерные вещественные массивы одинаковой длины, что первый и пос’ледний элементы массива А равны соответственно нулю и единице и что A[i] A[f], В[г] > Д[/] при i > /. Если какие-либо из этих условий не выполняются, результат процедуры зависит от конкретных способов реализации.
10.	integer procedure histd (Д, 17); name U; array Д; integer U;
Доставляет целочисленное значение в пределах [нижнгр, верхнгр], где нижнгр и верхнгр суть нижняя и верхняя границы индекса одномерного массива А. Этот массив интерпретируется как гистограмма, определяющая относительную частоту требующего значения индекса.
13.	СЛУЖЕБНЫЕ ПРОЦЕДУРЫ
Определена следующая процедура:
procedure histo (Д, В, с, dy, array Д, В ; real с, d;
Эта процедура обновляет гистограмму, определенную одномерными массивами Д и В в соответствии с наблюденным значением с с весом d. При этом Д [i] возрастает на d, где I есть наименьшее целое, удовлетворяющее неравенству с < <B[i]. Предполагается, что длина массива Д на единицу больше длины массива В. Последний элемент массива А отвечает наблюденным значениям, превосходящим все знйче-
ния В [t]. Процедура допускает параметры типов real и integer в любой комбинации.
Если условие, накладываемое на длины массивов ZI и В, не выполняется, то результат процедуры зависит от конкретных способов ее реализации.
14.	СИСТЕМНЫЕ КЛАССЫ
Имеется два системных класса:
class S1MSET ;.............;
и
SIMSET class SIMULATION ;...............;
Класс SIMSET вводит “средства для обработки списков, соответствующие понятию «набор» в языке СИМУЛА-1 [2]. Класс SIMULATION определяет средства, аналогичные понятию «процесс» и управлению, принятым в языке СИМУЛА-1. Оба эти класса можно использовать в качестве префиксов к классам или префиксов к блокам на любом блочном уровне программы. Такой префикс действует так, как если бы соответствующая декларация системного класса была частью начала блока минимального текстуально объемлющего блока. Конкретная реализация может ограничить количество блочных уровней в программе, на которых такие префиксы к блокам могут использоваться.
В следующих определениях идентификаторы, написанные заглавными буквами, за исключением SIMSET и SIMULATION, представляют величины, недоступные для пользователя. Многоточие заменяет части алгоритмов, приведенные где-либо в другом месте настоящего изложения.
14.1.	КЛАСС SIMSET
Класс SIMSET содержит средства обработки циклических двунаправленных списков, которые называются «наборами».
14.1.1.	Общая структура
14.1.1.1.	Определение
class SIMSET;
begin class linkage;....
linkage class head;....
linkage class link;....
end SIMSET; ,
14.1.1.2.	Семантика
Ссылочные переменные и процедуры, необходимые для манипулирования с наборами, вводятся в стандартных классах, декларированных внутри класса SIMSET. Используя эти классы в качестве префиксов, можно включать соответствующие данные и другие свойства в сами объекты.
Наборы и объекты, которые могут становиться членами наборов, должны иметь ссылки на преемника и предшественника, поэтому они сделаны объектами подклассов класса linkage.
Наборы представлены объектами, принадлежащими к подклассу head класса linkage. Объекты, которые могут быть членами наборов, принадлежат к подклассам класса link, который в свою очередь сам является другим подклассом класса linkage,
14.1.2.	Класс linkage
14.1.2.1.	Определение
class linkage;
begin ref (linkage) SUC , PRED ; ref (link) procedure sue;
sue: —if SUC in link then SUC
else none;
ref (link) procedure pred;
pred : — if PRED in link then PRED else none;
end linkage;
. 14.1.2.2. Семантика
Класс, linkage является общим названием и для «голов наборов» и для «членов наборов».
Переменная SUC является ссылкой на преемника (successor) данного объекта (класса linkage) в наборе, а переменная PRED является ссылкой на предшественника (predecessor). Значение ссылок SUC и PRED можно получить посредством процедур sue и pred. Эти процедуры доставляют значение попе, если указанный объект не может быть членом никакого набора (т. е. не принадлежит ни к классу link, ни к подклассу этого цласса).
Атрибуты SUC и PRED можно модифицировать только посредством процедур, определенных внутри классов link и
head. Это помогает пользователю избежать некоторых ошибок при программировании.
14.1.3.	Класс link
14.1.3.1.	Определение linkage class link;
begin procedure out;
if SUC = / = none then begin SUC. PRED : - PRED ; PRED . SUC : — SUC; SUC: - PRED:-none end out;
procedure follow (X); ref (linkage) X-, begin out;
if X = I = none then begin if X • SUC = / = none then begin PRED : — X;
SUC:—X.SUC;
SUC. PRED:- X. SUC: -this linkage end end end follow;
procedure precede (X); ref (linkage) X; begin out;
if X = I = none then begin if X. SUC = / = none then begin SUC : — X;
PRED:-X. PRED;
PRED. SUC : - X. PRED : -this linkage end end end precede;
procedure into (S); ref (head) S; begin out;
if S = / = none then begin SUC : — S;
PRED : — S. PRED ;
PRED.SUC:-S. PRED:-this linkage end "
end into; end link;
14.1.3.2.	Семантика
Объекты, принадлежащие к подклассам класса link, могут становиться членами наборов. В каждый данный момент объект может быть членом только одного набора.
В дополнение к процедурам sue и pred имеются еще' четыре процедуры, связанные с каждым объектом класса link: out, follow, precede и into.
Процедура out удаляет объект из набора, членом которого он является (если объект имеет членство в наборе). Если объект не состоит ни в каком наборе, то вызов процедуру out не влечет за собой никаких последствий.
Процедуры follow и precede удаляют объект из набора, членом которого он является (если объект имеет членство в наборе), и вставляют его в некоторый набор в указанную позицию. Набор и позиция задаются параметром типа ref (linkage). Если этот параметр имеет значение попе, или не имеет членства в наборе, или не является головой набора, то вызов процедур follow и precede имеет тот же эффект, что и вызов out (за исключением возможных последствий вычисления значения фактического параметра)’. В противном случае объект включается непосредственно «г вслед за» (follow’) или непосредственно «перед» (precede) тем объектом класса linkage, на который указывает параметр.
Процедура into, которая имеет параметр типа ref (head), удаляет объект из набора, членом которого он является ^если объект имеет членство в наборе), и включает его в качестве последнего члена в набор, указанный параметром. Если параметр есть попе, то вызов процедуры into имеет тот же эффект, что и вызов процедуры out (за исключением возможных последствий вычисления значения фактического параметра).
14.1.4.	Класс head
14.1.4.1.	Определение
linkage class head;
begin ref (link) procedure first; first: —sue; ref (link) procedure last;. last: —pred; Boolean procedure empty;
empty: = SUC = = this linkage; integer procedure cardinal;
begin integer I; ref (linkage) X;
X: — this linkage;
for X — X. sue while X = / = none
 r ' do I: = 1 + I ; > cardinal: = / end cardinal;
procedure clear;
begin ref (link) X;
for X: — first while X = / = none do
X. out end clear;
SUC: — PRED : — this linkage end head;
14.1.4.2.	Семантика
Объект класса head или подкласса класса head служит для представления набора. Объекты класса head не- могут становиться членами наборов. Таким образом, каждый набор имеет единственную «голову»'(head).
Процедуру first можно использовать для того, чтобы получить ссылку на первый член набора, а процедуру last — на последний.
Логическая процедура empty доставляет значение true, если набор не имеет членов.
Целая процедура cardinal может быть использована для подсчета количества членов в наборе.
Процедурой clear можно воспользоваться для удаления всех членов из набора.
Ссылки SUC и PRED первоначально указывают на саму «голову», которая, таким образом, представляет пустой набор.
14.2.	КЛАСС SIMULATION
Системный класс SIMULATION можно рассматривать как «пакет применений», предназначенный для решения задач моделирования. Он имеет в качестве префикса класс SIMSET и, таким образом, имеет непосредственный доступ к средствам для манипуляций с наборами.
Определение класса SIMULATION, данное ниже, является лишь одним из многих возможных способов организации этого класса. При реализации языка можно выбрать любую другую схему, эквивалентную этой с точки зрения программы пользователя.
В последующих разделах понятия, определенные в классе SIMULATION, будут разъяснены в связи с префикс-блоком,
префиксальная часть которого является экземпляром тела класса SIMULATION или некоторого его подкласса. Блок с префиксом действует как главная программа некоторой квазипараллельной системы, которая может представлять модель системы «с дискретными событиями».
14.2.1.	Общая структура
14.2.1.1.	Определение
SIMSET class SIMULATION;
begin link class EVENT NOTICE (EVTIME, PROC);
real EVTIME ; ref (process) PROC;
begin ref (EVENT NOTICE) procedure sue;'
sue: - if SUC is EVENT NOTICE then SUC else none; ref (EVENT NOTICE) procedure pred;
pred : — PRED;
procedure RANK (BEFORE); Boolean BEFORE;
begin ref (EVENT NOTICE) P;
P:- SQS. last;
for P: - P while P. EVTIME > EVTIME do
P : — P . pred;
if BEFORE then begin
for P: - P while P. EVTIME = EVTIME do P : — P. pred end;
follow (P)
end RANK;
end EVENT NOTICE;
link class process;
begin ref (EVENT NOTICE) EVENT;.........end
process;
ref (head) SQS;
ref (EVENT NOTICE) procedure FIRSTEV;
FIRSTEV: — SQS. first;
ref (process) procedure current;
current: - FIRSTEV. PROC ;
real procedure time; time : = FIRSTEV.EVTIME;
procedure hold.....;
procedure passivate....;
procedure wait.....;
procedure cancel...;
procedure terminate....;
procedure ACTIVATE.....;
procedure accum....;
process class MAIN PROGRAM.......;
ref (MAIN PROGRAM) main;
SQS : — new head;
main: — new MAIN PROGRAM;
main. EVENT:-new EVENT NOTICE (0, main);
main. EVENT. into (SQS)
end SIMULATION;
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;
ERROR end process;
14.2.2.2.	Семантика
Объект класса, имеющего process своим префиксом, будем называть объектом класса процесс или просто процессом. Процесс имеет свойства класса link; кроме того, он имеет возможность быть представленным в управляющем списке; далее, некоторые управляющие операторы могут манипулировать над процессом, изменяя его «состояние». Процесс может быть в одном из -четырех состояний: активном, приостановленном, пассивном или завершенном-.
При своем порождении процесс немедленно становится самостоятельным, ЛУ процесса устанавливается перед первым оператором его правила действий, задаваемого пользователем. Процесс остается самостоятельным все время своего существования.
Процедура idle имеет; значение true, если процесс в данный' момент не представлен в управляющем списке, такой процесс называется бездействующим (idle). Бездействующий процесс или пассивен, или завершен в зависимости от значения процедуры terminated (т. е. завершен). Бездействующий процесс пассивен, если его ЛУ находится на некотором префиксальном уровне, определенном пользователем. Когда ЛУ проходит через заключительный end части тела, определяемой пользователем, оно переходит к «заключительным операциям» на префиксальном уровне класса process, и значение процедуры terminated становится true — процесс «завершен». (Хотя состояние процесса «завершен» в только что определенном смысле не является строго эквивалентным соответствующему основному понятию, определенному в разд. 9, в некоторых вариантах реализации «завершенный» процесс можно трактовать как завершенный в строгом смысле слова.)
Процесс, представленный в данный момент в управляющем списке, называется «приостановленным», если он не представлен уведомлением в начале управляющего списка. В последнем, случае процесс активен. Системное время, на которое запланирована активная фаза приостановленного процесса, указывается атрибутом EVTIME в уведомлении, ссылающемся на данный процесс. Это значение времени можно получить при помощи процедуры evtime. Процедура nextev доставляет ссылку на процесс (если таковой имеется), представленный в управляющем списке следующим по порядку уведомлением.
14.2.3.	Операторы активации
14	.2.3.1. Синтаксис
(активатор):: = activate (reactivate
(активация)::=(активатор)(объектное выражение)
(простое указание времени):: = at (арифметическое
выражение) |
delay (арифметическое
выражение)
(указание времени) :: == (простое указание времени)|
(простое указание времени) prior (планирование):: = (пусто) | (указание времени) |
before (объектное выражение) |
after (объектное выражение) (оператор активации):: *= (активация) (планирование)
14	.2.3.2. Семантика
Применение оператора активации допустимо только по отношению к объектам подкласса класса SIMULATION, или внутри блока с префиксом, префиксальная часть которого является таким объектом.
Действие оператора активации определяется как обращение к управляющей процедуре ACTIVATE, локализованной в классе SIMULATION.
procedure ACTIVATE (REAC, X, CODE, T, Y, PRIOR); value CODE; ref (process) X,Y;
Boolean REAC,PRIOR;
text CODE ; real T;
Список фактических параметров определяется видом оператора активации в соответствии с ниже следующими правилами: -
1.	Фактический параметр, соответствующий параметру REAC, есть true, если активатор есть reactivate, в противном случае — false.
2.	Фактическим параметром, соответствующим параметру X, является объектное выражение, которым заканчивается активация.
3.	Фактическим параметром, соответствующим параметру Т, является арифметическое выражение, которым заканчивается простое указание времени, е,сли указание имеется; в противном случае фактический параметр равен нулю.
4.	Фактический параметр, соответствующий параметру PRIOR, есть true, если указание времени заканчивается символом prior; в противном случае — false.
5.	Фактическим параметром, соответствующим параметру Y, является объектное выражение, которым заканчивается планирование, если такое объектное выражение имеется; в противном случае фактическим параметром является попе.
6.	Фактический параметр, соответствующий "параметру CODE, определяется видом конструкции планирование:
^конструкция планирование) (пусто)
at (арифметическое выражение) delay (арифметическое выражение) before (объектное выражение) after (объектное выражение)
(фактический параметр) ’direct’
’at’ ’delay’ ’before’ ’after’
14.2.4.	Управляющие процедуры
14.2.4.1.	Определение
procedure hold (Г); real T;
inspect FIRSTEV do
begin if T>0 then EVTIME : = EVTIME + T; if sue = / = none then
begin if sue. 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;
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.X); 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 A PRIOR then go to DIRECT; EVENT:-new EVENT NOTICE (T ,X);
EVENT.RANK (PRIOR)
end at
else if (if Y = = none then true else Y. EVENT = = none) then EVENT: — none else
begin EVENT:-new EVENT NOTICE (У. EVENT. EVTIME,X);
if CODE =’before’ then EVENT.precede (У. EVENT) else EVENT.follow (У. 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;
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 и включении его в управляющий список. Тип планирования определяется конструкцией планирование.
Пустое планирование означает «непосредственную» активацию, при ,.которой активная фаза процесса X начинается немедленно. Уведомление вставляется  в УС на первое место, перед уведомлением, ссылающимся на активный процесс, и процесс X становится активным. Системное время не меняется. Процесс, бывший активным, становится приостановленным.
Указание времени служит для указания времени планируемого события. Конструкция delay Т, где Т — арифметическое выражение, эквивалентна конструкции at time + Т. Новое уведомление вставляется' в управляющий список на место, определяемое указанным планируемым временем. При отсутствии символа prior в указании времени уведомление вставляется непосредственно вслед за последним уведомлением с непревосходящими значениями EVTIME. Если же в указании времени имеется символ prior, то уведомление вставляется непосредственно перед первым уведомлением е неменьшим значением EVTIME.
. Пусть Y есть ссылка на активный или приостановленный процесс. Тогда, если планирование имеет вид before Y, новое уведомление вставляется непосредственно перед уведомлением для процесса Y, а если планирование имеет вид after У, то непосредственно вслед за уведомлением для процесса У. Порожденное уведомление получает то же системное время, что и У. Если У не является активным или приостановленным процессом, то никакой активной фазы запланировано не будет.
Пример:
Операторы
activate X; activate X before current;
activate,X delay 0 prior; activate X at time prior;
эквивалентны. Все они вызывают непосредственную активацию. Оператор
reactivate current delay Т
эквивалентен оператору 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 a, b, c,d}
begin а : = а + с X (time — b);
b: = time; с: — с + d end accum;
14.2.6.2.	Семантика
Оператор вида accum (А, В, С, D) можно использовать для того, чтобы накапливать интеграл по системному времени от переменной С, которая считается ступенчатой функцией системного времени. Значение интеграла накапливается в переменной А. Переменная В содержит то значение системного времени, когда Л и С в последний раз изменяли свое значение. Переменная D задает текущее приращение функции С.
15.	РАЗДЕЛЬНАЯ КОМПИЛЯЦИЯ
Если некоторая конкретная реализация языка допускает раздельную (независимую) компиляцию деклараций процедур и классов, заданных пользователем, то программа должна
иметь средства обращаться к таким декларациям (являю-щимся внешними по отношению к программе).
Рекомендуются следующие дополнительные декларации в качестве необязательной части базы языка.
15.1.	СИНТАКСИС
(внешняя величина):: = (внешний идентификатор) | (идентификатор) — (внешний
идентификатор)
(список внешних)!:	= (внешняя величина) |
(список внешних), (внешняя
величина)
(внешняя декларация) :: —	1
external procedure (список внешних) |
external (тип) procedure (список внешних) | external class (список внешних)
15.2.	СЕМАНТИКА
.Внешний идентификатор идентифицирует для «операционной системы» отдельно скомпилированную декларацию. Внешняя величина вводит для такой декларации некоторый локальный идентификатор. Локальный идентификатор может быть либо тождествен, либо равен соответствующему внешнему идентификатору. В последнем случае используется знак равенства.
Внешняя декларация является представителем всех раздельно скомпилированных деклараций процедур или классов, указанных в ее списке внешних.
В каждой копии такой отдельно скомпилированной декларации все вхождения исходных идентификаторов процедур и классов заменяются новыми заданными «локальными» идентификаторами.
16.	ОГРАНИЧЕНИЯ БАЗЫ ЯЗЫКА
База языка СИМУЛА-67 имеет следующие языковые ограничения:
1)	системные процедуры нельзя передавать в качестве параметров;
2)	. по наименованию могут вызываться лишь параметры со спецификатором (тип);
3)	оператор арифметического присваивания должен подчиняться правилам языка АЛГОЛ-60.
Ограничение 1 может быть полезно для того, чтобы получить максимальную эффективность при реализации системных процедур. Ограничения 2 и 3 могут упростить расширение существующих реализаций языка АЛГОЛ-60.
ЛИТЕРАТУРА
1]	Naur Р. (ed.), Revised Report on the Algorithmic Language ALGOL 60; русский перевод: Алгоритмический язык АЛГОЛ-60. Пересмотренное сообщение, изд-во «Мир», М., 1965.
2]	Dahl O.-J., Nygaard К., SIMULA — A Language for Programming and Description of Discrete Event Systems. Introduction and User’s Manual. Norwegian Computing Center, Oslo, 1966; русский перевод в сб. Алгоритмы и алгоритмические языки, Вып. 2, ВЦ АН СССР, М., 1967.
[3	] Н о а г е С. A. R., Record Handling. Lectures delivered at the NATO Summer School, Villard-de-Lans, Academic Press, 1966.
NORWEGIAN COMPUTING CENTER
PUBLICATION No, S-2
SIMULA 67
Common Base Language
by
Ole-Johan Dahl, Bjorn Myhrhaug and Kristen Nygaard
Oslo
1968
У .-И. ДАЛ, Б. МЮРХАУГ, К. ИЮГОРД
СИМУЛА 67ч
УНИВЕРСАЛЬНЫЙ ЯЗЫК ПРОГРАММИРОВАНИЯ
Перевод с английского
К. С. Кузьмина и Е. И. Яковлева
ИЗДАТЕЛЬСТВО „МЦ1,£ МОСКВА
УДК 681.142.2
Брошюра содержит последнее (составленное летом 1968 г.Ц развернутое описание новейшего универсального алгоритмиче-яского языка СИМУЛА-67, языка, весьма перспективного и уже получившего широкое распространение в ряде европейских' стран и в США. Этот язык представляет собой обобщение вариантов широко известного языка АЛГОЛ-60, дополненного операторами, описывающими широкий класс алгоритмов принятия решения. Язык СИМУЛА-67 предназначен для модели-‘рования сложных систем на электронных вычислительных машинах.
Книга, несомненно, представит большой интерес для программистов, математиков, работников учебных и научных учреждений и вычислительных центров, студентов самых различных специальностей, а также для всех, сталкивающихся в своей работе с вычислительными машинами, вопросами автоматического программирования и алгоритмическими языками.
Редакция литературы по математическим наукам
Инд. 2-2-3 &3 № 23-1969-№ §