М.М. ГОРБУНОВ-ПОСАДОВ - Системное обеспечение пакетов прикладных программ (1184225), страница 21
Текст из файла (страница 21)
Списокможет быть продолжен с помощью предложений MODULE.Формируется задача, которая переписывает на сбойные зоны Крабатексты модулей в том порядке, в котором они перечислены в пункте CRAB.3.8. Сборка и запуск расчетного вариантаЦентральным звеном системы Сафра является операция EXECUTE,предназначенная для сборки из хранящихся в архиве модулей конкретногорасчетного варианта программы и передачи его на выполнение.
Напомним,что для определения расчетного варианта необходимо задать соответствиямежду функциональными именами гнезд каркаса программы и архивнымиименами модулей, которые требуется подставить на их место в данномрасчете.Проиллюстрируем схему формирования расчетного варианта наследующем примере (рис.3.1). Пусть на базе имеющегося программногофонда требуется построить программу,осуществляющую десятиминутный расчет по методу Эйлера в сферическойгеометрии. Иначе говоря, в каркасе программы имеются гнезда, отвечающиеза метод расчета (РАСЧЕТ), геометрию (ГЕОМ), в которой производитсярасчет, и за время проведения расчета (ВРЕМЯ). Для каждого из этих гнездимеется несколько реализации, из которых надлежит выбрать компонентыформируемой программы в соответствии с требованиями задачи.
В данномслучае это можно сделать с помощью пункта EXECUTE, в теле которогосодержатся указания о заполнении гнезд каркаса:+EXECUTEMATCH МЕТОД = ЭЙЛЕРMATCH ГЕОМ = СФЕРАMATCH ВРЕМЯ = МИН10На основе этой информации Сафра сформирует (см. рис.3.1) и запустит насчет необходимый вариант программы.Рассмотрим теперь используемые здесь механизмы более подробно.Предложение INSERT, уже упоминавшееся в п.
3.1, является одним изосновных средств конструирования модульной структуры при работе ссистемой Сафра. Приняв решение об оформлении некоторой части своейзадачи в виде модуля типа вставка (MACRO), пользователь определяетфункциональное имя этого модуля, создает одну или несколько реализацииданного модуля, записывает их в архив под уникальными архивнымиименами, и, наконец, вместо текста выделенного модуля в соответствующихему местах программ(или задания) записывает предложение INSERT. Предложение INSERTимеет вид<признак> INSERT <функциональное имя>где <признак> - признак управляющего предложения; <функциональноеимя> - имя, присвоенное выделенному модулю (гнезду каркаса) прифункциональноймодуляризации,котороепредставляетсобойидентификатор, состоящий не более чем из шести символов.Предложения INSERT записываются в архив наряду с остальнымипредложениями текста модуля и воспроизводятся при последующихраспечатках, но при сборке расчетного варианта они заменяются текстамиархивных модулей.
В пункте EXECUTE любому функциональному имени,записанному в предложении INSERT, может быть поставлено в соответствие некоторое архивное имя модуля, текст которого будетподставляться в этом случае на место предложения INSERT. Если же такоесоответствие не задано, выполняется подстановка текста модуля сархивным именем, совпадающим с функциональным именем, записанным впредложении INSERT.Приведем пример использования предложения INSERT.
Пусть привыполнении функциональной модуляризации принято решение овыделении в качестве модуля COMMON-блока с именем COMMAR. В этомслучае использующая указанный COMMON-блок программа SOLVE,имеющая видSUBROUTINE SOLVECOMMON /COMMAR/1 N,AMAX,AMIN2 ,RF(300),F(200)PRINT 1 N,RF(1),RF(N). . . . . . . . . . . . . .
.ENDзаписывается в архив следующим образом:+STORE PRUNIT:НЬЮТОНSUBROUTINE SOLVE+INSERT COHHARPRINT 1 N,RF(1),RF(N). . . . . . . . . . . . . . .ENDВ результате выполнения этого пункта STORE в архив запишется подименем НЬЮТОН подпрограмма SOLVE, в текстекоторой вместо предложений, соответствующих описанию COMMONблока COMMAR записано предложение INSERT. В подобном же видезаписываются в архив и остальные использующие COMMAR модули. Текстописания COMMON-блока записывается в архив в виде модуля типавставка (MACRO):+STORE СОMMАRCOMMON /COMMAR/1 N,AMAX,AMIN2 ,RF(300),F(200)Результатом такой организации использования COMMAR, помимоэкономии записи, является существенное облегчение внесения изменений вописание блока.
Дело в том, что подстановка текста модуля COMMARпроизводится только в момент сборки расчетного варианта. Поэтомувнесение изменения в текст COMMAR изменяет фактически все текстыиспользующих его модулей, компенсируя тем самым известную слабостьязыка Фортран.Кроме того, допустимо сосуществование в архиве несколькихразличных вариантов блока COMMAR.
Каждый вариант должен бытьзаписан в архив под своим уникальным именем, например+STORE NEWCOMCOMMON /COMMAR/1 N,AMAX,AMIN2 ,RF(300),F(200)3 ,TAUПри составлении расчетного варианта задачи можно указать(посредством описываемого ниже МАТСН-предложения), какой именновариант реализации блока COMMAR следует использовать. Таким образом,имеется возможность накапливать в архиве различные реализацииотдельных частей программ, методов расчета и т.д. и оперативнокомпоновать из этих частей посредством операции EXECUTE готовыерасчетные программы.Пункт EXECUTE имеет заголовок следующего вида<признак> EXECUTEТело пункта может содержать МАТСН-предложения вида HATCH<функциональное имя> = <архивное имя>где <функциональное имя> - имя гнезда каркаса собираемой программы;<архивное имя> - архивное имя модуля, реализующего соответствующуюфункциональную часть в данном расчете.Кроме МАТСН-предложений тело пункта EXECUTE может содержатьссылки на модули типа вариант (VARIANT), записываемые в формепредложений INSERT.
Модуль типа вариант представляет собой группуМАТСН-предложений, а ссылка на него в пункте EXECUTE означает, чтовся эта группа будет участвовать в формировании варианта.Если сборка расчетного варианта заканчивается успешно, на листингезадания печатается соответствующее сообщение, например+++++ СФОРМИРОВАНА ЗАДАЧА ШИФР 031101000000Перейдем теперь к описанию механизма сборки расчетного варианта.Расчетные задачи, формируемые Сафрой, работают на ЭВМ БЭСМ-6 врамках операционной системы Диспак и мониторной системы Дубна.
Этообстоятельство предопределило принятие соглашения, в соответствии скоторым любой расчетный вариант составляется из двух функциональныхчастей: ДИСПАК - паспорт задачи для операционной системы, ДУБНА задание для мониторной системы Дубна. Другими словами, текст любойрасчетной задачи представляет собой результат расширения конструкциивида+INSERT ДИСПАК+INSERT ДУБНАРассмотрим сначала формальный механизм генерации текста, а затемперейдем к описанию содержания каждой из упомянутых частей.
В основемеханизма генерации текста расчетной задачи лежит следующий алгоритмрасширения предложения INSERT.Шаг 1. Определяется архивное имя, соответствующее функциональномуимени, записанному в предложении INSERT. Если в теле пункта EXECUTE(с учетом всех упомянутых в нем модулей типа вариант) отсутствуютМАТСН-предложения с данным функциональным именем в левой части, вкачестве архивного имени берется функциональное имя. Если такиеМАТСН-предложения есть, среди них выбирается последнее и в качествеархивного имени берется архивное имя, записанное в его правой части.Шаг 2.
Предложения текста модуля с определенным на шаге 1 архивнымименем просматриваются одно за другим и обрабатываются следующимобразом:1) С-предложения (комментарии - см.п.3.6) игнорируются;2) предложения INSERT расширяются согласно описываемомуалгоритму;3) из S-предложеиий (см.п.3.7) в генерируемый текст задачизаписывается только содержащийся в них <произвольный текст>;4) остальные предложения переписываются в генерируемый текст безизменений.Теперь можно определить, каким образом собирается расчетныйвариант, состоящий, как уже упоминалось, из функциональных частейДИСПАК и ДУБНА.Часть ДИСПАК имеет обычно довольно простую структуру, посколькувключает в себя только разделы паспорта ОС Диспак. К ним добавляется(системой) заказ магнитного носителя, на котором расположен архив Сафры.Часть Дубна представляет собой задание для мониторной системыДубна.
С помощью пункта EXECUTE, вообще говоря, можно сформироватьчасть ДУБНА произвольного вида. Однако если в формируемой задачепредполагаетсяиспользоватьмеханизм автоматизациипроцессовтрансляции, то задание для мониторной системы должно иметь вид*NAME .......................*PERSO:62060,CONT*CALL TEMPO....................*EXECUTE..........*END FILEСсылки на программные единицы,входящие в каркас.Вызов программы связис архивом Сафры.Предложения *CALL FICMEMORY,*MAIN ... и др.Начальные данные расчета.В результате выполнения такого задания сначала во временную библиотекумониторной системы записываются объектные модули, соответствующиевсем участвующим в расчете программным единицам, а затем производятсясборка и выполнение программы.Отметим, что текст, соответствующий исходным данным, используемымв расчетной задаче, также формируется из текстов архивных модулей.
Как илюбая другая часть задания, исходные данные могут обладать достаточносложной организацией, основанной на использовании предложе-ний INSERT. В этом случае к ним применим весь аппарат функциональных иархивных имен.Программные единицы (PRUNIT). Подобные схемы задания длямониторной системы обычно используются при решении вычислительныхзадач. Основная особенность работы по приведенной схеме в системе Сафразаключается в том, что, хотя между предложениями *NAME и*PERSO:62060,CONT должны быть так или иначе упомянуты всеиспользуемые в данном расчете программные единицы, транслироватьсябудут лишь те из них, которые не транслировались ни в одном извыполнявшихся ранее заданий или же подвергались редактированию послетрансляции. Тексты транслировавшихся ранее программных единиц пригенерации части ДУБНА исключаются из задания, а из архива Сафрывыбираются соответствующие им объектные модули и с помощьюпрограммы TEMPO, вызываемой предложением *CALL TEMPO, переписываются во временную библиотеку мониторной системы.
Эта же программазаписывает в архив Сафры объектные модули, соответствующиетранслируемым в данном задании программным единицам.Исключение из задания для мониторной системы текстов транслировавшихся ранее программных единиц происходит перед шагом 2 описанноговыше алгоритма расширения предложений INSERT. Для каждого архивногомодуля, участвующего в генерации задачи, прежде всего проверяется его тип.Если тип модуля - допускающая автономную трансляцию программнаяединица (PRUNIT), то сначала в архиве Сафры ищется соответствующий ейобъектный модуль.
Если модуль найден, предложению INSERT,содержащему функциональное имя программной единицы, будетсоответствовать пустое расширение, а в формируемую задачу будет переданосообщение о необходимости дозаписи из архива Сафры во временнуюбиблиотеку Дубны соответствующего объектного модуля.Итак, пользователь, желающий поручить Сафре хлопоты, связанные схранением и использованием объектных модулей, должен все входящие в егорасчеты программные единицы оформлять в виде модулей типа PRUNIT.Такие модули должны представлять собой готовые фрагменты задания длясистемы Дубна, т.е.