Организация взаимодействия межъязыковых модулей (PASCAL-2 - FORTRAN-4) в операционных системах RSX-11M и RT-11

Автор: Брусиловский Л.И., Михайлов Ю.А.

Журнал: Компьютерная оптика @computer-optics

Рубрика: Автоматизация проектирования

Статья в выпуске: 4, 1989 года.

Бесплатный доступ

Рассмотрены практические приемы взаимодействия межъязыковых модулей (PASCAL-2 - F0RTRAN-4) в ОС RSX-llM и RT-11, вопросы организации работы с файлами переменной длины на языке программирования PASCAL-2/RT-11, методы переноса двоичных записей, длина которых превышает 512 байт, из ОС RSX-11M в ОС RT-11 и обращение к сервисным функциям монитора операционной системы из программ, написанных на PASCAL-2.

Короткий адрес: https://sciup.org/14058156

IDR: 14058156

Текст научной статьи Организация взаимодействия межъязыковых модулей (PASCAL-2 - FORTRAN-4) в операционных системах RSX-11M и RT-11

Средства вычислительной техники (СВТ) являются основной технической базой для создания любой комплексной системы автоматизации (КСА), характерным примером которой может служить комплексная система автоматизации компьютерной оптики (КСА КО) [1] . Развитое системное обеспечение большинства современных компьютеров позволяет выбрать операционные системы (ОС) в зависимости от места Используемых СВТ в КСА. При этом проблема мобильности программного обеспечения решается, как правило, за счет использования в различных ОС единого языка высокого уровня. Так, Для распространенного при решении задач КСА семейства 16-разрядных машин типа PDP-11 и совместимых с ними примерами таких языков могут служить FORTRAN-4 и PASCAL-2 [2-4].

Наличие компиляторов с PASCAL-2 в обеих ОС позволяет разрабатывать программы, эффективно использующие память машин: память под локальные объекты не включается в загрузочный модуль, а выделяется динамически по мере надобности в процессе работы, что крайне важно в силу ограниченности адресного пространства программ, работающих под управлением этих ОС. Однако достаточно большая часть существующего прикладного ПО в ОС RSX-11M и RT-11 написана на языке F0RTRAN-4 (например, большее число различных библиотек научно-технических и инженерных расчетов). Поэтому вопрос об организации взаимодействия модулей, написанных на PASCAL-2 и FORTRAN—4, имеет важное практическое значение в рамках рассматриваемых

ОС. Такая необходимость может быть еще вызвана тем обстоятельством, что входящий в системы программирования PASCAL-2 обеих ОС пакет PASMAC, облегчающий интерфейс с ОС на ассемблере, не поддерживает автоматическую адресацию глобальных переменных, что может усложнить программирование и сопровождение разрабатываемых программ. В силу этого может оказаться целесообразным использовать входящий в состав обеих ОС интерфейс, оформленный в виде библиотеки системных подпрограмм, вызываемых с использованием обычной схемы FORTRAN (оператор CALL).

Хотя входной язык компилятора PASCAL-2 допускает обращение к внешним модулям, написанным на FORTRAN-4, тем не менее существует ряд ограничений, препятствующих непосредственному использованию имеющегося в PASCAL-2 механизма вызова непаскальных модулей с описанием NONPASCAL.

Во-первых, оба компилятора генерируют код формирования среды для работы программ, написанных на соответствующих языках. В первую очередь это касается организации управляющих структур для организации ввода/вы-вода (в/в) и инициализации стека (через регистр R6). Из-за различия организации в/в все операции по в/в, использующие встроенные в язык программирования средства, должны выполняться в модулях, написанных на том же языке, что и главная программа. (Тем не менее в модуле, написанном на языке, отличном от языка главной программы, возможна организация в/в на физическом уровне посредством обращения к системным функциям ОС.)

