專利名稱:多種解釋性編程語言間的第一類對(duì)象共享的制作方法
技術(shù)領(lǐng)域:
本發(fā)明主要涉及接口,其允許一種解釋性編程語言(interpretedlanguage)的語言構(gòu)造中使用以不同解釋性編程語言編寫的語言構(gòu)造。尤其是,本公開涉及允許高級(jí)別腳本用戶整合以不同腳本語言編寫的低級(jí)別腳本的接口。
背景技術(shù):
編譯語言不能交互使用。標(biāo)準(zhǔn)使用案例是編寫代碼,編譯代碼,然后運(yùn)行代碼。這對(duì)于正編寫應(yīng)用程序的軟件開發(fā)人員來說是很好的范例,但是這對(duì)于需要探究和解決問題的工程師或數(shù)學(xué)家來說不是那么有用。解釋性語言能夠交互使用。工程師可以在他/她打印代碼并且代碼被解釋以及當(dāng)?shù)讓討?yīng)用程序在運(yùn)行時(shí),然后執(zhí)行該代碼的地方具有“提示符”。解釋性語言的例子包括Python、Ruby 等。腳本語言添加到應(yīng)用程序中以允許用戶從命令提示符或文本文件驅(qū)動(dòng)應(yīng)用程序。解釋性語言能夠用作腳本語言,并且在下文中,本公開將將用于腳本的解釋性語言稱為“腳本語言”。Python是一種解釋性語言。其具有幾個(gè)實(shí)施,包括CPython和Jython。CPython以C語言編寫并且通常稱作Python。Jython以Java編寫。Java是在虛擬機(jī)器上運(yùn)行的編譯語言。在Java虛擬機(jī)器之上建立了幾種腳本語言。這些通常稱為J基腳本語言。(例子包括Jython,JRuby,Groovy和Rhino。)眾所周知,專用J基腳本語言是設(shè)計(jì)用于幾何形狀操縱和嚙合(創(chuàng)建離散表示)的領(lǐng)域特定語言。而且,用于幾何構(gòu)造、分析和操控的以Java編寫的應(yīng)用程序是設(shè)計(jì)成腳本的。底層Java代碼定義了很多幾何操作。然后,工程師可以利用這些腳本使用具體幾何操作解決他們的工程技術(shù)問題。這些腳本代表工程過程中的知識(shí)收集。存在重用這些腳本的強(qiáng)烈需要。存在能夠利用這些事先存在的專有語言腳本驅(qū)動(dòng)上述幾何構(gòu)造應(yīng)用程序的需要??紤]由幾個(gè)較低級(jí)別工程過程組成的高級(jí)別工程過程。已經(jīng)編寫每個(gè)較低級(jí)別過程。工程師需要能夠編寫整合較低級(jí)別腳本的高級(jí)別腳本。既然這些腳本可能將以不止一種的腳本語言編寫,需要一種方法輕松共享在不同腳本語言中創(chuàng)建的函數(shù)、類、實(shí)例和對(duì)象。目前在現(xiàn)存的腳本環(huán)境中共享不同腳本語言之間的數(shù)據(jù)是可能的,但是做到這點(diǎn),需要編程技巧以及底層Java語言的知識(shí)。應(yīng)針對(duì)工程師設(shè)計(jì)這種問題的解決方案,而不是針對(duì)應(yīng)用軟件開發(fā)人員,因此在工程師部分,該解決方案不應(yīng)該需要額外的編程/軟件開發(fā)。因此,存在允許不同工程師以不同腳本語言編程并且沒有考慮底層語言實(shí)施問題,共享他們通過這些腳本語言編寫代碼的方法需求。優(yōu)選地,該解決方案還將包括領(lǐng)域特定語言(DS語言)。
發(fā)明內(nèi)容
公開了使用戶能夠以第一基于Java的腳本語言,例如Jython, JRuby和Matlab編寫腳本代碼,然后利用第二基于Java的腳本語言調(diào)用以第一腳本語言編寫的語言構(gòu)造或語言構(gòu)造成分(Ianguageconstruct)。語言構(gòu)造包括,例如列表、數(shù)組、映射、函數(shù)、類定義、類實(shí)例和代碼模塊。例如,公開的方法使得工程師能夠以一種腳本語言編寫函數(shù)并且能以另一種腳本語言調(diào)用。在這里公開的技術(shù)對(duì)領(lǐng)域特定語言也是適用的。根據(jù)下文中公開的實(shí)施例,函數(shù)、類定義、類實(shí)例、模塊與其他語言構(gòu)造作為通過不同腳本語言能夠共享的第一類對(duì)象。在計(jì)算中,第一類對(duì)象是的實(shí)體,其能夠以運(yùn)行時(shí)間構(gòu)造、像參數(shù)或自變量一樣傳遞、從子程序返回或分配到變量中。作為本文公開方法的一部分,這些對(duì)象類型中每個(gè)的各個(gè)底層表示設(shè)計(jì)成Java接口,然后這些接口在每種腳本語言中實(shí)施。另外,代碼在以每種腳本語言實(shí)施來編寫,以允許后者使用Java接口表示函數(shù)、類或其他語言構(gòu)造。本文公開的方法允許不同腳本語言之間以對(duì)給出語言是自然的方式互動(dòng),以便當(dāng)使用腳本語言的工程師編寫他們的腳本時(shí),他們不需要考慮或具有其他腳本語言的任何專業(yè)技能或知識(shí)。更為具體地,本發(fā)明的一個(gè)方面是在不同腳本語言之間共享語言構(gòu)造的方法,其包括(a)定義核心應(yīng)用程序編程接口,其相對(duì)多種腳本語言是語言中性的,該核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口 ;(b)調(diào)用以第一腳本語言編寫的語言構(gòu)造類型,該調(diào)用由以第二腳本語言編寫的語言構(gòu)造類型構(gòu)成;(c)創(chuàng)建處理語言構(gòu)造類型的核心接口實(shí)例;(d)重定向調(diào)用到核心接口實(shí)例;以及(e)重定向由核心接口實(shí)例接收的調(diào)用到以第一腳本語言編寫的語言構(gòu)造類型。本發(fā)明的另一個(gè)方面是使語言構(gòu)造能夠在不同腳本語言之間共享的系統(tǒng),該系統(tǒng)包括相對(duì)多種腳本語言是語言中性的核心應(yīng)用程序編程接口和編程以執(zhí)行操作的處理器,該核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口 ;所述處理器執(zhí)行在前面段落中闡述的(b )到(e )作為對(duì)用戶命令的響應(yīng)。本發(fā)明的進(jìn)一步方面是對(duì)語言構(gòu)造做出調(diào)用的方法,其中所述調(diào)用以第一腳本語言編寫,而語言構(gòu)造以第二腳本語言編寫,所述方法包括(a)定義相對(duì)第一和第二腳本語言是語言中性的核心應(yīng)用程序編程接口,該核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口 ;(b)創(chuàng)建第一和第二核心接口對(duì)象;(c)創(chuàng)建第一語言適配器對(duì)象,其重定向調(diào)用到第一核心接口對(duì)象;(d)創(chuàng)建以第二腳本語言編寫的語言構(gòu)造對(duì)象;
(e)創(chuàng)建第一核心適配器對(duì)象,其重定向由第一核心接口對(duì)象接收的調(diào)用到語言構(gòu)造對(duì)象;
(f)創(chuàng)建第二語言適配器對(duì)象,其返回由語言構(gòu)造對(duì)象產(chǎn)生的結(jié)果到第二核心接口對(duì)象;以及(g)創(chuàng)建第二核心適配器對(duì)象,其重定向由第二核心接口對(duì)象接收的返回結(jié)果到以第一腳本語言編寫的語言構(gòu)造對(duì)象。本發(fā)明的另外一個(gè)方面是對(duì)語言構(gòu)造做出調(diào)用的系統(tǒng),其中所述調(diào)用以第一腳本語目編寫而語目構(gòu)造以第二腳本語目編寫,該系統(tǒng)包括相對(duì)第一和第二腳本語目是語目中性的核心應(yīng)用程序編程接口和編程以執(zhí)行操作的處理器,該核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口;所述處理器被編程為執(zhí)行在前面段落中闡述的(b)到(g)作為對(duì)用戶命令的響應(yīng)。本發(fā)明涉及在不同腳本語言之間共享語言構(gòu)造的方法,所述方法包括定義相對(duì)第一和第二腳本語言是語言中性的核心應(yīng)用程序編程接口,所述核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口 ;調(diào)用以第一腳本語言編寫的第一類型語言構(gòu)造,該調(diào)用由以第二腳本語言編寫的所述第一類型語言構(gòu)造做出;創(chuàng)建處理所述第一類型語言構(gòu)造的第一核心接口第一實(shí)例;重定向調(diào)用到所述第一核心接口所述第一實(shí)例;以及重定向由所述第一核心接口所述第一實(shí)例接收的調(diào)用到以所述第一腳本語言編寫的所述第一類型所述語言構(gòu)造。該方法可以包括創(chuàng)建第一語言適配器的實(shí)例;以及創(chuàng)建第一核心適配器的實(shí)例,其中操作(d)由所述第一語言適配器所述實(shí)例實(shí)施,以及操作(e)由所述第一核心適配器所述實(shí)例實(shí)施。該方法還包括,創(chuàng)建以所述第一腳本語言編寫的所述第一類型所述語言構(gòu)造的實(shí)例作為對(duì)調(diào)用的響應(yīng);返回以所述第一腳本語言編寫的所述第一類型所述語言構(gòu)造所述實(shí)例的結(jié)果;創(chuàng)建所述第一核心接口的第二實(shí)例;重定向返回結(jié)果到所述第一核心接口所述第二實(shí)例;以及重定向由所述第一核心接口所述第二實(shí)例接收的返回結(jié)果到以所述第二腳本語言編寫的所述第一類型所述語言構(gòu)造。該方法可以包括創(chuàng)建第二語言適配器的實(shí)例;以及創(chuàng)建第二核心適配器的實(shí)例,其中操作(i) 由所述第二語言適配器的所述實(shí)例實(shí)施,以及操作(j)由所述第二核心適配器所述實(shí)例實(shí)施。第一類型語言構(gòu)造可以從下列類型集合中選擇原語,字符串,列表,詞典,數(shù)組,多元組,陣列,函數(shù),類定義,類實(shí)例,方法和模塊。第一和第二腳本語言可以是J基的。該方法可以包括調(diào)用以第三腳本語言編寫的第二類型語言構(gòu)造,該調(diào)用由以所述第二腳本語言編寫的所述第二類型語言構(gòu)造做出;創(chuàng)建處理所述第二類型語言構(gòu)造的第二核心接口第一實(shí)例;重定向調(diào)用到所述第二核心接口的所述第一實(shí)例;以及重定向由所述第二核心接口所述第一實(shí)例接收的調(diào)用到以所述第三腳本語言編寫所述第二類型所述語言構(gòu)造。該方法可以包括創(chuàng)建第三語言適配器的實(shí)例;以及創(chuàng)建第三核心適配器的實(shí)例,其中操作(m)由所述第三語言適配器所述實(shí)例實(shí)施;以及操作(η)由所述第三核心適配器所述實(shí)例實(shí)施。另外,該方法可以進(jìn)一步包括創(chuàng)建以所述第三腳本語言編寫的所述第二類型所述語言構(gòu)造的實(shí)例作為對(duì)調(diào)用的響應(yīng);返回以所述第三腳本語言編寫所述第二類型所述語言構(gòu)造所述實(shí)例的結(jié)果;創(chuàng)建所述第二核心接口的第二實(shí)例;重定向返回結(jié)果到所述第二核心接口的所述第二實(shí)例;以及重定向由所述第二核心接口所述第二實(shí)例接收的返回結(jié)果到以所述第二腳本語言編寫的所述第二類型所述語言構(gòu)造。其還可以涉及創(chuàng)建第四語言適配器的實(shí)例;以及創(chuàng)建第四核心適配器的實(shí)例,其中操作(r)由所述第四語言適配器所述實(shí)例實(shí)施,以及操作(s)由所述第四核心適配器所述實(shí)例實(shí)施。可以使語言構(gòu)造能夠在不同腳本語言之間共享的系統(tǒng),所述系統(tǒng)包括相對(duì)多種腳本語言是語言中性的核心應(yīng)用程序編程接口和處理器,所述核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口,所述處理器編程以執(zhí)行下列操作作為對(duì)用戶命令的響應(yīng)調(diào)用以第一腳本語言編寫的第一類型語言構(gòu)造,該調(diào)用由以第二腳本語言編寫的所述第一類型語言構(gòu)造做出;創(chuàng)建處理所述第一類型語言構(gòu)造的第一核心接口第一實(shí)例;重定向調(diào)用到所述第一核心接口所述第一實(shí)例;以及重定向由所述第一核心接口所述第一實(shí)例接收的調(diào)用到以所述第一腳本語言編寫的所述第一類型所述語言構(gòu)造。該系統(tǒng)可以包括編程以執(zhí)行下列操作的處理器創(chuàng)建第一語言適配器的實(shí)例;以及創(chuàng)建第一核心適配器的實(shí)例,其中操作(C)由所述第一語言適配器所述實(shí)例實(shí)施,以及操作(d)由所述第一核心適配器所述實(shí)例實(shí)施。如權(quán)利要求12所述的系統(tǒng),其中所述處理器進(jìn)一步編程執(zhí)行下列操作創(chuàng)建以所述第一腳本語言編寫的所述第一類型所述語言構(gòu)造的實(shí)例作為對(duì)調(diào)用的響應(yīng);返回以所述第一腳本語言編寫所述第一類型所述語言構(gòu)造所述實(shí)例的結(jié)果;創(chuàng)建所述第一核心接口的第二實(shí)例;重定向返回的結(jié)果到所述第一核心接口所述第二實(shí)例;以及重定向由所述第一核心接口所述第二實(shí)例接收的返回結(jié)果到以所述第二腳本語言編寫的所述第一類型所述語言構(gòu)造。該系統(tǒng)所述處理器進(jìn)一步編程執(zhí)行下列操作創(chuàng)建第二語言適配器的實(shí)例;以及創(chuàng)建第二核心適配器的實(shí)例,其中操作(h)由所述第二語言適配器所述實(shí)例實(shí)施,以及操作
(i)由所述第二核心適配器所述實(shí)例實(shí)施。該系統(tǒng)可以包括編程執(zhí)行下列操作的處理器調(diào)用以第三腳本語言編寫的第二類型語言構(gòu)造,該調(diào)用由以所述第二腳本語言編寫的所述第二類型語言構(gòu)造做出;創(chuàng)建處理所述第二類型語言構(gòu)造的第二核心接口的第一實(shí)例;重定向調(diào)用到所述第二核心接口的所述第一實(shí)例;以及重定向由所述第二核心接口所述第一實(shí)例接收的調(diào)用到以所述第三腳本語言編寫的所述第二類型所述語言構(gòu)造。系統(tǒng)處理器可以編程執(zhí)行下列操作創(chuàng)建第三語言適配器的實(shí)例;以及創(chuàng)建第三核心適配器的實(shí)例,其中操作(I)由所述第三語言適配器所述實(shí)例實(shí)施,以及操作(m)由所述第三核心適配器所述實(shí)例實(shí)施。該系統(tǒng)處理器可以進(jìn)一步編程執(zhí)行下列操作創(chuàng)建以所述第三腳本語言編寫的所述第二類型所述語言構(gòu)造的實(shí)例作為對(duì)調(diào)用的響應(yīng);返回以所述第三腳本語言編寫所述第二類型所述語言構(gòu)造所述實(shí)例的結(jié)果;創(chuàng)建所述第二核心接口第二實(shí)例;重定向返回結(jié)果到所述第二核心接口所述第二實(shí)例;以及重定向由所述第二核心接口所述第二實(shí)例接收的返回結(jié)果到以所述第二腳本語言編寫所述第二類型所述語言構(gòu)造。該系統(tǒng)處理器還可以編程執(zhí)行下列操作創(chuàng)建第四語言適配器的實(shí)例;以及創(chuàng)建第四核心適配器的實(shí)例,其中操作(r)由所述第四語言適配器實(shí)施,以及操作(s)由所述第四核心適配器所述實(shí)例實(shí)施。本發(fā)明涉及對(duì)語言構(gòu)造做出調(diào)用的方法,其中調(diào)用以第一腳本語言編寫而語言構(gòu)造以第二腳本語言編寫,所述方法包括定義相對(duì)第一和第二腳本語言是語言中性的核心應(yīng)用程序編程接口,所述核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口 ;創(chuàng)建第一和第二核心接口對(duì)象;創(chuàng)建第一語言適配器對(duì)象,其重定向調(diào)用到所述第一核心接口對(duì)象;創(chuàng)建以第二腳本語言編寫的語言構(gòu)造對(duì)象;創(chuàng)建第一核心適配器對(duì)象,其重定向由所述第一核心接口對(duì)象接收的調(diào)用到所述語言構(gòu)造對(duì)象;創(chuàng)建第二語言適配器對(duì)象,其返回到由所述語言構(gòu)造對(duì)象產(chǎn)生的結(jié)果到所述第二核心接口對(duì)象;以及創(chuàng)建第二核心適配器對(duì)象,其重定向由所述第二核心接口對(duì)象接收的返回結(jié)果到以所述第一腳本語目編寫的語目構(gòu)造對(duì)象。對(duì)語言構(gòu)造做出調(diào)用的系統(tǒng),該調(diào)用以第一腳本語言編寫,而語言構(gòu)造以第二腳本語言編寫,所述系統(tǒng)包括核心應(yīng)用程序編程接口,其相對(duì)所述第一和第二腳本語言是語言中性的,所述核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口,以及處理器編程執(zhí)行下列操作作為對(duì)用戶命令的響應(yīng)創(chuàng)建第一和第二核心接口對(duì)象;創(chuàng)建第一語言適配器對(duì)象,其重定向調(diào)用到所述第一核心接口對(duì)象;創(chuàng)建以第二腳本語言編寫的語言構(gòu)造對(duì)象;創(chuàng)建第一核心適配器對(duì)象,其重定向由所述第一核心接口對(duì)象接收的調(diào)用到所述語言構(gòu)造對(duì)象;創(chuàng)建第二語言適配器對(duì)象,其返回由所述語言構(gòu)造對(duì)象產(chǎn)生的結(jié)果到所述第二核心接口對(duì)象;以及創(chuàng)建第二核心適配器對(duì)象,其重定向由所述第二核心接口對(duì)象接收的返回結(jié)果到以所述第一腳本語言編寫的語言構(gòu)造對(duì)象。本發(fā)明的其他方面公開和權(quán)利要求如下。
圖1示出用于當(dāng)Python用戶通過CoreAPI (核心應(yīng)用程序編程接口)的方式調(diào)用以領(lǐng)域特定語言(domain-specific language,即DSL)編寫的函數(shù)(名為DSLFunction)時(shí)的適配器模型示意圖。圖2示出根據(jù)一個(gè)實(shí)施例的代表面向?qū)ο蟠a的示意圖,面向?qū)ο蟠a便于在多種腳本語目之間的共孚語目構(gòu)造。下文中將參考附圖,其中不同附圖中類似部件以相同參考標(biāo)記表示。
具體實(shí)施例方式在隨后的詳細(xì)公開中,術(shù)語接口、類定義、類實(shí)例、應(yīng)用程序編程接口和適配器具有下列含義接口 相關(guān)方法的集合(僅是方法的特征,不是實(shí)施)。類定義在一起實(shí)施的一組方法。類定義可以實(shí)施一個(gè)或更多接口。該實(shí)施常常定義由實(shí)施方法封裝和操作的一些數(shù)據(jù)。類實(shí)例類定義可以多次實(shí)例化。類定義的每個(gè)實(shí)例稱為類實(shí)例。
應(yīng)用程序編程接口(API):—組接口和具有與那些接口和那些類相關(guān)的一組行為的類定義。適配器一種設(shè)計(jì)模型,其允許已有API使用不是API —部分的已有類定義。這通常在當(dāng)類定義與API中的一些接口或類名義上相同時(shí)執(zhí)行。適配器是符合已有API的新類定義。已有類定義(其不在API中)稱為被適配者。適配器包括被適配者和通過對(duì)被適配者的使用實(shí)施在已有API中的接口(或延伸在已有API中的類)。為了理解下文公開的方法,當(dāng)兩個(gè)腳本以相同語言編寫時(shí),觀察他們之間是如何相互作用的。首先考慮以Python語言編寫的簡單腳本,其定義對(duì)兩個(gè)數(shù)值相加的函數(shù)并返回結(jié)果。然后,考慮使用第一腳本來執(zhí)行添加操作的第二腳本。這里是第一腳本的代碼;其在稱為pyExample. py的文件中編寫---------------start example, py---------------def add (a, b):return a+b---------------end example, py----------------而這里是使用第一腳本的第二腳本代碼--------------start use Example, py---------------from example import addprint ^3+4= add (3, 4)
--------------end use Example, py---------------這個(gè)腳本運(yùn)行結(jié)果是打印出的3+4=7本公開采納Python語法并在下文中將在其自有文件中編寫的每個(gè)腳本稱為“模塊”。Python輸入語句允許一個(gè)模塊訪問以另一個(gè)模塊編寫的函數(shù)。因此,在這種情況下,useExample. py模塊輸入example, py模塊,并從那個(gè)模塊中獲得稱為“add”的函數(shù)。然后通過將數(shù)值3和4相加而使用該函數(shù)。需要注意的是輸入語句正搜尋在“example”中的“add”并執(zhí)行,其在Python路徑中的目錄搜尋名為“example, py”文件(以及.pyo,. pyc等),運(yùn)行“example, py”,這導(dǎo)致模塊對(duì)象的生成,然后其在模塊中查找名為“add”的東西。給Jython語言引入額外的功能,即允許用戶用以不同腳本語言編寫的其他文件替換example, py文件是可取的。這里是以領(lǐng)域特定語言編寫的文件例子---------------start example. DSL---------------function add(a as double, b as double)return a+bend function ---------------end example. DSL---------------目的是能夠?qū)xample. DSL放在Python路徑中以取代example, py,然后使模塊useExamp I e. py沒有修改地工作。下文中公開的方法允許這種情況存在。這是典型的大多數(shù)過程化語言之間的語言構(gòu)造或語言構(gòu)造成分(languageconstruct)列表數(shù)據(jù)類型原語(包括整數(shù),雙精度,字符,短的,浮點(diǎn),字節(jié)和語言特定構(gòu)造)字符串列表詞典(有時(shí)候稱為映射)集合(通常以詞典關(guān)鍵碼實(shí)施,僅適用于一些語言)多兀組(固定列表,僅適用于一些語言)陣列語言類型函數(shù)類定義類實(shí)例方法(S卩,類實(shí)例的方法)模塊本文公開的方法使用戶能夠在不同語言之間共享這些構(gòu)造類型中的每個(gè)。為了做到這點(diǎn),首先定義相對(duì)多種腳本語言中的每種是語言中性的API (以Java編寫)。該API包括用于每個(gè)數(shù)據(jù)類型和每種語言類型(即,用于每種語言構(gòu)造類型)的一個(gè)接口。這些語言構(gòu)造接口在本文中稱為核心接口(Core接口),并且他們將被命名,使得單詞“Core”在類型的開始處添加(例如,CorePrimitive, CoreString, CoreFunction, CoreClassDefinition等)。另外,組成Core的所有接口將從稱為CoreObject的公共接口傳承。
CoreFunction的示例性接口如下··
產(chǎn)φ
An interface to genericaliy represent a function.
^ j
public interface CoreFunction extends CoreObject {
Call the function.
*/
CoreObject exec( CoreObject…args);
I1.... 本文公開的方法是實(shí)施和利用核心(Core)接口的適配器模型的擴(kuò)展使用。對(duì)于每種語言,需要為每種類型語言構(gòu)造實(shí)施兩個(gè)適配器。考慮由計(jì)算機(jī)用戶對(duì)涉及特定類型語言構(gòu)造和特定腳本語言的Core做出調(diào)用的情形。計(jì)算機(jī)編程將在特定腳本語言應(yīng)用程序編程接口(API)中具有可用的語言構(gòu)造類型實(shí)施并且在Core API中具有該類型的接口。兩個(gè)適配器中的第一個(gè)包裝特定腳本語言的語言構(gòu)造類型實(shí)施,以便第一適配器符合Core API并且利用語言實(shí)施。第二適配器做的相反并且包裝那種語言構(gòu)造類型Core接口,以便其符合該特定腳本語言API,但是利用Core接口的實(shí)例。更為具體地,對(duì)于每種類型語言構(gòu)造,可以采用已有語言類定義和相應(yīng)已有Core接口,然后編寫實(shí)施Core接口(下文中稱為核心適配器(Core Adapter))和其他適配器的新類定義,允許用于那種語言構(gòu)造類型的Core接口被用于該語言實(shí)施的API (下文中稱為語言適配器(Language Adapter))。例如,考慮Jython語言并考慮函數(shù)(Function)類型。Jython語言實(shí)施的API實(shí)施具有稱為PyFunction的類定義。用戶需要編寫CoreAdapter,其實(shí)施CoreFunction接口并重定向?qū)ζ渥龀龅姆椒ㄕ{(diào)用到PyFunction中的方法調(diào)用。用戶還需要編寫LanguageAdapter,其仿真Python Function并且重定向所有調(diào)用到被包裝的CoreFunction。圖1示出用于Python用戶調(diào)用以領(lǐng)域特定語言編寫函數(shù)14 (稱為DSLFunction)時(shí)的適配器模型。Python解譯程序(interpreter)確定應(yīng)當(dāng)做出調(diào)用。其在是LanguageAdapter的PyWrappedFunction 10中執(zhí)行該調(diào)用,并且重定向該調(diào)用到在這種情況下是CoreFunctionFromDSL 實(shí)施的 CoreFunction 接口 12,這個(gè) CoreFunctionFromDSL 實(shí)施 12是重定向該調(diào)用到DSLFunction的CoreAdapter。DSLFunction是領(lǐng)域特定語言實(shí)施的一部分并且知道如何內(nèi)部解析該方法。例如,這里是文本文件中如何定義DSL函數(shù) ---------------------------function add(a as double, b as double)
return a+bend function -----------------------------------------DSL解譯程序?qū)⒔庾g該文本并創(chuàng)建DSL函數(shù)實(shí)例。DSL函數(shù)通常可以從像下面這樣的DSL語言中調(diào)用 ----------------c=add (1. O, 2. O) ----------------DSL解譯程序?qū)⑼ㄟ^查詢名為“add”的已有DSL Function實(shí)例來解譯上述文本。其導(dǎo)入DSL Function實(shí)例兩個(gè)輸入(1. O和2. O)。DSLFunction實(shí)例知道在內(nèi)部如何“解析該函數(shù)”。其將執(zhí)行“a+b”,在此例中是“1. 0+2. O”并返回輸出,3. O。因此,當(dāng)從Python調(diào)用這個(gè)相同函數(shù)時(shí),該系統(tǒng)從Py對(duì)象轉(zhuǎn)換到Core對(duì)象,然后從Core對(duì)象轉(zhuǎn)換到DSL對(duì)象,然后調(diào)用“真正的”函數(shù),其知道如何利用那些輸入并執(zhí)行用于定義該函數(shù)的代碼。將Python函數(shù)轉(zhuǎn)換成Core函數(shù)的示例性Language Adapter可以采用下列形式
public class PyWrappedFunction extends PyObject {
CoreFunction function;
public PyWrappedFunction( CoreFunction ten ) {function = fen;
.(
( /Override
public PyObject —call—( PyObject args[], String keywords[]) {
List <CoreObject> veArgs = new ArrayList <CoreObject>();
for ( PyObject arg : args ) {
CoreObject veArg = JythonAda.pterFactory:/hv/77,./_>,//")/. ( arg ); veArgs.add( veArg );
CoreObject result = function.execi veArgs. to Arrayi ne、v CoreObject[Oj ));
return JvthonAdapterFactory.")./v//"" ( result):
}
Language Adapter 讓 Python 函數(shù)偽裝成 Core 函數(shù)。將Core函數(shù)轉(zhuǎn)換成Python函數(shù)的示例性Core Adapter具有下列形式
public class CoreFunctionlmplementedlnPython implements CoreFunction {
private PyObject pycallable;
@Override
public CoreObject exec( CoreObject... ams ) {
PyObject[] pyargs pyargs = new PyObject[args.length];int start = 0;
for (int i = start; i < args.length + start; i+: ) {
PyObject pyobj = J ython Adaptor Facto iy.1oJyihon( args[i]);
pyargs[i] = pyobj;
t
)
/
*In practice, there should be additional code that will trap any errors
in
*the user-supplied function and generate a meaningful stacktrace in*the error message. (This allows for cross-language tracebacksOm
踐中,應(yīng)當(dāng)有附加的代碼用于收集用戶提供函數(shù)的錯(cuò)誤,并在錯(cuò)誤消 息中產(chǎn)生有意義的棧追蹤。(這允許語言間的追溯。)
PyObject result = pycallable.—call—( pyargs );return jython AdaptorFactory.//Y;/w,/v7/ o/ ( result)
}
Core Adapter讓Core函數(shù)偽裝成Python函數(shù)。為了實(shí)施每個(gè)適配器,用戶 需要基于另一個(gè)API的已有對(duì)象,能夠創(chuàng)建用于一個(gè)API的適配器。為了支持該方法,每種腳本語言必須以兩個(gè)方法實(shí)施AdapterFactory類。一個(gè)方法將用于Core API的對(duì)象轉(zhuǎn)換到Language API并且另一個(gè)方法將Language API對(duì)象轉(zhuǎn)換到Core API。工廠可以創(chuàng)建適配器的新實(shí)例或可以利用緩存,以便其能夠再用適配器。需要注意Python函數(shù)包裝到Core函數(shù)然后需要轉(zhuǎn)換返回到Python語言API的情況。在這種情況下,不想創(chuàng)建適配器,但是取而代之的是應(yīng)當(dāng)檢索底層Python函數(shù)并返回。詳細(xì)闡述圖1所示的情形,DSL函數(shù)將DSL對(duì)象作為輸入并且將DSL對(duì)象作為輸出返回。Core函數(shù)將Core對(duì)象作為輸入并將Core對(duì)象作為輸出返回。Python函數(shù)將Python對(duì)象作為輸入并將Python對(duì)象作為輸出返回。對(duì)于調(diào)用DSL函數(shù)的Python,我們需要適配Core函數(shù)的Python函數(shù),其中Core函數(shù)適配DSL函數(shù)。因此,Python函數(shù)將Py對(duì)象作為輸入。這些Py對(duì)象轉(zhuǎn)換為Core對(duì)象,并且Core函數(shù)以那些Core對(duì)象輸入調(diào)用。這個(gè)Core函數(shù)將Core對(duì)象作為輸入并且將他們轉(zhuǎn)換為DSL對(duì)象輸入,并且調(diào)用“真正的”DSL函數(shù)。DSL對(duì)象作為結(jié)果被返回。適配DSL函數(shù)的Core函數(shù)將那個(gè)返回的DSL對(duì)象轉(zhuǎn)換為Core對(duì)象并且返回Core對(duì)象。最終,Python函數(shù)獲得返回的Core對(duì)象并將其轉(zhuǎn)換為Python對(duì)象。正如本文所使用的,“轉(zhuǎn)換”意為AdapterFactory被調(diào)用,以便能夠創(chuàng)建或檢索正確的適配器。應(yīng)當(dāng)理解,Core接口不局限于如圖1所示的、將DSL對(duì)象轉(zhuǎn)換為Python對(duì)象和將Python對(duì)象轉(zhuǎn)換為DSL對(duì)象,而是能夠擴(kuò)展到包括便于以其他腳本語言編寫對(duì)象共享的Core接口。圖2示出能夠擴(kuò)展的便于以三種不同腳本語言Jython、JRuby和領(lǐng)域特定語言編寫的語言構(gòu)造共享的類CoreObject示意圖。根據(jù)圖2示出的方案,Core API (類CoreObject及其擴(kuò)展)使得Jython用戶能夠訪問以JRuby或DSL編寫的語言構(gòu)造;使得JRuby用戶能夠訪問以Jython或DSL編寫的語言構(gòu)造;以及使得DSL用戶能夠訪問以Jython或JRuby編寫的語言構(gòu)造。例如,為了使Jython用戶能夠訪問以DSL編寫的語言構(gòu)造,JythonLanguageAdaptor (Jython 語言適配器)的第一實(shí)例(由 Jython-CoreAdaptorFactory (Jython 核心適配器工廠)24創(chuàng)建或檢索)將Py0bjectl6的第一實(shí)例轉(zhuǎn)換為CoreObject 18的第一實(shí)例;隨后,DSL-CoreAdaptor (由 DSL-Core AdaptorFactory (DSL 核心適配器工廠)26 創(chuàng)建或檢索)的第一實(shí)例將CoreObject 18的第一實(shí)例轉(zhuǎn)換為DSLObject20的第一實(shí)例。隨后,DSL Language Adaptor (DSL 語言適配器)的第一實(shí)例(由 DSL-Core AdaptorFactory26創(chuàng)建或檢索)將DSL0bject20的第二實(shí)例轉(zhuǎn)換為CoreObject 18的第二實(shí)例;其后,Jython-CoreAdaptor 的第一實(shí)例(由 Jython-Core AdaptorFactory 24 創(chuàng)建或檢索)將CoreObject 18的第二實(shí)例轉(zhuǎn)換為PyObject 16的第二實(shí)例。類似地,為了使JRuby用戶能夠訪問以DSL編寫的語言構(gòu)造,JRuby LanguageAdaptor (JRuby 語言適配器)的第一實(shí)例(由 JRuby-Core AdaptorFactory (JRuby 核心適配器工廠)28創(chuàng)建或檢索)將RubyObject 22的第一實(shí)例轉(zhuǎn)換為CoreObject 18的第三實(shí)例;然后,DSL-Core Adaptor (由 DSL-Core AdaptorFactory 26 創(chuàng)建或檢索)的第二實(shí)例將CoreObject 18的第三實(shí)例轉(zhuǎn)換為DSLObject 20的第三實(shí)例。隨后,DSL LanguageAdaptor 的第二實(shí)例(由 DSL-Core AdaptorFactory26 創(chuàng)建或檢索)將 DSLObject 20 的第四實(shí)例轉(zhuǎn)換為CoreObject 18的第四實(shí)例;并且然后,JRuby-Core Adaptor的第一實(shí)例(由JRuby-CoreAdaptorFactory 28創(chuàng)建或檢索)將CoreObject 18的第四實(shí)例轉(zhuǎn)換為RubyObject 22 的第二實(shí)例。以類似的方式,DSL用戶能夠?qū)胗蒍ython或JRuby腳本語言編寫的語言構(gòu)造;JRuby用戶能夠?qū)胍訨ython腳本語言編寫的語言構(gòu)造;以及Jython用戶能夠利用CoreAPI導(dǎo)入以JRuby腳本語言編寫的語言構(gòu)造。如上文所述,Core API包括每種語言構(gòu)造的相應(yīng)Core接口,其中Core接口從調(diào)用CoreObject的公共接口繼承。一些語言對(duì)大小寫敏感而其他語言不是。因此,Dictionary andClass Instances的接口不由String做檢查。相反,對(duì)單獨(dú)的接口實(shí)施檢查,定義稱為CoreKey的關(guān)鍵碼。該實(shí)施例包括對(duì)大小寫敏感的CoreKey的實(shí)施而其他實(shí)施對(duì)大小寫不敏感。為了使上述系統(tǒng)可行,每種語言必須支持導(dǎo)入鉤(import hook)的概念。術(shù)語導(dǎo)入鉤來自Python群體并且是重定義當(dāng)執(zhí)行導(dǎo)入時(shí)被調(diào)用函數(shù)的機(jī)制。導(dǎo)入函數(shù)需要被強(qiáng)化,以便其能夠處理以其他語言編寫的模塊。常用慣例是使用文件名的擴(kuò)展名以確定應(yīng)當(dāng)用以解譯該文件的語言。一旦文件被解譯,應(yīng)當(dāng)產(chǎn)生文件內(nèi)容的一些模塊(Module)或詞典(Dictionary)表示。然后使用該表示創(chuàng)建能夠包裝到模塊內(nèi)的CoreModuleAdaptor。需要注意的是若目標(biāo)語言不支持導(dǎo)入鉤,那么,總體機(jī)制仍然將正確工作,但需要調(diào)用腳本的一些修改,以便做出導(dǎo)入腳本的函數(shù)調(diào)用而不是更多自然導(dǎo)入語句。還需要注意的是一些語言高速緩存導(dǎo)入的模塊以便他們不必再次解譯(而且,類定義不必再定義)。當(dāng)在一種語言出現(xiàn)導(dǎo)入時(shí),實(shí)施例的實(shí)施器需要很小心地將被導(dǎo)入模塊高速緩存到支持語言中的每種。上述方法通過允許工程師輕松共享他們的分析代碼而提供了成本節(jié)約。以不同語言編寫的不同應(yīng)用軟件能夠快速整合。還有一個(gè)成本節(jié)約是工程師能夠以他們感覺舒服的語言編寫代碼。他們不需要花費(fèi)時(shí)間培訓(xùn)新語言。這也避免了成本支出。通過更輕松共享代碼,有重復(fù)使用代碼的更好機(jī)會(huì)。雖然已經(jīng)通過參考不同實(shí)施例對(duì)本發(fā)明進(jìn)行了描述,本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,在不偏離本發(fā)明范圍的前提下,可以對(duì)其中的元素做出各種改變或以等價(jià)物替換。另夕卜,在不偏離本發(fā)明基本范圍的前提下,可以做出許多修改以適應(yīng)本發(fā)明教導(dǎo)的特殊情形。因此,本發(fā)明不限于已經(jīng)公開的、擬作為本發(fā)明最佳實(shí)現(xiàn)模式的特定實(shí)施例。本文闡述的方法不應(yīng)解釋為要求本發(fā)明以列舉的順序執(zhí)行操作。
權(quán)利要求
1.一種在不同腳本語言之間共享語言構(gòu)造的方法,所述方法包括 (a)定義相對(duì)多種腳本語言是語言中性的核心應(yīng)用程序編程接口,所述核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口; (b)調(diào)用以第一腳本語言編寫的第一類型語言構(gòu)造,所述調(diào)用由以第二腳本語言編寫的所述第一類型語言構(gòu)造做出; (c)創(chuàng)建處理所述第一類型語言構(gòu)造的第一核心接口的第一實(shí)例; Cd)重定向所述調(diào)用到所述第一核心接口的所述第一實(shí)例;以及 (e)重定向由所述第一核心接口的所述第一實(shí)例接收的所述調(diào)用到以所述第一腳本語言編寫的所述第一類型的所述語言構(gòu)造。
2.根據(jù)權(quán)利要求1所述的方法,其進(jìn)一步包括 創(chuàng)建第一語言適配器的實(shí)例;以及 創(chuàng)建第一核心適配器的實(shí)例, 其中,操作(d)由所述第一語言適配器的所述實(shí)例實(shí)施,以及操作(e)由所述第一核心適配器的所述實(shí)例實(shí)施。
3.根據(jù)權(quán)利要求2所述的方法,其進(jìn)一步包括 (f)創(chuàng)建以所述第一腳本語言編寫的所述第一類型的所述語言構(gòu)造的實(shí)例以響應(yīng)所述調(diào)用; (g)返回以所述第一腳本語言編寫的所述第一類型的所述語言構(gòu)造的所述實(shí)例的結(jié)果; (h)創(chuàng)建所述第一核心接口的第二實(shí)例; (i)重定向返回的結(jié)果到所述第一核心接口的所述第二實(shí)例;以及 (j )重定向由所述第一核心接口的所述第二實(shí)例接收的返回結(jié)果到以所述第二腳本語言編寫的所述第一類型的所述語言構(gòu)造。
4.根據(jù)權(quán)利要求3所述的方法,其進(jìn)一步包括 創(chuàng)建第二語言適配器的實(shí)例,以及 創(chuàng)建第二核心適配器的實(shí)例。
其中操作(i)由所述第二語言適配器的所述實(shí)例實(shí)施,以及操作(j)由所述第二核心適配器的所述實(shí)例實(shí)施。
5.根據(jù)權(quán)利要求1、2、3或4所述的方法,其中所述第一類型語言構(gòu)造從下列類型集合中選擇原語,字符串,列表,詞典,數(shù)組,多元組,陣列,函數(shù),類定義,類實(shí)例,方法和模塊。
6.根據(jù)權(quán)利要求1、2、3或4所述的方法,其中所述第一和第二腳本語言是基于Java的。
7.根據(jù)權(quán)利要求4、5或6所述的方法,其進(jìn)一步包括 (k)調(diào)用以第三腳本語言編寫的第二類型的語言構(gòu)造,該調(diào)用由以所述第二腳本語言編寫的所述第二類型的語言構(gòu)造做出; (I)創(chuàng)建用于處理所述第二類型的語言構(gòu)造的第二核心接口的第一實(shí)例; Cm)重定向所述調(diào)用到所述第二核心接口的所述第一實(shí)例;以及(η)重定向由所述第二核心接口的所述第一實(shí)例接收的調(diào)用到以所述第三腳本語言編寫所述第二類型的所述語言構(gòu)造。
8.根據(jù)權(quán)利要求4、5、6或7所述的方法,其進(jìn)一步包括 創(chuàng)建第三語言適配器的實(shí)例;以及 創(chuàng)建第三核心適配器的實(shí)例, 其中,操作(m)由所述第三語言適配器的所述實(shí)例實(shí)施;以及操作(η)由所述第三核心適配器的所述實(shí)例實(shí)施。
9.根據(jù)權(quán)利要求4、5、6、7或8所述的方法,其進(jìn)一步包括 (O)創(chuàng)建以所述第三腳本語言編寫的所述第二類型的所述語言構(gòu)造的實(shí)例以響應(yīng)所述調(diào)用; (P)返回以所述第三腳本語言編寫的所述第二類型的所述語言構(gòu)造所述實(shí)例的結(jié)果; (q)創(chuàng)建所述第二核心接口的第二實(shí)例; Cr)重定向返回的結(jié)果到所述第二核心接口的所述第二實(shí)例;以及 (S)重定向由所述第二核心接口的所述第二實(shí)例接收的返回結(jié)果到以所述第二腳本語言編寫的所述第二類型的所述語言構(gòu)造。
10.根據(jù)權(quán)利要求9所述的方法,其進(jìn)一步包括 創(chuàng)建第四語言適配器的實(shí)例;以及 創(chuàng)建第四核心適配器的實(shí)例, 其中,操作(r)由所述第四語言適配器的所述實(shí)例實(shí)施;以及操作(s)由所述第四核心適配器的所述實(shí)例實(shí)施。
11.一種使語言構(gòu)造能夠在不同腳本語言之間共享的系統(tǒng),所述系統(tǒng)包括相對(duì)多種腳本語言是語言中性的核心應(yīng)用程序編程接口和處理器,所述核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口,所述處理器被編程為執(zhí)行下列操作 Ca)調(diào)用以第一腳本語言編寫的第一類型語言構(gòu)造,所述調(diào)用由以第二腳本語言編寫的所述第一類型語言構(gòu)造做出; (b)創(chuàng)建處理所述第一類型語言構(gòu)造的第一核心接口的第一實(shí)例; (c)重定向所述調(diào)用到所述第一核心接口的所述第一實(shí)例;以及 (d)重定向由所述第一核心接口的所述第一實(shí)例接收的所述調(diào)用到以所述第一腳本語言編寫的所述第一類型的所述語言構(gòu)造。
12.根據(jù)權(quán)利要求11所述的系統(tǒng),其中所述處理器進(jìn)一步被編程為執(zhí)行下列操作 創(chuàng)建第一語言適配器的實(shí)例;以及 創(chuàng)建第一核心適配器的實(shí)例, 其中,操作(c)由所述第一語言適配器的所述實(shí)例實(shí)施,以及操作(d)由所述第一核心適配器的所述實(shí)例實(shí)施。
13.根據(jù)權(quán)利要求12所述的系統(tǒng),其中所述處理器進(jìn)一步被編程為執(zhí)行下列操作 (e)創(chuàng)建以所述第一腳本語言編寫的所述第一類型的所述語言構(gòu)造的實(shí)例以響應(yīng)所述調(diào)用; Cf)返回以所述第一腳本語言編寫的所述第一類型所述語言構(gòu)造所述實(shí)例的結(jié)果; (g)創(chuàng)建所述第一核心接口的第二實(shí)例; (h)重定向返回的結(jié)果到所述第一核心接口的所述第二實(shí)例;以及 (j)重定向由所述第一核心接口的所述第二實(shí)例接收的返回結(jié)果到以所述第二腳本語言編寫的所述第一類型的所述語言構(gòu)造。
14.根據(jù)權(quán)利要求13所述的系統(tǒng),其中所述處理器進(jìn)一步被編程為執(zhí)行下列操作 創(chuàng)建第二語言適配器的實(shí)例,以及 創(chuàng)建第二核心適配器的實(shí)例。
其中操作(h)由所述第二語言適配器的所述實(shí)例實(shí)施,以及操作(i)由所述第二核心適配器的所述實(shí)例實(shí)施。
15.根據(jù)權(quán)利要求14所述的系統(tǒng),其中所述處理器進(jìn)一步被編程為執(zhí)行下列操作 (j)調(diào)用以第三腳本語言編寫的第二類型的語言構(gòu)造,該調(diào)用由以所述第二腳本語言編寫的所述第二類型的語言構(gòu)造做出; (k)創(chuàng)建用于處理所述第二類型的語言構(gòu)造的第二核心接口的第一實(shí)例; (I)重定向所述調(diào)用到所述第二核心接口的所述第一實(shí)例;以及(m)重定向由所述第二核心接口的所述第一實(shí)例接收的調(diào)用到以所述第三腳本語言編寫所述第二類型的所述語言構(gòu)造。
全文摘要
本發(fā)明提供了一種系統(tǒng)和方法,其使得用戶能夠以第一腳本語言編寫腳本代碼,然后使用第二腳本語言調(diào)用以第一腳本語言編寫的語言構(gòu)造。函數(shù),類定義,類實(shí)例,模塊和其他語言構(gòu)造被作為能夠在不同腳本語言之間共享的第一類對(duì)象。本發(fā)明的技術(shù)也適用于領(lǐng)域特定語言。作為本方法的一部分,這些對(duì)象類型的每個(gè)的相應(yīng)底層表示被設(shè)計(jì)為接口,然后該接口在每種腳本語言中實(shí)施。另外,以每種腳本語言實(shí)施編寫的代碼允許后來者使用表示函數(shù)、類或其他語言構(gòu)造的該接口。
文檔編號(hào)G06F9/45GK103064721SQ20121040629
公開日2013年4月24日 申請(qǐng)日期2012年10月23日 優(yōu)先權(quán)日2011年10月24日
發(fā)明者P·Z·圖納曼, S·L·雷 申請(qǐng)人:波音公司