IDL – заклинання епохи розподілених обчислень, Різне, Програмування, статті

Дмитро Рамодін

Поява в програмуванні того чи іншого мови зазвичай пов’язане з виникненням і розвитком якоїсь нової концепції. Так, одночасно з ідеєю об’єктно-орієнтованої розробки (в її сучасному варіанті) була створена мова смалток, сформував, до всього іншого, і умови для перетворення звичайного Сі в об’єктно-орієнтована Сі + + і класичного віртовского Паскаля в Borland Object Pascal. Всі ці «діалекти» живі і донині, підтверджуючи своїм існуванням, що до заходу об’єктно-орієнтованої епохи ще далеко.

Подальше застосування об’єктів і компонентів укупі з впровадженням останніх у розподілені системи викликало необхідність створення такої мови програмування, який би дозволив описати будь-який об’єкт або компонент. І, що не менш важливо, це опис має бути однаковим для будь-якої платформи. Програмісти відповіли на ці вимоги, видавши «на-гора» мову опису інтерфейсів IDL (Interface Definition Language). Сьогодні за розвитком IDL стежить міжнародний консорціум OMG, в чиєму веденні також знаходяться технологія СОRВА і мова UML.

Слід зауважити, що 1DL не тільки мову, але й інструмент, за допомогою якого можна зберігати метаінформацію про об’єкти, тобто дані про те, як влаштований об’єкт. Відомо досить багато випадків, коли мову 1DL використовується для опису контрактів – технічних параметрів, що дозволяють декільком незалежним групам працювати одночасно над різними частинами проекту. Хоча в основному вихідні тексти на 1DL служать своєрідним «сировиною», з якого спеціальні компілятори 1DL генерують вихідні тексти на одній з мов програмування високого рівня. Такий процес правильно називати проектуванням (Mapping), але для зручності ми назвемо його трансляцією. Типовий процес створення розподілених об’єктних програм складається з опису об’єктів на IDL, їх трансляції на який-небудь мову програмування, додавання бізнес-логіки й компіляції отриманих вихідних текстів в готові для запуску модулі.

Серія статей, публікацію яких ми починаємо з цього номера, знайомить як з самим мовою IDL, так і з трансляцією його конструкцій. Але для початку слід домовитися про терміни, якими будемо оперувати в надалі:

Озброївшись цими важливими поняттями, ми можемо приступати до опису елементів і конструкцій мови.

Коментарі

Коментарі IDL – точна копія коментарів мови Сі + +. Це означає, що для приховування фрагмента вихідного тексту можна застосувати пари символів / * та * /. Для виключення з компіляції одного рядка або її частини зручно користуватися символами / /, як це показано на прикладі:

/ * Цей текстовий блок буде пропущений компілятором, бо він закоментований * /

Ці рядки будуть сприйняті компілятором як вихідний текст і будуть відкомпільовані

/ / А цей рядок буде пропущена

Ідентифікатори

До ідентифікаторів зараховують імена, з якими має справу програміст. Це можуть бути імена інтерфейсів, модулів, атрибутів, операцій, констант і т. д. Для будь-якого компілятора IDL ідентифікатор – це послідовність букв і цифр, а також знак підкреслення ‘_’. Всі ідентифікатори в IDL-файлах повинні починатися з літерного символу. В силу деяких особливостей різні IDL-компілятори порізному реагують на порушення цього правила. Якщо набрати фрагмент, описує три нові ідентифікатора:

attribute Object ffx:

attribute Object &_x:

attribute Object 3X;

то компілятор IDL2JAVA з набору Inprise VisiBroker повідомить про те, що знайдені символи не співпадають з очікуваними. А ось idltojava з JDK 1.2 скаже, що знайдена синтаксична помилка, і «вивалиться» відразу ж на першого помилкового рядку.

Компілятори не розрізняють регістр букв в ідентифікаторах IDL, отже, зовсім різні імена:

attribute string PK;
attribute string pk:

будуть сприйняті компілятором IDL як одне і те ж ім’я, що призведе до появи на екрані повідомлення про помилку, що говорить про спробу перевизначити ідентифікатор PK. В цьому є свій резон. Якщо даний фрагмент IDL буде відтранслювати на мову програмування, не розрізняє регістр букв, то як відповідний компілятор цієї мови зможе розрізнити імена? Тому подібна перестраховка не завадить.

Символ підкреслення ‘_’ не може бути першим в імені ідентифікатора. Однак дуже часто при трансляції IDL, скажімо, на мову Java, компілятор сам додає перед одержуваними ідентифікаторами символи підкреслення, щоб уникнути конфліктів імен, і ідентифікатори, що починаються з підкреслення, можуть породити проблеми. Так, компілятор idl2java з Visi Broker «не бачить» різниці між двома однаковими іменами, що відрізняються лише наявністю символу підкреслення спочатку, і рядки вихідного тексту:

void getSomethingfin Object param);
void _getSomething(in Object param);

викличуть помилку перевизначення імені getSomething. Реакція інших компіляторів може бути іншою.

Ключові слова

Інакше йде справа з ключовими словами – зарезервованим набором IDL. До регістру букв у ключових словах компілятори цієї мови дуже чутливі, тому навіть спроба використовувати слово Module замість module призведе до помилки часу компіляції.















































any


double


interface


readonly


unsigned


attribute


enum


long


sequence


union


boolean


exception


module


short


void


case


FALSE


Object


string


wchar


char


fixed


octet


struct


wstring


const


float


oneway


switch


 


context


In


out


TRUE


 


default


inout


raises


typedef


 

Літерали

Літерали мови IDL поділяються на булеві, «вузькі» і «широкі» символьні, цілочисельні, з плаваючою точкою, з фіксованою точкою і рядкові.

Булева літерал найпростіший. Він застосовується при операціях з типом boolean і може приймати значення TRUE або FALSE:

const boolean flag – TRUE:

Трохи складніше символьні літерали. Вони застосовуються там, де фігурують типи char і wchar. За традицією, що дісталася від мов Сі і Сі + +, символьні літерали полягають в одинарні лапки (”). Розмір простих символьних літералів – 8 біт. Вони описують символи в діапазоні від 0 до 255, тобто стандартну таблицю символів ISO Latin-1 (8859-1). До цього додаються службові символи і символи, описані числовими константами.

IDL: спеціальні неотображаемие символи

символ нового рядка \ n
горизонтальна табуляція \ t
вертикальна табуляція \ v
backspace \b
carriage return \r
form feed \f
alert \a
зворотна коса риска <\> \\
знак питання \?
одинарна лапка \ ‘
лапки \ “
вісімкове число \ ооо
шістнадцяткове число \ xhh

Набір спеціальних не відображаються на екрані символів цілком достатній для повсякденної роботи, тим більше що форми \ ооо і \ xhh дозволяють представити будь-який символ як його номер в таблиці символів в вісімковому і шістнадцятковому форматі. Зазвичай компілятор IDL під час трансляції конвертує подібні шістнадцяткові коди в символ.

Окремо потрібно сказати про «широких» символьних літералах. Коли одного байта для зберігання символу не вистачає, застосовуються так звані «широкі» символи, що містять більше 8 біт. Таблиці цих символів можуть бути різними на різних платформах. Тому, ставлячи літерали з «широкими» символами, слід не виходити за рамки таблиці ISO Latin-1 (8859-1).

Цілочисельні літерали можуть бути десятковими, вісімковими і шістнадцятковим. Десяткові літерали складаються з послідовності цифр, але якщо послідовність цифр починається з нуля, то компілятор вважає, що перед ним літерал в вісімковій системі числення. Шістнадцяткові літерали можуть містити всі цифри і латинські символи від А до F. Подібні літерали повинні починатися з пари символів 0х або 0Х.