Во-вторых, компиляторы используют различный механизм вызова внешних модулей: PASCAL-2 организует передачу параметров через стек (использование описателя у внешней процедуры/функции NONPASCAL заставляет компилятор генерировать при ее вызове последовательность кодов, аналогичную генерируемой компилятором FORTRAN-4, то есть загружать в регистр R5 адрес списка адресов фактических аргументов). Однако даже при соблюдении стандартной последовательности вызова при организации взаимодействия модулей PASCAL-FORTRAN возможно возникновение проблем: передача имени внешнего модуля в качестве фактического параметра (непосредственно передать имя внешнего модуля, написанного на PASCAL-2, в модуль, написанный на языке FORTRAN, нельзя в силу особенностей генерации кода при передаче в качестве параметра имени внешней процедуры), доступ в фортраневском модуле к глобальным переменным PASCAL и т.д, и, наоборот, доступ к переменным блоков COMMON в модулях, написанных на PASCAL-2.

нАпогр еп етяемный перенос двоичных файлов, содержащих записи переменной длины, превышающие 512 байт, из ОС RSX-11M в ОС RT-11 невозможен (системная утилита FLX ОС RSX-11M, предназначенная для переноса файлов между этими системами, обрабатывает записи длиной не более 512 байт). Ниже будет показано, как при помощи двух простых программ на PASCAL-2 легко решить эту проблему.

В данной статье будут рассмотрены практические приемы взаимодействия межъязыковых модулей (PASCAL-2 - F0RTRAN-4) в ОС RSX-11M и RT-11, а также организации работы с файлами переменной длины на PASCAL-2/RT-11 и методы переноса двоичных записей, длина которых превышает 512 байт, из ОС RSX-11M В ОС RT-11.

  • 2,    Организация взаимодействия PASCAL-FORTRAN

    • 2.1.    ПОЛУЧЕНИЕ АДРЕСА ЗАГРУЗКИ ВНЕШНЕГО МОДУЛЯ

      При программировании на языке FORTRAN данная проблема легко решается с помощью вызова специальной функции, входящей в состав системы программирования FORTRAN-4 обеих ОС (например, для RT-11 это функция IADDR). Напомним, что для машин семейства PDP-11 адрес - это целое число в диапазоне 0 - 65535. Получить адрес внешнего модуля в процедуре, написанной на языке PASCAL, можно, например, с помощью следующей вспомогательной раздельнокомпилируемой (для исключения проверки комплято-ром согласования типов фактического и формального параметров) функции:

( *6nomaiп*> t vpe ADDRESS : 0..65535:

function ADDR ( I : ADDRESS >* ADDRESS; external: function ADDR; (* тело функции ADDR *) beg i n ADDR:=I end:

При вызове функции ADDR в качестве фактического параметра указывается имя внешнего модуля (описанного как EXTERNAL), адрес которого необходимо получить. Например, из программы на языке PASCAL в подпрограмму на языке FORTRAN (FORT) необходимо передать имя внешнего модуля EXT в качестве фактического параметра. Схема вызова будет следующей:

type ADDRESS : 0..65535;

procedure EXT; external;

function ADDR ( procedure F ) : ADDRESS; external; procedure FORK I : ADDRESS); nonpascal;

FORT(ADDR(EXT));

Отметим, что, независимо от того, на каком языке написан модуль EXT, его необходимо описать как EXTERNAL, а не NONPASCAL. Не важно, имеет ли он формальные параметры, а также то, процедура (подпрограмма) это или функция. Важно то, что в данном случае параметр (адрес точки загрузки внешнего модуля) должен передаваться в фортрановский модуль по значению.

Рассмотрим организацию модуля, написанного на PASCAL-2, вызываемого из модуля, написанного на F0RTRAN-4. При вызове внешнего модуля компилятор FORTRAN-4 заносит в регистр R5 адрес списка адресов фактических параметров. В младшем байте первого слова списка содержится число фактических параметров, а адреса фактических параметров начинаются со второго слова списка. Допустим, из модуля, написанного на языке FORTRAN, в модуль, написанный на PASCAL-2, передаются три параметра: целое число, вещественный массив и вещественное число. Для отмены генерации кода проверки согласования длины массива модуль, написанный на PASCAL-2, должен компилировать с ключом /NOCHECK, Имитация списка формальных параметров может иметь вид:

< *QnOfnai п* । nrocedure EXT: еиЦегпе!; procMur*' EXT;

I ург1

VI С I HR — дг гд V ! 1. , I >?!0 ] о* *■ ла i :

