專利名稱:Cobol到java代碼翻譯中面向對象翻譯的方法
技術領域:
本發(fā)明涉及計算機領域的源-源高級語言代碼翻譯技術,尤其涉及對COBOL面向對象翻譯的方法。
背景技術:
編譯是計算機領域的關鍵技術,源-源高級語言翻譯是編譯的一個重要研究方向,傳統(tǒng)的COBOL語言到現(xiàn)代的Java語言的代碼翻譯則是這個方向的典型的研究對象。
源-源高級語言翻譯目前正在成為解決軟件移植問題的一個研究熱點。傳統(tǒng)語言(如COBOL,F(xiàn)ORTRAN等)從誕生到現(xiàn)在已有近50年的歷史。目前在銀行、證券和保險等行業(yè)中已有的大量成熟的商用與科學計算程序是采用這些傳統(tǒng)語言編寫的。由于現(xiàn)代語言(如C/C++,JAVA等)以其優(yōu)越性替代了傳統(tǒng)語言,很少有軟件從業(yè)人員去學習和使用傳統(tǒng)語言,因此用這些語言編寫的程序就成為了遺產代碼。遺產代碼會導致了一系列的問題,突出的問題包括遺產代碼的維護、遺產軟件的集成和遺產軟件的跨平臺遷移等。因此,尋求一種將遺產代碼轉化為現(xiàn)代語言編寫的代碼的技術,是實現(xiàn)遺產代碼遷移、使舊代碼煥發(fā)新活力的一項很有意義的嘗試。目前,許多研究機構和組織都開展了這方面的研究。
在實現(xiàn)COBOL到JAVA的源-源高級語言代碼翻譯的過程中,最基本的問題是如何保證源語言程序與翻譯成的目標語言程序在語義上的等價性。面向對象編程(OOP)是現(xiàn)代語言中非常流行的編程模式,COBOL 2000標準中也引入了面向對象(OO)特性,在傳統(tǒng)的COBOL語言結構基礎上擴充了支持面向對象編程(OOP)結構。但由于這些擴充的OOP結構兼顧了傳統(tǒng)語言結構,致使面向對象COBOL與目前流行的支持面向對象的語言(如JAVA)在語法和語義上存在著很大的不同。這就給面向對象COBOL的翻譯帶來了很大的難度。
一般而言,用COBOL語言編寫的一個程序可以翻譯成JAVA語言中的一個類,兩者在功能上是等價的。如圖1所示,COBOL程序結構與JAVA類結構存在對應關系。
面向對象COBOL中類的語言結構是在傳統(tǒng)COBOL語言結構的基礎上擴充而來的,其中的類(CLASS)、類對象(CLASS-OBJECT)、對象(OBJECT)和方法(METHOD)都對應于傳統(tǒng)COBOL中的一個程序,而且這些程序之間存在著嵌套關系。
面向對象COBOL中的語法是基于傳統(tǒng)COBOL語法的,所以翻譯傳統(tǒng)COBOL的方法完全可以作為翻譯面向對象COBOL的基礎。面向對象COBOL中的類、類對象、對象和方法在語法上都對應于傳統(tǒng)COBOL中的一個程序,翻譯成JAVA后就對應多個JAVA類,而且這些類之間的嵌套關系和相應COBOL程序之間的嵌套關系是一致的。如圖2所示,面向對象COBOL類與JAVA類之間存在對應關系。
由上述的語言結構可知,面向對象COBOL和JAVA的語言結構有很大的不同,面向對象COBOL中的一個類翻譯成JAVA后,對應著一組逐級嵌套的類。因此,若要利用JAVA語言中類的特性來表達面向對象COBOL中的類的特性時,必須使兩者在數(shù)據(jù)和操作方面實現(xiàn)語義上的等價。但根據(jù)COBOL和JAVA的語法和語義規(guī)則,兩者在數(shù)據(jù)和操作上都存在著很大的不同,下面分別描述之。
在數(shù)據(jù)方面面向對象COBOL中的一個類包含類數(shù)據(jù)和實例數(shù)據(jù)。類數(shù)據(jù)的內存空間是在類裝載時動態(tài)分配的,實例數(shù)據(jù)的內存空間是在實例創(chuàng)建時動態(tài)分配的。相對于一個面向對象COBOL類而言,類數(shù)據(jù)在內存中只存在一份,而實例數(shù)據(jù)則存在有多份,有多少個對象實例,實例數(shù)據(jù)就有多少份。JAVA中的一個類中包含類靜態(tài)數(shù)據(jù)和實例數(shù)據(jù)。類靜態(tài)數(shù)據(jù)的空間是在編譯期間確定的,實例數(shù)據(jù)的內存空間是在實例創(chuàng)建時動態(tài)分配的。相對于一個類而言,類靜態(tài)數(shù)據(jù)在內存中只存在一份,而實例數(shù)據(jù)則存在有多份,有多少個對象實例,實例數(shù)據(jù)就有多少份。
面向對象COBOL和JAVA在數(shù)據(jù)方面的最大區(qū)別體現(xiàn)在類數(shù)據(jù)繼承方面。在面向對象COBOL中,子類會繼承父類的類數(shù)據(jù),但繼承的類數(shù)據(jù)在內存空間上是父類類數(shù)據(jù)的一個副本,獨立于父類類數(shù)據(jù)內存空間。也就是說,子類的類方法在操作從父類繼承來的類數(shù)據(jù)時,受影響的只是子類中的副本,而父類中的相應類數(shù)據(jù)是不受影響的。在JAVA中,類靜態(tài)數(shù)據(jù)在內存空間上只存在一份,即便被子類繼承也不會在子類的類靜態(tài)數(shù)據(jù)空間中建立父類類靜態(tài)數(shù)據(jù)的副本,類靜態(tài)數(shù)據(jù)體現(xiàn)著全局共享的特性。COBOL和JAVA在類數(shù)據(jù)繼承方面的區(qū)別可參見圖3和圖4。在圖3中可見,對于COBOL類,當CLASS B繼承CLASS A后,CLASS A的類數(shù)據(jù)也包含在CLASS B中,而在圖4中可見,對于JAVA類,當CLASS B繼承CLASSA后,CLASS A的類數(shù)據(jù)并不包含在CLASS B中。
而面向對象COBOL和JAVA對實例數(shù)據(jù)的處理方式則是相同的,當創(chuàng)建一個類的實例時,會為該實例動態(tài)分配實例數(shù)據(jù)空間,這個空間在各個實例之間以及父類與子類之間是完全獨立的。圖3和圖4對COBOL類和JAVA類對實例數(shù)據(jù)的處理進行了說明,在圖中,實例數(shù)據(jù)在父類和子類間是獨立的。
在操作方面,面向對象COBOL和JAVA的主要區(qū)別體現(xiàn)在被操作的數(shù)據(jù)和被執(zhí)行的方法方面。
被操作的數(shù)據(jù)方面,在面向對象COBOL中,類方法只能操作當前類對象的類數(shù)據(jù),此處所述的當前類對象指的是接受到操作消息的類對象,而不是被執(zhí)行的操作方法所在的類的類對象。實例方法只能操作當前實例對象的數(shù)據(jù),當前實例對象指的是接受到操作消息的實例對象。類方法是不能操作實例數(shù)據(jù)的,實例方法只能通過類方法的調用間接操作類數(shù)據(jù)。在JAVA中,類靜態(tài)方法只能操作類靜態(tài)數(shù)據(jù),實例方法則可以直接操作類靜態(tài)數(shù)據(jù)和實例數(shù)據(jù)。
被執(zhí)行的方法方面,面向對象COBOL和JAVA異同點體現(xiàn)在類方法的定位上。在面向對象COBOL中,類方法的定位是動態(tài)的,即在運行期間確定被執(zhí)行的方法,方法定位的起點是當前類對象,因此能做到子類對父類方法的重寫。在JAVA中,類方法的定位是靜態(tài)的,即在編譯期間確定被執(zhí)行的方法,沒有當前類對象的概念,因此無法實現(xiàn)子類對父類方法的重寫。在實例方法方面,這兩種語言的定位均采用動態(tài)機制,基本上是相同的。
COBOL語言和JAVA語言的上述差異給翻譯帶來了困難,要實現(xiàn)COBOL到JAVA面向對象的翻譯就必須要解決上述兩種語言之間的差異。
解決語言差異的方法總體上有兩種,一是為目標代碼編寫一個面向對象的JAVA運行時系統(tǒng)(簡稱OORTS),完全由該系統(tǒng)來負責對象的創(chuàng)建與銷毀、數(shù)據(jù)空間的分配與釋放和操作方法的定位等。在把COBOL的類翻譯成相應JAVA類后,這些JAVA類完全在OORTS的控制下執(zhí)行,以便在數(shù)據(jù)和操作兩方面模擬出和面向對象COBOL相同的語義。這種方法的優(yōu)點是OORTS可以精確地控制對象的行為,使其符合COBOL語義,缺點是編寫OORTS的負擔過重,OORTS的運行開銷過大,運行效率不高,也沒有充分利用JAVA語言自身面向對象的機制。
第二種方法是通過翻譯來解決兩種語言之間的差異,充分利用JAVA語言自身的面向對象機制來模擬COBOL對象的行為,使之有較高的運行效率。
發(fā)明內容
本發(fā)明的目的是克服COBOL語言和JAVA語言的差異給翻譯帶來的困難,提供一種具有較高運行效率的面向對象翻譯方法。
為了實現(xiàn)上述目的,本發(fā)明提供了一種COBOL到JAVA代碼翻譯中面向對象翻譯的方法,包含以下步驟步驟1)、定義一個類數(shù)據(jù)的抽象封裝類,所述抽象封裝類是所有類數(shù)據(jù)封裝類的根類,用來實現(xiàn)公共的類數(shù)據(jù)行為;步驟2)、按照翻譯傳統(tǒng)COBOL程序的方法把COBOL類語法元素類、類對象、對象、方法翻譯成相應的JAVA類,所述JAVA類之間的嵌套關系與COBOL類語法元素之間的嵌套關系保持一致,與COBOL中的類相對應的JAVA類是JAVA中一組逐級嵌套的類的最外層的一個類,該類被稱為類體;步驟3)、為步驟2)得到的類體定義一個類接口,該類接口中包含了類數(shù)據(jù)封裝類的定義、類數(shù)據(jù)對象和實例數(shù)據(jù)的定義以及所有的類方法和實例方法的接口方法的定義,類接口之間的繼承關系體現(xiàn)了COBOL中的類之間的繼承關系;步驟4)、翻譯類使用語句,將COBOL類方法的調用語句翻譯為對步驟3)得到的類接口中相應方法的調用,同時為其傳遞當前類的類數(shù)據(jù)對象的引用,對于COBOL實例方法調用語句,將實例方法的調用語句翻譯為對步驟3)得到的類接口中相應方法的調用。
上述技術方案中,所述的類體包含以下內容a、類方法COBOL中的類方法在類體中對應一個子程序,在所述子程序的入口方法中除原有形參外,另定義一個類型為類數(shù)據(jù)抽象封裝類的形參,所述形參用來傳遞當前類數(shù)據(jù)對象的引用;b、實例方法實例方法在類體中對應著一個子程序,在所述子程序的入口方法中除原有形參外,另定義一個類接口類的形參,所述形參用來傳遞當前實例對象的引用。
上述技術方案中,所述的類接口中,對類數(shù)據(jù)、類方法、實例數(shù)據(jù)、實例方法的操作如下
A類數(shù)據(jù)將COBOL的類數(shù)據(jù)封裝在一個類中,此封裝類中的類數(shù)據(jù)之間維持原有的類數(shù)據(jù)繼承關系;將類數(shù)據(jù)封裝類的定義嵌入在類接口的定義中,類接口中再定義一個類型為封裝類的私有靜態(tài)成員變量,作為類數(shù)據(jù)的訪問入口;B類方法為每一個類方法在類接口中定義一個接口方法,接口方法中除原有形參外另定義一個類型為類數(shù)據(jù)抽象封裝類的形參,所述形參用來傳遞當前類對象的類數(shù)據(jù),所述接口方法通過調用類體中相應的方法實現(xiàn);C實例數(shù)據(jù)將COBOL類中的每一項實例數(shù)據(jù)映射為類接口的一個實例成員變量;D實例方法將COBOL類中的每一個實例方法映射為類接口的一個實例接口方法,所述接口方法通過調用類體中相應的方法實現(xiàn)。
本發(fā)明提出的方法通過翻譯解決了源語言與目標語言在面向對象語法語義方面存在的差異問題,同時也兼顧了目標語言與源語言之間的相似性,充分利用了目標語言的面向對象的機制等價模擬了源語言的語義,具有較好的運行效率。
圖1為COBOL程序到JAVA類翻譯的語言結構轉換圖;圖2為COBOL類到JAVA類翻譯的語言結構轉換圖;圖3為COBOL中類數(shù)據(jù)和實例數(shù)據(jù)的繼承關系示意圖;圖4為JAVA中類靜態(tài)數(shù)據(jù)和實例數(shù)據(jù)的繼承關系示意圖;圖5為COBOL類翻譯后對應的JAVA代碼;圖6為實施例中的ClassA的COBOL源碼和翻譯后的JAVA源碼;圖7為實施例中的ClassB的COBOL源碼和翻譯后的JAVA源碼;圖8為實施例中的Client程序的COBOL源碼和翻譯后的JAVA源碼;圖9為ClassA和ClassB在COBOL語言中的內容結構圖;圖10為ClassA的類體的內容結構以及該類體與ClassA內容結構之間的對應關系;圖11為ClassA的JAVA類接口的內容結構以及該類接口與COBOL類ClassA內容結構之間的對應關系圖;圖12為Client程序的運行結果;圖13為本發(fā)明的COBOL到JAVA代碼翻譯中面向對象翻譯的方法的流程圖。
具體實施例方式
下面結合附圖和具體實施方式
對本發(fā)明的方法做進一步的說明。
步驟10、定義一個類數(shù)據(jù)的抽象封裝類,所述抽象封裝類是所有類數(shù)據(jù)封裝類的根類,用來實現(xiàn)公共的類數(shù)據(jù)行為,也方便了將類數(shù)據(jù)作為整體傳遞給類方法時參數(shù)類型的定義。抽象封裝類中定義一個用來存放當前類對象的類名的成員變量,以實現(xiàn)類方法的動態(tài)定位。
步驟20、按照翻譯傳統(tǒng)COBOL程序的方法把COBOL類語法元素類(CLASS)、類對象(CLASS-OBJECT)、對象(OBJECT)和方法(METHOD)翻譯成相應的JAVA類,而且使得這些JAVA類之間的嵌套關系與COBOL類語法元素之間的嵌套關系保持一致。COBOL類語法元素翻譯成JAVA類的過程是現(xiàn)有的成熟技術,在參考文獻1專利號為200410030988.2的中國專利《一種遺產代碼向現(xiàn)代語言變換過程中的控制流變換方法》,和參考文獻2公開號為CA2266297的歐洲專利《METHOD AND APPARATUS FORCOBOL TO JAVA TRANSLATION》中對該技術都有說明。
翻譯后的得到的JAVA類中,與COBOL中的類(CLASS)相對應的JAVA類是JAVA中一組逐級嵌套的類的最外層的一個類,該類被稱為類體。所述類體具有以下特點a、類數(shù)據(jù)類體中不包含COBOL類數(shù)據(jù)的翻譯。
b、實例數(shù)據(jù)類體中不包含COBOL實例數(shù)據(jù)的翻譯。
上述兩類COBOL數(shù)據(jù)轉換后對應的JAVA代碼不存放在類體中。
c、類方法COBOL中的類方法在類體中對應一個子程序,在其入口方法中除原有形參外另定義一個步驟10中所定義的類數(shù)據(jù)抽象封裝類的形參,該形參是必需的,用來傳遞當前類數(shù)據(jù)對象的引用。
d、實例方法實例方法在類體中對應著一個子程序,在其入口方法中除原有形參外另定義一個類接口類的形參,該形參是必需的,用來傳遞當前實例對象的引用。所述的類接口類在步驟30中會做進一步的描述。
本步驟充分利用了成熟的翻譯傳統(tǒng)COBOL程序的方法,也適應面向對象COBOL語言結構的要求。
步驟30、定義類接口。為類體定義一個類接口,該類接口中包含了類數(shù)據(jù)封裝類的定義、類數(shù)據(jù)對象和實例數(shù)據(jù)的定義以及所有的類方法和實例方法的接口方法的定義。類之間的繼承關系通過類接口之間的繼承關系來體現(xiàn)。這樣做可將類的數(shù)據(jù)和類的操作從類的實現(xiàn)中分離出來,避免了在復雜的類體上定義繼承關系。在類接口中,對類數(shù)據(jù)、類方法、實例數(shù)據(jù)、實例方法的操作如下。
A類數(shù)據(jù)將COBOL的類數(shù)據(jù)封裝在一個類中,此封裝類中的類數(shù)據(jù)之間維持原有的類數(shù)據(jù)繼承關系,根類的類數(shù)據(jù)封裝類的父類為步驟10中定義的類數(shù)據(jù)的抽象封裝類,其它類的類數(shù)據(jù)封裝類的父類為父類的類數(shù)據(jù)封裝類。類之間存在繼承關系,類數(shù)據(jù)封裝類之間的繼承關系和類數(shù)據(jù)所屬類之間的繼承關系是一致的,以此來維持類數(shù)據(jù)原有的繼承關系。
將類數(shù)據(jù)封裝類的定義嵌入在類接口的定義中,類接口中再定義一個類型為封裝類的私有靜態(tài)成員變量,作為類數(shù)據(jù)的訪問入口。這樣做就可以實現(xiàn)COBOL類數(shù)據(jù)在內存空間上的繼承特性。
B類方法為每一個類方法在類接口中定義一個接口方法,接口方法中除原有形參外另定義一個類型為步驟10中定義的類數(shù)據(jù)抽象封裝類的形參,該形參是必需的,用來傳遞當前類對象的類數(shù)據(jù)。接口方法功能的實現(xiàn)通過調用類體中相應的方法來實現(xiàn),調用時需傳遞接口方法的所有參數(shù)。
C實例數(shù)據(jù)因為COBOL實例數(shù)據(jù)的處理機制與JAVA是一致的,因此可以實現(xiàn)兩者之間的直接映射,具體來說就是將COBOL類中的每一項實例數(shù)據(jù)映射為類接口的一個實例成員變量,這樣就充分利用了兩種語言之間的相似性。
D實例方法因為COBOL實例方法的處理機制與JAVA是一致的,因此可以實現(xiàn)兩者之間的直接映射,具體來說就是將COBOL類中的每一個實例方法映射為類接口的一個實例接口方法,這樣就充分利用了兩種語言之間的相似性。實例接口方法功能的實現(xiàn)通過調用類體中相應的方法來實現(xiàn),調用時需傳遞接口方法的所有原有形參和當前實例對象的引用。
步驟40、翻譯類使用語句。在面向對象COBOL中,類使用語句包括類方法調用語句和實例方法調用語句,對類數(shù)據(jù)和實例數(shù)據(jù)的操作都是通過對類方法和實例方法的調用進行的。對于類方法調用語句,將類方法的調用語句翻譯為對步驟30得到的類接口中相應方法的調用,同時為其傳遞當前類的類數(shù)據(jù)對象的引用,這樣就可以保證類方法操作的是當前類對象的數(shù)據(jù)空間。對于實例方法調用語句,將實例方法的調用語句翻譯為對類接口中相應方法的調用。
上述步驟描述了怎樣將COBOL類翻譯為JAVA代碼,COBOL類與JAVA代碼翻譯的示意圖可參見附圖5。
下面結合一個具體的實施例對本發(fā)明的方法進行說明。
在一個實施例中,有兩個類,分別為ClassA和ClassB,ClassA為ClassB的父類,另外還有一個使用ClassA和ClassB的客戶程序Client。
如圖6所示,ClassA中包含類數(shù)據(jù)classItemA,實例數(shù)據(jù)instanceItemA,類方法InitializeClass,AddClass,SubClass和DisplayClass,實例方法InitializeInstance,AddInstance,SubInstance和DisplayInstance。
如圖7所示,ClassB繼承自ClassA,在ClassA的基礎上新增類數(shù)據(jù)classItemB和實例數(shù)據(jù)instanceItemB。另外重載了ClassA的類方法InitializeClass,DisplayClass和AddClass,實例方法InitializeInstance,AddInstance和DisplayInstance。
圖8是對使用ClassA和ClassB的客戶程序Client所做的說明。
圖9反映了COBOL類ClassA和ClassB的內容結構。
在對程序進行翻譯時,首先,定義一個JAVA類數(shù)據(jù)的抽象封裝類ObjData,如下public abstract classObjData{public String className;
}其中的className用于確定當前類對象。
將COBOL類ClassA和ClassB依次翻譯成JAVA類體ClassABody和ClassBBody。以ClassA為例,ClassABody的內容結構以及與ClassA內容結構之間的對應關系如圖10所示。
然后為JAVA類體ClassABody和ClassBBody分別定義JAVA類接口ClassA和ClassB。以ClassA為例,JAVA類接口ClassA的內容結構以及與COBOL類ClassA內容結構之間的對應關系如圖11所示。
其中類接口中的ClassData為類數(shù)據(jù)封裝類,本例中ClassA.ClassData的父類為抽象封裝類ObjData,ClassB.ClassData的父類為ClassA.ClassData。
下面以ClassA的類方法“DisplayClass”為例演示一下類方法的翻譯。
COBOL類中,該方法的定義如下Method-ID."DisplayClass".
Procedure Division.
Display"ClassA.classData.ClassItemA="classItemA.
End Method"DisplayClass".
翻譯后的Java代碼中,類體中對應的代碼為public static class DisplayClass{public static void entry(ObjData objData){ClassA.ClassData classData=(ClassA.ClassData)objData;
System.out.println("ClassA.classData.ClassItemA="+classData.ClassItemA);
}}類接口中對應的代碼為public static void DisplayClass(ObjData objData){ClassABody.ClassObj.DisplayClass.entry(objData);
}下面以ClassA的實例方法“DisplayInstance”為例演示一下實例方法的翻譯。
COBOL類中,該方法的定義如下Method-ID."DisplayInstance".
Procedure Division.
Display"a.InstanceItemA="instanceItemA.
End Method"DisplayInstance".
翻譯后的Java代碼中,類體中對應的代碼為public static class DisplayInstance{public static void entry(ClassA a){System.out.println("a.InstanceItemA="+a.InstanceItemA);
}}類接口中對應的代碼為public void DisplayInstance(){ClassABody.InstanceObj.DisplayInstance.entry(this);
}客戶程序Client中有對ClassA類方法和實例方法的調用,翻譯結果舉例如下例如,有類方法的調用語句Invoke ClassA’DisplayClass’.
翻譯出的JAVA代碼ClassA.DisplayClass(ClassA.getClassData());其中ClassA.getClassData()返回的是ClassA類數(shù)據(jù)對象的引用。
對于類方法的調用語句Invoke ClassB’SubClass’.
翻譯出的JAVA代碼ClassB.SubClass(ClassB.getClassData());在對ClassB的翻譯過程中,在ClassB上調用類方法SubClass,最終執(zhí)行的是ClassA上的類方法SubClass,通過調用ClassB.getClassData()傳遞ClassB的類數(shù)據(jù)對象的引用給SubClass可以確保被操作的是ClassB的類對象數(shù)據(jù)。
再如,有實例方法的調用語句Invoke a’DisplayInstance’.
翻譯的JAVA代碼a.DisplayInstance();因為實例數(shù)據(jù)和實例方法在COBOL語言和JAVA語言中的處理機制是相同的,故不需要像處理類數(shù)據(jù)那樣傳遞實例數(shù)據(jù)。
完成上述翻譯過程后,分別運行客戶程序Client,可得到相同的運行結果,最終的運行結果可參見圖12。
權利要求
1.一種COBOL到JAVA代碼翻譯中面向對象翻譯的方法,包含以下步驟步驟1)、定義一個類數(shù)據(jù)的抽象封裝類,所述抽象封裝類是所有類數(shù)據(jù)封裝類的根類,用來實現(xiàn)公共的類數(shù)據(jù)行為;步驟2)、按照翻譯傳統(tǒng)COBOL程序的方法把COBOL類語法元素類、類對象、對象、方法翻譯成相應的JAVA類,所述JAVA類之間的嵌套關系與COBOL類語法元素之間的嵌套關系保持一致,與COBOL中的類相對應的JAVA類是JAVA中一組逐級嵌套的類的最外層的一個類,該類被稱為類體;步驟3)、為步驟2)得到的類體定義一個類接口,該類接口中包含了類數(shù)據(jù)封裝類的定義、類數(shù)據(jù)對象和實例數(shù)據(jù)的定義以及所有的類方法和實例方法的接口方法的定義,類接口之間的繼承關系體現(xiàn)了COBOL中的類之間的繼承關系;步驟4)、翻譯類使用語句,將COBOL類方法的調用語句翻譯為對步驟3)得到的類接口中相應方法的調用,同時為其傳遞當前類的類數(shù)據(jù)對象的引用,對于COBOL實例方法調用語句,將實例方法的調用語句翻譯為對步驟3)得到的類接口中相應方法的調用。
2.根據(jù)權利要求1所述的COBOL到JAVA代碼翻譯中面向對象翻譯的方法,其特征在于,所述的類體包含以下內容a、類方法COBOL中的類方法在類體中對應一個子程序,在所述子程序的入口方法中除原有形參外,另定義一個類型為類數(shù)據(jù)抽象封裝類的形參,所述形參用來傳遞當前類數(shù)據(jù)對象的引用;b、實例方法實例方法在類體中對應著一個子程序,在所述子程序的入口方法中除原有形參外,另定義一個類接口類的形參,所述形參用來傳遞當前實例對象的引用。
3.根據(jù)權利要求1所述的COBOL到JAVA代碼翻譯中面向對象翻譯的方法,其特征在于,所述的類接口中,對類數(shù)據(jù)、類方法、實例數(shù)據(jù)、實例方法的操作如下A類數(shù)據(jù)將COBOL的類數(shù)據(jù)封裝在一個類中,此封裝類中的類數(shù)據(jù)之間維持原有的類數(shù)據(jù)繼承關系;將類數(shù)據(jù)封裝類的定義嵌入在類接口的定義中,類接口中再定義一個類型為封裝類的私有靜態(tài)成員變量,作為類數(shù)據(jù)的訪問入口;B類方法為每一個類方法在類接口中定義一個接口方法,接口方法中除原有形參外另定義一個類型為類數(shù)據(jù)抽象封裝類的形參,所述形參用來傳遞當前類對象的類數(shù)據(jù),所述接口方法通過調用類體中相應的方法實現(xiàn);C實例數(shù)據(jù)將COBOL類中的每一項實例數(shù)據(jù)映射為類接口的一個實例成員變量;D實例方法將COBOL類中的每一個實例方法映射為類接口的一個實例接口方法,所述接口方法通過調用類體中相應的方法實現(xiàn)。
全文摘要
本發(fā)明公開了一種COBOL到JAVA代碼翻譯中面向對象翻譯的方法,包括定義一個類數(shù)據(jù)的抽象封裝類;定義類體,按照翻譯傳統(tǒng)COBOL程序的方法把COBOL類語法元素類、類對象、對象和方法翻譯成相應的JAVA類;為類體定義一個類接口,該類接口中包含了類數(shù)據(jù)封裝類的定義、類數(shù)據(jù)對象和實例數(shù)據(jù)的定義以及所有的類方法和實例方法的接口方法的定義,類接口之間的繼承關系體現(xiàn)了COBOL中的類之間的繼承關系;翻譯類使用語句,將類方法的調用語句翻譯為對類接口中相應方法的調用,對于實例方法調用語句,將實例方法的調用語句翻譯為對類接口中相應方法的調用。本方法充分利用了JAVA語言面向對象的機制,有較好的運行效率。
文檔編號G06F9/44GK1818861SQ20061000827
公開日2006年8月16日 申請日期2006年2月20日 優(yōu)先權日2006年2月20日
發(fā)明者唐生林, 吳曾, 武成崗, 崔慧敏, 張兆慶, 蘇靈燕, 王振江 申請人:中國科學院計算技術研究所