午夜毛片免费看,老师老少妇黄色网站,久久本道综合久久伊人,伊人黄片子

多種解釋性編程語言間的第一類對象共享的制作方法

文檔序號:6379407閱讀:309來源:國知局
專利名稱:多種解釋性編程語言間的第一類對象共享的制作方法
技術(shù)領(lǐng)域
本發(fā)明主要涉及接口,其允許一種解釋性編程語言(interpretedlanguage)的語言構(gòu)造中使用以不同解釋性編程語言編寫的語言構(gòu)造。尤其是,本公開涉及允許高級別腳本用戶整合以不同腳本語言編寫的低級別腳本的接口。
背景技術(shù)
編譯語言不能交互使用。標(biāo)準(zhǔn)使用案例是編寫代碼,編譯代碼,然后運行代碼。這對于正編寫應(yīng)用程序的軟件開發(fā)人員來說是很好的范例,但是這對于需要探究和解決問題的工程師或數(shù)學(xué)家來說不是那么有用。解釋性語言能夠交互使用。工程師可以在他/她打印代碼并且代碼被解釋以及當(dāng)?shù)讓討?yīng)用程序在運行時,然后執(zhí)行該代碼的地方具有“提示符”。解釋性語言的例子包括Python、Ruby 等。腳本語言添加到應(yīng)用程序中以允許用戶從命令提示符或文本文件驅(qū)動應(yīng)用程序。解釋性語言能夠用作腳本語言,并且在下文中,本公開將將用于腳本的解釋性語言稱為“腳本語言”。Python是一種解釋性語言。其具有幾個實施,包括CPython和Jython。CPython以C語言編寫并且通常稱作Python。Jython以Java編寫。Java是在虛擬機器上運行的編譯語言。在Java虛擬機器之上建立了幾種腳本語言。這些通常稱為J基腳本語言。(例子包括Jython,JRuby,Groovy和Rhino。)眾所周知,專用J基腳本語言是設(shè)計用于幾何形狀操縱和嚙合(創(chuàng)建離散表示)的領(lǐng)域特定語言。而且,用于幾何構(gòu)造、分析和操控的以Java編寫的應(yīng)用程序是設(shè)計成腳本的。底層Java代碼定義了很多幾何操作。然后,工程師可以利用這些腳本使用具體幾何操作解決他們的工程技術(shù)問題。這些腳本代表工程過程中的知識收集。存在重用這些腳本的強烈需要。存在能夠利用這些事先存在的專有語言腳本驅(qū)動上述幾何構(gòu)造應(yīng)用程序的需要。考慮由幾個較低級別工程過程組成的高級別工程過程。已經(jīng)編寫每個較低級別過程。工程師需要能夠編寫整合較低級別腳本的高級別腳本。既然這些腳本可能將以不止一種的腳本語言編寫,需要一種方法輕松共享在不同腳本語言中創(chuàng)建的函數(shù)、類、實例和對象。目前在現(xiàn)存的腳本環(huán)境中共享不同腳本語言之間的數(shù)據(jù)是可能的,但是做到這點,需要編程技巧以及底層Java語言的知識。應(yīng)針對工程師設(shè)計這種問題的解決方案,而不是針對應(yīng)用軟件開發(fā)人員,因此在工程師部分,該解決方案不應(yīng)該需要額外的編程/軟件開發(fā)。因此,存在允許不同工程師以不同腳本語言編程并且沒有考慮底層語言實施問題,共享他們通過這些腳本語言編寫代碼的方法需求。優(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ù)并且能以另一種腳本語言調(diào)用。在這里公開的技術(shù)對領(lǐng)域特定語言也是適用的。根據(jù)下文中公開的實施例,函數(shù)、類定義、類實例、模塊與其他語言構(gòu)造作為通過不同腳本語言能夠共享的第一類對象。在計算中,第一類對象是的實體,其能夠以運行時間構(gòu)造、像參數(shù)或自變量一樣傳遞、從子程序返回或分配到變量中。作為本文公開方法的一部分,這些對象類型中每個的各個底層表示設(shè)計成Java接口,然后這些接口在每種腳本語言中實施。另外,代碼在以每種腳本語言實施來編寫,以允許后者使用Java接口表示函數(shù)、類或其他語言構(gòu)造。本文公開的方法允許不同腳本語言之間以對給出語言是自然的方式互動,以便當(dāng)使用腳本語言的工程師編寫他們的腳本時,他們不需要考慮或具有其他腳本語言的任何專業(yè)技能或知識。更為具體地,本發(fā)明的一個方面是在不同腳本語言之間共享語言構(gòu)造的方法,其包括(a)定義核心應(yīng)用程序編程接口,其相對多種腳本語言是語言中性的,該核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口 ;(b)調(diào)用以第一腳本語言編寫的語言構(gòu)造類型,該調(diào)用由以第二腳本語言編寫的語言構(gòu)造類型構(gòu)成;(c)創(chuàng)建處理語言構(gòu)造類型的核心接口實例;(d)重定向調(diào)用到核心接口實例;以及(e)重定向由核心接口實例接收的調(diào)用到以第一腳本語言編寫的語言構(gòu)造類型。本發(fā)明的另一個方面是使語言構(gòu)造能夠在不同腳本語言之間共享的系統(tǒng),該系統(tǒng)包括相對多種腳本語言是語言中性的核心應(yīng)用程序編程接口和編程以執(zhí)行操作的處理器,該核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口 ;所述處理器執(zhí)行在前面段落中闡述的(b )到(e )作為對用戶命令的響應(yīng)。本發(fā)明的進一步方面是對語言構(gòu)造做出調(diào)用的方法,其中所述調(diào)用以第一腳本語言編寫,而語言構(gòu)造以第二腳本語言編寫,所述方法包括(a)定義相對第一和第二腳本語言是語言中性的核心應(yīng)用程序編程接口,該核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口 ;(b)創(chuàng)建第一和第二核心接口對象;(c)創(chuàng)建第一語言適配器對象,其重定向調(diào)用到第一核心接口對象;(d)創(chuàng)建以第二腳本語言編寫的語言構(gòu)造對象;
(e)創(chuàng)建第一核心適配器對象,其重定向由第一核心接口對象接收的調(diào)用到語言構(gòu)造對象;
(f)創(chuàng)建第二語言適配器對象,其返回由語言構(gòu)造對象產(chǎn)生的結(jié)果到第二核心接口對象;以及(g)創(chuàng)建第二核心適配器對象,其重定向由第二核心接口對象接收的返回結(jié)果到以第一腳本語言編寫的語言構(gòu)造對象。本發(fā)明的另外一個方面是對語言構(gòu)造做出調(diào)用的系統(tǒng),其中所述調(diào)用以第一腳本語目編寫而語目構(gòu)造以第二腳本語目編寫,該系統(tǒng)包括相對第一和第二腳本語目是語目中性的核心應(yīng)用程序編程接口和編程以執(zhí)行操作的處理器,該核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口;所述處理器被編程為執(zhí)行在前面段落中闡述的(b)到(g)作為對用戶命令的響應(yīng)。本發(fā)明涉及在不同腳本語言之間共享語言構(gòu)造的方法,所述方法包括定義相對第一和第二腳本語言是語言中性的核心應(yīng)用程序編程接口,所述核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口 ;調(diào)用以第一腳本語言編寫的第一類型語言構(gòu)造,該調(diào)用由以第二腳本語言編寫的所述第一類型語言構(gòu)造做出;創(chuàng)建處理所述第一類型語言構(gòu)造的第一核心接口第一實例;重定向調(diào)用到所述第一核心接口所述第一實例;以及重定向由所述第一核心接口所述第一實例接收的調(diào)用到以所述第一腳本語言編寫的所述第一類型所述語言構(gòu)造。該方法可以包括創(chuàng)建第一語言適配器的實例;以及創(chuàng)建第一核心適配器的實例,其中操作(d)由所述第一語言適配器所述實例實施,以及操作(e)由所述第一核心適配器所述實例實施。該方法還包括,創(chuàng)建以所述第一腳本語言編寫的所述第一類型所述語言構(gòu)造的實例作為對調(diào)用的響應(yīng);返回以所述第一腳本語言編寫的所述第一類型所述語言構(gòu)造所述實例的結(jié)果;創(chuàng)建所述第一核心接口的第二實例;重定向返回結(jié)果到所述第一核心接口所述第二實例;以及重定向由所述第一核心接口所述第二實例接收的返回結(jié)果到以所述第二腳本語言編寫的所述第一類型所述語言構(gòu)造。該方法可以包括創(chuàng)建第二語言適配器的實例;以及創(chuàng)建第二核心適配器的實例,其中操作(i) 由所述第二語言適配器的所述實例實施,以及操作(j)由所述第二核心適配器所述實例實施。第一類型語言構(gòu)造可以從下列類型集合中選擇原語,字符串,列表,詞典,數(shù)組,多元組,陣列,函數(shù),類定義,類實例,方法和模塊。第一和第二腳本語言可以是J基的。該方法可以包括調(diào)用以第三腳本語言編寫的第二類型語言構(gòu)造,該調(diào)用由以所述第二腳本語言編寫的所述第二類型語言構(gòu)造做出;創(chuàng)建處理所述第二類型語言構(gòu)造的第二核心接口第一實例;重定向調(diào)用到所述第二核心接口的所述第一實例;以及重定向由所述第二核心接口所述第一實例接收的調(diào)用到以所述第三腳本語言編寫所述第二類型所述語言構(gòu)造。該方法可以包括創(chuàng)建第三語言適配器的實例;以及創(chuàng)建第三核心適配器的實例,其中操作(m)由所述第三語言適配器所述實例實施;以及操作(η)由所述第三核心適配器所述實例實施。另外,該方法可以進一步包括創(chuàng)建以所述第三腳本語言編寫的所述第二類型所述語言構(gòu)造的實例作為對調(diào)用的響應(yīng);返回以所述第三腳本語言編寫所述第二類型所述語言構(gòu)造所述實例的結(jié)果;創(chuàng)建所述第二核心接口的第二實例;重定向返回結(jié)果到所述第二核心接口的所述第二實例;以及重定向由所述第二核心接口所述第二實例接收的返回結(jié)果到以所述第二腳本語言編寫的所述第二類型所述語言構(gòu)造。其還可以涉及創(chuàng)建第四語言適配器的實例;以及創(chuàng)建第四核心適配器的實例,其中操作(r)由所述第四語言適配器所述實例實施,以及操作(s)由所述第四核心適配器所述實例實施??梢允拐Z言構(gòu)造能夠在不同腳本語言之間共享的系統(tǒng),所述系統(tǒng)包括相對多種腳本語言是語言中性的核心應(yīng)用程序編程接口和處理器,所述核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口,所述處理器編程以執(zhí)行下列操作作為對用戶命令的響應(yīng)調(diào)用以第一腳本語言編寫的第一類型語言構(gòu)造,該調(diào)用由以第二腳本語言編寫的所述第一類型語言構(gòu)造做出;創(chuàng)建處理所述第一類型語言構(gòu)造的第一核心接口第一實例;重定向調(diào)用到所述第一核心接口所述第一實例;以及重定向由所述第一核心接口所述第一實例接收的調(diào)用到以所述第一腳本語言編寫的所述第一類型所述語言構(gòu)造。該系統(tǒng)可以包括編程以執(zhí)行下列操作的處理器創(chuàng)建第一語言適配器的實例;以及創(chuàng)建第一核心適配器的實例,其中操作(C)由所述第一語言適配器所述實例實施,以及操作(d)由所述第一核心適配器所述實例實施。如權(quán)利要求12所述的系統(tǒng),其中所述處理器進一步編程執(zhí)行下列操作創(chuàng)建以所述第一腳本語言編寫的所述第一類型所述語言構(gòu)造的實例作為對調(diào)用的響應(yīng);返回以所述第一腳本語言編寫所述第一類型所述語言構(gòu)造所述實例的結(jié)果;創(chuàng)建所述第一核心接口的第二實例;重定向返回的結(jié)果到所述第一核心接口所述第二實例;以及重定向由所述第一核心接口所述第二實例接收的返回結(jié)果到以所述第二腳本語言編寫的所述第一類型所述語言構(gòu)造。該系統(tǒng)所述處理器進一步編程執(zhí)行下列操作創(chuàng)建第二語言適配器的實例;以及創(chuàng)建第二核心適配器的實例,其中操作(h)由所述第二語言適配器所述實例實施,以及操作
(i)由所述第二核心適配器所述實例實施。該系統(tǒng)可以包括編程執(zhí)行下列操作的處理器調(diào)用以第三腳本語言編寫的第二類型語言構(gòu)造,該調(diào)用由以所述第二腳本語言編寫的所述第二類型語言構(gòu)造做出;創(chuàng)建處理所述第二類型語言構(gòu)造的第二核心接口的第一實例;重定向調(diào)用到所述第二核心接口的所述第一實例;以及重定向由所述第二核心接口所述第一實例接收的調(diào)用到以所述第三腳本語言編寫的所述第二類型所述語言構(gòu)造。系統(tǒng)處理器可以編程執(zhí)行下列操作創(chuàng)建第三語言適配器的實例;以及創(chuàng)建第三核心適配器的實例,其中操作(I)由所述第三語言適配器所述實例實施,以及操作(m)由所述第三核心適配器所述實例實施。該系統(tǒng)處理器可以進一步編程執(zhí)行下列操作創(chuàng)建以所述第三腳本語言編寫的所述第二類型所述語言構(gòu)造的實例作為對調(diào)用的響應(yīng);返回以所述第三腳本語言編寫所述第二類型所述語言構(gòu)造所述實例的結(jié)果;創(chuàng)建所述第二核心接口第二實例;重定向返回結(jié)果到所述第二核心接口所述第二實例;以及重定向由所述第二核心接口所述第二實例接收的返回結(jié)果到以所述第二腳本語言編寫所述第二類型所述語言構(gòu)造。該系統(tǒng)處理器還可以編程執(zhí)行下列操作創(chuàng)建第四語言適配器的實例;以及創(chuàng)建第四核心適配器的實例,其中操作(r)由所述第四語言適配器實施,以及操作(s)由所述第四核心適配器所述實例實施。本發(fā)明涉及對語言構(gòu)造做出調(diào)用的方法,其中調(diào)用以第一腳本語言編寫而語言構(gòu)造以第二腳本語言編寫,所述方法包括定義相對第一和第二腳本語言是語言中性的核心應(yīng)用程序編程接口,所述核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口 ;創(chuàng)建第一和第二核心接口對象;創(chuàng)建第一語言適配器對象,其重定向調(diào)用到所述第一核心接口對象;創(chuàng)建以第二腳本語言編寫的語言構(gòu)造對象;創(chuàng)建第一核心適配器對象,其重定向由所述第一核心接口對象接收的調(diào)用到所述語言構(gòu)造對象;創(chuàng)建第二語言適配器對象,其返回到由所述語言構(gòu)造對象產(chǎn)生的結(jié)果到所述第二核心接口對象;以及創(chuàng)建第二核心適配器對象,其重定向由所述第二核心接口對象接收的返回結(jié)果到以所述第一腳本語目編寫的語目構(gòu)造對象。對語言構(gòu)造做出調(diào)用的系統(tǒng),該調(diào)用以第一腳本語言編寫,而語言構(gòu)造以第二腳本語言編寫,所述系統(tǒng)包括核心應(yīng)用程序編程接口,其相對所述第一和第二腳本語言是語言中性的,所述核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口,以及處理器編程執(zhí)行下列操作作為對用戶命令的響應(yīng)創(chuàng)建第一和第二核心接口對象;創(chuàng)建第一語言適配器對象,其重定向調(diào)用到所述第一核心接口對象;創(chuàng)建以第二腳本語言編寫的語言構(gòu)造對象;創(chuàng)建第一核心適配器對象,其重定向由所述第一核心接口對象接收的調(diào)用到所述語言構(gòu)造對象;創(chuàng)建第二語言適配器對象,其返回由所述語言構(gòu)造對象產(chǎn)生的結(jié)果到所述第二核心接口對象;以及創(chuàng)建第二核心適配器對象,其重定向由所述第二核心接口對象接收的返回結(jié)果到以所述第一腳本語言編寫的語言構(gòu)造對象。本發(fā)明的其他方面公開和權(quán)利要求如下。