f* riwin-- ддр «он 1 .лиамеrpoR *) RORoMFTFR. UST - r ernr d

ОI

' ntt?g*»r :   < * число ■ирамр’п^юп *■

■'?з1еим ; Г* одим- *--• ч параметра*)

'vRCTOR;   (* адоес 2—гт? гырдметм*;

■те/о г         < *   .дрет,   s--? о  :V;n ..-it.-I (:. 1*1

end:

var

(* адрес о -одыржимпу '’'5 * ’

RS or I gi I I ) 777055 : ' PARAMETER_Е I ST;

оед 1 п

К; ЕГ^.й!"; (* к :.-: значению 1-то Фактическое о параметра *)

Если бы в данном случае схема вызовов быта " PASCAL-FORT RAN-PASCAL" , то в приведенном выше модуле при необходимости можно было бы обращаться к глобальным переменным.

  • 2.2.    ДОСТУП К РАЗДЕЛЯЕМЫМ ПЕРЕМЕННЫМ

Теперь рассмотрим вопросы, связанные с доступом к глобальным переменным модулей, написанных на PASCAL-2, из модулей, написанных на FORTRAN-4.

Компилятор PASCAL-2 размещает глобальные переменные в программной секции с именем GLOBAL (или с именем соответствующего модуля при использовании ключа компиляции /OWN) со смещением в 4 байта относительно ее начала* Следовательно, для получения доступа к таким переменным в модуле, написанном на FORTRAN-4, соответствующие переменные необходимо описать в блоке COMMON с именем GLOBAL (или соответствующим) со смешением в 4 байта относительно его начала:

var (* глобальные переменные *) А : rea) s

В : arrav Ci.«2001 nf boolean* С : гесord

АХ ; i п t ее or ;

ST : arrav L1..100] Of char end;

SUBROUTINE Fit ПАРАМЕТРЫ, ЕСЛИ ЕСТЬ ) COMMON/GLOBAL/DUMMY,A,В,AX,ST

REAL A

BYTE В(200),ST(100)

Integer ax

Здесь DUMMY - фиктивная переменная, наличие которой обеспечивает смещение в 4 байта относительно начала блока COMMON с именем GLOBAL. Для доступа к переменным блока COMMON в модуле на PASCAL-2 аналогичный метод непригоден, поскольку исполнительная система PASCAL-2 использует первые 4 байта программной секции.PSECT, отводимой для размещения глобальных переменных, и, следовательно, помещенная в них информация будет потеряна. В этом случае метод доступа к переменным блока COMMON будет следующим: необходимо на языке F0RTRAN-4 напйсать подпрограмму, которая возвращала бы адреса (в виде 16-разрядных целых чисел) точек загрузки блоков COMMON (например, в RT-11 с помощью системной функции IADDR). В программе на PASCAL-2 этим адресам необходимо поставить в соответствие переменные ссылочного типа, базовый тип которых соответствует описанию блоков COMMON. Например, пусть необходимо получить доступ к переменным, размещенным в общих блоках СОМ1, COM2 и COM3, в процедуре написанной на PASCAL-2.

Тогда подпрограмма на FORTRAN-4 может иметь вид:

SUBROUTINE CADDR(ADDR)

* INTEGER ADDR(l)

COMMON/COM1/A(100),1(10)

C0MM0N/CDM2/B(200),J(300),F

COMMON/COM3/Z

ADDR(1)-IADDR(A)          1 или ADDR(1)= 1ADDR(CQM1)

ADDR(2)~IADDR(В)          1 или ADDR(2)=IADDR(COM2)

ADDR(3>-IADDR(7)          ! или ADDR(3)-IADDR(COM3)

RETURN

END а вызывающая процедура на PASCAL-2:

type

COMADDR = array Cl,.32 of integer; CM1 = record

A : array Cl..100] of real;

I ; array Cl..103 of integer; end;

СМ2 = record

В : array Cl..200] of real;

I : array Cl..3003 of integer; end;

СМ3 = real ;

AC0M1 = ЛСМ1;

AC0M2 - ACM2;

AC0M3 = ЛСМЗ;

var

C0M1 : ACDM1;

COM2 : AC0M2;

COM3 : ACOM3;

