ДонНТУПортал магистров
Биография Афтореферат Библиотека Ссылки по теме Отчет о поиске Индивидуальное задание


Інструкція користувача omniORB версії 4.1


Дункан Гірсбі, Саи-Лаи Ло, Девід Ріддок


Лабораторія AT&T Кембрідж



Квітень 2006




Компілятор IDL


IDL компілятор omniORB називається omniidl. Він складається із вхідного текстового аналізатору, що написаний на С++ та кількох кінцевих модулів, що написані на Python. omniidl поводиться дуже строго щодо відповідності IDL стандарту, тому може виявитись, що він повідомляє про помилки у IDL, які файно компілюються іншими IDL компіляторами.


Загальний синтаксис командного рядку виглядить так:


omniidl [опції] -b<кінцевий модуль>[опції кінцевого модуля]<файл1><файл2>



Загальні опції


Наступні опції загальні для усіх кінцевих модулів:


-bкінцевий_модуль – Використовувати зазначений кінцевий модуль. Для стандартного С++ модуля слід використовувати –bcxx


-Dім’я[=значення] – Визначити ім’я для препроцесору


-Uім’я – Скасувати визначення ім’я для препроцесору


-Iдир – Включити дир до шляху пошуку


-Yкоманда – Надати перевагу команді у якості препроцесора, радше ніж звичайному С препроцесору


-N – Не використовувати препроцесор


-T – Використовувати тимчасовий файл, радше ніж канал, для виходу препроцесору


-Wpарг[,арг] – Надіслати аргументи до препроцесору


- Wbарг[,арг] – Надіслати аргументи до кінцевого модуля


-nf – Не повідомляти про нерозв'язаний заздалегідь оголошення


-k – Зберегти коментарі після оголошень для подальшого використання у кінцевих модулях


-K – Зберегти коментарі до оголошень для подальшого використання у кінцевих модулях


-Cдир – Змінити директорію до запису вихідних файлів


-d – скинути проаналізований IDL на диск і вийти без запуску кінцевого модуля


- pдир – використати директорію дир як шлях для пошуку кінцевих модулів omniidl


-V – роздрукувати інформацію про версію і вийти


-u – роздрукувати інформацію по використанню


-v – Балакучість: відслідковувати етапи компіляції


Більшість з цих опцій говорять самі за себе, але деякі з них не такі очевидні.



Взаємодії із препроцесором


IDL файли обробляються Сі препроцесором перед тим, як omniidl їх аналізує. omniidl завжди використовує GNU Сі препроцесор (котрий побудований з ім’ям omnicpp). Опції –D, –U та –I безпосередньо надсилаються до препроцесору. Слід зауважити, що поточна директорія не включена до шляху пошуку за замовчуванням. Для цього слід використовувати опцію «-I». Опція –Y може бути використана для відмінного від omnicpp препроцесору. Слід застережити, що рядкові директиви вставлені іншими препроцесорами імовірно зіб’ють omniidl.



Windows 9x


Вихід із Сі препроцесору в нормі живить аналізатор omniidl через канал. На деяких машинах із Windows 98 (не на усіх!) канали не працюють, і вихід препроцесору відображується на екрані. Коли це трапляється, аналізатор omniidl бачить порожній файл та генерує непотрібні файли заглушок із підозрілими довгими іменами. Для того, щоб уникнути проблеми слід використовувати опцію –T, щоб створити тимчасовий файл між цими двома етапами.



Інтерфейси, що об’явлені заздалегідь


Якщо є такий IDL файл:


interface I;


interface J {


attribute I the_I;


};


тоді звичайно omniidl видасть зауваження:


