Актуально: ИТ-решение

Оборудование за 1 рубль

Позволяет корпоративным клиентам до 31 августа этого года приобрести оборудование для подключения к Интернету по мобильной сети оператора всего за 1 рубль.
Читайте подробности>>
 




Мир ПК :: Мир ПК

IDL - заклинания эпохи распределенных вычислений

в buzz в мой мир в twitter версия для печатисохранить в pdf

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

Занятие первое

Появление в программировании того или иного языка обычно связано с возникновением и развитием некоей новой концепции. Так, одновременно с идеей объектно-ориентированной разработки (в ее современном варианте) был создан язык cмалток, сформировавший, ко всему прочему, и условия для превращения обычного Cи в объектно-ориентированный Cи++ и классического виртовского Паскаля в Borland Object Pascal. Все эти «диалекты» живы и по сей день, подтверждая своим существованием, что до заката объектно-ориентированной эпохи еще далеко.

Дальнейшее применение объектов и компонентов вкупе с внедрением последних в распределенные системы вызвало необходимость создания такого языка программирования, который бы позволил описать любой объект или компонент. И, что не менее важно, это описание должно быть одинаковым для любой платформы. Программисты ответили на эти требования, выдав «на-гора» язык описания интерфейсов IDL (Interface Definition Language). Сегодня за развитием IDL следит международный консорциум OMG, в чьем ведении также находятся технология CORBA и язык UML.

Следует заметить, что IDL не только язык, но и инструмент, с помощью которого можно сохранять метаинформацию об объектах, т. е. данные о том, как устроен объект. Известно довольно много случаев, когда язык IDL используется для описания контрактов — технических параметров, позволяющих нескольким независимым группам работать одновременно над различными частями проекта. Хотя в основном исходные тексты на IDL служат своеобразным «сырьем», из которого специальные компиляторы IDL генерируют исходные тексты на одном из языков программирования высокого уровня. Такой процесс правильно называть проецированием (mapping), но для удобства мы наречем его трансляцией. Типичный процесс создания распределенных объектных приложений состоит из описания объектов на IDL, их трансляции на какой-либо язык программирования, добавления бизнес-логики и компиляции полученных исходных текстов в готовые для запуска модули.

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

  • модуль — блок с заданным именем, объединяющий логически связанные конструкции языка IDL; в целом модуль можно воспринимать как пакет (package) в языке Java или пространство имен (namespace) в языке Cи++;
  • интерфейс — набор атрибутов и операций объекта, с помощью которого потребитель может обращаться к объекту;
  • атрибут — сущность, описывающая какое-либо свойство объекта; атрибут можно сравнить с внутренней переменной класса;
  • операция — сущность, которую вызывают для выполнения действий, связанных с функциональным назначением объекта; операцию можно сравнить с методом класса.

Вооружившись этими важными понятиями, мы можем приступать к описанию элементов и конструкций языка.

Комментарии

Комментарии IDL — точная копия комментариев языка Cи++. Это значит, что для сокрытия фрагмента исходного текста можно применить пары символов /* и */. Для исключения из компиляции одной строки или ее части удобно пользоваться символами //, как это показано на примере:

/* Этот текстовый блок будет пропущен компилятором, потому что он закомментирован */ ... Эти строки будут восприняты компилятором как исходный текст и будут откомпилированы // а эта строка будет пропущена

Идентификаторы

К идентификаторам причисляют имена, с которыми имеет дело программист. Это могут быть имена интерфейсов, модулей, атрибутов, операций, констант и т. д. Для любого компилятора IDL идентификатор — это последовательность букв и цифр, а также знак подчеркивания ?_?. Все идентификаторы в IDL-файлах должны начинаться с буквенного символа. В силу некоторых особенностей разные IDL-компиляторы по-разному реагируют на нарушение этого правила. Если набрать фрагмент, описывающий три новых идентификатора:

attribute Object #x; attribute Object &_x; attribute Object 3X;

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

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

attribute string MirPK; attribute string mIRpk;

будут восприняты компилятором IDL как одно и то же имя, что приведет к появлению на экране сообщения об ошибке, говорящего о попытке переопределить идентификатор MirPK. В этом есть свой резон. Если данный фрагмент IDL будет оттранслирован на язык программирования, не различающий регистр букв, то как соответствующий компилятор этого языка сможет различить имена? Поэтому подобная перестраховка не помешает.

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

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