Літерали з плаваючою точкою можуть складатися з цілого числа та дробової частини, розділених символом точки (.). Їх також можна записати числом в науковому форматі, тобто відокремити мантиссу числа від його порядку буквою е або Е:

1234Е +13
0,987 е-150

Для фінансових обчислень в IDL передбачені літерали з фіксованою точкою, що складаються з цілої і дробової частин, розділених десятковою крапкою та зазначених буквою d або D. Такого роду літерали будуть надалі застосовуватися разом з типом fixed. Однак, незважаючи на те що ці елементи мови описані в специфікації CORBA V2.2, знайти їх реалізацію в компіляторах IDL не вдалося. Принаймні ні VisiBroker for Java 3.3, ні утиліта idltojava з JDK 1.2 не вміють працювати з фіксованою крапкою.

І останні літерали – рядкові. Вони являють собою рядки, що складаються із символів, допустимих в якості символьних літералів за винятком символу ‘\ 0’-І хоча VisiBroker і idltojava з JDK коректно обробляють ці символи, проте ясно, що при трансляції IDL на Сі і Сі + + наявність нульового символу в рядку може послужити джерелом помилки. Судячи з усього, саме це і стало причиною заборони на використання символу ‘\ 0’. Щоб уникнути помилок ком- піляціі, отриманих в результаті трансляції вихідних текстів, компілятор IDL конвертує всі шістнадцяткові коди в вісімкові. Строкові літерали, як і символьні, можуть бути засновані на простих і «широких» символах.

Препроцессінг

Для організації умовної компіляції і завдання деяких опцій компілятори IDL використовують препроцессінг, заснований на директивах, описаних у стандарті ANSI C + +, тому програмісти на мовах Сі та Сі + + відчують себе тут як риба у воді. Якщо ж ви не знайомі з цими мовами, то слід звернутися до відповідної літератури.

В препроцессінге IDL присутні спеціальні різновиди директиви # pragma:
“>

#pragma ID
#pragma prefix
#pragma version
#pragma hint

Однак вони мають сенс лише для знаючих CORBA, тому ми не станемо їх торкатися.

Область видимості імен

Будь-яке ім’я IDL видно в тому блоці, де воно описано. В якості подібного блоку можуть виступати, скажімо, описи модулів або інтерфейсів. Для посилання на самий глобальний блок можна використовувати його ім’я з додаванням пари символів :: або ж без подібного додавання. Однак хорошим тоном буде, якщо ви завжди будете додавати символи :: перед блоками, не вкладеними нікуди. Таким чином ви підкреслите, що згадується ім’я – найбільш старше в ієрархії вкладених блоків.

Приміром, щоб послатися на ім’я Inner, описане наступним IDL-файлом:
“>

interface Upper
{
  typedef string Inner;
}

можна написати:

::Upper::Inner

або

Upper::Inner

При такому стилі створення складних повних імен компілятору явно вказується, як знайти опис відповідного імені. Заодно знімається потенційний конфлікт імен, можливий при використанні однакових імен усередині різних блоків. Приміром, в одному файлі IDL можуть бути описані блоки, усередині яких визначені однакові імена:

“>
interface One
{
  typedef float nameContiict;
};

“>
interface Other
{
  typedef float nameConflict;
};

У цьому випадку буде потрібно деталізація імен при зверненні до них:

::One::nameConflict;

або

::Other::nameConflict;

Прості типи

Прості типи служать для завдання атрибутів об’єктів та параметрів їх операцій, констант, отримання нових, більш складних типів. Коротенько скажемо про простих типах, що застосовуються в IDL.


Булева тип. Тип boolean відповідає за зберігання логічних значень “істина» і «брехня» або, згідно з правилами IDL, TRUE і FALSE.

