Описание интерфейса объектов-компонентов в распределенной среде

Для объединения компонентов в ПС необходимым условием является наличие для них формально определенных интерфейсов в языках IDL и APL, а также механизмов динамического контроля связей между компонентами.

Спецификация интерфейса в API и IDL включает описание функциональных свойств компонентов, их типов и порядка задания операций передачи аргументов и результатов для взаимодействия компонентов. Описание интерфейса представляет собой интерфейсный посредник между двумя объектами.

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

В функции интерфейсного модуля клиента входят:

– подготовка внешних данных клиента (параметров),

– набор вызовов этих процедур или обращение к сервису сервера,

– обработка разных ошибок, возврат данных от сервера к клиенту.

Общие функции интерфейсного модуля сервера содержат:

– ожидание сообщений клиента и их обработка; запуск удаленной процедуры и передача ей параметров клиента;

– возврат результатов процедуры клиенту, уничтожения удаленной процедуры и др.

Структура интерфейсного модуля не зависит от ЯП взаимодействующих объектов и в целом одинакова для всех. Это связано со стандартизированной его структурой и общим языком спецификации интерфейса, синтаксис которого представлен ниже в форме Бекуса–Наура:

<интерфейс объекта> ::= Object <имя_Объекта> :{<множество исходных интерфейсов>}; {<множество входных интерфейсов>} end

<множество входных интерфейсов> ::= <множество интерфейсов>

<множество выходных интерфейсов> ::= <множество интерфейсов>

<множество интерфейсов> ::= _ | <интерфейс>; <множество интерфейсов>;

<интерфейс> :: = Interface <имя_интерфейса>:{<множество функций>} end

<множество функций> :: = _ | <функция>; <множество функций>;

<функция>:::= function <имя_функции>:<множество параметров>еnd

<множество параметров> ::= <параметр> | <параметр>, <множество параметров>

<параметр> ::= <тип> (<вид параметра>)

<вид параметра> :: = in | out | inout

Тип описывается средствами языков программирования (C++, Pascal и т.п.) и обеспечивает взаимодействие между процессами, а в качестве <вида параметра> могут быть:

in— входной параметр,

out— выходной параметр,

inout— совместный параметр.

Интерфейсные объекты в распределенной среде являются посредниками между клиентом и сервером (stub для клиента и skeleton для сервера). Их описания отображаются в те языки программирования, в которых описаны соответствующие им объекты или компоненты.

Описание интерфейса в IDL-языке начинается с ключевого слова interface, за которым следует: идентификатор интерфейсного посредника, описание типов параметров и операций вызова объектов.

Общая структура описания интерфейса имеет вид

interfaceA { ... }

interfaceB { ... }

interfaceC: B,A { ... }.

Параметрами операций (op_dcl) в задании интерфейсов могут быть такими:

– тип данных (type_dcl);

– константа (const_dcl);

– исключительная ситуация (except_dcl),возникающая в процессе выполнения метода объекта;

– атрибуты параметров (attr_dcl).

Описание типов данных начинается ключевым словом typedef, за которым следует базовый или конструируемый тип и его идентификатор. В качестве константы может быть некоторое значение типа данного или выражение, составленное из констант. Типы данных и констант могут быть: integer, boolean, string, float, char и др.

Описание операций op_dcl включает в себя:

– наименование операции интерфейса;

– список параметров (от нуля и более);

– типы аргументов и результатов, если они имеются (иначе - void);

– управляющий параметр и задание исключительной ситуации и др.

Атрибуты параметров могут начинаться служебными словами:

in – при отсылке параметра от клиента к серверу;

out – при отправке параметров-результатов от сервера к клиенту;

inout – при передаче параметров в оба направления (от клиента к серверу и обратно).

Описание интерфейса может наследоваться другим объектом, тогда оно становится базовым. Пример описания базового интерфейса приведен ниже:

const long l=2

interface A {

void f (in float s [l]); }

interface B {

const long l=3 }

interfaceC: B, A { }.

Интерфейс С использует интерфейс В и А. Это означает, что интерфейс С наследует описание их типов данных, которые по отношению к С становятся глобальными. Но при этом синтаксис и семантика остаются неизменными. Из приведенного примера видно, что операция f в интерфейсе С наследуется из А.

Механизм наследования интерфейса подразумевает, что все имена сохраняются без их переопределения. Особенно это касается описания операций, которые должны иметь уникальные обозначения. Имена операций могут использоваться во время выполнения интерфейса с помощью skeleton при его динамическом вызове.

Общая структура описания модуля в языке IDL с интерфейсом приведена ниже:

Regust Operations

module CORBA {

interface Reguest {

Status add-arg (

in Identifier name,

in Flags arg_flags

);

Status invoke (

in Flags invoke_flags // invocation flags

);

Status send(

Status get_respouse (

out Flags response_flags // response flags

);

};

};

Предложенный язык описания интерфейса объектов содержит средства общие с языком описания интефейсов IDL.

Наши рекомендации