вызовут ошибку переопределения имени getSomething. Реакция других компиляторов может быть иной.

Ключевые слова

Иначе обстоит дело с ключевыми словами — зарезервированным набором IDL. К регистру букв в ключевых словах компиляторы этого языка весьма чувствительны, поэтому даже попытка использовать слово Module вместо module приведет к ошибке времени компиляции.

IDL: ключевые слова

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  
сontext In out TRUE  
default inoutraises typedef  

Литералы

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

Булев литерал самый простой. Он применяется при операциях с типом boolean и может принимать значение TRUE или FALSE:

const boolean flag = TRUE;

Немного сложнее символьные литералы. Они применяются там, где фигурируют типы char и wchar. По традиции, доставшейся от языков Cи и Cи++, символьные литералы заключаются в одинарные кавычки (? ?). Размер простых символьных литералов — 8 бит. Они описывают символы в диапазоне от 0 до 255, т. е. стандартную таблицу символов ISO Latin-1 (8859-1). К этому добавляются служебные символы и символы, описанные числовыми константами.

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

символ новой строки
горизонтальная табуляция
вертикальная табуляция v
backspace 
carriage return
form feed f
alert a
обратная косая черта <>
вопросительный знак ?
одинарная кавычка ?
двойная кавычка »
восьмеричное число ooo
шестнадцатеричное число xhh

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

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

Целочисленные литералы могут быть десятичными, восьмеричными и шестнадцатеричными. Десятичные литералы состоят из последовательности цифр, но если последовательность цифр начинается с нуля, то компилятор считает, что перед ним литерал в восьмеричной системе счисления. Шестнадцатеричные литералы могут содержать все цифры и латинские символы от A до F. Подобные литералы должны начинаться с пары символов 0x или 0X.

Литералы с плавающей точкой могут состоять из целого числа и дробной части, разделенных символом точки (.). Их также можно записать числом в научном формате, т. е. отделить мантиссу числа от его порядка буквой e или E:

1234E+13 0.987e-150

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

И последние литералы — строковые. Они представляют собой строки, состоящие из символов, допустимых в качестве символьных литералов за исключением символа ??. И хотя VisiBroker и idltojava из JDK корректно обрабатывают эти символы, тем не менее ясно, что при трансляции IDL на Cи и Cи++ наличие нулевого символа в строке может послужить источником ошибки. Судя по всему, именно это и явилось причиной запрета на использование символа ??. Чтобы избежать ошибок компиляции, полученных в результате трансляции исходных текстов, компилятор IDL конвертирует все шестнадцатеричные коды в восьмеричные. Строковые литералы, как и символьные, могут быть основаны на простых и «широких» символах.

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

Для организации условной компиляции и задания некоторых опций компиляторы IDL используют препроцессинг, основанный на директивах, описанных в стандарте ANSI C++, поэтому программисты на языках Cи и Cи++ почувствуют себя здесь как рыба в воде. Если же вы не знакомы с этими языками, то следует обратиться к соответствующей литературе. В препроцессинге IDL присутствуют специальные разновидности директивы #pragma:

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


17.06.1999г


Комментарии:


Для того, чтобы оставить комментарий авторизуйтесь или зарегистрируйтесь.

Новости ОСП-ТВ - 03.09.10


В номере

17/03/2000 №03


Эта рубрика в архиве
Список номеров за



Инфозоны

DIRECTUM EVERYWHERE

УРАЛХИМ признал DIRECTUM

Система DIRECTUM стала корпоративным стандартом электронного документооборота в масштабах всего холдинга "Уралхим".

Уфа внедряет электронный муниципалитет

Платформа DIRECTUM стала центральным звеном в создаваемой информационной системе, направленной на повышение эффективности и открытости местных органов власти.

Цена вопроса

Кто и когда должен оценивать эффективность ECM-проектов? Как перейти от общих результатов к конкретным количественным характеристикам?

DIRECTUM во власти

Внедрение СЭД в Правительстве Астраханской области: система управления делами для 12 министерств и более 1300 сотрудников.

OSP.RU :: Написать письмо.