對象接口定義語言

對象接口定義語言

IDL(Interface Definition Language,接口定義語言)是用於描述分散式對象接口的定義語言,利用IDL進行接口定義之後,就確定了客戶端與伺服器之間的接口,這樣即使客戶端和伺服器獨立進行開發,也能夠正確地定義和調用所需要的分散式方法。

概述

ORB提供了兩個用於存儲有關對象信息的線上資料庫:接口存儲庫(InterfaceRepository)與實現存儲庫(Implementation Repository)。

其中,接口存儲庫負責對象的IDL接口定義的存儲、分布和管理。它使用永久對象來表示IDL信息,使客戶對象可以在運行時查閱接口存儲庫的內容,獲得對象實現的IDL接口信息,從而向對象實現發出請求。使用接口存儲庫中的信息還可以對對象請求中操作的有效性進行檢查。接口存儲庫可以從IDL語言編譯器,或者通過自身的數據寫入功能,直接控制這些定義。

CORBA通過定義一組類描述了信息如何在接口存儲庫中組織和檢索,這些類的實例即表示存儲庫中的信息。接口存儲庫本身作為一個對象存在,應用程式可以像調用其他CORBA對象所提供的操作一樣,來調用接口存儲庫接口中的操作。接口存儲庫結構靈活,能夠跟蹤按照類似IDL方式組織的對象集合。

靜態CORBA

在軟體體系結構中,OMG IDL可作為定義軟體劃分的通用規範,用IDL定義各種具有屬性和方法的接口對象,並通過支持接口描述之間的繼承來實現軟體重用。

OMG IDL是一種面向對象的接口定義語言,能夠支持複雜的數據類型。同時,它是一種說明性語言,而不是程式語言,主要用於指定對象包含方法和屬性的接口,使對象行為與對象實現分離。OMG IDL支持的屬性主要包括:模組(Module)、接口(Interface)、方法(Method)、屬性(Attribute)、繼承(Inheritance)和數據類型。這樣,就實現了將對象的接口與實現分離,可以用不同的程式語言實現對象,而它們之間又可以進行互操作。當然,需要分別將IDL映射到具體的程式語言,目前,OMG已經為IDL到C,C++,Smalltalk,Ada,COBOL和Java制定了映射標準,最新的CORBA 3.0規範又增加了IDL到Python(一種類似於Perl的腳本語言,可參考http://www.python.org/)的映射標準。

OMG IDL編譯器可以根據接口定義來產生分散式對象的客戶方的存根(Stub)和服務方的骨架(skeleton)。存根代表客戶創建並發出請求,骨架則把請求交給CORBA對象實現。具體來說,靜態IDL存根是服務的靜態接口,客戶程式與它直接相連。存根的作用相當於本地調用,由存根向ORB透明地提供一個接口,以實現對操作參數的編碼和解釋,並以適當的格式進行傳輸。存根為客戶機提供了這樣一種機制,使得客戶機能夠不關心ORB的存在,而把請求交付給存根,由存根負責對請求參數的封裝與傳送,以及對返回結果的接收和去封裝。

靜態IDL骨架是靜態IDL存根在伺服器端的對應,在請求的接收端提供與存根類似的服務。當ORB接收到請求時,由骨架將請求參數去封裝,識別客戶所請求的服務,調用伺服器中的對象實現,當伺服器完成了對請求的處理後,骨架把執行結果封裝,並將結果返回給客戶程式。

由於存根和骨架都是從用戶的接口定義編譯而來,所以它們都和具體的接口有關,並且,在請求發生前,存根和骨架早已分別被直接連結到客戶程式和對象實現中去。因此,通過存根和骨架的調用被通稱為靜態調用。

對象接口定義語言 對象接口定義語言

從創建IDL聲明到使用預編譯器和編譯器編譯從而生成靜態IDL存根、靜態IDL骨架等對象的全過程如圖所示。

在圖中各個步驟的含義如下:

1)用接口定義語言定義對象類。通過接口定義語言,對象可以告知潛在的客戶何種操作是可用的以及應該如何調用它。接口定義語言定義了對象的類型、對象的屬性、對象輸出的方法以及方法的參數。

2)通過語言預編譯程式運行接口定義語言檔案。典型的CORBA兼容預編譯程式可以處理接口定義語言檔案,為實現伺服器類產生語言框架。

3)增加實現代碼。必須在上述框架里進一步提供實現代碼,創建伺服器類。

4)由編譯器編譯代碼。CORBA兼容編譯程式通常能夠產生至少三種類型的輸出檔案,分別是:向接口存儲庫描述對象的輸入檔案;IDL所定義的方法的客戶存根,這些存根能夠被需要通過ORB靜態訪問IDL定義服務的客戶所調用:在伺服器上調用這些方法的伺服器框架,也稱為向上調用方法接口。用戶必須提供實現這些伺服器類的代碼。存根的自動產生功能使開發者擺脫了編寫存根程式的負擔,也使應用程式變得與特定的ORB實現無關。

5)將類定義與接口存儲庫綁定。通常可以用相關的實用程式將IDL信息綁定(裝入)到接口存儲庫,這樣程式能夠在運行時訪問。

6)向實現存儲庫註冊運行對象。對象適配器在實現存儲庫里記錄對象標記以及在伺服器上實例化的對象類型。實現存儲庫還知道哪一些對象類在某個特定伺服器上得到了支持。ORB利用這個信息去查找某個特定伺服器上的活動對象或者請求激活對象。

