Cтраница 2
Язык директив представляет собой фиксированный набор лексем естественного языка, жестко связанных с последовательностью вызываемых модулей. Языки директив предполагают знание пользователем некоторого набора команд управления: системой. Они обладают такими преимуществами, как информативностью, выражаемой в совпадении мнемоники с названиями выполняемых действий; лаконичностью, достигаемой за счет мнемоники директивных предписаний; коммутативностью, подразумевающей подробную диагностику и выдачу подсказок. Среди недостатков этих языков следует отметить отсутствие достаточной гибкости при описании многофункциональной системы с большим числом различных программных модулей, а также сложность изучения при большом числе директив. [16]
В окне просмотра Data ( см. рис. 16.5) модуль показан с вызывающими и вызываемыми модулями. Здесь вся информация, с которой работает модуль, сосредоточена вокруг базы данных. Основными элементами являются таблицы и столбцы, используемые модулем, и связи между таблицами. [17]
В регистре 15 должен быть оставлен код возврата, если ой был сформирован в вызываемом модуле. Поскольку правила формирования этого кода определяются по соглашениям между модулями, мы на этом вопросе останавливаться не будем. [18]
По принятым соглашениям в третье слово области сохранения вызывающего модуля заносится ссылка на область сохранения вызываемого модуля. Тем самым третьи слова областей сохранения образуют вторую цепочку, по которой также можно просмотреть области сохранения, задействованные при выполнении последовательности модулей. При этом вторая цепочка позволяет двигаться по областям сохранения в обратном порядке по сравнению с первой цепочкой. Таким образом, области сохранения модулей связываются в двунаправленный список, что полезно для организации аварийных выдач. [19]
Два модуля сцеплены по данным, если один вызывает другой и все входные и выходные параметры вызываемого модуля - простые ( не структурные) элементы данных. Предположим, что функция модуля В из предыдущего примера - надпечатать конверт для служащего. [20]
Информация, находящаяся в регистрах вызывающего модуля при вызове, должна быть сохранена на период выполнения вызываемого модуля и восстановлена при возврате управления в вызывающий модуль. Сохранение регистров может осуществлять как вызывающий, так и вызываемый модуль, однако принятое соглашение должно соблюдаться при всех вызовах модулей. [21]
Такое решение проблемы часто не дает положительных результатов, так как выходные параметры, значения которых рассчитываются в вызываемом модуле, обычно ярт ляются функцией его входных параметров, и значения результатов вычислений влияют на дальнейший ход работы вызывающего модуля. [22]
В библиотеке содержатся условия вызова всех участков, поэтому выполняется автоматическая трансляция всех модулей, к которым имеется обращение из непосредственно вызываемого модуля. Условия вызова получаются на основе анализа структурных схем программных пакетов. [23]
Заметим, что содержимое регистра 13 в области сохранения вызывающего модуля не запоминается, поскольку единственное назначение этого регистра состоит в передаче адреса области сохранения вызываемому модулю. Поэтому содержимое регистра 13 запоминается. Таким образом, вторые слова областей сохранения образуют цепочку ( список), с помощью которой можно просмотреть области сохранения, задействованные при выполнении последовательности модулей, что может оказаться полезным при отладке. [24]
В описание модуля входят свойства модуля, его компонентов, табличных способов использования и связанных элементов, а также характеристики размещения компонентов модуля ( например, новая канва или прежняя канва), окна, вызываемые модули и другие сведения, имеющие отношение к этому модулю. Большая часть всех операций, выполняемых при уточнении модуля, касается описания этого модуля и вызываемых модулей. [25]
Регистры ссязей ( см. 2.6) - регистры, которые используются для связей между модулями: регистры 0 и 1-для передачи параметров, регистр 1-для передачи адреса списка параметрои; регистр 13 - адрес области сохранения; регистр 14-адрес возврата; регистр 15-содержит адрес точки входа при передаче управления вызываемому модулю и код возврата при возврате управления вызывающему модулю. [26]
При передаче управления из модуля, составленного на одном языке, в модуль, составленный на другом языке, требуется устанавливать программную среду, представляющую собой совокупность программ обработки прерываний и аварийных завершений, установки регистров, содержащих адреса областей, использующихся на протяжении выполнения задачи, и др. Поэтому при организации вызова модулей, составленных на различных языках, необходимо всякий раз устанавливать среду вызываемого модуля. [27]
Выполнение каждого модуля осуществляется в одних и тех же общих регистрах. Поэтому вызываемый модуль должен содержать области, позволяющие сохранить регистры в момент входа в модуль и восстановить их перед выходом из модуля. Вызываемый модуль обеспечивает настройку на параметры и выдает вызывающей программе результаты обработки и коды возврата, которые характеризуют качество выполнения вызываемого модуля. Вызывающий модуль анализирует коды возврата и может повлиять на дальнейший ход решения задачи. [28]
Вызываемый модуль производит перезапись содержимого регистров в слова 4 - 18 области сохранения вызывающего модуля и приступает к исполнению. После исполнения вызываемый модуль загружает в регистр 13 адрес области сохранения вызывающего модуля ( второе слово), а в регистры 14, 15, 0 - 12 переписывав. При написании программы на языке Ассемблера эти действия должен предусмотреть программист. Если же программа пишется на языке высокого уровня, их выполняет компилятор. [29]
Имеется один выход - обычно это последнее предложение первого параграфа на странице. В каждом вызываемом модуле конструкция ВЫЙТИ ИЗ ПРОГРАММЫ ( EXIT PROGRAM) может встречаться только один раз. Если к сегменту применялся ВЫПОЛНИТЬ, то его выход - это просто конец параграфа. Допустимо и указание ( после ПО) параграфа с ВЫЙТИ. [30]