Параллельное и распределенное программирование на С++
Шрифт:
// Программа 8.2
1 #include <iostream>
2 #include <fstream>
3 #include «adding_machine_impl.h» 4
5 6 7
8 int main(int argc, char *argv[])
9 {
10 CORBA::ORB_var Orb = CORBA: :ORB_init(argc,argv,«mico-local-orb»);
11 CORBA::BOA_var Boa = Orb->BOA_init(argc,argv,«mico-local-boa») ;
12 adding_machine_impl *AddingMachine =new adding_machine_impl;
13 CORBA::String_var Ref = Orb->object_to_string(AddingMachine);
14 ofstream Out(«adding_machine.objid»);
15 Out « Ref « endl;
16 Out.close ;
17 Boa->impl_is_ready (CORBA: : ImplementationDef : :_nil ) ;
18 Orb->run;
19 CORBA: :release(AddingMachine) ;
20 return(0);
21 } 22 23
Обратите
Язык описания интерфейсов (IDL):более «пристальный» взгляд на CORBA-объекты
Язык описания интерфейсов (IDL) — стандартный язык объектно-ориентированного проектирования, который используется для разработки классов, предназначенных для распределенного программирования. Он применяется для отображения интерфейса класса и отношений между классами, а также для определения прототипов функций-членов, типов параметров и типов значений, возвращаемых функциями. Одно из основных назначений языка IDL — отделить интерфейс класса от его реализации. Но дл я определени я самих функций-членов и членов данных IDL не используетс я. Язык IDL определ я ет только интерфейс функции. Основные ключевые слова IDL перечислены в табл. 8.1.
Таблица8
.1.
Ключевые слова IDL
abstract
enum
native
struct
any
factory
Object
supports
attribute
FALSE
octet
typedef
boolean
fixed
oneway
unsigned
case
float
out
union
char
in
raises
ValueBase
const
inout
readonly
valuetype
cell
interface
sequence
void
double
long
short
wchar
exception
module
string
Ключевые
• типы, определенные пользователем;
• последовательности, определенные пользователе м;
• типы массивов;
• рекурсивные типы;
• семантику исключений;
• модули (по аналогии с пространствами имен);
• единичное и множественное наследование;
• поразрядные арифметические операторы.
Приведем IDL-определение для класса adding_machine из листинга 8.2:
interface adding_machine{
void add(in unsigned long X);
void subtract(in unsigned long X);
long result;
}
Это определение начинается с ключевого слова CORBA interface. Обратите внимание на то, что данное объявление интерфейса класса adding_machine не включает ни одной переменной, которая бы могла хранить результат выполнения операций сложения и вычитания. Методы add и subtract принимают в качестве параметра одно значение типа unsigned long. Объявление типа параметра сопровождается ключевым словом CORBA in, который говорит о том, что данный параметр является входным (mput). Это объявление класса хранится в отдельном исходном файле adding_machine.idl. Исходные файлы, содержащие ГОЬюпределения, должны иметь . idl-расширения. Прежде чем такой файл можно будет использовать, его необходимо преобразовать к С++чЈюрмату. Это преобразование можно выполнить с помощью препроцессора или отдельной программы. Все CORBA-реализации включают IDL-компиляторы. Существуют IDL-компиляторы лля языков С, Smalltalk, С++, Java и др. IDL-компилятор преобразует ГОЬюпределения в код соответствующего языка. В данном случае IDL-компилятор преобразует объявление интерфейса в легитимный C++-код. В зависимости от конкретной CORBA-реализации IDL-компилятор вызывается с использованием синтаксиса, который будет подобен слелующему:
idl adding_machine.idl
При выполнении этой команды создается файл, содержащий С++-код. Поскольку наше IDL-определение хранится в файле adding_machine. idl, MICO IDL-компилятор создаст файл adding_machine. h, который будет содержать несколько каркасных C++-классов и CORBA-типов данных. Базовые IDL-типы данных приведены в табл. 8.2.
Таблица 8.2. Базовые IDL – т ипы дан н ых