7)實例化伺服器對象。在伺服器對象適配器啟動時,它可以將伺服器對象實例化。這些運行時的對象是伺服器應用程式類的實例。CORBA規定了不同的對象適配器策略,用來創建和管理運行對象。

在靜態CORBA調用中,要特別注意的問題是存根的管理。客戶在調用伺服器對象的方法之前,必須同時擁有一個存根和一個對象標記,對象標記的傳送相對比較容易實現,而客戶對存根的擁有則通常是通過將存根放入客戶代碼中來實現。不過,新的CORBA規範中規定可以動態地從伺服器上下載存根(如果是以Java位元組碼的方式則很適合下載),也就是說,靜態CORBA正在變得越來越“動態”。

動態CORBA

除了可以通過存根和骨架進行靜態調用外,CORBA還支持兩種用於動態調用的接口:動態調用接口(Dynamic Invocation Interface,簡稱DII)和動態骨架接口(Dynamic Skeleton Interface,簡稱DSI)。DII和DSI可以被分別視為通用存根和通用骨架。它們由ORB直接提供,不依賴於所調用對象的接口。

DII支持客戶方的動態請求調用,使客戶方套用可以在運行時向任何對象發出請求,動態地選擇對象的實現接口和操作。而不像靜態調用那樣,必須在編譯時就知道特定的目標對象的接口信息。DII通過函式create_request根據具體對象實現的IDL接口來動態創建對象請求,其IDL接口信息由接口存儲庫提供。

DSI是DII在Server方的對應,與DII允許客戶不通過存根就可以調用請求類似,DSI允許用戶在沒有靜態骨架信息的條件下來獲得對象實現。DSI從進入的訊息找出調用的目標對象及相應的方法,並提供運行時的連線機制。

總體來說,動態調用接口使客戶可在運行時選擇目標對象並動態調用其方法。客戶不需要預編譯存根,這意味著客戶可在調用時發現接口的相關信息。但是,客戶具體怎樣來發現這些遠程對象呢?實際上,有多種機制可以做到這一點,其中,最簡單的辦法是:給客戶提供“字元串化的”的對象標記,然後客戶通過把字元串轉換成一個活動的對象標記再建立連線。當然,客戶也可以利用CORBA名字服務查找對象,或者客戶可以通過CORBA的“電話簿黃頁”——交易器服務來發現這些對象。

假設用戶已獲得了想要動態調用的對象的標記,下面來描述一下如何調用這個對象上的遠程方法。

1)獲得接口名字。CORBA對象是自描述的,它們能夠提供相當多有關自己的信息,因此,可以通過get_interface方法向這個對象詢問其接口的名字,這個調用將返回一個InterfaceDef對象的引用,該對象是接口存儲庫中一個描述接口信息的對象。

2)從接口存儲庫獲得方法描述。可以把InterfaceDef用作接口存儲庫的入口點,可以獲得有關接口和它所支持的方法的各種詳細信息。CORBA定義了約10個調用,用於接口存儲庫的瀏覽訪問和對象描述。如,客戶可以發出lookup_name以尋找它想調用的方法,然後再發出一個describe方法來取得被找到方法的全部IDL定義。或者發出一個describe_interface方法來獲得接口的全部描述,再進一步找到想調用的方法。

3)創建參數列表。CORBA定義了一個自定義的數據結構以傳遞參數,被稱為命名數值列表。用戶可以使用一系列方法實現這個列表。

4)創建請求。請求是一個包含方法名稱、參變數列表和返回值的CORBA準對象。可以通過調用create_request方法來創建請求。

5)調用請求。可以用以下三種辦法中的任何一種調用請求:

用invoke調用傳送請求並得到結果。

將控制項返回給程式,再通過傳送poll_reponse或get_reponse來論詢回響。

傳送調用可以通過傳送Send_oneway被定義一個數據報,此時不需要回響。

這三種方式有時也被稱為同步、延遲同步和單向調用。

可以看出,要動態地調用一個方法需要進行相當多的工作,最困難的部分是創建請求,用不同的方法創建和調用遠程方法將使這項工作變得更加複雜,如必須權衡複雜度和性能,以得到更多的靈活性。

上述過程中所使用到的各個方法分散於CORBA的四個不同接口中,它們分別是:

1、CORBA::Object:一個準對象接口,定義了每一個CORBA對象必須支持的操作,是所有CORBA對象的根接口,其與動態調用有關的方法包括:getinterface方法、create_request方法、_request方法。

2、CORBA::Request:一個定義遠程對象操作的準對象接口。其與動態調用有關的方法包括:add_arg、invoke、send_oneway、send_deferred、get_reponse、poll_reponse等。

3、CORBA::NVList:幫助用戶創建參數列表的準對象接口。其與動態調用有關的方法包括:add_item、add_value、get_count、remove、free等。

4、CORBA::ORB:定義通用對象請求代理方法的準對象接口。可以從客戶或者伺服器實現中調用其提供的方法以操作ORB準對象。與動態請求相關的方法包括:create_list、poll_next_reponse、get_next_reponse等

一般來說,當客戶頻繁地調用伺服器對象而且伺服器對象基本上無變化時使用靜態調用,當客戶很少調用伺服器對象或者客戶在運行時發現伺服器對象時使用動態調用。

相關詞條

熱門詞條

聯絡我們