test.idl:1: Warning: Forward declared interface `I' was never fully defined


Окреме таке IDL оголошення є нелегальним, але воно стає дійсними, якщо інтерфейс I оголошений у окремому файлі. Якщо існує багато файлів із подібною конструкцією, екран буде перевантажено попереджувальними повідомленнями. Для стримування цих повідомлень слід використовувати –nf



Коментарі


За замовчуванням omniidl відкидає коментарі у вихідному IDL файлі. Проте, при використанні опцій –k та –K він зберігає коментарі для використання у кінцевих модулях. Стандартний кінцевий модуль С++ ігнорує цю інформацію, але порівняно нескладно написати новий кінцевий модуль, який буде використовувати коментарі.


Дві різноманітні опції відноситься до того, як само коментарі будуть прикріплені до об’явлень усередині IDL файлу. Нехай є IDL файл:


interface I {


void op1();


// коментар


void op2();


};


Флаг –k прикріпить коментар до op1(); флаг –K прикріпить коментар до op2()



Опції кінцевого модуля С++


Для стандартного кінцевого модуля С++, який доступний для використання при встановленні опції –bcxx наступні –Wb опції доступні. Слід зауважити, що –Wb опції повинні бути вказані після –bcxx опції таким чином, щоб omniidl знав, якому кінцевому модулю слід передати аргументи.


-Wbh=суфікс – Використовувати суфікс для згенерованих заголовних файлів. За замовченням встановлений «.hh»


-Wbs=суфікс – Використовувати суфікс для згенерованих файлів заглушок. За замовченням встановлений «SK.cc»


-Wbd=суфікс – Використовувати суфікс для згенерованих динамічних файлів. За замовченням встановлений «DynSK.cc»


-Wba – Генерувати заглушки для TypeCode та Any


-Wbinline – Вихідні заглушки для включених директивою #include IDL файлів знаходяться у відповідності до головного файлу


-Wbtp – Генерація «зв’язувальної» реалізації скелетона


-Wbtf – Генерація пласкої «зв’язувальної» реалізації скелетона


-Wbsplice-modules – Об’єднати разом модулі, що відкриті багато разів


-Wbexample – Згенерувати приклад коду реалізації


-WbF – Генерувати фрагменти коду (тільки для експертів)


-WbBOA – Генерувати скелетони сумісні із BOA


-Wbold – Генерувати старі сигнатури CORBA 2.1 для скелетонів


-Wbold_prefix – Відображати ключові слова С++ із префіксом «_», скоріше ніж «_схх_»


-Wbkeep_inc_path – Зберігати шляхи IDL-директив #include у згенерованих #include-директивах


-Wbuse_quotes – використовувати лапки у #include-директивах (наприклад “дещо” скоріше ніж <дещо>)


Знову, більшість з цих директив пояснюють самі себе



Файли заглушок/скелетонів


За замовчуванням, omniidl розрізняє звичайну заглушку і файл скелетону від динамічних заглушок. Таким чином, додатки, які не потребують підтримки Any і TypeCode для частини IDL файлів, не витрачають простір необов’язковими визначеннями. Можливо робити вивід звичайних та динамічних заглушок в один файл простим визначенням ідентичних суфіксів для обох файлів. Наступна команда розміщує звичайну та динамічну заглушки в файл aSK.cc:


omniidl -bcxx -Wba -Wbd=SK.cc a.idl



Об’єднання модулів


На давніх компіляторах С++ без підтримки простору імен, IDL модулі відображаються у С++ класи, і таким чином не можуть бути довизначені. Для деяких IDL файлів можливо «зрощення» довизначених модулів у місце першої їх появи таким чином, що всі визначення модуля опиняються в одному класі. Це можливо для наступного типу ситуацій:


module M1 {


interface I {};


};


module M2 {


interface J {


attribute M1::I ok;


};


};


module M1 {


interface K {


attribute I still_ok;


};


};


Але стає не можливим, якщо модулі взаємозалежні:


module M1 {


interface I {};


};


module M2 {


interface J {


attribute M1::I ok;


};


};


module M1 {


interface K {


attribute M2::J oh_dear;


};


};


В обох випадках опція -Wbsplice-modules змусить omniidl покласти усі визначення модуля М1 до одного С++ класу. Для першого випадку, все працюватиме добре. Для другого випадку, клас М1::К буде містити посилання до M2::J, який ще не був визначений – це спричинить скарги компілятора С++



Пласкі класи зв’язування


Інша проблема з відображенням IDL модулів у С++ класи постає із шаблонами зв’язування. Відображення С++ говорить, що для інтерфейсу M::I, С++ шаблон зв’язування повинен мати ім’я POA_M::I_tie. Одначе, оскільки шаблони класів не можуть бути об’явлені усередині інших класів, ця схема іменування не може бути застосована з компіляторами без підтримки простору імен.


Стандартне рішення – згенерувати «пласке» ім’я класу зв’язування, використовуючи аргумент командного рядку –Wbtf. З таким флагом, шаблонний клас оголошується у глобальному просторі з ім’ям POA_M_I_tie. Тобто усі випадки «::» замінюються «_»



Генерування прикладів реалізації


При використанні флагу –Wbexample, omniidl згенерує файли прикладу реалізації, а також заглушки та скелетони. Для IDL файлу foo.idl, код прикладу буде записаний у foo_i.cc. Файл прикладу містить декларації класів і методів для операцій усіх інтерфейсів у IDL файлі, разом із функцією main(), яка створює екземпляри кожного об’єкту. Звичайно, все ще залишається необхідність наповнювати реалізацію імплементації.



Приклади


Згенерувати C++ заголовки та заглушки для файлу a.idl:


omniidl -bcxx a.idl


Згенерувати із підтримкою Any:


omniidl -bcxx -Wba a.idl


Як вище, але згенерувати заглушки для Python (при умові, що встановлений omniORBpy):


omniidl -bcxx -Wba -bpython a.idl


Просто перевірити IDL файли на коректність, без генерацій виводу:


omniidl a.idl b.idl