Символьні типи можуть описувати звичайні 8-бітові символьні дані (тип char) або «широкі» символьні дані (тип wchar), розмір яких більше 8 біт. В процесі передачі символьних / даних по мережі вони можуть бути переконвертувати так, що зміниться їх подання, але значення символу буде збережено. Така ситуація може виникнути при передачі даних між комп’ютерами з відмінними кодуваннями.

Цілочисельні типи – Це short, long, long long, а також їх беззнакові різновиди з префіксом unsigned. Як ви вже, напевно, зрозуміли, такого роду типи можуть зберігати лише цілі числа.

IDL: діапазони припустимих збережених значень для цілочисельних типів


short від -215 до 215
-1

long від 231 до 231
-1

long long від -263 до 263
-1

unsigned short від 0 до 216
-1

unsigned long від 0 до 232
-1

unsigned long long від 0 до 264
-1

Зверніть увагу, що тип int в IDL відсутня.

Типи чисел з плаваючою точкою поділяються на float, double і long double. Тип float відповідає IEEE-числу з плаваючою точкою одинарної точності. Тип double – IEEE-числу з плаваючою точкою подвійної точності. І останній тип, long double, використовується для опису IEEE-числа з плаваючою точкою подвійної розширеної точності. Більш повні дані про числа з плаваючою точкою IEEE можна дізнатися з документа «IEEE Standard for Binary Floating-Point Arithmetic», ANSI/IEEE Standard 754-1985.

Спеціальні типи використовуються в IDL для декларації в особливих випадках. Їх два: octet і any Перший служить для передачі по комунікаційних систем 8-бітових чисел так, щоб вони в процесі пересилання не зазнали змін. Тип octet – хороша альтернатива типу char в тих випадках, коли передається маленьке число.

Для того щоб описати поля, в яких можуть зберігатися значення будь-якого типу, дозволеного IDL, any можна порівняти з універсальним типом void * в мовах Сі та Сі + + або з класом Java.lang.Object в мові Java. Тип any часто застосовується в CORBA.

Константи

Опис констант починається з ключового слова «const», за яким вказуються: тип константи, її ім’я, символ присвоєння «=» і константне вираз, що складається з літералів і математичних опера- торів. Константне вираз визначає, яке значення буде присвоєно константі. Константи бувають наступних типів: цілочисельні, символьні (звичайні та «широкі»), з плаваючою і фіксованою крапкою, рядкові (зі звичайними і «широкими» символами) і булеві.

Літерали, які можуть використовуватися в константних виразах, були розглянуті раніше. А от про математичних операторах ще не було сказано. Бінарні оператори можуть бути наступними:

| – Побітове «АБО»;

^ – Побітове «ВИКЛЮЧАЄ АБО»;

& – Побітове «ВИКЛЮЧАЄ І»;

>> – Побітовий зрушення вправо із заповненням звільнилися бітів нулями; дозволяється зрушення в діапазоні від 0 до 63 позицій включно;

<< - Побітовий зрушення вліво з заповненням звільнилися бітів нулями; дозволяється зрушення в діапазоні від 0 до 63 позицій включно;
+ – Арифметичне складання;

– Арифметичне віднімання;

* – Арифметичне множення;

/ – Арифметичне розподіл;

% – Взяття залишку від арифметичного поділу.

Унарні оператори поділяються на установку негативного (-) і позитивного (+) знака у числа, а також доповнення цього числа до двох (~).

Унарні оператори (+ -), а також бінарні оператори (* / + -) можуть бути використані при створенні константних виразів, де беруть участь числа з плаваючою і фіксованою крапкою. А ось унарні оператори (+ – ~) І бінарні оператори (* /% + – << >> & | ^) Можуть бути застосовані тільки до цілих числах.

Нижче показані приклади опису констант:

const short
sConst – 1123;

const double
dConst = 2.f * 3.14 * 1.234E+13;

const wstring wsConst = «Широка рядок»;

const long long
llConst = (1000000 >> 4) % 7;

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*