ADDR : COMADDR;

procedure CADDR( var A : COMADDR );

nonpascal;

begi n

CADDR(ADDR);

COM 1:=1oophole(АСОМ1,ADDRC13>;

COM2: =1oophole(AC0M2,ADDRC21>;

COM3:=1oophole(AC0M3,ADDRC3 3);

К:=COM1 •••. I C L 3+C0M2' ■. J С 1 3 :

  • 3,    Работа с файлами

    • 3.1.    ЗАПИСИ ПЕРЕМЕННОЙ ДЛИНЫ НА PASCAL

В PASCAL-2 все записи в нетекстовых файлах рассматриваются как записи фиксированной длины, определяемой типом файла. Работу с записями переменной длины на языке PASCAL можно организовать следующим образом, используя механизм раздельной компиляции модулей. Файл, содержащий записи переменной длины, необходимо описать как type FBYTE = file of integer и весь в/в записей переменной длины организовать с помощью двух процедур# написанных на PASCAL-2'. процедуры WVL (вывод) и RVL (ввод):

(*Qnamaiп*> type

FBYTE = -File of integer;

AB Y ТЕ — array C 1 . . 101 of integer;

procedure WVL(var F:FBYTE; var X:ABYTE; K:integer); external; procedure WVL;

var

I : integer;

beg i n write( F,K );        (* записать длину записи *)

(* запись структуры *)

for I: = l to (K+i)div2 do write(F,X С I 3) end;

procedure RVL(var F:FBYTE; var X:ABYTE; K;integer); external; procedure RVL;

var

I : integer;

begin read( F,K );         (* читать длину записи *)

(* читать запись *)

for I:=l to (K*l)div2 do read(F,XCIJ)

end ;

Пример вызова процедуры WVL для записи:

type

FBYTE = file of integer;

VREC1 = record ... end;

VREC2 = record ... end;

var

Fl, F2 : FBYTE;

X : VREC1;

Y : VREC2;

I : integer;

procedure WVL(var F:FBYTE; I ,LEN:integer);external ;

procedure RVL(var FzFBYTE; I:integer; var LEN:integer);external;

begi n

WVL(Fl,1oophole(i nteger,ref(X)) ,size(VREC1));

RVL. (F2, loophole (i nteger , ref (Y) ) , I) ) ;

end .

Получающаяся структура записей будет идентична структуре записей переменной длины в ОС RSX-11M.

  • 3.2.    ОБРАБОТКА СИМВОЛЬНЫХ СТРОК ПЕРЕМЕННОЙ ДЛИНЫ

  • 3.3.    ПЕРЕНОС ЗАПИСЕЙ ПЕРЕМЕННОЙ ДЛИНЫ ИЗ ОС RSX-11M В ОС RT-11 ПРИ ДЛИНЕ ЗАПИСЕЙ БОЛЬШЕ 512 БАЙТ

Жесткий контроль типов, присущий языку программирования PASCAL-2, создает определенные проблемы, связанные с обработкой текста. Входящий в систему программирования PASCAL-2 пакет для работы со строками, не обладает гибкостью, поскольку все строки в этом случае должны иметь одинаковую максимальную длину, независимо от конкретных случаев. Используя системную объектную библиотеку SYSLIB, содержащую подпрограммы работы со строками, и механизм задания строк переменно? длины (конец строки определяется первым вхождением нулевого байта), эту проблему можно легко решить. в качестве фактических параметров системных подпрограмм необходимо указывать не сами строки, а их адреса (в виде целых чисел): при этом эти адреса должны передаваться по значению. В качестве примера приведен вызов функции определения длины строки:

var S: packed array[1..01D of char;

function LEN ( I: integer>: integer; nonpascal;

K:"LEN(1oophole(integer, ref;

Данная проблема возникает при попытке переноса файлов, созданных операторами бесформатного ввода FORTRAN ОС RSX-11M, в ОС RT-11, когда длина записей переносимого файла превышает 512 байт. При ее решении мы рекомендуем следующий алгоритм:

  • -    программой PIP/RSX-11M сделать переносимый файл непрерывным (при помощи ключа /СО программы PIP);

  • -    с помощью программы DMP/RSX-11M оаспечатать заголовок файла и определить адрес 1-го блока файла на диске (виртуальный блок 0).

Далее под управлением ОС RT-11 необходимо проделать следующее:

  • -    командой

  • -    если данный файл необходимо читать из модулей, написанных на PASCAL-2, то больше ничего делать не надо; этот файл уже можно читать приведенной выше процедурой RVL. Если данный файл необходимо обрабатывать операторами последовательного бесформатного ввода FORTRAN, необходимо выполнить две следующие программы (первая написанная на PASCAL-2 читает файл и формирует промежуточный выходной файл; вторая программа, написанная на FORTRAN-4, читает промежуточный файл и формирует бесформатные записи FORTRAN-4/RT-11).

tvpe

Fl: Tile □+ integer;

F2: text;

I t J ,K: i nteqer;

Degi n reset( Fl, ИМЯ ); rewritef F21 ИМЯ ); while not eot(Fl) do begin

(* Длина записи *)

read(Fl,I): write(F2,I);

■for J:=l to (I*l)div2 do begin reaa(Fl,K):

writein(F2,K) end end end .

BYTE M(МАКСИМАЛЬНАЯ ДЛИНА В БАИГАХ)

INTEGER N(МАКСИМАЛЬНАЯ ДЛИНА В СЛОВАХ)

EOUIVALENCE(M,N)

OPEN(UNIТ = 1, NAME='ИМЯПРОМЕЖФАИЛА'),DISPDSE='DELETE')

OPEN(UNIT=2, МАМЕ='ИМЯВЫХфАИЛА'),FORM-'UNFORMATTED')

  • 2       READd,*) N(I)

