IDL(Interface Definition Language)即接口定義語言,是CORBA規范的一部分,是跨平臺開發的基礎。IDL提供一套通用的數據類型,并以這些數據類型來定義更為復雜的數據類型。可變化 IDL 基本類型 整數類型 OMG IDL 摒棄int 類型在不同平臺上取值范圍不同帶來的多義性的問題。常數定義常數可以是整數、字符、浮點數、字符串、Boolean、octet 或枚舉型,不能是 any 類型或用戶定義的類型。OMG IDL數組類型IDL array 和 sequence,可以輕易地被映射到實現語言中。序列可以包含所有類型的元素,不管是基本類型還是用戶定義的類型。
IDL(Interface Definition Language)即接口定義語言,是CORBA規范的一部分,是跨平臺開發的基礎。IDL提供一套通用的數據類型,并以這些數據類型來定義更為復雜的數據類型。可變化 IDL 基本類型 整數類型 OMG IDL 摒棄int 類型在不同平臺上取值范圍不同帶來的多義性的問題。常數定義常數可以是整數、字符、浮點數、字符串、Boolean、octet 或枚舉型,不能是 any 類型或用戶定義的類型。OMG IDL數組類型IDL array 和 sequence,可以輕易地被映射到實現語言中。序列可以包含所有類型的元素,不管是基本類型還是用戶定義的類型。
OMG IDL文件概述
從本質上講,OMG IDL接口定義語言不是作為程序設計語言體現在CORBA體系結構中的,而是用來描述產生對象調用請求的客戶對象和服務對象之間的接口的語言。OMG IDL文件描述數據類型和方法框架,而服務對象則為一個指定的對象實現提供上述數據和方法。
OMG IDL文件描述了服務器提供的服務功能,客戶機可以根據該接口文件描述的方法向服務器提出業務請求。在大多數CORBA產品中都提供IDL到相關編程語言的編譯器。程序設計人員只需將定義的接口文件輸入編譯器,設定編譯選項后,就可以得到與程序設計語言相關的接口框架文件和輔助文件。
IDL文件應用過程如圖1所示。

圖1 OMG IDL文件編譯過程
在語法規則方面,類似于C++或Java中關于接口或對象的定義,OMG IDL增加了一些構造方法支持IDL特有的方法調用機制。OMG IDL只是一種說明性的語言,支持C++語法中的常量、類型和方法的聲明。采用OMG IDL這樣的說明性語言,其目的在于克服特定編程語言在軟件系統集成及互操作方面的限制,這正是CORBA的誘人之處,同樣也體現出采用CORBA構造分布式應用程序在網絡時代的強大生命力。OMG IDL已經為C、C++、Java等主要高級程序設計語言制定了IDL到高級編程語言的映射標準。項目開發人員可以根據需要選擇自己最熟悉的編程語言來獨立開發基于CORBA的應用,而對軟件系統的互操作能力不產生影響。
OMG IDL的語法規則
1. OMG IDL文件舉例
module Compute
{ typedef double radius;
typedef long times;
interface PI
{ double getResult( in radius aRadius, in times time); }
}
上述接口定義文件主要用于客戶端向服務對象提出請求:計算π值。因此,模塊中定義了一個方法getResult(),以圓的直徑(aRadius)和迭代次數(times)作為該方法的輸入參數。
2. OMG IDL詞法規則
OMG IDL采用ASCII字符集構成接口定義的所有標識符。標識符由字母、數字和下劃線的任意組合構成,但第一個字符必須是ASCII字母。IDL認為大寫字母和小寫字母具有相同的含義,例如anExample和AnExample是相同的。
與C++和Java類似,采用以“/*”開始,以“*/”結束來注釋一段代碼,以“//”開始注釋從“//”開始直至行尾的所有內容。
另外,IDL保留了47個關鍵字,程序設計人員不能將關鍵字用作變量或方法名。需要注意的是關鍵字的大小寫,例如:
typedef double context;
//錯誤:定義的變量context是關鍵字
typedef double CONTEXT;
//錯誤:CONTEXT與關鍵字context沖突
3. 數據類型
(1)基本數據類型:OMG IDL基本數據類型包括short、long和相應的無符號(unsigned)類型,表示的字長分別為16、32位。
(2)浮點數類型:OMG IDL浮點數類型包括float、double和long double類型。其中float表示單精度浮點數,double表示雙精度浮點數,long double表示擴展的雙精度浮點數。
(3)字符和超大字符類型:OMG IDL定義字符類型char為面向字節的碼集中編碼的單字節字符; 定義類型wchar為從任意字符集中編碼的超大字符。
(4)邏輯類型:用boolean關鍵字定義的一個變量,取值只有true和false。
(5)八進制類型:用octet關鍵字定義,在網絡傳輸過程中不進行高低位轉換的位元序列。
(6)any數據類型:引入該類型用于表示OMG IDL中任意數據類型。
4. 常量
OMG IDL用const關鍵字聲明一個常量,用于模塊(module)或接口(interface)中定義保持不變的量,如:
const double PI = 3.1415926;
在IDL中,可以定義long、unsigned long、unsigned short、char、boolean、float、double、string類型的常量。
5. 構造數據類型
類似于C和C++的語法規則,OMG IDL中構造數據類型包括結構、聯合、枚舉等形式。如下例:
(1)結構類型:
typedef long GoodsNumber;
struct
{ GoodsNumber number;
string name;
float price; }
(2)聯合類型:
union stockIn switch( short )
{ case 1: stocker : long;
case 2: goodsName1 : string;
case 3: goodsName2 : string; }
(3)枚舉類型:
enum GoodsStatus { GOODS_SALED, GOODS_INSTOCK};
6. 數組類型
OMG IDL的數組類型提供了多維定長、統一數據格式的數據存儲方式——數組。每一維的長度必須在定義時給定,所有數據單元必須存儲相同類型的元素。如下例定義一個長度為20×100的整數數組:
typedef long aDimension[20][100];
7.模板(template)類型
OMG IDL提供兩種類型的模板:
(1) 序列(sequence)類型:
用該方法定義長度可變的任意數值類型的存儲序列,通常在定義時可以指定長度,也可以不指定,如:
typedef sequence <long,80> aSequence;
//長度定義為80
typedef sequence <long> anotherSequence;
//長度不定
(2) 字符串(string)序列:
同樣對于字符串序列類型,也有兩種定義方式:
typedef string <80> aName; //長度定義為80
typedef string anotherName; //長度不定
8.接口(interface)
在前幾講中,均提到了CORBA接口,接口作為服務對象功能的詳細描述,封裝了服務對象提供服務方法的全部信息,客戶對象利用該接口獲取服務對象的屬性、訪問服務對象中的方法。
接口用關鍵字interface聲明,其中包含的屬性和方法對所有提出服務請求的客戶對象是公開的,如下例:
interface JobManager
{ readonly attribute string FirstName;
attribute string status;
string QueryJobStatus( in long Number, out string property); }