IDL通常用于遠(yuǎn)程調(diào)用軟件。 在這種情況下,一般是由遠(yuǎn)程客戶終端調(diào)用不同操作系統(tǒng)上的對(duì)象組件,并且這些對(duì)象組件可能是由不同計(jì)算機(jī)語(yǔ)言編寫的。IDL建立起了兩個(gè)不同操作系統(tǒng)間通信的橋梁。
從本質(zhì)上講,OMG IDL接口定義語(yǔ)言不是作為程序設(shè)計(jì)語(yǔ)言體現(xiàn)在CORBA體系結(jié)構(gòu)中的,而是用來(lái)描述產(chǎn)生對(duì)象調(diào)用請(qǐng)求的客戶對(duì)象和服務(wù)對(duì)象之間的接口的語(yǔ)言。OMG IDL文件描述數(shù)據(jù)類型和方法框架,而服務(wù)對(duì)象則為一個(gè)指定的對(duì)象實(shí)現(xiàn)提供上述數(shù)據(jù)和方法。
OMG IDL文件描述了服務(wù)器提供的服務(wù)功能,客戶機(jī)可以根據(jù)該接口文件描述的方法向服務(wù)器提出業(yè)務(wù)請(qǐng)求。在大多數(shù)CORBA產(chǎn)品中都提供IDL到相關(guān)編程語(yǔ)言的編譯器。程序設(shè)計(jì)人員只需將定義的接口文件輸入編譯器,設(shè)定編譯選項(xiàng)后,就可以得到與程序設(shè)計(jì)語(yǔ)言相關(guān)的接口框架文件和輔助文件。IDL文件應(yīng)用過(guò)程。
IDL(Interface Definition Language)即接口定義語(yǔ)言,是CORBA規(guī)范的一部分,是跨平臺(tái)開(kāi)發(fā)的基礎(chǔ)。IDL提供一套通用的數(shù)據(jù)類型,并以這些數(shù)據(jù)類型來(lái)定義更為復(fù)雜的數(shù)據(jù)類型。可變化 IDL 基本類型 整數(shù)類型 OMG IDL 摒棄int 類型在不同平臺(tái)上取值范圍不同帶來(lái)的多義性的問(wèn)題。常數(shù)定義常數(shù)可以是整數(shù)、字符、浮點(diǎn)數(shù)、字符串、Boolean、octet 或枚舉型,不能是 any 類型或用戶定義的類型。OMG IDL數(shù)組類型IDL array 和 sequence,可以輕易地被映射到實(shí)現(xiàn)語(yǔ)言中。序列可以包含所有類型的元素,不管是基本類型還是用戶定義的類型。
從本質(zhì)上講,OMG IDL接口定義語(yǔ)言不是作為程序設(shè)計(jì)語(yǔ)言體現(xiàn)在CORBA體系結(jié)構(gòu)中的,而是用來(lái)描述產(chǎn)生對(duì)象調(diào)用請(qǐng)求的客戶對(duì)象和服務(wù)對(duì)象之間的接口的語(yǔ)言。OMG IDL文件描述數(shù)據(jù)類型和方法框架,而服務(wù)對(duì)象則為一個(gè)指定的對(duì)象實(shí)現(xiàn)提供上述數(shù)據(jù)和方法。
OMG IDL文件描述了服務(wù)器提供的服務(wù)功能,客戶機(jī)可以根據(jù)該接口文件描述的方法向服務(wù)器提出業(yè)務(wù)請(qǐng)求。在大多數(shù)CORBA產(chǎn)品中都提供IDL到相關(guān)編程語(yǔ)言的編譯器。程序設(shè)計(jì)人員只需將定義的接口文件輸入編譯器,設(shè)定編譯選項(xiàng)后,就可以得到與程序設(shè)計(jì)語(yǔ)言相關(guān)的接口框架文件和輔助文件。
IDL文件應(yīng)用過(guò)
圖1 OMG IDL文件編譯過(guò)程
采用OMG IDL這樣的說(shuō)明性語(yǔ)言,其目的在于克服特定編程語(yǔ)言在軟件系統(tǒng)集成及互操作方面的限制,這正是CORBA的誘人之處,同樣也體現(xiàn)出采用CORBA構(gòu)造分布式應(yīng)用程序在網(wǎng)絡(luò)時(shí)代的強(qiáng)大生命力。OMG IDL已經(jīng)為C、C++、Java等主要高級(jí)程序設(shè)計(jì)語(yǔ)言制定了IDL到高級(jí)編程語(yǔ)言的映射標(biāo)準(zhǔn)。項(xiàng)目開(kāi)發(fā)人員可以根據(jù)需要選擇自己最熟悉的編程語(yǔ)言來(lái)獨(dú)立開(kāi)發(fā)基于CORBA的應(yīng)用,而對(duì)軟件系統(tǒng)的互操作能力不產(chǎn)生影響。
OMG IDL的語(yǔ)法規(guī)則
1. OMG IDL文件舉例
module Compute
{ typedef double radius;
typedef long times;
interface PI
{ double getResult( in radius aRadius, in times time); }
}
上述接口定義文件主要用于客戶端向服務(wù)對(duì)象提出請(qǐng)求:計(jì)算π值。因此,模塊中定義了一個(gè)方法getResult(),以圓的直徑(aRadius)和迭代次數(shù)(times)作為該方法的輸入?yún)?shù)。
2. OMG IDL詞法規(guī)則
OMG IDL采用ASCII字符集構(gòu)成接口定義的所有標(biāo)識(shí)符。標(biāo)識(shí)符由字母、數(shù)字和下劃線的任意組合構(gòu)成,但第一個(gè)字符必須是ASCII字母。IDL認(rèn)為大寫字母和小寫字母具有相同的含義,例如anExample和AnExample是相同的。
與C++和Java類似,采用以“/*”開(kāi)始,以“*/”結(jié)束來(lái)注釋一段代碼,以“//”開(kāi)始注釋從“//”開(kāi)始直至行尾的所有內(nèi)容。
另外,IDL保留了47個(gè)關(guān)鍵字,程序設(shè)計(jì)人員不能將關(guān)鍵字用作變量或方法名。需要注意的是關(guān)鍵字的大小寫,例如:
typedef double context;
//錯(cuò)誤:定義的變量context是關(guān)鍵字
typedef double CONTEXT;
//錯(cuò)誤:CONTEXT與關(guān)鍵字context沖突
3,接口(interface)
接口作為服務(wù)對(duì)象功能的詳細(xì)描述,封裝了服務(wù)對(duì)象提供服務(wù)方法的全部信息,客戶對(duì)象利用該接口獲取服務(wù)對(duì)象的屬性、訪問(wèn)服務(wù)對(duì)象中的方法。
接口用關(guān)鍵字interface聲明,其中包含的屬性和方法對(duì)所有提出服務(wù)請(qǐng)求的客戶對(duì)象是公開(kāi)的,如下例:
interface JobManager
{ readonly attribute string FirstName;
attribute string status;
string QueryJobStatus( in long Number, out string property); }
IDL語(yǔ)言數(shù)據(jù)類型有什么?
(1)基本數(shù)據(jù)類型:OMG IDL基本數(shù)據(jù)類型包括short、long和相應(yīng)的無(wú)符號(hào)(unsigned)類型,表示的字長(zhǎng)分別為16、32位。
(2)浮點(diǎn)數(shù)類型:OMG IDL浮點(diǎn)數(shù)類型包括float、double和long double類型。其中float表示單精度浮點(diǎn)數(shù),double表示雙精度浮點(diǎn)數(shù),long double表示擴(kuò)展的雙精度浮點(diǎn)數(shù)。
(3)字符和超大字符類型:OMG IDL定義字符類型char為面向字節(jié)的碼集中編碼的單字節(jié)字符; 定義類型wchar為從任意字符集中編碼的超大字符。
(4)邏輯類型:用boolean關(guān)鍵字定義的一個(gè)變量,取值只有true和false。
(5)八進(jìn)制類型:用octet關(guān)鍵字定義,在網(wǎng)絡(luò)傳輸過(guò)程中不進(jìn)行高低位轉(zhuǎn)換的位元序列。 octet 是 8 位類型。因?yàn)楸WC了 octet 在地址空間之間傳送時(shí)不會(huì)有任何表示更改,因此這就使它變成了一種非常重要的類型。這就表示您可以發(fā)送二進(jìn)制數(shù)據(jù),并且知道當(dāng)將它打包時(shí),它的形式仍然相同。其它每種 IDL 類型在傳輸時(shí)都有表示變化。例如,根據(jù) IOR 代碼集信息的指示,char 數(shù)組會(huì)經(jīng)歷代碼集轉(zhuǎn)換。而 octet 數(shù)組卻不會(huì)。
(6)any數(shù)據(jù)類型:引入該類型用于表示OMG IDL中任意數(shù)據(jù)類型。
(7) 常量
OMG IDL用const關(guān)鍵字聲明一個(gè)常量,用于模塊(module)或接口(interface)中定義保持不變的量,如:
const double PI = 3.1415926;
在IDL中,可以定義long、unsigned long、unsigned short、char、boolean、float、double、string類型的常量。
(8)結(jié)構(gòu)類型:
typedef long GoodsNumber;
struct
{ GoodsNumber number;
string name;
float price; }
(9)聯(lián)合類型:
union stockIn switch( short )
{ case 1: stocker : long;
case 2: goodsName1 : string;
case 3: goodsName2 : string; }
(10)枚舉類型:
enum GoodsStatus { GOODS_SALED, GOODS_INSTOCK};
(11) 數(shù)組類型
OMG IDL的數(shù)組類型提供了多維定長(zhǎng)、統(tǒng)一數(shù)據(jù)格式的數(shù)據(jù)存儲(chǔ)方式——數(shù)組。每一維的長(zhǎng)度必須在定義時(shí)給定,所有數(shù)據(jù)單元必須存儲(chǔ)相同類型的元素。如下例定義一個(gè)長(zhǎng)度為20×100的整數(shù)數(shù)組:
typedef long aDimension[20][100];
(12)模板(template)類型
OMG IDL提供兩種類型的模板:
(13)序列(sequence)類型:
用該方法定義長(zhǎng)度可變的任意數(shù)值類型的存儲(chǔ)序列,通常在定義時(shí)可以指定長(zhǎng)度,也可以不指定,如:
typedef sequence aSequence;
//長(zhǎng)度定義為80
typedef sequence anotherSequence;
//長(zhǎng)度不定 字符串(string)序列:
同樣對(duì)于字符串序列類型,也有兩種定義方式:
typedef string <80> aName; //長(zhǎng)度定義為80
typedef string anotherName; //長(zhǎng)度不定