專利名稱:從外部程序環(huán)境調(diào)用后綁定函數(shù)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及到應(yīng)用以及軟件組件,特別涉及從先綁定的應(yīng)用中調(diào)用后綁定函數(shù)的 方法與系統(tǒng)。
背景技術(shù):
在應(yīng)用中綁定函數(shù)調(diào)用需要用真實的機(jī)器地址取代對該函數(shù)的符號地址。因此, 綁定操作確定哪個函數(shù)(即實現(xiàn)該功能的代碼部分)在運行時執(zhí)行。當(dāng)綁定發(fā)生在編譯階 段時,該綁定為“先綁定”。與此相對應(yīng)地,當(dāng)綁定發(fā)生在運行時,該綁定為“后綁定”。通常 可將編程語言分類為先綁定的或后綁定的。函數(shù)調(diào)用綁定時間的選擇(即是先綁定還是后綁定)是運行時的代碼性能(先綁 定在運行時更快)和程序員在編程時的便易性(后綁定程序更易于編寫)之間的一種折 衷。當(dāng)前,程序員必須決定以下何種更為重要程序員編寫程序時所用的時間還是程序運行 所用的時間。不幸的是,通常這是一種很難做出的選擇。在現(xiàn)有的系統(tǒng)中還沒有機(jī)制能有 效地平衡這種折衷。
發(fā)明內(nèi)容
本發(fā)明提供了一種將后綁定程序函數(shù)集成到外部程序環(huán)境之中的方法和系統(tǒng)。該 外部程序環(huán)境可以是先綁定環(huán)境,也可以是后綁定環(huán)境,或者兩種環(huán)境的組合。根據(jù)本發(fā)明的第一個方面,提供了一種將后綁定應(yīng)用集成到外部程序環(huán)境中的方 法。提供后綁定程序和后綁定環(huán)境,隨后加以檢測以確定哪些后綁定調(diào)用存在于后綁定程 序和環(huán)境中而應(yīng)當(dāng)使其為外部環(huán)境可用。然后生成一個接口,其中該接口允許將這些后綁 定函數(shù)調(diào)用集成到該外部程序環(huán)境中。用于實現(xiàn)本發(fā)明的外部環(huán)境可以是后綁定環(huán)境、先 綁定環(huán)境或者它們的組合。在本發(fā)明的另一個方面中,提供了一種用于將后綁定程序語言集成到外部環(huán)境中 的系統(tǒng),其中該系統(tǒng)包括一個外部環(huán)境,一個后綁定程序和程序環(huán)境。該外部環(huán)境可以是后 綁定程序環(huán)境、也可以是先綁定程序環(huán)境、或者它們的某種組合。后綁定程序環(huán)境包括一個 模塊化執(zhí)行引擎和一種接口機(jī)構(gòu),使得該接口機(jī)構(gòu)允許用外部環(huán)境兼容的格式表達(dá)后綁定語義。在本發(fā)明的又一個方面中,提供了一種將可執(zhí)行的后綁定內(nèi)容打包到與外部程序 環(huán)境一起使用的可重新發(fā)布的應(yīng)用之中的方法。該外部環(huán)境可以是后綁定程序環(huán)境、或是先綁定程序環(huán)境或者它們的某種組合。該方法包括以下步驟首先檢查后綁定內(nèi)容,以確定 后綁定內(nèi)容中的哪些文件代表后綁定應(yīng)用。然后提供后綁定模塊化執(zhí)行引擎,其中,模塊化 執(zhí)行引擎僅包含那些支持后綁定應(yīng)用所必需的函數(shù)。而且,模塊化執(zhí)行引擎被配置成僅執(zhí) 行那些支持后綁定應(yīng)用所必需的函數(shù)。在本發(fā)明的又一個方面中,提供了一種包括客戶端與服務(wù)器的網(wǎng)絡(luò),其中服務(wù)器 端能夠執(zhí)行后綁定程序環(huán)境和外部程序環(huán)境。一些合適的外部環(huán)境包括(但不局限于)后 綁定程序環(huán)境,先綁定程序環(huán)境或者它們的組合??蛻舳送ㄟ^網(wǎng)絡(luò)與服務(wù)器進(jìn)行通信。所 生成的接口允許后綁定程序和程序環(huán)境與外部程序環(huán)境之間的數(shù)據(jù)交換,以使得能夠?qū)⒑?綁定應(yīng)用集成到外部程序環(huán)境中。在本發(fā)明的一個可選擇的方面中,描述了一種用于將后綁定應(yīng)用集成到外部環(huán)境 中的系統(tǒng),其中分發(fā)服務(wù)器用于向客戶端設(shè)備提供信息。此外,還提供了一種接口機(jī)構(gòu),其 中該接口機(jī)構(gòu)允許將后綁定函數(shù)調(diào)用集成到外部程序環(huán)境中。
以下,結(jié)合附圖來詳細(xì)說明本發(fā)明的實施例,其中圖1為對用于實現(xiàn)本發(fā)明的示意性實施例的電子設(shè)備進(jìn)行說明的方框示意圖;圖2描述了一種適于實現(xiàn)本發(fā)明的示意性實施例的客戶端-服務(wù)器環(huán)境,其中后 綁定函數(shù)能被合并到外部編程環(huán)境中;圖3描述了用于實現(xiàn)本發(fā)明的示意性實施例的組件;圖4是對示意性實施例中的組件交互進(jìn)行詳細(xì)說明的圖例;圖5是說明用于實現(xiàn)確定對其它后綁定函數(shù)間的依賴性的步驟的流程圖;圖6是用于將后綁定函數(shù)調(diào)用集成到后綁定程序環(huán)境中所必需的組件的一個示 意性實施例。
具體實施例方式本發(fā)明的示意性實施例提供了一種機(jī)制,其對于存在于外部程序環(huán)境之中的應(yīng)用 調(diào)用在后綁定的語言中存在的函數(shù)。為了說明之目的,下面將參照將后綁定函數(shù)集成到先 綁定外部程序環(huán)境進(jìn)行描述。還存在一些可替代的外部環(huán)境,包括但不局限于那些包含先 綁定語言、后綁定語言、或者它們的組合的環(huán)境。在本實施例中,將后綁定函數(shù)集成到先綁 定環(huán)境之中允許程序員選擇何時實現(xiàn)執(zhí)行時間與編碼便易性之間的折衷。因此,程序員可 以采用先綁定函數(shù)調(diào)用來執(zhí)行應(yīng)用中那些關(guān)鍵部分,而對于難以編程的函數(shù)則采用后綁定 函數(shù)調(diào)用。將后綁定函數(shù)的調(diào)用集成到先綁定編程環(huán)境之中,除了提供前述的折衷平衡外, 還具有很多其它的優(yōu)點。首先,這種集成為先綁定編程環(huán)境提供了一種利用后綁定的表達(dá) 能力之優(yōu)點的方式。其次,這種集成使得先綁定編程環(huán)境能夠?qū)⒁粋€先綁定函數(shù)調(diào)用與一 個或多個后綁定函數(shù)調(diào)用的集合相綁定。再次,它為大量的遺留系統(tǒng)提供了包括進(jìn)更多現(xiàn) 代編程方法的方式,例如所發(fā)現(xiàn)的采用后綁定函數(shù)調(diào)用的方式。在替換實例中,將后綁定函數(shù)集成到后綁定程序環(huán)境中能提供大量的優(yōu)點,而這 些優(yōu)點是在利用將后綁定函數(shù)集成到先綁定語言時并不容易被認(rèn)識到的。例如,大多數(shù)后
5綁定程序語言專門用于在某一特殊問題領(lǐng)域中操作。例如,LISP后綁定語言特別適用于對 字符串列表中的符號處理。與之相比,后綁定PROLOG編程語言則適用于原理的證明以及邏 輯推理問題。與之相比,后綁定MATLAB編程語言適合于在數(shù)值線性代數(shù)領(lǐng)域中操作。上述 的后綁定程序語言僅用于說明可用于本發(fā)明的可用的后綁定程序環(huán)境中的一些實例。這里 所列出的例子并不是明確的,作為本領(lǐng)域的普通技術(shù)人員很容易理解,存在著大量的可適 用于本發(fā)明的后綁定程序環(huán)境。當(dāng)將后綁定函數(shù)的調(diào)用集成到后綁定環(huán)境中時,本發(fā)明允許用戶構(gòu)造一種程序, 其將對多種后綁定語言的調(diào)用組合起來,以便采用最合適的語言來解決存在的計算問題。出于示例目的,本示意性的實施例將針對MATLAB的環(huán)境進(jìn)行詳細(xì)的說明。雖然 本示意性實施例將會針對基于MATLAB的應(yīng)用進(jìn)行說明,但本發(fā)明可以被用來配置和發(fā)布 在不同的編程和開發(fā)環(huán)境中所生成的應(yīng)用,例如但不局限于由國家儀器公司(National Instruments, Inc)提供的 Labview, LISP,或 PROLOG。MATLAB 是一種直觀高性能的語言和技術(shù)計算環(huán)境。MATLAB 為數(shù)據(jù) 分析、可視化以及程序的開發(fā)提供了數(shù)學(xué)和圖形工具。MATLAB 以一個易用環(huán)境集 成了計算與編程,在所述的易用環(huán)境中,問題與解決方案用人們熟悉的數(shù)學(xué)符號表達(dá)。 MATLAB 是一種交互系統(tǒng),該系統(tǒng)中的基本數(shù)據(jù)元素是無需定義維數(shù)的數(shù)組。這使 得用戶在解決許多技術(shù)性計算問題、特別是那些要用到矩陣和向量公式的問題時,編寫程 序所花費的時間僅是一種標(biāo)量非交互語言(例如C和FORTRAN等)所花費時間的一小 部分。MATLAB 提供了包括MATLAB 編譯器在內(nèi)的應(yīng)用開發(fā)工具。用于COM的 MATLAB 編制器(Builder)和用于Excel工作的MATLAB 編制器(Builder)與 MATLAB 編譯器協(xié)同工作,以自動生成在COM和Excel環(huán)境中執(zhí)行的對象。這些應(yīng)用開 發(fā)工具使得用戶能夠創(chuàng)建并分配MATLAB 應(yīng)用并與可能使用MATLAB 或其他環(huán)境 的同事共享MATLAB 成果。圖1描述了適用本發(fā)明的描述性實施例的電子設(shè)備100的一個實施例。電子設(shè)備 100代表許多不同的技術(shù),例如個人電腦(PC),膝上型電腦,工作站,個人數(shù)字助理(PDA), 因特網(wǎng)用具,蜂窩電話,以及類似的設(shè)備。在所示的實施例中,電子設(shè)備100包括中央處理 單元(CPU) 102以及顯示設(shè)備104。顯示設(shè)備104使得電子設(shè)備100通過視覺顯示器直接與 用戶進(jìn)行通信。電子設(shè)備100還包括鍵盤106以及例如鼠標(biāo)器的輸入設(shè)備108。其他未被 描述的潛在輸入設(shè)備包括但不局限于指示筆,軌跡球,控制桿,觸摸墊,觸摸屏,以及其他 類似的設(shè)備。電子設(shè)備100包括用于存儲數(shù)據(jù)和指令的第一存儲設(shè)備110和第二存儲設(shè)備 112。存儲設(shè)備110和112包括但不局限于如下技術(shù)軟盤驅(qū)動器,硬盤驅(qū)動器,磁帶驅(qū)動器, 光盤驅(qū)動器,只讀存儲器(ROM),隨機(jī)存取存儲器(RAM),以及其他類似的設(shè)備。如瀏覽器, JAVA虛擬機(jī)之類的應(yīng)用程序,以及其他實用程序和應(yīng)用可以駐留在存儲設(shè)備110和112之 一或二者中。電子設(shè)備100還可以包括用于與一個或多個在圖示的電子設(shè)備100之外的外 部電子設(shè)備進(jìn)行通信的網(wǎng)絡(luò)接口 114。調(diào)制解調(diào)器是用來實現(xiàn)與外部的電子設(shè)備或網(wǎng)絡(luò)建 立連接的網(wǎng)絡(luò)接口 114的一種形式。CPU102通過內(nèi)部或外部方式連接到前述的一個或多個 部件。除了前述的這些應(yīng)用之外,可以在電子設(shè)備100上安裝并運行例如MATLAB lie 的建模應(yīng)用。
應(yīng)當(dāng)注意的是,電子設(shè)備100僅僅代表了實現(xiàn)本發(fā)明的一種結(jié)構(gòu)。盡管如此,本領(lǐng) 域普通技術(shù)人員將會認(rèn)識到本發(fā)明并不局限于以上具體描述的設(shè)備100??梢圆捎闷渌?型的實現(xiàn)方式,包括部分或整體基于嵌入代碼的實現(xiàn)方式,在此則不需要用戶輸入或顯示 設(shè)備;而且,處理器能夠與其他處理器或設(shè)備直接進(jìn)行通信。圖2是對用于實現(xiàn)本發(fā)明的分布式網(wǎng)絡(luò)的示意性實施例。該系統(tǒng)包括與網(wǎng)絡(luò)200 相連的客戶端設(shè)備202。網(wǎng)絡(luò)上還連接有服務(wù)器設(shè)備204、接口機(jī)構(gòu)210和存儲設(shè)備206。 接口機(jī)構(gòu)210能夠?qū)⒑蠼壎ê瘮?shù)調(diào)用集成到先綁定程序環(huán)境之中。當(dāng)在面向?qū)ο蟮沫h(huán)境中進(jìn)行編程時,采用后綁定函數(shù)調(diào)用的優(yōu)點之一在于,能夠 使得開發(fā)者在編寫代碼時無需就所要操作的對象的確切對象類型而作特殊的考慮。換句話 說,后綁定函數(shù)調(diào)用可以支持多態(tài)。利用本發(fā)明的接口機(jī)構(gòu)210,當(dāng)先綁定編譯器在編譯時遇到存在于后綁定環(huán)境中 的后綁定函數(shù)時,,利用該接口機(jī)構(gòu)210,先綁定環(huán)境中的編譯器允許在運行時執(zhí)行存在于 后綁定環(huán)境中的后綁定函數(shù)。接口機(jī)構(gòu)210作為一組后綁定函數(shù)的代理,該后綁定函數(shù)組 中的某一個(根據(jù)在運行時輸入的類型)將在運行時被調(diào)用。 此外,為了舉例說明的目的,在本實施例中的接口機(jī)構(gòu)是與網(wǎng)絡(luò)200相連接的;但 本領(lǐng)域的普通技術(shù)人員很容易理解,該接口機(jī)構(gòu)210還能夠連接到客戶端設(shè)備202、服務(wù)器 204或者它們的組合。本領(lǐng)域的普通技術(shù)人員還可以認(rèn)識到,本實施例中的網(wǎng)絡(luò)只是一個示 例性的實例,它的功能可以以任意的方式分到整個網(wǎng)絡(luò)中。例如,多個客戶端可以與一個服 務(wù)器連接,一個客戶端也可以連接到多個服務(wù)器上,或者上述情況的一些組合。圖3描述了應(yīng)用于本發(fā)明的示意性實施例中的組件。在圖示實施例中所描述的組 件用于將后綁定函數(shù)集成到先綁定環(huán)境300之中。在一個示例中,先綁定程序環(huán)境為由位 于美國華盛頓州雷德蒙德市(Redmond)的微軟公司所提供的Visual Studio 程序環(huán)境,后 綁定函數(shù)為MATLAB 函數(shù)。選擇MATLAB 和Visual Studio 只是出于舉例說明的 目的。對多種其它在先和后綁定語言的選擇都可用于實現(xiàn)本發(fā)明。在圖示的實例中,當(dāng)后綁定函數(shù)為MATLAB 函數(shù)時,MATLAB 編譯器生成 后綁定接口函數(shù)304和306,后者是位于先綁定環(huán)境300中的先綁定函數(shù)。這些接口函數(shù) 304和306的名稱與功能完全在編譯時得到確定。在運行時內(nèi),這些接口函數(shù)304和306 調(diào)用后綁定函數(shù)。具體的,后綁定接口函數(shù)304通過一個模塊化后綁定執(zhí)行引擎302(下文 中將作詳細(xì)說明)調(diào)用包含有一個或多個后綁定函數(shù)的集合308。類似的,后綁定接口函 數(shù)306通過此模塊化后綁定執(zhí)行引擎302調(diào)用包含有一個或多個后綁定函數(shù)的集合310。 從而,提供了一種使得先綁定環(huán)境300能夠?qū)⒑瘮?shù)的綁定延遲到所選定函數(shù)的運行時的機(jī) 制。正如圖3所示,后綁定接口函數(shù)304和306可能會引起多于一個后綁定函數(shù)要被 執(zhí)行(參見308和310)。也可能存在這樣的情況,一個后綁定接口函數(shù)與一個單獨的后綁 定函數(shù)相關(guān)聯(lián),也可能存在其他情況,多個后綁定函數(shù)與一個單獨的后綁定接口函數(shù)相關(guān) 聯(lián)。此外,根據(jù)提供給接口函數(shù)的輸入類型,每次調(diào)用會導(dǎo)致對所關(guān)聯(lián)的集合中一個不同的 后綁定函數(shù)的調(diào)用。在一個實施例中,接口機(jī)構(gòu)可通過應(yīng)用程序接口(API)實現(xiàn),該接口具有可以從 先綁定應(yīng)用調(diào)用的函數(shù)。API可被用于啟動對在后綁定環(huán)境中的函數(shù)的調(diào)用。例如,在C程序環(huán)境下運行的API能夠調(diào)用在MATLAB 后綁定環(huán)境中的函數(shù)。可選擇地,API可以 是不需要其他輔助程序操作的獨立可執(zhí)行程序。從以先綁定C語言運行的應(yīng)用程序的角度 看,在后綁定MATLAB 應(yīng)用中所調(diào)用的函數(shù),表現(xiàn)為例如是一種傳統(tǒng)的函數(shù)調(diào)用,其中 函數(shù)及其參數(shù)是不言自明的,其輸出以與任何現(xiàn)有函數(shù)相類似的方式傳遞。盡管將API作為接口機(jī)構(gòu)的實例加以描述,但接口機(jī)構(gòu)并不局限于采用API,例如 還可以是運行于先綁定或后綁定環(huán)境中的軟件或硬件組件。接口機(jī)構(gòu)能夠以先綁定編程環(huán) 境在運行時易于識別的格式,自動表達(dá)后綁定編程環(huán)境的語義,并且如前面已經(jīng)提出的,可 以采用適當(dāng)形式來表達(dá)所述語義。模塊化后綁定執(zhí)行引擎302提供用于執(zhí)行存在于后綁定環(huán)境中的函數(shù)的機(jī) 制。由于這些函數(shù)是后綁定函數(shù),它們在運行時被綁定在后綁定環(huán)境中。在后綁定環(huán)境 為MATLAB 環(huán)境的情況下,模塊化后綁定執(zhí)行引擎可以是MATLAB 組件運行引擎 (runtime engine)。MATLAB 組件運行引擎是一種獨立的共享庫的集合,所述的共享庫 能夠執(zhí)行M-文件,MEX-文件以及其它類型的MATLAB 可執(zhí)行內(nèi)容。采用MATLAB 組件運行引擎作為模塊化執(zhí)行引擎,當(dāng)在后綁定環(huán)境中執(zhí)行函數(shù)時,無需在一個新的用戶 可視窗口中打開MATLAB 組件運行引擎;而是由組件運行引擎以一種對用戶不可見的 方式在后臺執(zhí)行。本發(fā)明并不僅僅局限于MATLAB 應(yīng)用以及MATLAB 組件運行引擎,還可以 用各種替代后綁定環(huán)境以及執(zhí)行引擎來實現(xiàn)。模塊后綁定模塊化后綁定執(zhí)行引擎302跟隨先綁定環(huán)境300中的后綁定接口函數(shù) 調(diào)用304或306的執(zhí)行,模塊后綁定模塊化后綁定執(zhí)行引擎302既可以保持運行,也可以終 止。允許模塊后綁定模塊化后綁定執(zhí)行引擎302保持運行,可以使得從先綁定環(huán)境300中 調(diào)用的后續(xù)的函數(shù)在后綁定環(huán)境中執(zhí)行得更快,并且不再需要啟動模塊后綁定模塊化后綁 定執(zhí)行引擎302??蛇x擇地,在執(zhí)行后綁定函數(shù)之后終止在先綁定環(huán)境300中受到控制的模 塊化后綁定執(zhí)行引擎302,可以減少對處理器的需要和資源的分配,并且在模塊化執(zhí)行引擎 300終止時,與模塊后綁定模塊化后綁定執(zhí)行引擎302相關(guān)聯(lián)的資源得以釋放。一個具體的實例有助于說明圖示示意性實施例的操作。該實例是一個來自于后綁 定程序環(huán)境(例如MATLAB )之中的MTALAB 函數(shù),該函數(shù)用于為任何的輸入數(shù)字 加10。該函數(shù)被稱為plus 10并定義如下function s = plus 10 (χ)s = x+10 ;disp([num2str(x) ' +10=' num2str(s)]);以下所描述的是由MATLAB 編譯器從包含函數(shù)plus 10的M類型的文件plus 10. m自動生成的C函數(shù)庫的源文件。下面所列舉的第一個文件是頭文件libplus.h。該頭 文件之后跟隨文件libplus. C。函數(shù)mlfPluslO是一個接口函數(shù)的實例,該接口函數(shù)是存取 由plus 10函數(shù)提供的MATLAB 功能的C程序調(diào)用。以下為頭文件#ifndef—libplus_h#define—libplus一hi
#include “ mclmcr.h"
#ifdef_—cplusplus
extern〃 C〃{
#endif
externboolIibplusInitializeffithHandlers(mc1OutputHand1erFcnhandler,
mcIOutputHandlerFcn print—handler);
externbool IibpIusInitialize (void);
externvoid IibplusTerminate(void);
externvoidmlxPluslO(int nlhs, mxArray *plhs[], int nrhs,:*prhs []
externvoid mlfPlus 10 (int nargout, mxArray **s,mxArray ;
#ifdef_—cplusplus
}
#endif
#endif
以下為libplus. c文件
#include <stdio.h>
#include" mclmcr. h"
#include ” libplus. h"
#ifdefcplusplus
extern〃 C〃{
#endif
externconstunsigned char—MCC C0MP0NENT_pub 1 ic_data[];
externconstchar*—MCC_C0MP0NENT_name_data ;
externconstchar*—MCC_C0MP0NENT_root_data ;
externconstunsigned char_MCC_C0MP0NENT_session_data[];
externconstchar*—MCC_C0MP0NENT_matlabpath_data [];
externconstint_MCC_C0MP0NENT_mat 1 abpath_data_count ;
externconstchar*—MCC一COMPONENT一mcr一runtime—options [];
externconstint_MCC_C0MP0NENT_mcr_runtime_option_count ;
externconstchar*_MCC_C0MP0NENT_mcr_application_options [];
externconstint_MCC_C0MP0NENT_mcr_application_option_count ;
#ifdef—cplusplus
}
#endif
staticHMCRINSTANCE—mcr」nst = NULL ;
staticint mclDefaultErrorHandler(const char *s)
{
return fprintf(stderr, s);}static int mclDefaultPrintHandler(const char 氺s){return fprintf(stdout, s);}bool IibpluslnitializeffithHandlers(mc1OutputHandlerFcn error_handler,mclOutputHandlerFcn print_handler){return (_mcr_inst = = NULL ?mcIlnitializeComponentInstance(&_mcr_inst,—MCC_C0MP0NENT_public_data,—MCC_C0MP0NENT_name_data,_MCC_C0MP0NENT_root_data,—MCC_C0MP0NENT_s e ssion_data,—MCC_C0MP0NENT_matlabpath_data,_MCC_C0MP0NENT_matlabpath_data_count,_MCC_C0MP0NENT_mcr_runt ime_opt ions,_MCC_C0MP0NENT_mcr_runt ime_op t i on_count,true, NoObjectType, LibTarget,NULL,error_handler, print_handler): true);}bool libpluslnitialize(void){return IibpluslnitializeffithHandlers(mc1Defau1tErrorHand1er,mclDefaultPrintHandler);}void IibplusTerminate(void){if(_mcr_inst ! = NULL)mcITerminateInstance(&_mcr_inst);}void mlxPluslO (int nlhs, mxArray*plhs [], int nrhs, mxArray*prhs []){mclFeval (_mcr_inst, “ pluslO" , nlhs, plhs, nrhs, prhs);}0124]void mlfPlus 10 (int nargout, mxArray mxArray *x)
0125]{
0126]mclMlfFeval(_mcr_inst, " plusiO" , nargout, 1,1, s, x);
0127]}
0128]從一個先綁定編程環(huán)境(如C)之中調(diào)用前述接口函數(shù)mlxPluslO,在以下代碼中
描述#include<stdio. h>#include ‘‘ matrix, h"#include “ libplus. h〃void usage (char 氺name){printf (" Usage % s integer\n〃 , name);printf(" \tAdds 10 to the given integer\n");exit(-l);}int main (int ac, char 氺av[]){mxArray^input = mxCreateDoubleScalar(atoi(av[1]));mxArray*output = NULL ;double result ;if (ac ! = 2) usage (av
);mcllnitializeApplication(NULL,0);libpluslnitialize ();mlxPlus 10(1, &output, 1, &input);IibplusTerminate ();result = mxGetScalar(output);printf (" % s+10 =% . 0f\n",av [1],result);mclTerminateApplication ();return 0 ;}前述的代碼是用C編程語言編寫的,但本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解可選用各 種其它先綁定環(huán)境實現(xiàn)本發(fā)明。正如通過前述調(diào)用后綁定函數(shù)的方法所證明的,該處理被流水化,并同時提供了 用最小的用戶交互來實現(xiàn)將后綁定函數(shù)集成到先綁定環(huán)境中的這樣一種合適的機(jī)制。對原 始后綁定函數(shù)(pluslO.m)的調(diào)用與對先綁定環(huán)境中的其它普通函數(shù)的調(diào)用看起來是類似 的。此外,先綁定環(huán)境與往常一樣繼續(xù)處理先綁定函數(shù),因而提供了更快的函數(shù)執(zhí)行速度。圖4對在示意性實施例中組件的具體交互過程進(jìn)行了詳細(xì)說明。首先,用戶采用 后綁定環(huán)境400開發(fā)一個后綁定應(yīng)用或組件。在圖4中,這一后綁定應(yīng)用或組件表示為用 戶編寫的后綁定函數(shù)套件(function 81^切)402,其包括后綁定函數(shù)404々和4048。為了說明的目的,假設(shè)后綁定環(huán)境400是MATLAB ,而后綁定函數(shù)是MATLAB 函數(shù)。然 后,用戶調(diào)用MATLAB 編譯器406以生成其應(yīng)用或組件的可調(diào)度形式。MATLAB 編譯器406檢查輸入文件以決定將要生成的用以調(diào)用后綁定函數(shù)404A和404B的先綁定 接口文件的適當(dāng)形式。進(jìn)一步的,對先綁定環(huán)境的選擇也會影響所生成的先綁定接口的形 式。MATLAB 編譯器檢查輸入文件以確定在后綁定環(huán)境400中對其它后綁定函數(shù)的依 賴性。MATLAB 編譯器然后將所有必需的后綁定函數(shù)打包到組件技術(shù)文件(CTF)檔案 410之中,并生成合適的先綁定接口函數(shù)408。CTF檔案被用來包含與某一組件相關(guān)的所有 可執(zhí)行內(nèi)容(即,M-文件或Mex-文件)。CTF檔案也包含應(yīng)用程序所必需的所有數(shù)據(jù)文件, 以生成對程序執(zhí)行所需的所有信息的快照。CTF檔案的內(nèi)容是經(jīng)過加密的。圖5是用來描述確定對其它后綁定函數(shù)的依賴性所執(zhí)行步驟的流程圖。在一個 實施例中,圖5中所描述的步驟可用于計算函數(shù)調(diào)用樹的傳遞閉包。這一過程起始于用 戶提供一個輸入文件集合,該集合中的每個輸入文件都包含一個或多個后綁定函數(shù)(步驟 500)。MATLAB 編譯器檢查步驟500所提供的輸入文件集合中的每個后綁定函數(shù),以確 定哪些其它函數(shù)被該后綁定函數(shù)所調(diào)用(步驟50幻。編譯器查看在編譯過程中所生成的 函數(shù)調(diào)用樹。在步驟502中所識別的每個函數(shù)可能包含有被明確記載在依賴數(shù)據(jù)庫中的依 賴關(guān)系。例如,該數(shù)據(jù)庫可以指出某一特定函數(shù)為了正確運行需要的一個或多個其它函數(shù)。 依賴性分析器將這些函數(shù)添加到必要函數(shù)清單中(步驟504)。步驟502和504重復(fù)執(zhí)行直 到?jīng)]有其它的函數(shù)被添加到清單中(步驟506)為止。在步驟508中,某些函數(shù)或函數(shù)組被 明確排除在清單之外。對函數(shù)的排除行為會由于諸多原因而被激發(fā)。例如,函數(shù)排除行為 可基于預(yù)先確定的商業(yè)原因而發(fā)生,其中,特定文件或函數(shù)由于安全考慮或知識產(chǎn)權(quán)保護(hù) 而不會伴隨最終部署的文件而分發(fā)。此外,函數(shù)可能會因為防止對已知的非必要函數(shù)的無 意包含而被加以排除。這些函數(shù)偶爾會因為一些依賴確定機(jī)制的內(nèi)在不嚴(yán)密性而不經(jīng)意間 被包含到必要函數(shù)清單中(步驟504)。最后,“后綁定模塊化執(zhí)行引擎”典型地包含一個與 模塊化后綁定執(zhí)行引擎相關(guān)的后綁定函數(shù)的固定的基本集合。準(zhǔn)確地說,這些函數(shù)的基本 集合在安裝執(zhí)行引擎的任何地方都是可用的,因此,在已部署的應(yīng)用中并不需要包含這些 函數(shù)。采用當(dāng)前的排除機(jī)制,最終部署的應(yīng)用在大小上會顯著降低,并更容易被用戶掌握。 用戶可以在步驟504和508提供輸入,在上述步驟中用戶明確地聲明依賴性并明確地聲明 排除。此外,可由用戶實現(xiàn)對必要函數(shù)列表的全部或局部控制。依賴性分析器的輸出是包含有該應(yīng)用的后綁定函數(shù)的最終清單。這些函數(shù)由編譯 器結(jié)合用戶定義的數(shù)據(jù)(如輸入數(shù)據(jù)和分路選擇)一起使用,以確定應(yīng)當(dāng)生成哪些接口函 數(shù)以及所生成的函數(shù)的形式。所生成的先綁定接口函數(shù)408(圖4)與可選的用戶編寫的先綁定語言代碼416以 及數(shù)據(jù)類型創(chuàng)建API 418結(jié)合在一起,以生成先綁定應(yīng)用或組件414。在運行時最終用戶應(yīng)用或組件414調(diào)用數(shù)據(jù)類型創(chuàng)建API 418以創(chuàng)建數(shù)據(jù),所創(chuàng) 建的數(shù)據(jù)與包含在外部環(huán)境中的數(shù)據(jù)是后綁定環(huán)境兼容的。在本實施例中,所述的外部環(huán) 境是一種先綁定編程環(huán)境。數(shù)據(jù)類型創(chuàng)建API418然后向最終用戶應(yīng)用或組件414標(biāo)識這 一新創(chuàng)建的數(shù)據(jù)。這一數(shù)據(jù)標(biāo)識可以采用本領(lǐng)域普通技術(shù)人員所知的“句柄(handle)”或 “代理”來實現(xiàn)。最終用戶應(yīng)用程序或組件414然后調(diào)用先綁定接口函數(shù)408,該函數(shù)依次調(diào)用模塊化后綁定執(zhí)行引擎420。然后,從外部環(huán)境數(shù)據(jù)所創(chuàng)建的兼容數(shù)據(jù)、以及先綁定接口函數(shù) 408的名稱被傳遞到模塊化執(zhí)行引擎420,使得模塊化執(zhí)行引擎能夠?qū)⒃摂?shù)據(jù)和函數(shù)名稱 結(jié)合起來(即后綁定),以使得從包含在CTF檔案410中的集合中選擇合適的函數(shù)。模塊化 后綁定執(zhí)行引擎420的結(jié)果然后被送回到最終用戶應(yīng)用或組件414。本發(fā)明的示意性實施例提供了使得后綁定函數(shù)能夠從先綁定環(huán)境中被調(diào)用的數(shù) 據(jù)類型。這些數(shù)據(jù)類型允許先綁定語言來表示用后綁定語言表示的數(shù)據(jù)類型。這些數(shù)據(jù)類 型可以成為提供給用戶的接口庫中的一部分。與編譯器406的每次調(diào)用相關(guān)的還包括加密/解密模式。在一個實施例中,在調(diào) 用編譯器時,生成唯一的編密/解密密鑰。該密鑰可以采用公鑰加密的方法進(jìn)行保護(hù),如美 國政府所采用的高級加密標(biāo)準(zhǔn)(AES)。本領(lǐng)域的普通技術(shù)人員很容易理解到,現(xiàn)有的其它各 種加密/解密方法可用于本發(fā)明。在運行時,該唯一的密鑰被解密并用于對CTF檔案中所 需要的文件進(jìn)行解密。在一個實施例中,對文件的解密僅僅發(fā)生在該文件被需要的時候,從 而防止將已解密信息存儲在磁盤上。諸如上述的加密/解密模式的使用,為由那些創(chuàng)建應(yīng)用所開發(fā)的代碼提供了保 護(hù)。由于在CTF檔案中所使用的文件是加密的,因此這些文件在被共享和分配的同時也能 對包含在其中的內(nèi)容提供保護(hù)。例如,一個包含有公司商業(yè)秘密的文件可以以加密的方式 被分發(fā),使得這一交易秘密不會披露給用戶。此外,由于在應(yīng)用中所使用的文件被加密,因 此終端客戶無法輕易地對文件進(jìn)行修改從而影響程序的執(zhí)行。進(jìn)一步的,由于文件的加密 和解密是基于編譯器所生成的唯一密鑰,因此用于一個應(yīng)用中的文件無法被用到另一個應(yīng) 用之中。最后,利用當(dāng)前加密/解密機(jī)制可實現(xiàn)對盜版軟件的追蹤,因為能夠分析每個生成 的應(yīng)用程序而確定該應(yīng)用是由哪個編譯器許可證密鑰所生成的。因此,一旦知道編譯器許 可證密鑰,就有可能在許可證清單中將該許可證密鑰與被許可人清單進(jìn)行對照參考,從而 確定盜版軟件的來源。圖6是一個將后綁定函數(shù)調(diào)用集成到后綁定程序環(huán)境600中所需的組件的示意性 實施例。在一個實例中,后綁定程序環(huán)境為LlSP程序環(huán)境,而后綁定函數(shù)為MATLAB 函 數(shù)。上述對后綁定函數(shù)和語言的選擇僅僅作為描述的目的,因為本領(lǐng)域的普通技術(shù)人員很 容易理解,可選用各種替代的現(xiàn)存的后綁定函數(shù)及語言。在此示意性實例中,當(dāng)后綁定函數(shù)為MATLAB 函數(shù)時,MATLAB 編譯器生
成后綁定接口函數(shù)604和606,這些函數(shù)是存在于后綁定環(huán)境600中的后綁定函數(shù)。在運 行時,這些接口函數(shù)604和606被應(yīng)用于利用模塊化后綁定執(zhí)行引擎602調(diào)用后綁定函數(shù)。 正如圖6中所進(jìn)一步描述的,后綁定接口函數(shù)604和606可能會引發(fā)執(zhí)行多于一個的后綁 定函數(shù)(參見608和610)??赡艽嬖谶@樣一些情況,其中一個后綁定接口函數(shù)與一個單獨 的后綁定函數(shù)相關(guān)聯(lián),而且也可能存在其它情況,即多個后綁定函數(shù)與一個單獨的后綁定 接口函數(shù)相關(guān)聯(lián)。此外,根據(jù)提供給接口函數(shù)的輸入類型,每一調(diào)用操作可導(dǎo)致對相關(guān)集合 中不同的后綁定函數(shù)的調(diào)用。在一個實施例中,所述的接口機(jī)構(gòu)可以是應(yīng)用程序接口(API),該API具有可以從 后綁定應(yīng)用調(diào)用的函數(shù)??蛇x擇地,該API可以是不需要輔助程序即可執(zhí)行的獨立可執(zhí)行 程序。此外,接口函數(shù)可以是軟件或硬件組件。模塊化后綁定執(zhí)行引擎602提供在運行時執(zhí)行函數(shù)的機(jī)制,其中所述函數(shù)存在于后綁定環(huán)境中。在一個MATLAB 環(huán)境中,模塊化后綁定執(zhí)行引擎可以是MATLAB 組 件運行引擎,該引擎能夠執(zhí)行M-文件、MEX-文件以及其它MATLAB 可執(zhí)行內(nèi)容。本發(fā) 明并不僅僅局限于MATLAB 應(yīng)用以及MATLAB 組件運行引擎,也可以用很多替代的 后綁定環(huán)境和執(zhí)行引擎來實現(xiàn)。模塊化后綁定執(zhí)行引擎602跟隨后綁定環(huán)境600中的后綁定接口函數(shù)調(diào)用604或 606的執(zhí)行,模塊化后綁定執(zhí)行引擎602既可以保持運行以使得后續(xù)函數(shù)在后綁定環(huán)境中 的執(zhí)行隨時發(fā)生,但也可以終止。本發(fā)明已通過舉例的方式加以說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,在不脫離 本發(fā)明技術(shù)方案的精神的前提下,可以對所描述的實施例進(jìn)行修改和變動。上述實施例的 各個方面與特征可以合并使用。所描述的實施例僅用于示意而不應(yīng)被理解為限制性的。本 發(fā)明的范圍應(yīng)當(dāng)由附屬的權(quán)利要求進(jìn)行限定,而不是由前述的說明,對本發(fā)明的技術(shù)方案 進(jìn)行修改或者等同替換,均應(yīng)涵蓋在本發(fā)明的權(quán)利要求范圍當(dāng)中。
權(quán)利要求
1.一種將后綁定函數(shù)G04a)集成到支持先綁定函數(shù)(416)的語言中的方法,該方法包 含以下步驟提供在支持先綁定函數(shù)G16)的語言中要被調(diào)用的后綁定函數(shù)(40 ),該提供步驟包括檢查后綁定程序G02)以標(biāo)識由后綁定函數(shù)G04a)所需的一個或多個相關(guān)后綁定函 數(shù);以及自動地生成所述后綁定函數(shù)G04a)、一個或多個相關(guān)后綁定函數(shù)以及支持先綁定函數(shù) (416)的語言之間的接口 (408)。
2.根據(jù)權(quán)利要求1所述的方法,其中所述接口(408)包括一個或多個先綁定函數(shù)或方 法調(diào)用。
3.根據(jù)權(quán)利要求2所述的方法,其中還包括以下步驟創(chuàng)建包括一個或多個先綁定函數(shù)(408)和后綁定函數(shù)G04a)以及一個或多個相關(guān)函 數(shù)的包;存儲該包。
4.根據(jù)權(quán)利要求2所述的方法,其中還包括以下步驟當(dāng)后綁定函數(shù)G04a)的數(shù)據(jù)類型與所述一個或多個先綁定函數(shù)的數(shù)據(jù)類型不相兼容 時,從所述一個或多個先綁定函數(shù)創(chuàng)建可與后綁定函數(shù)G04a)的數(shù)據(jù)類型相兼容的數(shù)據(jù)。
5.根據(jù)權(quán)利要求2所述的方法,其中還包括以下步驟當(dāng)所述一個或多個先綁定函數(shù)的數(shù)據(jù)類型與所述后綁定函數(shù)G04a)的數(shù)據(jù)類型不相 兼容時,從后綁定函數(shù)G04a)創(chuàng)建可與所述一個或多個先綁定函數(shù)的數(shù)據(jù)類型相兼容的 數(shù)據(jù)。
6.根據(jù)權(quán)利要求2所述的方法,其中還包括以下步驟生成可適于在支持先綁定函數(shù)G16)的語言中調(diào)用的后綁定程序002)的可調(diào)度形式。
7.一種用于將后綁定函數(shù)004a)集成到支持先綁定函數(shù)(416)的語言中的媒介,其包括提供在支持先綁定函數(shù)G16)的語言中要被調(diào)用的后綁定函數(shù)(40 ),其特征在于下 列步驟自動地生成所述后綁定函數(shù)G04a)和支持先綁定函數(shù)G16)的語言之間的接口 008),其中接口(408)包括一個或多個先綁定函數(shù)或方法調(diào)用;創(chuàng)建包括一個或多個先綁定函數(shù)和后綁定函數(shù)G04a)以及該后綁定函數(shù)G04a)的一 個或多個相關(guān)函數(shù)的包; 存儲該包。
8.根據(jù)權(quán)利要求7所述的媒介,還包括以下步驟生成可適于在支持先綁定函數(shù)G16)的語言中調(diào)用的后綁定函數(shù)G04a)的可調(diào)度形式。
9.根據(jù)權(quán)利要求7所述的媒介,其中所述包包含與后綁定函數(shù)G04a)相關(guān)的所有可執(zhí) 行內(nèi)容。
10.根據(jù)權(quán)利要求7所述的媒介,其中所述包是加密的。
11.根據(jù)權(quán)利要求7所述的媒介,還包括以下步驟使用支持先綁定語言的編譯器對所述一個或多個先綁定函數(shù)進(jìn)行編譯。
12.一種適于將后綁定函數(shù)004a)集成到支持先綁定函數(shù)G16)的語言中的系統(tǒng),該 系統(tǒng)包括存儲設(shè)備(110),其被配置用于存儲支持先綁定函數(shù)G16)的語言;所述后綁定函數(shù) (404a);以及處理器(102),其被配置成提供在支持先綁定函數(shù)G16)的語言中要被調(diào)用的后綁定函數(shù)G04a); 檢查后綁定程序G02)以標(biāo)識由后綁定函數(shù)G04a)所需的一個或多個相關(guān)后綁定函 數(shù);以及自動地生成所述后綁定函數(shù)G04a)、一個或多個相關(guān)后綁定函數(shù)以及支持先綁定函數(shù) (416)的語言之間的接口 (408)。
13.根據(jù)權(quán)利要求12所述的系統(tǒng),其中所述接口(408)包括一個或多個先綁定函數(shù)或 方法調(diào)用。
14.根據(jù)權(quán)利要求13所述的系統(tǒng),其中所述存儲設(shè)備進(jìn)一步被配置成存儲所述一個或多個先綁定函數(shù)和后綁定函數(shù)G04a)以及一個或多個相關(guān)函數(shù)。
15.根據(jù)權(quán)利要求12所述的系統(tǒng),其中所述處理器進(jìn)一步被配置成生成可適于在支持先綁定函數(shù)G16)的語言中調(diào)用的后綁定程序002)的可調(diào)度形式。
16.根據(jù)權(quán)利要求12所述的系統(tǒng),其中所述處理器進(jìn)一步被配置成 使用支持先綁定語言的編譯器對所述一個或多個先綁定函數(shù)進(jìn)行編譯。
全文摘要
本發(fā)明旨在將后綁定程序語言自動地集成到外部程序環(huán)境之中。外部程序環(huán)境可以是先綁定環(huán)境、后綁定環(huán)境或它們的組合。與后綁定程序環(huán)境相關(guān)的是模塊化執(zhí)行引擎和接口機(jī)構(gòu),其中的接口機(jī)構(gòu)能夠以與外部環(huán)境兼容的格式表達(dá)后綁定語義。
文檔編號G06F9/45GK102063315SQ20101050380
公開日2011年5月18日 申請日期2006年6月2日 優(yōu)先權(quán)日2005年6月2日
發(fā)明者B·西蒙, C·G·尼蘭德, J·米克, M·厄爾曼, P·H·韋布 申請人:數(shù)學(xué)工程公司