
204 Глава 3. Процессы
содержатся глобальные системные переменные, в которых хранятся коды оши-
бок, строки с сообщениями об ошибках, коды результатов, строки сообщений,
выводимые вместе с результатами и т. п. Имеется также отдельная таблица, в ко-
торой хранятся все определенные пользователем глобальные переменные про-
граммы. И наконец, в отдельной таблице хранятся определения процедур, свя-
занных с агентами. Эти определения процедур нуждаются в переносе вместе
с агентами для выбора интерпретатора на целевой машине.
Более интересная часть, напрямую связанная с переносом агентов,
—
два сте-
ка, в которых хранится истинное состояние выполнения агента. В основе каждо-
го агента лежит набор команд Тс1, возможно, встроенных в конструкции, такие
как циклы, инструкцрш множественного выбора и т. д. Кроме того, команды мо-
гут быть сгруппрфованы в процедуры. Как это происходит во всех интерпрети-
руемых языках, агент выполняется команда за командой.
Сначала рассмотрим, что происходит при выполнении базовой команды Тс1,
то есть команды, которая вызывается не из пользовательской процедуры. Интер-
претатор анализирует команду и строит запись, помещаемую в то, что мы назы-
ваем
стеком
команд
(command
stack).
Эта запись содержит все необходимые для
выполнения команды поля, как
то:
значения параметров, указатель на процедуру
реализации команды и т. п. Запись помещается в стек, после чего может быть ис-
пользована компонентом, отвечающим за выполнение команды. Другими слова-
ми,
стек команд представляет собой место хранения текущего состояния выполне-
ния агента.
Тс1
также поддерживает определяемые пользователем процедуры. Кроме стека
команд среда исполнения D'Agent отслеживает стек записей активизации, также
называемых фреймами вызова. Фрейм вызова в D'Agent содержит таблицу пере-
менных, локальных для процедуры, а также имена и значения параметров, с ко-
торыми эта процедура была вызвана. Фрейм вызова создается только в результате
вызова процедуры и относится к команде вызова процедуры, помещенной в стек
команд. Фрейм вызова содержит ссылку на связанную с ним команду.
Рассмотрим теперь, что происходит, например, когда агент вызывает команду
agent_jump, при помощи которой он переносится на другую машину. В этот мо-
мент полное состояние агента, описанное выше, подвергается маршалингу и пре-
вращается в последовательность байтов. Другими словами, все четыре таблицы
и два стека укладываются в массив байтов и пересылаются на другую машину.
Сервер D'Agent на целевой машине создает новый процесс, запуская интерпре-
татор Тс1. Процесс обрабатывает полученные данные, выполняет их демарша-
линг и в результате получает состояние агента, в котором он Р1аходился перед
вызовом команды agent_jump. Выполнение агента продолжается путем простого
снятия с вершины стека команд очередной команды.
3.5. Программные агенты
Теперь мы рассмотрим процессы под несколько другим углом. Сначала мы сосре-
доточимся на одном из ключевых вопросов, управляющих потоках выполнения