圖1示出用于當(dāng)Python用戶通過CoreAPI (核心應(yīng)用程序編程接口)的方式調(diào)用以領(lǐng)域特定語言(domain-specific language,即DSL)編寫的函數(shù)(名為DSLFunction)時的適配器模型示意圖。圖2示出根據(jù)一個實施例的代表面向?qū)ο蟠a的示意圖,面向?qū)ο蟠a便于在多種腳本語目之間的共孚語目構(gòu)造。下文中將參考附圖,其中不同附圖中類似部件以相同參考標(biāo)記表示。
具體實施例方式在隨后的詳細(xì)公開中,術(shù)語接口、類定義、類實例、應(yīng)用程序編程接口和適配器具有下列含義接口 相關(guān)方法的集合(僅是方法的特征,不是實施)。類定義在一起實施的一組方法。類定義可以實施一個或更多接口。該實施常常定義由實施方法封裝和操作的一些數(shù)據(jù)。類實例類定義可以多次實例化。類定義的每個實例稱為類實例。

應(yīng)用程序編程接口(API):—組接口和具有與那些接口和那些類相關(guān)的一組行為的類定義。適配器一種設(shè)計模型,其允許已有API使用不是API —部分的已有類定義。這通常在當(dāng)類定義與API中的一些接口或類名義上相同時執(zhí)行。適配器是符合已有API的新類定義。已有類定義(其不在API中)稱為被適配者。適配器包括被適配者和通過對被適配者的使用實施在已有API中的接口(或延伸在已有API中的類)。為了理解下文公開的方法,當(dāng)兩個腳本以相同語言編寫時,觀察他們之間是如何相互作用的。首先考慮以Python語言編寫的簡單腳本,其定義對兩個數(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---------------這個腳本運行結(jié)果是打印出的3+4=7本公開采納Python語法并在下文中將在其自有文件中編寫的每個腳本稱為“模塊”。Python輸入語句允許一個模塊訪問以另一個模塊編寫的函數(shù)。因此,在這種情況下,useExample. py模塊輸入example, py模塊,并從那個模塊中獲得稱為“add”的函數(shù)。然后通過將數(shù)值3和4相加而使用該函數(shù)。需要注意的是輸入語句正搜尋在“example”中的“add”并執(zhí)行,其在Python路徑中的目錄搜尋名為“example, py”文件(以及.pyo,. pyc等),運行“example, py”,這導(dǎo)致模塊對象的生成,然后其在模塊中查找名為“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ù),雙精度,字符,短的,浮點,字節(jié)和語言特定構(gòu)造)字符串列表詞典(有時候稱為映射)集合(通常以詞典關(guān)鍵碼實施,僅適用于一些語言)多兀組(固定列表,僅適用于一些語言)陣列語言類型函數(shù)類定義類實例方法(S卩,類實例的方法)模塊本文公開的方法使用戶能夠在不同語言之間共享這些構(gòu)造類型中的每個。為了做到這點,首先定義相對多種腳本語言中的每種是語言中性的API (以Java編寫)。該API包括用于每個數(shù)據(jù)類型和每種語言類型(即,用于每種語言構(gòu)造類型)的一個接口。這些語言構(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.... 本文公開的方法是實施和利用核心(Core)接口的適配器模型的擴展使用。對于每種語言,需要為每種類型語言構(gòu)造實施兩個適配器。考慮由計算機用戶對涉及特定類型語言構(gòu)造和特定腳本語言的Core做出調(diào)用的情形。計算機編程將在特定腳本語言應(yīng)用程序編程接口(API)中具有可用的語言構(gòu)造類型實施并且在Core API中具有該類型的接口。兩個適配器中的第一個包裝特定腳本語言的語言構(gòu)造類型實施,以便第一適配器符合Core API并且利用語言實施。第二適配器做的相反并且包裝那種語言構(gòu)造類型Core接口,以便其符合該特定腳本語言API,但是利用Core接口的實例。更為具體地,對于每種類型語言構(gòu)造,可以采用已有語言類定義和相應(yīng)已有Core接口,然后編寫實施Core接口(下文中稱為核心適配器(Core Adapter))和其他適配器的新類定義,允許用于那種語言構(gòu)造類型的Core接口被用于該語言實施的API (下文中稱為語言適配器(Language Adapter))。例如,考慮Jython語言并考慮函數(shù)(Function)類型。Jython語言實施的API實施具有稱為PyFunction的類定義。用戶需要編寫CoreAdapter,其實施CoreFunction接口并重定向?qū)ζ渥龀龅姆椒ㄕ{(diào)用到PyFunction中的方法調(diào)用。用戶還需要編寫LanguageAdapter,其仿真Python Function并且重定向所有調(diào)用到被包裝的CoreFunction。圖1示出用于Python用戶調(diào)用以領(lǐng)域特定語言編寫函數(shù)14 (稱為DSLFunction)時的適配器模型。Python解譯程序(interpreter)確定應(yīng)當(dāng)做出調(diào)用。其在是LanguageAdapter的PyWrappedFunction 10中執(zhí)行該調(diào)用,并且重定向該調(diào)用到在這種情況下是CoreFunctionFromDSL 實施的 CoreFunction 接口 12,這個 CoreFunctionFromDSL 實施 12是重定向該調(diào)用到DSLFunction的CoreAdapter。DSLFunction是領(lǐng)域特定語言實施的一部分并且知道如何內(nèi)部解析該方法。例如,這里是文本文件中如何定義DSL函數(shù) ---------------------------function add(a as double, b as double)
return a+bend function -----------------------------------------DSL解譯程序?qū)⒔庾g該文本并創(chuàng)建DSL函數(shù)實例。DSL函數(shù)通??梢詮南裣旅孢@樣的DSL語言中調(diào)用 ----------------c=add (1. O, 2. O) ----------------DSL解譯程序?qū)⑼ㄟ^查詢名為“add”的已有DSL Function實例來解譯上述文本。其導(dǎo)入DSL Function實例兩個輸入(1. O和2. O)。DSLFunction實例知道在內(nèi)部如何“解析該函數(shù)”。其將執(zhí)行“a+b”,在此例中是“1. 0+2. O”并返回輸出,3. O。因此,當(dāng)從Python調(diào)用這個相同函數(shù)時,該系統(tǒng)從Py對象轉(zhuǎn)換到Core對象,然后從Core對象轉(zhuǎn)換到DSL對象,然后調(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ù)的錯誤,并在錯誤消 息中產(chǎn)生有意義的棧追蹤。(這允許語言間的追溯。)
PyObject result = pycallable.—call—( pyargs );return jython AdaptorFactory.//Y;/w,/v7/ o/ ( result)
}
Core Adapter讓Core函數(shù)偽裝成Python函數(shù)。為了實施每個適配器,用戶 需要基于另一個API的已有對象,能夠創(chuàng)建用于一個API的適配器。為了支持該方法,每種腳本語言必須以兩個方法實施AdapterFactory類。一個方法將用于Core API的對象轉(zhuǎn)換到Language API并且另一個方法將Language API對象轉(zhuǎn)換到Core API。工廠可以創(chuàng)建適配器的新實例或可以利用緩存,以便其能夠再用適配器。需要注意Python函數(shù)包裝到Core函數(shù)然后需要轉(zhuǎn)換返回到Python語言API的情況。在這種情況下,不想創(chuàng)建適配器,但是取而代之的是應(yīng)當(dāng)檢索底層Python函數(shù)并返回。詳細(xì)闡述圖1所示的情形,DSL函數(shù)將DSL對象作為輸入并且將DSL對象作為輸出返回。Core函數(shù)將Core對象作為輸入并將Core對象作為輸出返回。Python函數(shù)將Python對象作為輸入并將Python對象作為輸出返回。對于調(diào)用DSL函數(shù)的Python,我們需要適配Core函數(shù)的Python函數(shù),其中Core函數(shù)適配DSL函數(shù)。因此,Python函數(shù)將Py對象作為輸入。這些Py對象轉(zhuǎn)換為Core對象,并且Core函數(shù)以那些Core對象輸入調(diào)用。這個Core函數(shù)將Core對象作為輸入并且將他們轉(zhuǎn)換為DSL對象輸入,并且調(diào)用“真正的”DSL函數(shù)。DSL對象作為結(jié)果被返回。適配DSL函數(shù)的Core函數(shù)將那個返回的DSL對象轉(zhuǎn)換為Core對象并且返回Core對象。最終,Python函數(shù)獲得返回的Core對象并將其轉(zhuǎn)換為Python對象。正如本文所使用的,“轉(zhuǎn)換”意為AdapterFactory被調(diào)用,以便能夠創(chuàng)建或檢索正確的適配器。應(yīng)當(dāng)理解,Core接口不局限于如圖1所示的、將DSL對象轉(zhuǎn)換為Python對象和將Python對象轉(zhuǎn)換為DSL對象,而是能夠擴展到包括便于以其他腳本語言編寫對象共享的Core接口。圖2示出能夠擴展的便于以三種不同腳本語言Jython、JRuby和領(lǐng)域特定語言編寫的語言構(gòu)造共享的類CoreObject示意圖。根據(jù)圖2示出的方案,Core API (類CoreObject及其擴展)使得Jython用戶能夠訪問以JRuby或DSL編寫的語言構(gòu)造;使得JRuby用戶能夠訪問以Jython或DSL編寫的語言構(gòu)造;以及使得DSL用戶能夠訪問以Jython或JRuby編寫的語言構(gòu)造。例如,為了使Jython用戶能夠訪問以DSL編寫的語言構(gòu)造,JythonLanguageAdaptor (Jython 語言適配器)的第一實例(由 Jython-CoreAdaptorFactory (Jython 核心適配器工廠)24創(chuàng)建或檢索)將Py0bjectl6的第一實例轉(zhuǎn)換為CoreObject 18的第一實例;隨后,DSL-CoreAdaptor (由 DSL-Core AdaptorFactory (DSL 核心適配器工廠)26 創(chuàng)建或檢索)的第一實例將CoreObject 18的第一實例轉(zhuǎn)換為DSLObject20的第一實例。隨后,DSL Language Adaptor (DSL 語言適配器)的第一實例(由 DSL-Core AdaptorFactory26創(chuàng)建或檢索)將DSL0bject20的第二實例轉(zhuǎn)換為CoreObject 18的第二實例;其后,Jython-CoreAdaptor 的第一實例(由 Jython-Core AdaptorFactory 24 創(chuàng)建或檢索)將CoreObject 18的第二實例轉(zhuǎn)換為PyObject 16的第二實例。類似地,為了使JRuby用戶能夠訪問以DSL編寫的語言構(gòu)造,JRuby LanguageAdaptor (JRuby 語言適配器)的第一實例(由 JRuby-Core AdaptorFactory (JRuby 核心適配器工廠)28創(chuàng)建或檢索)將RubyObject 22的第一實例轉(zhuǎn)換為CoreObject 18的第三實例;然后,DSL-Core Adaptor (由 DSL-Core AdaptorFactory 26 創(chuàng)建或檢索)的第二實例將CoreObject 18的第三實例轉(zhuǎn)換為DSLObject 20的第三實例。隨后,DSL LanguageAdaptor 的第二實例(由 DSL-Core AdaptorFactory26 創(chuàng)建或檢索)將 DSLObject 20 的第四實例轉(zhuǎn)換為CoreObject 18的第四實例;并且然后,JRuby-Core Adaptor的第一實例(由JRuby-CoreAdaptorFactory 28創(chuàng)建或檢索)將CoreObject 18的第四實例轉(zhuǎn)換為RubyObject 22 的第二實例。以類似的方式,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的公共接口繼承。一些語言對大小寫敏感而其他語言不是。因此,Dictionary andClass Instances的接口不由String做檢查。相反,對單獨的接口實施檢查,定義稱為CoreKey的關(guān)鍵碼。該實施例包括對大小寫敏感的CoreKey的實施而其他實施對大小寫不敏感。為了使上述系統(tǒng)可行,每種語言必須支持導(dǎo)入鉤(import hook)的概念。術(shù)語導(dǎo)入鉤來自Python群體并且是重定義當(dāng)執(zhí)行導(dǎo)入時被調(diào)用函數(shù)的機制。導(dǎo)入函數(shù)需要被強化,以便其能夠處理以其他語言編寫的模塊。常用慣例是使用文件名的擴展名以確定應(yīng)當(dāng)用以解譯該文件的語言。一旦文件被解譯,應(yīng)當(dāng)產(chǎn)生文件內(nèi)容的一些模塊(Module)或詞典(Dictionary)表示。然后使用該表示創(chuàng)建能夠包裝到模塊內(nèi)的CoreModuleAdaptor。需要注意的是若目標(biāo)語言不支持導(dǎo)入鉤,那么,總體機制仍然將正確工作,但需要調(diào)用腳本的一些修改,以便做出導(dǎo)入腳本的函數(shù)調(diào)用而不是更多自然導(dǎo)入語句。還需要注意的是一些語言高速緩存導(dǎo)入的模塊以便他們不必再次解譯(而且,類定義不必再定義)。當(dāng)在一種語言出現(xiàn)導(dǎo)入時,實施例的實施器需要很小心地將被導(dǎo)入模塊高速緩存到支持語言中的每種。上述方法通過允許工程師輕松共享他們的分析代碼而提供了成本節(jié)約。以不同語言編寫的不同應(yīng)用軟件能夠快速整合。還有一個成本節(jié)約是工程師能夠以他們感覺舒服的語言編寫代碼。他們不需要花費時間培訓(xùn)新語言。這也避免了成本支出。通過更輕松共享代碼,有重復(fù)使用代碼的更好機會。雖然已經(jīng)通過參考不同實施例對本發(fā)明進行了描述,本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,在不偏離本發(fā)明范圍的前提下,可以對其中的元素做出各種改變或以等價物替換。另夕卜,在不偏離本發(fā)明基本范圍的前提下,可以做出許多修改以適應(yīng)本發(fā)明教導(dǎo)的特殊情形。因此,本發(fā)明不限于已經(jīng)公開的、擬作為本發(fā)明最佳實現(xiàn)模式的特定實施例。本文闡述的方法不應(yīng)解釋為要求本發(fā)明以列舉的順序執(zhí)行操作。
權(quán)利要求
1.一種在不同腳本語言之間共享語言構(gòu)造的方法,所述方法包括 (a)定義相對多種腳本語言是語言中性的核心應(yīng)用程序編程接口,所述核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口; (b)調(diào)用以第一腳本語言編寫的第一類型語言構(gòu)造,所述調(diào)用由以第二腳本語言編寫的所述第一類型語言構(gòu)造做出; (c)創(chuàng)建處理所述第一類型語言構(gòu)造的第一核心接口的第一實例; Cd)重定向所述調(diào)用到所述第一核心接口的所述第一實例;以及 (e)重定向由所述第一核心接口的所述第一實例接收的所述調(diào)用到以所述第一腳本語言編寫的所述第一類型的所述語言構(gòu)造。
2.根據(jù)權(quán)利要求1所述的方法,其進一步包括 創(chuàng)建第一語言適配器的實例;以及 創(chuàng)建第一核心適配器的實例, 其中,操作(d)由所述第一語言適配器的所述實例實施,以及操作(e)由所述第一核心適配器的所述實例實施。
3.根據(jù)權(quán)利要求2所述的方法,其進一步包括 (f)創(chuàng)建以所述第一腳本語言編寫的所述第一類型的所述語言構(gòu)造的實例以響應(yīng)所述調(diào)用; (g)返回以所述第一腳本語言編寫的所述第一類型的所述語言構(gòu)造的所述實例的結(jié)果; (h)創(chuàng)建所述第一核心接口的第二實例; (i)重定向返回的結(jié)果到所述第一核心接口的所述第二實例;以及 (j )重定向由所述第一核心接口的所述第二實例接收的返回結(jié)果到以所述第二腳本語言編寫的所述第一類型的所述語言構(gòu)造。
4.根據(jù)權(quán)利要求3所述的方法,其進一步包括 創(chuàng)建第二語言適配器的實例,以及 創(chuàng)建第二核心適配器的實例。
其中操作(i)由所述第二語言適配器的所述實例實施,以及操作(j)由所述第二核心適配器的所述實例實施。
5.根據(jù)權(quán)利要求1、2、3或4所述的方法,其中所述第一類型語言構(gòu)造從下列類型集合中選擇原語,字符串,列表,詞典,數(shù)組,多元組,陣列,函數(shù),類定義,類實例,方法和模塊。
6.根據(jù)權(quán)利要求1、2、3或4所述的方法,其中所述第一和第二腳本語言是基于Java的。
7.根據(jù)權(quán)利要求4、5或6所述的方法,其進一步包括 (k)調(diào)用以第三腳本語言編寫的第二類型的語言構(gòu)造,該調(diào)用由以所述第二腳本語言編寫的所述第二類型的語言構(gòu)造做出; (I)創(chuàng)建用于處理所述第二類型的語言構(gòu)造的第二核心接口的第一實例; Cm)重定向所述調(diào)用到所述第二核心接口的所述第一實例;以及(η)重定向由所述第二核心接口的所述第一實例接收的調(diào)用到以所述第三腳本語言編寫所述第二類型的所述語言構(gòu)造。
8.根據(jù)權(quán)利要求4、5、6或7所述的方法,其進一步包括 創(chuàng)建第三語言適配器的實例;以及 創(chuàng)建第三核心適配器的實例, 其中,操作(m)由所述第三語言適配器的所述實例實施;以及操作(η)由所述第三核心適配器的所述實例實施。
9.根據(jù)權(quán)利要求4、5、6、7或8所述的方法,其進一步包括 (O)創(chuàng)建以所述第三腳本語言編寫的所述第二類型的所述語言構(gòu)造的實例以響應(yīng)所述調(diào)用; (P)返回以所述第三腳本語言編寫的所述第二類型的所述語言構(gòu)造所述實例的結(jié)果; (q)創(chuàng)建所述第二核心接口的第二實例; Cr)重定向返回的結(jié)果到所述第二核心接口的所述第二實例;以及 (S)重定向由所述第二核心接口的所述第二實例接收的返回結(jié)果到以所述第二腳本語言編寫的所述第二類型的所述語言構(gòu)造。
10.根據(jù)權(quán)利要求9所述的方法,其進一步包括 創(chuàng)建第四語言適配器的實例;以及 創(chuàng)建第四核心適配器的實例, 其中,操作(r)由所述第四語言適配器的所述實例實施;以及操作(s)由所述第四核心適配器的所述實例實施。
11.一種使語言構(gòu)造能夠在不同腳本語言之間共享的系統(tǒng),所述系統(tǒng)包括相對多種腳本語言是語言中性的核心應(yīng)用程序編程接口和處理器,所述核心應(yīng)用程序編程接口包括多種類型語言構(gòu)造中每種的相應(yīng)核心接口,所述處理器被編程為執(zhí)行下列操作 Ca)調(diào)用以第一腳本語言編寫的第一類型語言構(gòu)造,所述調(diào)用由以第二腳本語言編寫的所述第一類型語言構(gòu)造做出; (b)創(chuàng)建處理所述第一類型語言構(gòu)造的第一核心接口的第一實例; (c)重定向所述調(diào)用到所述第一核心接口的所述第一實例;以及 (d)重定向由所述第一核心接口的所述第一實例接收的所述調(diào)用到以所述第一腳本語言編寫的所述第一類型的所述語言構(gòu)造。
12.根據(jù)權(quán)利要求11所述的系統(tǒng),其中所述處理器進一步被編程為執(zhí)行下列操作 創(chuàng)建第一語言適配器的實例;以及 創(chuàng)建第一核心適配器的實例, 其中,操作(c)由所述第一語言適配器的所述實例實施,以及操作(d)由所述第一核心適配器的所述實例實施。
13.根據(jù)權(quán)利要求12所述的系統(tǒng),其中所述處理器進一步被編程為執(zhí)行下列操作 (e)創(chuàng)建以所述第一腳本語言編寫的所述第一類型的所述語言構(gòu)造的實例以響應(yīng)所述調(diào)用; Cf)返回以所述第一腳本語言編寫的所述第一類型所述語言構(gòu)造所述實例的結(jié)果; (g)創(chuàng)建所述第一核心接口的第二實例; (h)重定向返回的結(jié)果到所述第一核心接口的所述第二實例;以及 (j)重定向由所述第一核心接口的所述第二實例接收的返回結(jié)果到以所述第二腳本語言編寫的所述第一類型的所述語言構(gòu)造。
14.根據(jù)權(quán)利要求13所述的系統(tǒng),其中所述處理器進一步被編程為執(zhí)行下列操作 創(chuàng)建第二語言適配器的實例,以及 創(chuàng)建第二核心適配器的實例。
其中操作(h)由所述第二語言適配器的所述實例實施,以及操作(i)由所述第二核心適配器的所述實例實施。
15.根據(jù)權(quán)利要求14所述的系統(tǒng),其中所述處理器進一步被編程為執(zhí)行下列操作 (j)調(diào)用以第三腳本語言編寫的第二類型的語言構(gòu)造,該調(diào)用由以所述第二腳本語言編寫的所述第二類型的語言構(gòu)造做出; (k)創(chuàng)建用于處理所述第二類型的語言構(gòu)造的第二核心接口的第一實例; (I)重定向所述調(diào)用到所述第二核心接口的所述第一實例;以及(m)重定向由所述第二核心接口的所述第一實例接收的調(diào)用到以所述第三腳本語言編寫所述第二類型的所述語言構(gòu)造。
全文摘要
本發(fā)明提供了一種系統(tǒng)和方法,其使得用戶能夠以第一腳本語言編寫腳本代碼,然后使用第二腳本語言調(diào)用以第一腳本語言編寫的語言構(gòu)造。函數(shù),類定義,類實例,模塊和其他語言構(gòu)造被作為能夠在不同腳本語言之間共享的第一類對象。本發(fā)明的技術(shù)也適用于領(lǐng)域特定語言。作為本方法的一部分,這些對象類型的每個的相應(yīng)底層表示被設(shè)計為接口,然后該接口在每種腳本語言中實施。另外,以每種腳本語言實施編寫的代碼允許后來者使用表示函數(shù)、類或其他語言構(gòu)造的該接口。
文檔編號G06F9/45GK103064721SQ20121040629
公開日2013年4月24日 申請日期2012年10月23日 優(yōu)先權(quán)日2011年10月24日
發(fā)明者P·Z·圖納曼, S·L·雷 申請人:波音公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1