Рассмотрим комплексирование модулей, составленных на различных языках программирования. Для САПР наиболее употребимы универсальные языки ассемблера, ФОРТРАН, ПЛ/1. Особенности операций с разноязыковыми модулями можно свести в основном к двум группам: 1) особенности установки программной среды и вызова модуля; 2) различия в реализации типов и структур данных, проявляющиеся при обмене информацией между модулями.
Установка среды. При передаче управления из модуля, составленного на одном языке, в модуль, составленный на другом языке, требуется устанавливать программную среду, представляющую собой совокупность программ обработки прерываний и аварийных завершений, установки регистров, содержащих адреса областей, использующихся на протяжении выполнения задачи, и др.
Поэтому при организации вызова модулей, составленных на различных языках, необходимо всякий раз устанавливать среду вызываемого модуля. Рассмотрим процесс установления среды в языках ассемблера, ФОРТРАН, ПЛ/1.
В алгоритмическом языке ФОРТРАН среда устанавливается модулем IBCOM, находящимся в библиотеке компилятора. Помимо установки среды этот модуль выполняет операции ввода — вывода и др. Для программ, не содержащих операций ввода — вывода и прерываний, среда может не создаваться. Вызов модуля, составленного на языке ФОРТРАН, и установка среды этого языка представляют собой различные, самостоятельные действия.
В алгоритмическом языке ПЛ/1 установка среды обеспечивается совокупностью модулей библиотечных, сгенерированных компилятором ПЛ/1, а также построенных пользователем. Место расположения программной среды определяется вызовом модуля. Таким образом, установка среды в языке ПЛ/1 и вызов самого модуля представляют собой неразрывное целое и считаются одной операцией.
Для модулей, написанных на языке ассемблера, компилятор среды не создает. Чтобы обеспечить нормальное функционирование программы для обработки программных прерываний и аварийных ситуаций, пользователь должен сам включить в свою программу соответствующие средства, например макрокоманды SPIE, STAE, ABEND и др. Механизм задания среды определяется также пользователем, который располагается в любом месте исходного модуля макрокоманды задания среды.
Способ обращения к модулю определяется языковыми средствами организации связи по управлению, которое реализуется через активизацию модуля и возврат управления.
■ Примечание. В ЕС ЭВМ для активизации модуля необходимо присутствие копии модуля в оперативной памяти. Копия заносится в память с помощью загрузки.
Средства передачи управления алгоритмических языков проиллюстрированы табл. 3.1.
Таблица 3.1
Алгоритмические языки
Характеристика средств передачи управления
средство
этап соединения
тип загрузки
ПЛ/1
Ассемблера
ФОРТРАН
CALL
АТАСН
LINK
FETCH
XCTL
CALL
CALL Вызов функции
Компиляция Редактирование
Выполнение
>
Компиляция
Редактирование
Компиляция
Редактирование
Предварительная По запросу
>
>
Предварительная По запросу
Предварительная
По запросу
Согласование типов.Различные языки программирования обладают разными наборами типов данных. Типы данных языков программирования приведены в табл. 3.2.
Возможные отношения между типами данных приведены ниже.
Неэквивалентным типам данных относятся типы данных, для которых внутреннее представление, сгенерированное компиляторами, идентично.
К косвенно-эквивалентным типам данных относятся типы данных, для которых нет эквивалентного описания, но с помощью имеющихся языковых средств их можно совместить.
К неэквивалентным типам данных относят данные, которые невозможно свести друг к другу с помощью имеющихся языковых средств.
■ Примечание. Описание типов данных для вышеприведенных языков программирования см. в § 1.1.
Рассматриваемые алгоритмические языки различаются не только типами, а также заданиями длины отдельных элементов данных. Длина элементов данных может указываться явно или неявно (по умолчанию). Кроме того, необходимо отметить следующие организационные особенности каждого языка:
Таблица 3.2
Типы данных языков
Внутреннее
представление
ПЛ/1
ФОРТРАН
ассемблера
REAL FIXED
BINARY
INTEGER
H
F
Число с фиксированной точкой длиной 2 байт
Число с фиксированной точкой длиной 4 байт
REAL FLOAT
BINARY
REAL
E
D
Число с плавающей точкой длиной 2 байт
Число с плавающей точкой длиной 8 байт
REAL
DICEMAL
FIXED
—
P
Последовательность десятичных цифр со знаком длиной 1... 16 байт
REAL DICEMAL FLOAT
REAL
E
D
—
COMPLEX FLOAT
DECTMAL
COMPLEX
—
Два числа с плавающей точкой длиной 4 байт
Два числа с плавающей точкой длиной 8 байт
COMPLEX FIXED DICIMAL
—
—
Два десятичных числа
COMPLEX FLOAT BINARY
COMPLEX
—
—
—
COMPLEX FIXED BINARY
—
—
Два целых числа длиной 4 байта
Два целых числа длиной 2 байта
а) обратное расположение массивов (в языке ФОРТРАН массив располагается в памяти по столбцам, а в языке ПЛ/1 — по строкам);
б) наличие информационного вектора для переменных в языке ПЛ/1 [поскольку в языке ПЛ/1 память под данные может выделяться динамически, компилятор генерирует информационный вектор, который содержит сведения о переменных, строках и массивах (адрес, дли на, количество элементов и пр.)] и имеет различный вид для разных структур данных;
в) выравнивание полей, которое определяется тем, что компилятор располагает данные в соответствии с описаниями, выравнивая их, если необходимо, на границы слов и полуслов.
Обмен данными.Наиболее распространен способ обмена данных с помощью операторов CALL и LINK. При этом осуществляется формирование списка передаваемых данных и списка их адресов. Адрес списка адресов передается вызываемой программе через регистр 1.
Другим распространенным способом обмена данными является использование общих областей — статически распределенных участков памяти, к которым может обращаться любой модуль независимо от того, на каком языке он описан. Память под общую область отводит редактор связей во время создания загрузочной программы из совокупности общих областей отдельных модулей. Каждый из рассматриваемых языков имеет средства для описания общих областей; в языке ФОРТРАН — оператор COMMON, в языке ПЛ/1—оператор
Рис. 3.6.
STATIC EXTERNAL, в языке ассемблера — оператор СОМ.
Информационный адаптер.С учетом вышеизложенного для осуществления универсального информационного интерфейса необходимо:
1) произвести контроль наличия исходных данных для каждого отдельного модуля;
2) задать недостающие исходные данные;
3) проверить соответствие типов, структур и последовательности данных аналогичным характеристикам данных, принятым в вызываемом модуле;
4) преобразовать данные в случае несоответствия
типов;
5) обеспечить передачу данных вызываемому модулю в соответствии с типом обмена;
6) организовать среду, определяемую языком программирования модуля;
7) проверить результаты;
выполнитьобратное преобразование данных в вид, принятый для хранения промежуточных результатов;
8) сохранить результаты работы модуля для дальнейшего использования.
Реализация описанных функций выполняется программой-адаптером. Информационное обеспечение адаптера (рис. 3.6) включает в себя таблицы описателей модулей, входов модулей, наборов данных, область обмена. На рисунке МФ — модули функционирования; МВв — модули ввода; ТОНД — таблица описателей наборов данных; ТОМ— таблица описателей модулей; ПУС— программы установки среды; ТОВх — таблицы описателей входов; МВыв — модули вывода; 00 — области обмена.
Таблица описателей модуля содержит: имя модуля; идентификатор языка программирования; признак типа обмена, принятый в модуле (параметры, общие области, наборы данных); количество параметров; имя описателя входов модуля; имя области обмена; имя описателя набора данных.
Таблица описателей входов модуля содержит: имя параметра локальное; имя параметра глобальное; характеристику параметра (входной, выходной, модифицируемый); вид структуры (переменная строка, массив арифметический, массив строк, структура, массив структур и т.д.); размерность (для массива); длину (для строк); основание системы счисления (для переменной или элемента массива); форму представления; точность.
Таблица описателей наборов данных содержит: имя набора; имя DD-предложения; тип организации; метод доступа; формат блока; длину блока; атрибуты записи. Для обеспечения преемственности данных следует предусмотреть область памяти, куда заносились бы те результаты работы каждого модуля, которые принимают участие в дальнейших расчетах. Этой цели служит область обмена — память, выделенная для промежуточных результатов, передаваемых от модуля к модулю. В нее заносятся исходные данные для первого модуля, результаты вычислений, недостающие данные для промежуточных модулей.
Для организации области обмена необходимо: 1) осуществить анализ данных, которые будут циркулировать в среде программного комплекса в составе САПР с целью определения одинаковых по смыслу переменных;
2) всем одинаковым по смыслу переменным присвоить одно и то же имя, отражающее семантику этих переменных (глобальные переменные);
3) каждой переменной, встречающейся только один раз, присвоить уникальное имя, отражающее семантику величины (локальные переменные);
4) каждой глобальной и локальной переменной поставить в соответствие тип и структуру, являющиеся наиболее информативными.
Указанная совокупность переменных составляет область обмена, в которой хранится текущее значение каждой из переменных в наиболее информативном виде.
В крупных САПР, программы которых оперируют с большим числом входных, промежуточных и результирующих переменных, области обмена удобно организовать в виде некоторого банка данных. Это позволяет возложить часть функций, выполняемых адаптером, на СУБД, что в конечном итоге сокращает время на разработку информационного и программного обеспечения САПР.
Таким образом, адаптер выполняет всю совокупность операций по организации информационного взаимодействия между программными модулями. В случае разноязыковых моделей адаптер практически берет на себя выполнение соответствующих функций операционной системы. Достаточно сложной является также задача построения области обмена, поскольку ее решение связано со структурированием всех переменных, участвующих в информационном обмене. В крупных САПР, программные модули которых оперируют с большим числом входных, промежуточных и результирующих переменных, функции адаптера по организации и взаимодействию с обменными областями целесообразно переложить на типовые СУБД.
Банки данных в настоящее время находят все более широкое применение для организации межмодульного интерфейса. Их использование наиболее эффективно, когда совокупность модулей программного обеспечения зафиксирована и не подлежит изменениям в дальнейшем. В этом случае необходимо составить логическую схему для всей области обмена, в которой были бы указаны наименования переменных, их взаимосвязи, тип представления. Обращение из программных модулей для получения значений необходимых переменных должно выполняться с помощью операторов взаимодействия с СУБД. Применение банков данных для целей организации информационного
межмодульного обмена сокращает сроки разработки информационного и программного обеспечений с САПР.