UjR I ТЕ (2) (M(I), 1 = 1 ,L)

GOTO 1

  • 3       STOP

  • 4 . Обращение к монитору из программы, написанной на PASCAL-2

END

Для обращения к монитору непосредственно из программы, написанной на PASCAL-2, можно использовать встроенную (предопределенную) процедуру ЕМТ, Обращение в программе к этой процедуре эквивалентно выдаче команды ЕМТ с кодом, равным значению параметра процедуры ЕМТ. Например, вызов ЕМТ (375В) равносилен наличию инструкции:

ЕМТ 375

Заметим, что перед обращением к процедуре ЕМТ необходимо в регистр R0 загрузить адрес блока аргументов ЕМТ. Допустим, из программы на PASCAL-2 необходимо передать данные другому заданию с помощью системного вызова SDATW. Формат таблицы аргументов ЕМТ имеет следующий вид:

R0 = >  *------------+------------*

।      ^5         ! И ■

Не испольщин я

BUF

где

BUF - адрес буфера для передачи данных;

WCNT - длина буфера в славах.

Фрагмент программы на PASCAL-2 может иметь вид:

const BUFLEN=1000B;

type BUFFER=array C1,.BUFLEN] of integer; ARGBLOCK=record

CODE: packed arrayC1..2J of 0..25S;

DUMMY: integer;

BUF: -"BUFFER;

WCNT: integer;

ENDA: integer;

end;

var BUFF: BUFFER;

EMTARG: ARGBLOCK;

R0 origin 177700B : "'ARGBLOCK; (* это для DBM типа PDP-11/40 *1

begin with EMTARG do begin

CODEC 1]:=0;

CODEE 2J:=25B:

BUFF:=ref(BUFF);

WCNT:=BUFLEN;

ENDA:=0;

end;

R0:=ref(EMTARG);

EMT(375B);

Ли тора тура

  • 1,    Березный А.Е#, Брусиловский Л. И. и др. Проект системы автоматизации проектирования, создания, исследования и применения элементов плоской оптики (версия 1) . - В сб.; Компьютерная оптика, вып. 2. Автоматизация проектирования и технологии. М.: МЦНТИ, 1987.

  • 2.    PASCAL-2: Version 2*0 for RT-11, S.L., 1981.

  • 3,    PDP-11 PASCAL/RSX-11 Programmer's Guide. Maynard, Digital Equipment Corp., 1983.

  • 4*    PDP-11 Fortran Language Reference Manual. Maynard, Digital Equipment Corp., 1979.

Статья научная