<<< BACK NEXT >>>

КОМПИЛЯЦИЯ ПРОГРАММ И МАШИНА ЯЗЫКА

   Представляемая реализация CAPER для сред имеет как возможность компиляции исходного текста программы и немедленного выполнения, так и компиляции и создания файла объектного кода CAPER. Компиляция программ на CAPER завершается созданием листинга. Однако, если осуществляется динамическая компиляция, т.е. компиляция исходного текста с целью запуска в процессе работы некоей задачи, то создание листинга может быть подавлено и включен режим внутреннего программного прерывания при возникновении ошибок. Это позволяет динамически исправлять исходный текст и корректировать создание исполнимого кода. Как правило, компилятор создает, по возможности, "разумный" код при ошибках, и вы вполне можете пустить на выполнение такой код, однако ошибки редко бывают настолько несущественными, чтобы не повлиять на ход вычисления, как правило, они приводят к внутренним ошибкам в процессе выполнения. Однако и здесь вы можете проанализировать ошибку и внести коррективы в ход вычисления. В этом смысле, идеология и базовая организация CAPER ориентирована на максимальную устойчивость и сохранение жизнеспособности вычислительного процесса.
   В основе машины языка лежит т.н. виртуальный трехадресный процессор (трехадресная машина), который обладает системой внутренних команд. Конструкции исходного кода компилируются в комплексы команд именно этого процессора.
   Виртуальный процессор обладает внутренней системой прерываний, в том числе
   - подсистемой программных прерываний;
   - подсистемой прерываний динамической компиляции,позволяющихобрабатывать ошибки компиляции;
   - подсистемой программно-событийных асинхронных прерываний;
   - подсистемой прерываний от операционной системы.
   Заметим, что наиболее стабильными в смысле интерпретации будут оставаться все подсистемы прерываний, кроме прерываний от операционной системы - компоненты, наиболее подверженной свойствам конкретной ОС. Далее средства взаимодействия с операционной системой будут описаны для сред, базирующихся на Win32.
   Отмечу, что в перспективе не исключено появление версии CAPER, решенной на базе системы виртуальных процессоров (отчасти, это есть и в данной версии,однако выражено и исполнено это не достаточно прозрачно, скорее это
виртуальные "полупроцессоры" обработки событий и управления параллелизмом).
   Параллелизм вычислений рассматривается в двух ипостасях: концептуальной и
интерпретируемой, т.е. речь идет о применяемых принципах параллельных вычислений и их конкретной реализации, зависящей от архитектуры вычислительной установки. Что касается концептуального начала, то здесь различаем собственно архитектуры (схемы) параллельных вычислений и способы их инициации/терминирования. Что касается архитектур, то Caper обеспечивается средствами программирования всех архитектур по Флинну (Flynn []): SPSD, SPMD, MPSD, MPMD. Процессы инициации/терминирования поддержаны
- асинхронной схемой, по которой инициация и исполнение нескольких параллельных процессов без приостановки инициирующего, при этом параллельно исполняемые процессы равноправны, самостоятельны, могут порождать новые
процессы; в целом такой процесс может быть прерван любым из исполняемых процессов, либо же переведен в режим остановки с последующим восстановлением режима выполнения, либо в режим ожидания синхронизации - естественного
завершения всех запущенных параллельно процедур;
- синхронной схемой, которая отличается от асинхронной тем, что инициирующий процесс приостанавливается на время исполнения параллельных процессов, управление в любом случае после завершения параллельных процессов перейдет к
    инициировавшему;

   С точки же зрения интерпретации принципов параллелизма реализована псевдопараллельная схема для днопроцессорной машины.
   Псевдопараллельное выполнение процедур заключается в принципе покомандного исполнении каждого блока. Этот принцип был введен уже в первой версии языка, здесь же он получил свое развитие. Данный принцип заключается в том, что фиксируется список параллельно запускаемых блоков, после чего машина языка после выполнения очередной команды или группы команд фиксированного блока переключается на очередную команду или группу команд из следующего блока списка. Такой блок становится текущим, его команда – текущей для виртуального процессора. Т.е. если список выполняемых блоков состоит из

   block1, block2, ... , blockn.

то для каждого блока фиксирован индекс Ji - номер элемента массива(команда), который должен быть выполнен. Процедура же такова: в списке фиксируется очередной блок (с номером i), выбирается и реализуется blocki[Ji].
   Список параллельно запущенных боков может быть изменен в любой момент времени подстартовкой новых параллельных блоков или принудительным (помимо естественного) завершением отдельных или всех процессов.
   Кроме покомандного параллелизма может быть использовано квантование времени, позволяющее регулировать использование процессоров в случаях, когда количество запущенных параллельно процедур превышает количество вычислительных средств - процессоров и/или машин; здесь используется правило предоставления ресурсов на конечное время (квант времени).
   Все параллельно запущенные блоки имеют собственное состояние, соответственно,их выполнение может регулироваться установкой определенных состояний. Подробнее об этом ниже.
   Кроме перечисленных возможностей Caper обеспечивает возможности прямого регулирования распределением процессов по процессорам/вычислительным машинам.

   Виртуальная машина языка имеет три режима функционирования. Режим машины устанавливается с помощью инструкций:

   SET MACHINE PRIMARY – виртуальная машина первична по отношению к операционной системе в том смысле, что у виртуальной машины приоритет в регулировании ходом выполнения программы. Данный режим устанавливается по умолчанию.

   SET MACHINE SECONDARY - виртуальная машина отдает возможность регулирования ходом выполнения программы операционной системе. Фактически, программа на Caper “засыпает” до возникновения любого сигнала к ней со стороны ОС.

   SET MACHINE SOLO – виртуальная машина монополизирует ресурсы вычислителя (в первую очередь – процессора), блокируя, по возможности, любое вмешательство ОС в ее работу.
   Данные команды дублируются функцией ВМ

   SetMachineReg( <состояние> ), где состояние задается числом:

   0 – режим Primary;
   1 – режим Secondary;
   2 – режим Solo.
  
SetMachineReg возвращает число – индикатор предыдущего режима.

   GetMachineReg() возвращает число – индикатор текущего режима.

<<< BACK NEXT >>>