專利名稱::代碼轉(zhuǎn)換的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及可執(zhí)行代碼從一種語(yǔ)言到另一種語(yǔ)言的轉(zhuǎn)換。具體來(lái)說(shuō),本發(fā)明涉及代碼的自動(dòng)轉(zhuǎn)換。
背景技術(shù):
:遺留系統(tǒng)(legacysystem)是陳舊的計(jì)算機(jī)系統(tǒng)或通常包含以C0B0L、PL/I和其它古老的編程語(yǔ)言寫(xiě)成的幾十億行代碼的應(yīng)用程序。轉(zhuǎn)換涉及將遺留的應(yīng)用程序源代碼轉(zhuǎn)換為現(xiàn)代語(yǔ)言的進(jìn)程,例如將應(yīng)用程序從COBOL轉(zhuǎn)換到J2EE上的Java,或?qū)PG寫(xiě)成的應(yīng)用程序轉(zhuǎn)換為.NET上的c#。有時(shí)也將轉(zhuǎn)換稱作現(xiàn)代化。將遺留的應(yīng)用程序轉(zhuǎn)換到獨(dú)立的現(xiàn)代的技術(shù)平臺(tái)具有很多優(yōu)點(diǎn)-維護(hù)遺留應(yīng)用程序的知識(shí)產(chǎn)權(quán);-使得將來(lái)更容易且以較少花費(fèi)對(duì)應(yīng)用程序進(jìn)行改進(jìn);-應(yīng)用程序可以現(xiàn)代化為能夠提供網(wǎng)頁(yè)(Web-enablement);而且-應(yīng)用程序可保持原始的樣式、感覺(jué)和功能,從而使對(duì)職工的培訓(xùn)最小化。轉(zhuǎn)換通常使用基于工作臺(tái)的應(yīng)用程序現(xiàn)代化的方法,也就是說(shuō),轉(zhuǎn)換基于一系列完全不同的工具,且通常牽涉很多對(duì)代碼的人工轉(zhuǎn)換。A.特里可夫(ATerekhov)和C.費(fèi)霍夫(CVerhoef)在他們的名稱為"實(shí)現(xiàn)語(yǔ)言轉(zhuǎn)換(TheRealitiesofLangimgeConversion),,(圣彼德堡州立大學(xué)(StPetersburgStateUniversity))的論文中陳述自動(dòng)化的語(yǔ)言變換看起來(lái)簡(jiǎn)單,但當(dāng)實(shí)際應(yīng)用時(shí)是一個(gè)極其復(fù)雜的問(wèn)題。他們以這樣的陳述進(jìn)行總結(jié)不存在像簡(jiǎn)單變換這樣的事情,人們應(yīng)該限制他們對(duì)轉(zhuǎn)換工程的質(zhì)量和語(yǔ)義上等價(jià)的期望。
發(fā)明內(nèi)容本發(fā)明的第一方案為一種創(chuàng)建包括多個(gè)節(jié)點(diǎn)的樹(shù)的方法,該樹(shù)待用于可執(zhí)行代碼到不同編程語(yǔ)言的轉(zhuǎn)換中,該方法包括接收所述可執(zhí)行代碼;識(shí)別所述代碼的每一可執(zhí)行段;為所述代碼的每一可執(zhí)行段分配一個(gè)節(jié)點(diǎn),其中每一節(jié)點(diǎn)屬于一組預(yù)定節(jié)點(diǎn)類(lèi)型之一,所述每一預(yù)定節(jié)點(diǎn)類(lèi)型定義編程語(yǔ)言的一項(xiàng)唯一的通用可執(zhí)行操作,每一節(jié)點(diǎn)的結(jié)構(gòu)和內(nèi)容由其節(jié)點(diǎn)類(lèi)型定義的通用操作來(lái)確定;禾口鏈接多個(gè)節(jié)點(diǎn)以創(chuàng)建該樹(shù)。通過(guò)將各執(zhí)行段削減到其基本含義,各種語(yǔ)言之間的語(yǔ)法區(qū)別就不會(huì)在創(chuàng)建的樹(shù)中反映出來(lái),該樹(shù)隨后用于將代碼轉(zhuǎn)換到不同的編程語(yǔ)言。如果代碼的兩個(gè)部分實(shí)現(xiàn)同一組可執(zhí)行操作,即便它們是由不同語(yǔ)言寫(xiě)成的,代碼的這兩個(gè)部分也會(huì)生成相同的樹(shù)。這樣,由于相同的方法可以應(yīng)用于多種編程語(yǔ)言,因此使代碼轉(zhuǎn)換變得容易,并避免了對(duì)獨(dú)立的中間語(yǔ)言的需求。所述唯一的通用可執(zhí)行操作可以是對(duì)另一代碼組元的引用;賦值語(yǔ)句;數(shù)據(jù)處理語(yǔ)句;條件語(yǔ)句;或循環(huán)語(yǔ)句。對(duì)于每一節(jié)點(diǎn)類(lèi)型,其結(jié)構(gòu)包括一個(gè)或更多個(gè)子節(jié)點(diǎn),其中每一子節(jié)點(diǎn)屬于一組預(yù)定子節(jié)點(diǎn)類(lèi)型之一,所述每一子節(jié)點(diǎn)類(lèi)型定義其通用可執(zhí)行操作的一個(gè)可能組元。例如,定義賦值語(yǔ)句的可執(zhí)行操作的節(jié)點(diǎn)類(lèi)型,可以構(gòu)建為包括子節(jié)點(diǎn)類(lèi)型的第一子節(jié)點(diǎn)以及子節(jié)點(diǎn)類(lèi)型的第二子節(jié)點(diǎn),該第一子節(jié)點(diǎn)類(lèi)型定義賦值操作的目標(biāo)組元,第二子節(jié)點(diǎn)類(lèi)型定義賦值操作賦值組元。對(duì)于每一子節(jié)點(diǎn)類(lèi)型,其結(jié)構(gòu)包括一個(gè)或更多個(gè)再子節(jié)點(diǎn),其中每一再子節(jié)點(diǎn)屬于一組預(yù)定再子節(jié)點(diǎn)類(lèi)型之一,所述每一再子節(jié)點(diǎn)類(lèi)型定義其通用可執(zhí)行操作的組元的一個(gè)可能子組元。例如,上述第二子節(jié)點(diǎn)可以具有一組預(yù)定再子節(jié)點(diǎn)類(lèi)型,其可包括一個(gè)定義變量或數(shù)學(xué)表達(dá)式的再子節(jié)點(diǎn)。在該樹(shù)中,所述可執(zhí)行代碼中使用的變量會(huì)與定義變量的子節(jié)點(diǎn)類(lèi)型相關(guān)聯(lián)地出現(xiàn)在該樹(shù)中。在該樹(shù)中,所述可執(zhí)行代碼中使用的數(shù)學(xué)等式會(huì)與定義所述等式中使用的數(shù)學(xué)表達(dá)式的子節(jié)點(diǎn)類(lèi)型相關(guān)聯(lián)地出現(xiàn)在該樹(shù)中。在該樹(shù)中,所述可執(zhí)行代碼中使用的常量會(huì)與定義常量的子節(jié)點(diǎn)類(lèi)型相關(guān)聯(lián)地出現(xiàn)在該樹(shù)中。每一節(jié)點(diǎn)可包括識(shí)別信息,例如分配給所述可執(zhí)行代碼中的可執(zhí)行段的行號(hào)。通過(guò)向每一節(jié)點(diǎn)分配鏈接信息來(lái)將該節(jié)點(diǎn)鏈接到該樹(shù)上,所述鏈接信息與將該節(jié)點(diǎn)鏈接到該樹(shù)上所需的其它節(jié)點(diǎn)有關(guān),例如該節(jié)點(diǎn)的父節(jié)點(diǎn)和子節(jié)點(diǎn)的詳情。每一節(jié)點(diǎn)可具有唯一的標(biāo)識(shí)符。一個(gè)節(jié)點(diǎn)可通過(guò)擁有該節(jié)點(diǎn)相關(guān)的父節(jié)點(diǎn)或子節(jié)點(diǎn)的唯一的ID,來(lái)鏈接到該樹(shù)。每一節(jié)點(diǎn)可進(jìn)一步包括多個(gè)方法,這多個(gè)方法涉及如何執(zhí)行用于協(xié)助處理樹(shù)的各種動(dòng)作。每一節(jié)點(diǎn)可進(jìn)一步包括一個(gè)標(biāo)記器,該標(biāo)志器能夠由所述用于協(xié)助處理樹(shù)的多種方法使用;例如,指示一方法在該節(jié)點(diǎn)上已經(jīng)被執(zhí)行。所述方法可進(jìn)一步包括接收與所述可執(zhí)行代碼相關(guān)聯(lián)的聲明數(shù)據(jù);識(shí)別所述聲明數(shù)據(jù)的每一聲明段;為所述代碼的每一聲明段分配一個(gè)節(jié)點(diǎn),該節(jié)點(diǎn)屬于定義聲明的節(jié)點(diǎn)類(lèi)型;以及6將該聲明節(jié)點(diǎn)鏈接到該樹(shù)。所述聲明數(shù)據(jù)可以是與所述可執(zhí)行代碼相關(guān)聯(lián)的另一代碼。所述聲明數(shù)據(jù)可以包括變量聲明、函數(shù)聲明或程序聲明。所述聲明節(jié)點(diǎn)包括以下任一個(gè)或更多個(gè)如上所述的識(shí)別信息;如上所述的鏈接信息;如上所述的多個(gè)方法;以及唯一的標(biāo)識(shí)符。本發(fā)明的第二方案為一種建立解析器以創(chuàng)建包括多個(gè)節(jié)點(diǎn)的樹(shù)的方法,該樹(shù)待用于可執(zhí)行代碼從第一編程語(yǔ)言到第二編程語(yǔ)言的轉(zhuǎn)換中,該方法包括針對(duì)所述第一編程語(yǔ)言,從以所述第一編程語(yǔ)言編寫(xiě)的代碼中識(shí)別出定義可執(zhí)行操作的語(yǔ)法;為識(shí)別出的語(yǔ)法分配節(jié)點(diǎn)類(lèi)型,其中每一節(jié)點(diǎn)類(lèi)型為一組預(yù)定節(jié)點(diǎn)類(lèi)型之一,所述每一預(yù)定節(jié)點(diǎn)類(lèi)型定義編程語(yǔ)言的一項(xiàng)唯一的通用可執(zhí)行操作;每一節(jié)點(diǎn)類(lèi)型的結(jié)構(gòu)和內(nèi)容由其節(jié)點(diǎn)類(lèi)型定義的通用操作來(lái)確定;重復(fù)該方法,直至針對(duì)所述第一操作語(yǔ)言的所有可執(zhí)行操作的語(yǔ)法都已經(jīng)被識(shí)別并且都已被分配節(jié)點(diǎn)類(lèi)型。本發(fā)明的第三方案提供了一種解析器,其用于執(zhí)行本發(fā)明第一方案的方法。該解析器可以依據(jù)本發(fā)明第二方案的方法來(lái)建立。本發(fā)明的第四方案為一種能夠使計(jì)算機(jī)系統(tǒng)運(yùn)行以執(zhí)行本發(fā)明第一方案的方法的應(yīng)用軟件。本發(fā)明的第五方案為一種能夠使計(jì)算機(jī)系統(tǒng)運(yùn)轉(zhuǎn)以執(zhí)行本發(fā)明第二方案的方法的應(yīng)用軟件。本發(fā)明的第六方案為一種將可執(zhí)行代碼轉(zhuǎn)換為不同編程語(yǔ)言的計(jì)算機(jī)系統(tǒng),該計(jì)算機(jī)系統(tǒng)具有輸入工具,用于接收所述可執(zhí)行代碼;存儲(chǔ)工具,用于存儲(chǔ)所接收的代碼和應(yīng)用軟件;禾口處理工具,用于使用所述應(yīng)用軟件來(lái)執(zhí)行本發(fā)明第一方案的方法。該計(jì)算機(jī)系統(tǒng)可以進(jìn)一步包括輸出工具,其用于以不同的編程語(yǔ)言輸出所述可執(zhí)行代碼。本發(fā)明的第七方案為一種將可執(zhí)行代碼從第一編程語(yǔ)言轉(zhuǎn)換為第二編程語(yǔ)言的計(jì)算機(jī)系統(tǒng),該計(jì)算機(jī)系統(tǒng)包括存儲(chǔ)工具,用于存儲(chǔ)所述可執(zhí)行代碼和應(yīng)用軟件;以及處理工具,用于使用所述應(yīng)用軟件執(zhí)行本發(fā)明第二方案的方法。本發(fā)明的第八方案為一種將可執(zhí)行代碼從第一編程語(yǔ)言轉(zhuǎn)換為第二編程語(yǔ)言的方法,所述方法包括以本發(fā)明的第一方案所述的方法創(chuàng)建樹(shù);針對(duì)樹(shù)上的每個(gè)節(jié)點(diǎn),將定義的可執(zhí)行操作轉(zhuǎn)錄為第二編程語(yǔ)言的語(yǔ)法。本發(fā)明的第九方案為一種將代碼轉(zhuǎn)換為不同編程語(yǔ)言的方法,該方法包括7接收所述代碼;基于所述可執(zhí)行代碼創(chuàng)建抽象語(yǔ)法樹(shù);將涉及多個(gè)重建進(jìn)程的識(shí)別數(shù)據(jù)存儲(chǔ)于數(shù)據(jù)存儲(chǔ)器中,所述多個(gè)重建進(jìn)程待在所述抽象語(yǔ)法樹(shù)上運(yùn)行以重建該樹(shù),從而協(xié)助所述到不同語(yǔ)言的代碼轉(zhuǎn)換;在所述抽象語(yǔ)法樹(shù)上自動(dòng)運(yùn)行在所述數(shù)據(jù)存儲(chǔ)器中識(shí)別出的重建進(jìn)程;在該重建的樹(shù)上自動(dòng)運(yùn)行配置進(jìn)程,以將所述代碼轉(zhuǎn)換為所述不同的編程語(yǔ)言;評(píng)估轉(zhuǎn)換后的代碼,并基于該評(píng)估,識(shí)別出另一待在所述抽象語(yǔ)法樹(shù)上運(yùn)行以協(xié)助所述到不同語(yǔ)言的代碼轉(zhuǎn)換的重建進(jìn)程;將所述另一重建進(jìn)程的識(shí)別數(shù)據(jù)存儲(chǔ)到所述數(shù)據(jù)存儲(chǔ)器中;以及重復(fù)所述運(yùn)行步驟。利用每次迭代,對(duì)原始代碼進(jìn)行重復(fù)轉(zhuǎn)換并分析,從而使得轉(zhuǎn)換后的代碼在質(zhì)量上更好,且更具有可維護(hù)性。各次迭代生成與新語(yǔ)言的體系結(jié)構(gòu)更兼容并適應(yīng)的轉(zhuǎn)換后的代碼。僅在轉(zhuǎn)換處理中給出高自動(dòng)化水平時(shí),該代碼轉(zhuǎn)換的迭代方案才成為可能。如果在運(yùn)行步驟中包括人工數(shù)據(jù)轉(zhuǎn)換,則獲取最佳代碼的迭代方案的代價(jià)和付出可能受到限制。進(jìn)一步地,通過(guò)執(zhí)行在數(shù)據(jù)存儲(chǔ)器中識(shí)別出的進(jìn)程,在迭代之間可以對(duì)轉(zhuǎn)換進(jìn)行動(dòng)態(tài)的重新限定。代碼可以從代碼的擁有者那里接收。該方法還可以包括接收數(shù)據(jù)詞典、元數(shù)據(jù)或與所接收的代碼有關(guān)的所有其它文件。抽象語(yǔ)法樹(shù)可以是依據(jù)本發(fā)明第一和第二方案所述的樹(shù)。該抽象語(yǔ)法樹(shù)可以使用本發(fā)明第一方案描述的方法來(lái)創(chuàng)建。該方法可以進(jìn)一步包括將所述抽象語(yǔ)法樹(shù)存儲(chǔ)在所述數(shù)據(jù)存儲(chǔ)器中的步驟。所述創(chuàng)建抽象語(yǔ)法樹(shù)的步驟進(jìn)一步包括從所述抽象語(yǔ)法樹(shù)上提取聲明元素,并將之存儲(chǔ)于數(shù)據(jù)存儲(chǔ)器中。所述聲明元素是利用多個(gè)挖掘進(jìn)程從所述抽象語(yǔ)法樹(shù)上提取的,所述多個(gè)挖掘進(jìn)程對(duì)所述抽象語(yǔ)法樹(shù)進(jìn)行挖掘以識(shí)別該樹(shù)中的聲明元素。所述每一聲明元素的屬性還可存儲(chǔ)在所述數(shù)據(jù)存儲(chǔ)器中。所述方法可進(jìn)一步包括將分析數(shù)據(jù)存儲(chǔ)于所述數(shù)據(jù)存儲(chǔ)器中,所述分析數(shù)據(jù)涉及如何使用以及在何處使用所述代碼的元素。將所述代碼轉(zhuǎn)換為抽象語(yǔ)法樹(shù)的步驟可以進(jìn)一步包括將所述抽象語(yǔ)法樹(shù)保存到數(shù)據(jù)存儲(chǔ)器中。所述方法包括將關(guān)于所述代碼的元數(shù)據(jù)存儲(chǔ)于所述數(shù)據(jù)存儲(chǔ)器中的步驟??梢詫⑺鲈獢?shù)據(jù)人工寫(xiě)入數(shù)據(jù)存儲(chǔ)器中。所述元數(shù)據(jù)可以包括關(guān)于所述代碼的原始語(yǔ)言和/或所述不同的編程語(yǔ)言的信息,所述元數(shù)據(jù)可以包括關(guān)于所述代碼的原始語(yǔ)言和/或所述不同的編程語(yǔ)言的內(nèi)建組元的信息。所述元數(shù)據(jù)還可以包括涉及重建的另外的信息,例如所需可維護(hù)性、經(jīng)轉(zhuǎn)換的代碼的運(yùn)行時(shí)復(fù)雜性和效率??商鎿Q地,或另外,可以使用多個(gè)挖掘進(jìn)程,從所述抽象語(yǔ)法樹(shù)上提取所述元數(shù)據(jù),該挖掘進(jìn)程可以對(duì)所述抽象語(yǔ)法樹(shù)進(jìn)行挖掘,以便確定代碼的元數(shù)據(jù)。所述重建進(jìn)程可包括以下一個(gè)或更多個(gè)對(duì)循環(huán)加以識(shí)別并重建為期望循環(huán)結(jié)構(gòu)的進(jìn)程;對(duì)特定可執(zhí)行段加以識(shí)別并重建為更精細(xì)結(jié)構(gòu)的進(jìn)程;對(duì)所述抽象語(yǔ)法樹(shù)中的GOTO語(yǔ)句加以識(shí)別,并重建樹(shù)以移除這些語(yǔ)句的進(jìn)程;對(duì)該樹(shù)中的成組節(jié)點(diǎn)的復(fù)本加以識(shí)別,并重建以便將該組節(jié)點(diǎn)創(chuàng)建為函數(shù)或過(guò)程的進(jìn)程;對(duì)一個(gè)或更多個(gè)變量的作用域加以識(shí)別的進(jìn)程;對(duì)所述抽象語(yǔ)法樹(shù)中的特定節(jié)點(diǎn)組加以識(shí)別,并重排這些節(jié)點(diǎn)的結(jié)構(gòu)的進(jìn)程;對(duì)所述抽象語(yǔ)法樹(shù)中的特定節(jié)點(diǎn)組加以識(shí)別,并替換這些節(jié)點(diǎn)的進(jìn)程,例如使用函數(shù)調(diào)用;將數(shù)據(jù)結(jié)構(gòu)改變?yōu)榈谌龢?biāo)準(zhǔn)形式的進(jìn)程;遍歷該樹(shù)以識(shí)別界面的進(jìn)程;以及遍歷該樹(shù)并分析變量的用途,以改進(jìn)其變量類(lèi)型的進(jìn)程。所述方法可進(jìn)一步包括編寫(xiě)所述待在抽象語(yǔ)法樹(shù)上運(yùn)行的重建進(jìn)程。所述方法可進(jìn)一步包括對(duì)存儲(chǔ)于所述數(shù)據(jù)存儲(chǔ)器中的信息執(zhí)行審計(jì),以識(shí)別有無(wú)信息丟失。所述自動(dòng)運(yùn)行在所述數(shù)據(jù)存儲(chǔ)器中識(shí)別出的重建進(jìn)程的步驟,還使用存儲(chǔ)在所述數(shù)據(jù)存儲(chǔ)器中的與代碼相關(guān)的聲明信息和元數(shù)據(jù)信息。所述進(jìn)程可以同時(shí)運(yùn)行。所述自動(dòng)運(yùn)行配置進(jìn)程的步驟,還可使用存儲(chǔ)在所述數(shù)據(jù)存儲(chǔ)器中的與代碼相關(guān)的信息。對(duì)轉(zhuǎn)換后的代碼的評(píng)估基于以下任意一項(xiàng)或更多項(xiàng)所述代碼的秩復(fù)雜性;代碼的行數(shù);已被替換的進(jìn)程的數(shù)目;轉(zhuǎn)換后的代碼的人工評(píng)估;以及配置后的代碼的準(zhǔn)確性。所述評(píng)估轉(zhuǎn)換后的代碼的步驟,可以以所述抽象語(yǔ)法樹(shù)為基礎(chǔ)。所述評(píng)估轉(zhuǎn)換后的代碼包括生成異議報(bào)告,所述異議報(bào)告識(shí)別所述轉(zhuǎn)換后的代碼中可能無(wú)法產(chǎn)生所需結(jié)果的部分。在評(píng)估轉(zhuǎn)換后的代碼之前,所述方法可包括將所述轉(zhuǎn)換后的代碼存儲(chǔ)于所述數(shù)據(jù)存儲(chǔ)器中的步驟。這可能包括將該方法前一次迭代的轉(zhuǎn)換后的代碼替換為最新版轉(zhuǎn)換后的代碼。。所述數(shù)據(jù)存儲(chǔ)器是同一數(shù)據(jù)存儲(chǔ)器。本發(fā)明的第十方案為一種能夠執(zhí)行依據(jù)本發(fā)明第八方案的方法的應(yīng)用軟件。本發(fā)明的第十一方案為一種被編程為執(zhí)行本發(fā)明第八方案的方法的計(jì)算機(jī)系統(tǒng)。該計(jì)算機(jī)系統(tǒng)用于轉(zhuǎn)換代碼,該計(jì)算機(jī)系統(tǒng)具有輸入工具,用于接收所述代碼;存儲(chǔ)工具,用于存儲(chǔ)應(yīng)用軟件和接收的代碼;以及處理工具,用于使用所述應(yīng)用軟件執(zhí)行本發(fā)明第八方案的方法。所述計(jì)算機(jī)系統(tǒng)進(jìn)一步包括用于存儲(chǔ)以上所述信息的數(shù)據(jù)存儲(chǔ)器?,F(xiàn)在將參考附圖描述本發(fā)明的最佳方式,其中圖1為轉(zhuǎn)換系統(tǒng)的組元的原理圖;圖2(a)至圖2(C)為本發(fā)明的技術(shù)處理的流程圖;圖3為轉(zhuǎn)換引擎;圖4為IF語(yǔ)句節(jié)點(diǎn)的需要的結(jié)構(gòu);圖5為由兩行C代碼創(chuàng)建的語(yǔ)法樹(shù)實(shí)例;圖6示出C代碼片段的分析;圖7為基于相同的兩行C代碼,使用本發(fā)明創(chuàng)建的標(biāo)準(zhǔn)樹(shù)的實(shí)例圖8為知識(shí)庫(kù)類(lèi)層次結(jié)構(gòu)的實(shí)例;圖9示出邏輯樹(shù)的實(shí)例;圖10為偽代碼的實(shí)例;以及圖11為轉(zhuǎn)換為C語(yǔ)言的偽代碼。具體實(shí)施例方式本發(fā)明一個(gè)方面的方法包括重復(fù)執(zhí)行的多個(gè)步驟。每次迭代的目的在于盡可能地生成質(zhì)量最佳且配置準(zhǔn)確的代碼。只有自動(dòng)化的樹(shù)重建和配置才使迭代成為可能。如果這些步驟是人工進(jìn)行的,那么即使可以確定更好的方法或較佳的結(jié)果,轉(zhuǎn)換的重復(fù)步驟也會(huì)由于成本和時(shí)間問(wèn)題而有所限制。迭代方案通過(guò)在每次迭代時(shí)對(duì)轉(zhuǎn)換的代碼進(jìn)行改進(jìn)來(lái)保證最可行的轉(zhuǎn)換代碼。進(jìn)一步地,即使配置進(jìn)程已經(jīng)開(kāi)始,也可以實(shí)現(xiàn)對(duì)轉(zhuǎn)換的代碼的要求?,F(xiàn)在參考圖1描述轉(zhuǎn)換系統(tǒng)的組元。轉(zhuǎn)換引擎劃分為迭代執(zhí)行的三組串行進(jìn)程。輸入處理組元20對(duì)輸入語(yǔ)言進(jìn)行詞法分析(lex)并解析為一組語(yǔ)言符號(hào)(token)和抽象的邏輯樹(shù)。語(yǔ)言符號(hào)被應(yīng)用于變量和操作符(operator)。操作符和變量為開(kāi)發(fā)的廣譜語(yǔ)言(WSL,widespectrumlanguage)的一部分,該語(yǔ)言實(shí)際上是現(xiàn)有語(yǔ)言的父集。所有組元都存儲(chǔ)在知識(shí)庫(kù)中,供多個(gè)進(jìn)程同時(shí)訪問(wèn)。增強(qiáng)處理器(enrichmentprocessor)組元22存儲(chǔ)由稱作遍歷器(walker)的小型代碼組元執(zhí)行的多個(gè)進(jìn)程,這些小型代碼組元具有這樣的能力穿行于標(biāo)準(zhǔn)樹(shù)(StandardTree),并執(zhí)行多個(gè)任務(wù),例如針對(duì)信息對(duì)樹(shù)進(jìn)行挖掘,對(duì)樹(shù)進(jìn)行重建以及將樹(shù)配置為另一種語(yǔ)言。所有的重建都限制為格式轉(zhuǎn)換,這允許在不改變功能的情況下進(jìn)行重建。重建的實(shí)例是依賴于在前執(zhí)行的程序中的其它語(yǔ)句,識(shí)別出GOT0語(yǔ)句可以轉(zhuǎn)換為D0WHILE語(yǔ)句。輸出處理組元24遍歷重建的標(biāo)準(zhǔn)樹(shù)和知識(shí)庫(kù),以目標(biāo)語(yǔ)言生成可配置的代碼。所有處理可以在計(jì)算機(jī)系統(tǒng)的一個(gè)或更多個(gè)處理器上執(zhí)行。計(jì)算機(jī)系統(tǒng)具有能夠安裝的、使處理器執(zhí)行本發(fā)明的方法的軟件。計(jì)算機(jī)系統(tǒng)包括接收代碼的輸入工具,例如能夠接納存儲(chǔ)有代碼的CD或可以接納存儲(chǔ)有代碼的便攜式硬驅(qū)動(dòng)的CD驅(qū)動(dòng)器。計(jì)算機(jī)系統(tǒng)還包括像Quipoz知識(shí)庫(kù)(下面進(jìn)一步詳細(xì)描述)一樣運(yùn)行的合適的存儲(chǔ)工具。該存儲(chǔ)工具對(duì)例如執(zhí)行該方法的軟件、待轉(zhuǎn)換的代碼以及轉(zhuǎn)換過(guò)程中的代碼進(jìn)行存儲(chǔ)。該計(jì)算機(jī)系統(tǒng)可以包括分立的計(jì)算機(jī),這些計(jì)算機(jī)都具有可以在其上交叉分配本發(fā)明的處理的處理器。10遍歷器知道在元數(shù)據(jù)知識(shí)庫(kù)(meta-datar印ository)中指定的元數(shù)據(jù)需求(metadatarequirement)。這使得可以在迭代之間對(duì)轉(zhuǎn)換目標(biāo)進(jìn)行動(dòng)態(tài)地重新限定。圖2(a)至圖2(c)是轉(zhuǎn)換系統(tǒng)對(duì)應(yīng)用程序進(jìn)行轉(zhuǎn)換時(shí)所使用的技術(shù)處理的流程圖。這些處理通過(guò)采用獨(dú)特的組元實(shí)現(xiàn)各自的目標(biāo),以下對(duì)這些組元進(jìn)行更充分地描述。首先必須對(duì)源進(jìn)行采集30??梢圆捎枚喾N不同的格式將應(yīng)用程序源發(fā)送到轉(zhuǎn)換系統(tǒng)。多數(shù)普通的語(yǔ)言,例如COBOL,是完全順向的-這些語(yǔ)言的每個(gè)程序是作為一個(gè)文件接收的,每個(gè)程序包含該程序運(yùn)行所需的所有信息變量定義、文件關(guān)系等。這種語(yǔ)言稱作"以程序?yàn)橹行牡?(Program-Centric)語(yǔ)言。其它語(yǔ)言,尤其是4GL,就不是這么簡(jiǎn)單了。通常,譯碼器(coder)使用集成的開(kāi)發(fā)環(huán)境,其包括為用戶定制的屏幕,用于輸入只對(duì)一個(gè)特殊功能特定的數(shù)據(jù)。客戶端通常不會(huì)看到單一"程序"-而是看到一系列組元。由于轉(zhuǎn)換必須使用程序列表(這種程序列表本身不可編譯,且經(jīng)常缺少關(guān)鍵的關(guān)系信息,或具有遍布在代碼中的注釋),或必須嘗試對(duì)保持在專用數(shù)據(jù)庫(kù)中的信息進(jìn)行譯碼,所以這些情況很有挑戰(zhàn)性。在任一種情況下,都有一些預(yù)備工作。通常,所有程序的所有變量定義都存儲(chǔ)在一個(gè)文件中;所有程序的所有代碼存儲(chǔ)在另一文件中;所有屏幕(screen)定義存儲(chǔ)在再一個(gè)文件中,等。這種類(lèi)型的語(yǔ)言稱為"非以程序?yàn)橹行牡?語(yǔ)言。在兩種情況下,信息都可以來(lái)自其它源。例如,數(shù)據(jù)詞典文件,即使他們已經(jīng)跟不上時(shí)代,但也可以提供一些有價(jià)值的信息。該進(jìn)程中的下一步是進(jìn)程分析32,其中對(duì)接收到的材料進(jìn)行分析,以便確定動(dòng)作的順序(acourseofaction)。如果待轉(zhuǎn)換的語(yǔ)言不是以程序?yàn)橹行牡?,那么需要確定是否使用了程序列表或?qū)S脭?shù)據(jù)庫(kù)。通常,需要將小測(cè)試程序發(fā)給它們所運(yùn)行的客戶端,從而可以確定在困難情況下該語(yǔ)言的動(dòng)作。通常在該階段為特定的轉(zhuǎn)換建立屬性文件(propertiesfile)。與其它階段相同,該屬性文件包含元數(shù)據(jù),這些元數(shù)據(jù)告知進(jìn)程所讀入的是哪一種語(yǔ)言,配置的是哪一種語(yǔ)言,在哪里找到源代碼以及使用哪一個(gè)數(shù)據(jù)庫(kù)。對(duì)所有的工程,進(jìn)程分析32幾乎總是需要進(jìn)行預(yù)處理。例如,如果使用程序列表作為源代碼,那么需要進(jìn)行預(yù)處理,以便刪除分頁(yè)符和打印機(jī)命令。在少數(shù)情況下,為了更好地理解語(yǔ)言而使用預(yù)處理,以便利用客戶端的編碼標(biāo)準(zhǔn)。大多數(shù)預(yù)處理對(duì)于語(yǔ)言和源格式是特定的。接著,將各語(yǔ)言組元映射34到標(biāo)準(zhǔn)樹(shù)。也就是說(shuō),需要理解每個(gè)語(yǔ)句和聲明,并將語(yǔ)句和聲明映射到標(biāo)準(zhǔn)樹(shù)中的相應(yīng)項(xiàng)目。例如,COBOL中的語(yǔ)句"MOVEATOB"是簡(jiǎn)單的賦值語(yǔ)句,它被映射為標(biāo)準(zhǔn)樹(shù)上的這一類(lèi)項(xiàng)目。下文再進(jìn)一步詳細(xì)討論標(biāo)準(zhǔn)樹(shù)。為每種語(yǔ)言組元?jiǎng)?chuàng)建36詞法分析器(lexer)和解析器。為了對(duì)寫(xiě)出詞法分析器和解析器的進(jìn)程進(jìn)行加速,這些項(xiàng)目通常以稱作ANTLR的語(yǔ)言寫(xiě)成。然而,對(duì)于為轉(zhuǎn)換系統(tǒng)接收?qǐng)D形表示的屏幕,除非是編碼的,否則并不是這種情況。雖然可以在任意時(shí)刻制作詞法分析器,但是用于對(duì)語(yǔ)言進(jìn)行解析并同時(shí)建立標(biāo)準(zhǔn)樹(shù)的解析器要等到將輸入語(yǔ)言映射到標(biāo)準(zhǔn)樹(shù)之后才能制作。這是由于待創(chuàng)建的標(biāo)準(zhǔn)樹(shù)的結(jié)構(gòu)改變了對(duì)語(yǔ)言進(jìn)行劃分的方式。這是本發(fā)明的語(yǔ)言解析器和標(biāo)準(zhǔn)語(yǔ)言解析器之間的關(guān)鍵區(qū)別之一。當(dāng)輸入語(yǔ)言進(jìn)來(lái)時(shí),標(biāo)準(zhǔn)語(yǔ)言解析器僅識(shí)別輸入語(yǔ)言。創(chuàng)建的所有樹(shù)的外表特征都與該語(yǔ)言相似。然而,本發(fā)明使用解析步驟對(duì)每個(gè)組元進(jìn)行識(shí)別、命名,并創(chuàng)建標(biāo)準(zhǔn)樹(shù)。作為例子,可以對(duì)使用在網(wǎng)絡(luò)上免費(fèi)獲得的C解析器生成的樹(shù)和本發(fā)明的樹(shù)進(jìn)行比較。兩者都使用ANTLR創(chuàng)建,然而兩者建立的樹(shù)有很大的不同。標(biāo)準(zhǔn)的C解析器遇到輸入源中的"("時(shí),將該"("分類(lèi)為左括號(hào)(LEFT-PARENTHESIS)節(jié)點(diǎn)。然而,本發(fā)明的解析器更深地挖掘該代碼,確定該左括號(hào)是表示計(jì)算符號(hào)、區(qū)分待傳遞到函數(shù)調(diào)用的一列參數(shù)的開(kāi)始、區(qū)分函數(shù)聲明中的一列參數(shù)聲明,還是數(shù)學(xué)等式中加括號(hào)的表達(dá)式的開(kāi)始。進(jìn)一步地,本發(fā)明的解析器一旦識(shí)別出特定左括號(hào)的作用,則確定在當(dāng)前樹(shù)中該項(xiàng)目所屬的位置一可能不同于在C代碼中物理地寫(xiě)入的位置。接著,對(duì)需要作為源載入進(jìn)程的一部分的所有樹(shù)遍歷器(TreeWalker)進(jìn)行識(shí)別38。有時(shí),不可能由解析器完全生成標(biāo)準(zhǔn)樹(shù)。這是由于在一些特定領(lǐng)域,輸入語(yǔ)言與標(biāo)準(zhǔn)樹(shù)差別極大,所以在一個(gè)步驟中直接映射為標(biāo)準(zhǔn)樹(shù)過(guò)于復(fù)雜。在這種情況下,創(chuàng)建樹(shù)遍歷器,由樹(shù)遍歷器執(zhí)行這一進(jìn)程。由于這些樹(shù)遍歷器在輸入語(yǔ)言格式中提取樹(shù),并將輸入語(yǔ)言格式轉(zhuǎn)換為標(biāo)準(zhǔn)樹(shù)格式,因此這些樹(shù)遍歷器對(duì)輸入源語(yǔ)言是特定的,且無(wú)法以任何其它輸入語(yǔ)言運(yùn)行??梢栽赗PG語(yǔ)言中獲取這樣的例子。在RPG程序的聲明部分,用于下面的程序調(diào)用的參數(shù)被存儲(chǔ)在列表中。然后,在程序的邏輯部分,當(dāng)存在對(duì)另一程序的調(diào)用時(shí),調(diào)用參數(shù)的這些列表。然而,標(biāo)準(zhǔn)樹(shù)需要將程序調(diào)用的所有參數(shù)與調(diào)用的程序本身相關(guān)聯(lián)。由于這在解析時(shí)段很難進(jìn)行,因此在解析之后采用樹(shù)遍歷器,由樹(shù)遍歷器獲得所有參數(shù)列表,并將它們放入該程序的調(diào)用語(yǔ)句中。—旦寫(xiě)出語(yǔ)言解析器,并寫(xiě)出所有輸入樹(shù)遍歷器,那么針對(duì)所有輸入源40來(lái)運(yùn)行解析器和樹(shù)遍歷器就是一個(gè)簡(jiǎn)單的問(wèn)題。該步驟可以配置為針對(duì)所有代碼或僅針對(duì)特定的項(xiàng)目來(lái)運(yùn)行(由InScopeltem控制)。本步驟的結(jié)果是將輸入語(yǔ)言轉(zhuǎn)換為以標(biāo)準(zhǔn)樹(shù)來(lái)表示的廣譜語(yǔ)言(WSL)?!⒋a解析為標(biāo)準(zhǔn)樹(shù)格式,則針對(duì)解析的代碼運(yùn)行挖掘器42,以便提取聲明信息,并存儲(chǔ)在知識(shí)庫(kù)中。每個(gè)挖掘器僅針對(duì)特定的節(jié)點(diǎn)類(lèi)型遍歷標(biāo)準(zhǔn)樹(shù)結(jié)構(gòu)一通常是聲明節(jié)點(diǎn)類(lèi)型。例如,存在一個(gè)在程序中查找所有方法聲明的挖掘器,一個(gè)查找所有程序調(diào)用的挖掘器,一個(gè)查找所有SQL語(yǔ)句的挖掘器。然后,這些挖掘器將所有的聲明信息存儲(chǔ)于知識(shí)庫(kù)中。該知識(shí)庫(kù)保存所有命名的項(xiàng)目(例如變量),與它們的屬性(例如長(zhǎng)度、輸入語(yǔ)言數(shù)據(jù)類(lèi)型等)以及它們與其它被命名的項(xiàng)目的關(guān)系(例如擁有變量MyVar的函數(shù)Fxl,引用DBTableClientDetails的函數(shù)Fxl)?!┩瓿杀静襟E,就可以說(shuō)已經(jīng)載入了應(yīng)用程序。下一步驟是識(shí)別和理解輸入語(yǔ)言的所有內(nèi)建組元("built-in"component)44。本步驟不需要在此運(yùn)行,除非即將生成審計(jì)報(bào)告。有必要對(duì)語(yǔ)言的所有內(nèi)建組元_例如,作為運(yùn)行環(huán)境或語(yǔ)言的一部分所提供的函數(shù)進(jìn)行識(shí)別。這些函數(shù)在4GL中很普遍。在轉(zhuǎn)換之前,需要對(duì)它們進(jìn)行識(shí)別,以便知道必須寫(xiě)入哪些內(nèi)容。在運(yùn)行任一審計(jì)報(bào)告之前也需要對(duì)它們進(jìn)行識(shí)別,以便容易發(fā)現(xiàn)模塊從源中丟失,或該模塊是否是由源系統(tǒng)所提供的內(nèi)建模塊。在此需要識(shí)別的其它項(xiàng)目是系統(tǒng)常量和變量。例如,大多數(shù)語(yǔ)言提供一些全局變量-USERID就是一個(gè)例子。它可以在任何地方使用,但是程序員從來(lái)不需要對(duì)它們進(jìn)行聲明。這是由于它們是固化在系統(tǒng)中的,就像函數(shù)一樣。全局常量的例子是COBOL中的詞SPACES。再一次說(shuō)明,需要對(duì)這些項(xiàng)目進(jìn)行識(shí)別和理解,以便記錄如何對(duì)它們進(jìn)行轉(zhuǎn)換的知識(shí)。—旦對(duì)所有的內(nèi)建函數(shù)、變量和常量進(jìn)行了識(shí)別44,就需要將它們插入到知識(shí)庫(kù)中。通常,這是通過(guò)創(chuàng)建具有該系統(tǒng)的名稱(例如LINC—GLOBALS)的模塊,并將所有函數(shù)、變量和常量附到該模塊來(lái)進(jìn)行的。然后,當(dāng)對(duì)該系統(tǒng)中的任意程序進(jìn)行處理時(shí),首先將該全局模塊載入到作用域(scope),從而使該程序可以獲得所有的變量、函數(shù)和常量。需要獲取所有與輸入系統(tǒng)相關(guān)的因素,并輸入46到知識(shí)庫(kù)中。獲取的信息包括編譯器選項(xiàng);舍入(rounding)選項(xiàng);字長(zhǎng);語(yǔ)言選項(xiàng)以及代碼頁(yè)數(shù)。在該階段,需要理解語(yǔ)言中項(xiàng)目的作用域如何起作用??紤]以下語(yǔ)言之間的區(qū)別在語(yǔ)言1中,程序擁有一個(gè)屏幕,實(shí)際上在程序中對(duì)屏幕上示出的所有變量進(jìn)行聲明,并只是允許該屏幕使用該變量。所以,僅有變量X的一個(gè)定義。當(dāng)更新程序變量X時(shí),X的屏幕變量也得到自動(dòng)更新。在語(yǔ)言2中,屏幕是獨(dú)立于程序進(jìn)行定義的,屏幕包含它們自身的變量。當(dāng)程序決定包含屏幕時(shí),則程序員必須聲明該屏幕所使用的所有變量-所以,存在對(duì)變量x的兩個(gè)聲明。在這種情況下,具有名稱X的程序變量與具有名稱X的屏幕變量相配合。語(yǔ)言3可能與語(yǔ)言2類(lèi)似,但是程序員不需要在程序中聲明屏幕變量_系統(tǒng)假設(shè)是這種情況。語(yǔ)言4也與語(yǔ)言2類(lèi)似_但是屏幕變量獨(dú)立于程序變量。任何時(shí)候引用屏幕變量時(shí),將該屏幕變量稱作Screen.X,程序變量X僅稱作X。為了正確處理所有這些不同的情況,創(chuàng)建各種語(yǔ)言的作用域載入器(ScopeLoader)48。為作用域載入器指定語(yǔ)言規(guī)則,以解決這樣的問(wèn)題,例如"我們有變量X,我們談到的是屏幕變量還是程序變量"以及"該程序沒(méi)有聲明變量X,但在代碼中使用了變量X,該怎么做?"。為了生成審計(jì)報(bào)告(我們是否需要對(duì)客戶端說(shuō)"我們沒(méi)有X的定義",或僅在應(yīng)該附到該程序的其它內(nèi)容中定義變量X)以及為了對(duì)代碼進(jìn)行轉(zhuǎn)換代碼,理解語(yǔ)言規(guī)則,并正確地獲得這些作用域載入器都是必須的。關(guān)于這個(gè)問(wèn)題已經(jīng)組裝了知識(shí)庫(kù),從而有可能識(shí)別所有丟失的項(xiàng)目。審計(jì)報(bào)告完全脫離知識(shí)庫(kù)而運(yùn)行50-因此將所有信息載入到審計(jì)報(bào)告是很重要的。首先,運(yùn)行稱作引用解析器的進(jìn)程。該進(jìn)程查找對(duì)項(xiàng)目的所有引用,并試圖找到正在討論的項(xiàng)目。注意引用解析器使用針對(duì)源語(yǔ)言的作用域載入器進(jìn)行該過(guò)程。如果引用解析器能夠進(jìn)行該過(guò)程,則將這兩個(gè)項(xiàng)目進(jìn)行鏈接。如果引用解析器無(wú)法進(jìn)行該過(guò)程,則可能是由于以下三種原因中的一種今該項(xiàng)目是還沒(méi)有被識(shí)別的源系統(tǒng)中的內(nèi)建函數(shù)、變量或常量(參見(jiàn)步驟48);今由于某些原因,我們的早先進(jìn)程中的一個(gè)沒(méi)有起作用一可能程序沒(méi)有解析,或創(chuàng)建的樹(shù)不標(biāo)準(zhǔn),因此挖掘器無(wú)法正常完成它們的任務(wù),或(如果已經(jīng)建立了測(cè)試,測(cè)試結(jié)果表明不是這個(gè)原因);令客戶端還沒(méi)有提供相關(guān)的源。接下來(lái),配置52元數(shù)據(jù)。在該階段,已粗略知道如何轉(zhuǎn)換該系統(tǒng)。已經(jīng)寫(xiě)出一些轉(zhuǎn)換組元,有一些還待寫(xiě)出_但是在該階段,需要決定使用哪一個(gè)組元,并將決定使用的組元拖在一起。將簡(jiǎn)單的工程信息存儲(chǔ)在該工程的轉(zhuǎn)換屬性(transformation,properties)文件中。其它信息存儲(chǔ)在用于配置的控制程序中-該控制程序存儲(chǔ)例如運(yùn)行哪個(gè)樹(shù)遍歷器、使用哪個(gè)作用域載入器、使用哪個(gè)聲明記錄器(DeclarationWriter)等的信息。然后,以輸出語(yǔ)言寫(xiě)出54所有需要的"內(nèi)建"組元_框架(framework)。如果輸入系統(tǒng)具有表示"記錄這個(gè)變量,用ioo乘,并顯示為紅色"的內(nèi)建函數(shù),則在輸出代碼中創(chuàng)建完成相同事情的函數(shù)。通常,在輸入系統(tǒng)中建有15與40之間的任意個(gè)數(shù)的函數(shù)。一些是簡(jiǎn)單函數(shù),如數(shù)據(jù)格式化。其它的較復(fù)雜,注意數(shù)據(jù)庫(kù)訪問(wèn)或屏幕控制。執(zhí)行為所有聲明的項(xiàng)目獲取并生成英文名稱的一系列進(jìn)程56。該步驟包括今域分析;今縮寫(xiě)詞擴(kuò)充和轉(zhuǎn)換;今注釋分析;今文件分析;以及今上下文分析。就含義和準(zhǔn)確性對(duì)候選名稱進(jìn)行衡量。允許使用代理,從而使客戶端可以影響名稱的生成。這是一個(gè)迭代的進(jìn)程,以保證采用最可能的名稱。接下來(lái),為內(nèi)建函數(shù)寫(xiě)出BSD轉(zhuǎn)換58。由于為BSD生成的標(biāo)準(zhǔn)英文不夠詳細(xì),因此不能處理程序的內(nèi)建函數(shù)。例如,函數(shù)的標(biāo)準(zhǔn)BSD生成可能表示為"調(diào)用內(nèi)建函數(shù)DetermineNextRow",其使用參數(shù)CLIENT、DATE、CLIENTID被調(diào)用。這種表述不如"從具有主要關(guān)鍵字DATE和CLIENTID的表CLIENT中讀取記錄"的描述性強(qiáng)。由于內(nèi)建函數(shù)被經(jīng)常使用,所以通常給他們給定極其具體的轉(zhuǎn)換,包含有很高的智能程度。理想地,當(dāng)轉(zhuǎn)換為一種新的語(yǔ)言時(shí),會(huì)使用在該語(yǔ)言中固化的數(shù)據(jù)類(lèi)型。然而,在不同的語(yǔ)言中,變量不會(huì)表現(xiàn)為相同的方式。以十進(jìn)制數(shù)為例。如果將3.141乘以7.266,系統(tǒng)是將結(jié)果存儲(chǔ)為22.822506,還是存儲(chǔ)為22.822,或者存儲(chǔ)為22.823由于每個(gè)系統(tǒng)的表現(xiàn)是不同的,因此必須要做的第一件事情之一就是創(chuàng)建與輸入系統(tǒng)的數(shù)據(jù)類(lèi)(dataclass)表現(xiàn)相同的數(shù)據(jù)類(lèi)?!?duì)具體的變量進(jìn)行了分析,就可以說(shuō)"在任何時(shí)候,只給該變量分配了1到10的整數(shù)一它將在兩種語(yǔ)言中表現(xiàn)為相同的方式"。在這種情況下,可以將該變量轉(zhuǎn)換為輸出語(yǔ)言中的標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型60。然而,這必須按照變量基(variablebasis)針對(duì)變量進(jìn)行。在一些情況下,可能永遠(yuǎn)無(wú)法知道已經(jīng)使用的是什么值,所以總是需要使用模仿輸入系統(tǒng)的數(shù)據(jù)類(lèi)。14接下來(lái),寫(xiě)出正確仿真屏幕/報(bào)告/程序調(diào)用所需要的框架62。這就是創(chuàng)建與輸入語(yǔ)言表現(xiàn)相同的框架的時(shí)候。例如,輸入語(yǔ)言是會(huì)話的還是非會(huì)話的?這需要框架去完成。一些程序是否發(fā)起了運(yùn)行在背景中的異步任務(wù)?這也需要框架去完成。如果該系統(tǒng)在事務(wù)處理中停止運(yùn)轉(zhuǎn),會(huì)發(fā)生什么?這還是需要框架去正確處理。然后為輸入語(yǔ)言創(chuàng)建到輸出語(yǔ)言的轉(zhuǎn)換模板64。這些模板幫助識(shí)別需要什么樣的樹(shù)遍歷器,以及來(lái)自輸入系統(tǒng)的哪些聲明信息必須傳遞到新系統(tǒng)中。并非總是創(chuàng)建轉(zhuǎn)換模板,而是它們對(duì)語(yǔ)言的分析有極大的幫助?;旧袭?dāng)框架團(tuán)隊(duì)中的某人從輸入語(yǔ)言中獲得幾個(gè)小程序,將它們?nèi)斯まD(zhuǎn)換為輸出語(yǔ)言,并保證它們能夠工作時(shí),創(chuàng)建模板。通常,它們將選擇這樣的程序今訪問(wèn)屏幕今訪問(wèn)數(shù)據(jù)庫(kù)表今處理屏幕上的所有重復(fù)記錄(滾動(dòng)表格等)?!﹦?chuàng)建了模板,則轉(zhuǎn)換團(tuán)隊(duì)就可以更好的理解如何對(duì)代碼進(jìn)行轉(zhuǎn)換,并盡早發(fā)現(xiàn)轉(zhuǎn)換過(guò)程中的潛在問(wèn)題。寫(xiě)出需要用于轉(zhuǎn)換代碼的樹(shù)遍歷器66。在此要付出大量的時(shí)間和精力進(jìn)行轉(zhuǎn)換。一些能夠?qū)λ姓Z(yǔ)言進(jìn)行標(biāo)準(zhǔn)轉(zhuǎn)換的公共遍歷器已經(jīng)被創(chuàng)建。然而,大多轉(zhuǎn)換需要相當(dāng)特定的轉(zhuǎn)換,因此需要語(yǔ)言特定的(language-specific)樹(shù)遍歷器。對(duì)于所有工程,為了使代碼在新的環(huán)境下運(yùn)行,存在必須要進(jìn)行的轉(zhuǎn)換。除此之外,為了使代碼更簡(jiǎn)潔,或更面向?qū)ο蟮?,可以進(jìn)行一些提高。后面將對(duì)樹(shù)遍歷器進(jìn)行進(jìn)一步詳細(xì)的描述。接下來(lái),改換所有聲明項(xiàng)目的名稱68。所有的程序、變量、文件等都需要輸出名稱。對(duì)于BSD,轉(zhuǎn)換系統(tǒng)使用生成的英文名稱(EnglishName),對(duì)于所有其它的轉(zhuǎn)換,該系統(tǒng)使用目標(biāo)名稱(TargetName)。使用多個(gè)進(jìn)程確定如何生成目標(biāo)名稱。即使是在創(chuàng)建合法名稱之后,還針對(duì)這些名稱運(yùn)行名稱洗刷器(NameScrubber),以便保證所有使用的名稱符合輸出語(yǔ)言的命名標(biāo)準(zhǔn)和需求。例如,java不允許在方法或類(lèi)的名稱中出現(xiàn)破折號(hào)"-"。然后使用同音異義字、同義字和唯一性的算法,以保證以輸出語(yǔ)言正確生成候選名稱。在以上討論中已提到轉(zhuǎn)換控制程序,但是直到對(duì)所有的樹(shù)遍歷器都進(jìn)行了識(shí)別和處理,控制程序才能結(jié)束。這由對(duì)轉(zhuǎn)換控制程序的設(shè)立來(lái)完成70。這些控制程序包含各個(gè)待運(yùn)行的樹(shù)遍歷器、待使用的作用域載入器、待使用的數(shù)據(jù)類(lèi)型助手(DataTyperifelper)、待使用的聲明記錄器(DecalarationWriter)以及待使用的邏輯記錄器(LogicWriter)的名稱??梢詫⑿碌淖兞柯暶?2寫(xiě)入到它們自己的文件(或類(lèi))或?qū)懭肱c程序、屏幕或報(bào)告邏輯相同的文件中。變量聲明使用數(shù)據(jù)類(lèi)型助手(DataTypeHelper),以便知道如何對(duì)不同的數(shù)據(jù)類(lèi)型進(jìn)行改換并聲明。接下來(lái),為輸出語(yǔ)言創(chuàng)建屏幕XML文件74。運(yùn)行進(jìn)程,以便生成包含關(guān)于所有屏幕變量的信息的XML文件。該信息用于在屏幕和程序之間進(jìn)行映射。然后為每種不同的輸入語(yǔ)言寫(xiě)出屏幕創(chuàng)建器。然后創(chuàng)建針對(duì)輸出語(yǔ)言的DB表類(lèi)76。通常,每個(gè)數(shù)據(jù)庫(kù)都有它們自己的輸出文件。該進(jìn)程是相當(dāng)標(biāo)準(zhǔn)化的-然而,在此可能有不同于輸入系統(tǒng)的多個(gè)內(nèi)建方法需要?jiǎng)?chuàng)建。所以,對(duì)大多數(shù)轉(zhuǎn)換,表格和它們的列的聲明是公共的,然而,關(guān)于這些表格,可獲得的方法的聲明會(huì)針對(duì)各輸入系統(tǒng)而改變。接下來(lái),創(chuàng)建針對(duì)輸出語(yǔ)言的文件類(lèi)78。文件,像數(shù)據(jù)庫(kù)表,的聲明是相當(dāng)標(biāo)準(zhǔn)化的,但是可能需要增加輸入語(yǔ)言特定(input-language-specific)的方法。創(chuàng)建針對(duì)輸出語(yǔ)言的任意重復(fù)屏幕表格(R印eatingScreenTable)的類(lèi)80。如果使用了BSD配置,則不需要本步驟_然而,對(duì)于任何運(yùn)行的系統(tǒng),明確地需要這些類(lèi)。重復(fù)屏幕表格_除非已知為在屏幕上顯示的可滾動(dòng)的子文件_很難進(jìn)行轉(zhuǎn)換。每種輸入語(yǔ)言都有定義和處理這些項(xiàng)目的不同方式。一些語(yǔ)言明確地檢查并處理每一行;在其它語(yǔ)言中,每一行都是由系統(tǒng)暗中處理的。當(dāng)前,創(chuàng)建類(lèi)來(lái)匹配這些重復(fù)記錄,對(duì)于輸入語(yǔ)言是極其特定的。然后創(chuàng)建報(bào)告82,這些報(bào)告包括輸出語(yǔ)言的報(bào)告XML數(shù)據(jù)和輸出語(yǔ)言的報(bào)告格式。接下來(lái),寫(xiě)出輸出語(yǔ)言所需要的聲明信息84。程序被劃分為兩部分聲明信息和可執(zhí)行邏輯。聲明信息存儲(chǔ)在知識(shí)庫(kù)中,可執(zhí)行代碼存儲(chǔ)在樹(shù)格式(作為知識(shí)庫(kù)中的BLOB)中。使用知識(shí)庫(kù)信息為每個(gè)程序/模塊寫(xiě)出聲明信息,且以輸出語(yǔ)言期望的方式寫(xiě)出。每種輸入語(yǔ)言具有不同的內(nèi)建函數(shù)和不同的系統(tǒng)變量等,因此,當(dāng)寫(xiě)出輸出語(yǔ)言時(shí),必需繼承不同的基本類(lèi)。由此,在每個(gè)輸出程序的頂端,各輸入語(yǔ)言需要不同的聲明。生成針對(duì)輸出語(yǔ)言的程序邏輯86。這通常是轉(zhuǎn)換的最容易的部分。樹(shù)遍歷器已將代碼模塊化為輸出語(yǔ)言解析器可以處理的內(nèi)容。配置器只是走下樹(shù),并寫(xiě)出它所看到的。接下來(lái),生成BSD樹(shù)88。根據(jù)保持在知識(shí)庫(kù)中的聲明數(shù)據(jù)(DeclarationData)生成BSD巡戈樹(shù)(BSDNavigationtree)。該進(jìn)程可以基于COBOL風(fēng)格的知識(shí)庫(kù)而運(yùn)行。由BSD解析器生成的代碼中具有需要的所有信息,但是沒(méi)有格式化。BSD進(jìn)程的最后步驟是仔細(xì)檢查所有生成的代碼,并將其布置為可在恥b瀏覽器中查看的代碼90。接下來(lái),生成所有輸入代碼的HTML化的版本92,內(nèi)含BSD。進(jìn)程僅將所有的文本代碼作為輸入,并將它們顯示為HTML屏幕。最后,重復(fù)步驟38至90,直到實(shí)現(xiàn)轉(zhuǎn)換目標(biāo)。圖3中示出的轉(zhuǎn)換引擎包括使用特殊軟件工具的多個(gè)進(jìn)程。對(duì)于整個(gè)轉(zhuǎn)換進(jìn)程,可以認(rèn)為這些工具或組元是通用的,它們由特定的進(jìn)程調(diào)用來(lái)實(shí)現(xiàn)應(yīng)用程序的轉(zhuǎn)換。現(xiàn)在將詳細(xì)描述標(biāo)準(zhǔn)樹(shù)。首先,樹(shù)結(jié)構(gòu)存儲(chǔ)關(guān)于應(yīng)用程序的信息。必需對(duì)語(yǔ)言的每個(gè)組元進(jìn)行識(shí)別并定義。通過(guò)將各組元減少到其基本含義,本發(fā)明能夠增大語(yǔ)言中的句法區(qū)別,并將各語(yǔ)言變成通用的形式。在標(biāo)準(zhǔn)樹(shù)上記錄有兩種完全不同類(lèi)型的信息今包括所有被命名的項(xiàng)目(例如程序、變量、函數(shù)、命名的循環(huán)、段落等)的聲明信息,以及該項(xiàng)目可能具有的所有屬性(長(zhǎng)度、作用域、可見(jiàn)性、英文名稱、描述等)。已對(duì)各項(xiàng)目的每個(gè)可能的屬性進(jìn)行了定義,因此標(biāo)準(zhǔn)挖掘器進(jìn)程能夠檢索所有相關(guān)的信息,并將其存儲(chǔ)到知識(shí)庫(kù)中。16今邏輯包括組成程序的可執(zhí)行段的實(shí)際語(yǔ)句。每個(gè)語(yǔ)句類(lèi)型已進(jìn)行了識(shí)別,并將語(yǔ)句的結(jié)構(gòu)映射到樹(shù)中。是語(yǔ)句節(jié)點(diǎn)的結(jié)構(gòu)以及節(jié)點(diǎn)類(lèi)型和節(jié)點(diǎn)文本記錄了所需的信息。例如,參考圖4,在IF語(yǔ)句節(jié)點(diǎn)之下總是有帶著"IF"的節(jié)點(diǎn)文本(Node-text)的條件節(jié)點(diǎn)。還可以可選地具有帶著"IF"的節(jié)點(diǎn)文本的動(dòng)作節(jié)點(diǎn)(Actionnode),且可選地具有帶著"ELSE"的節(jié)點(diǎn)文本的動(dòng)作節(jié)點(diǎn)。節(jié)點(diǎn)結(jié)構(gòu)各節(jié)點(diǎn)具有以下屬性。今節(jié)點(diǎn)類(lèi)型(NodeType)該屬性表明該節(jié)點(diǎn)是IF語(yǔ)句(IF_STMT)節(jié)點(diǎn),還是變量聲明(VARIABLE—DECLARATION)節(jié)點(diǎn)等。節(jié)點(diǎn)類(lèi)型控制節(jié)點(diǎn)本身的結(jié)構(gòu)。例如,具有IF_STMT的類(lèi)型的所有節(jié)點(diǎn)必需符合以上所示出的結(jié)構(gòu)。今節(jié)點(diǎn)文本(NodeText)節(jié)點(diǎn)文本存儲(chǔ)有關(guān)節(jié)點(diǎn)的第二信息。有時(shí)節(jié)點(diǎn)文本充當(dāng)子類(lèi)型一例如,ACTION可以是"IF"動(dòng)作,或"ELSE"動(dòng)作等。在其它時(shí)候,節(jié)點(diǎn)文本充當(dāng)?shù)皆凑Z(yǔ)言的鏈接。例如,在語(yǔ)言LINC中,IF_STMT編碼為"DoWhenx=10...Code...End"在這種情況下,IF_STMT節(jié)點(diǎn)具有"DoWhen"的文本。今行號(hào)(LineNumber)這是來(lái)自輸入的源語(yǔ)言的行號(hào)。其可用于將樹(shù)結(jié)構(gòu)向后聯(lián)系到輸入源語(yǔ)言,特別是在調(diào)試時(shí)使用。為了編碼的目的,各節(jié)點(diǎn)是為本發(fā)明所開(kāi)發(fā)的標(biāo)準(zhǔn)節(jié)點(diǎn)的例子。該標(biāo)準(zhǔn)節(jié)點(diǎn)類(lèi)包含以上列出的所有屬性,增加將該節(jié)點(diǎn)鏈接到樹(shù)所需要的屬性-父標(biāo)識(shí)(ParentID)、子標(biāo)識(shí)(ChildID)等。除此之外,標(biāo)準(zhǔn)節(jié)點(diǎn)類(lèi)包含有助于樹(shù)遍歷和配置進(jìn)程的方法。下面解釋標(biāo)準(zhǔn)節(jié)點(diǎn)。標(biāo)準(zhǔn)節(jié)點(diǎn)(StandardNode)標(biāo)準(zhǔn)節(jié)點(diǎn)是用于模仿標(biāo)準(zhǔn)樹(shù)(StandardTree)上的各個(gè)節(jié)點(diǎn)的類(lèi)的名稱。其包含今帶有關(guān)于特定節(jié)點(diǎn)的信息的若干個(gè)屬性;今將該節(jié)點(diǎn)鏈接到樹(shù)中正確位置的若干個(gè)屬性;今用于獲取與該節(jié)點(diǎn)有關(guān)的信息或?qū)υ摴?jié)點(diǎn)進(jìn)行操作的若干個(gè)方法。標(biāo)準(zhǔn)節(jié)點(diǎn)包含以下屬性今節(jié)點(diǎn)類(lèi)型_例如IF_STMT;今行號(hào)(是指來(lái)自輸入源代碼的行);今標(biāo)志-其可由樹(shù)遍歷器設(shè)置,以表示必須對(duì)該節(jié)點(diǎn)進(jìn)行修改;今標(biāo)識(shí)(ID)以及今ParentID、ChildID、左兄弟節(jié)點(diǎn)標(biāo)識(shí)(LeftSiblingID)和右兄弟節(jié)點(diǎn)標(biāo)識(shí)(RightSiblingID),以便將該節(jié)點(diǎn)鏈接到樹(shù)中的位置。標(biāo)準(zhǔn)節(jié)點(diǎn)包括方法_即每個(gè)節(jié)點(diǎn)知道如何進(jìn)行以下處理一例如今獲取下一兄弟;今獲取父;今獲取第一子;今使用特定的類(lèi)型或文本或兩者,查找第一子節(jié)點(diǎn);今使用特定的類(lèi)型或文本或兩者,查找第一父節(jié)點(diǎn);今使用所有鏈接制作自身的拷貝;今使用所有向下鏈接(lowerlink)制作自身的拷貝;今從樹(shù)中移除自身;今使用另一個(gè)替換樹(shù)中的自身;今增加新的子或兄弟標(biāo)準(zhǔn)節(jié)點(diǎn);今增加新的子或兄弟節(jié)點(diǎn)QS,并向新的標(biāo)準(zhǔn)節(jié)點(diǎn)傳輸控制;今查找第一非注釋的子或兄弟節(jié)點(diǎn)。當(dāng)創(chuàng)建轉(zhuǎn)換樹(shù)遍歷器或樹(shù)挖掘器時(shí),幾乎普遍使用這些方法。每個(gè)節(jié)點(diǎn)類(lèi)型所固有的是其節(jié)點(diǎn)結(jié)構(gòu)。例如,IF_STMT結(jié)構(gòu)是其必須有條件(CONDITION)節(jié)點(diǎn),并且能夠可選地具有兩個(gè)動(dòng)作(ACTION)節(jié)點(diǎn)。以文本文件的形式存儲(chǔ)該節(jié)點(diǎn)結(jié)構(gòu)。是該結(jié)構(gòu)的知識(shí)使得該系統(tǒng)能夠?qū)?jié)點(diǎn)進(jìn)行操作,并對(duì)樹(shù)進(jìn)行遍歷??赡軐?duì)標(biāo)準(zhǔn)節(jié)點(diǎn)進(jìn)行擴(kuò)展,使其具有對(duì)各節(jié)點(diǎn)類(lèi)型特定的節(jié)點(diǎn)類(lèi)。這將影響變量(Variable)節(jié)點(diǎn),例如,存儲(chǔ)只對(duì)變量特定的信息,并包含僅對(duì)變量適用的方法。在這種情況下,變量節(jié)點(diǎn)類(lèi)型會(huì)知道變量可接受的結(jié)構(gòu)。而且,可能對(duì)標(biāo)準(zhǔn)節(jié)點(diǎn)進(jìn)行擴(kuò)展,從而可以將更多的轉(zhuǎn)換(Transformation)信息附加到該節(jié)點(diǎn)一例如"這一個(gè)可能是去拷貝(deduplication)的候選",或"該方法是從三個(gè)位置引用的",等?,F(xiàn)在將對(duì)基于代碼處理標(biāo)準(zhǔn)樹(shù)的一個(gè)實(shí)例進(jìn)行描述。大多數(shù)解析器只識(shí)別在語(yǔ)言中使用的詞和符號(hào),且將它們放入樹(shù)格式一語(yǔ)法樹(shù)。當(dāng)生成該樹(shù)時(shí),這些解析器不使用任何智能一它們僅輸出它們所看到的。另一方面,本發(fā)明的解析器在建立樹(shù)時(shí),向該解析器嵌入了一些智能。本發(fā)明的解析器既能識(shí)別語(yǔ)言的詞和符號(hào),還能進(jìn)行以下處理將這些符號(hào)轉(zhuǎn)換為標(biāo)準(zhǔn)定義,確定項(xiàng)目在語(yǔ)言中的那個(gè)位置所起的作用,并在樹(shù)上創(chuàng)建額外的元素,以便用符號(hào)表示概念。為了說(shuō)明解析器的以上處理,考慮以下C代碼片段的例子,并比較可根據(jù)該代碼創(chuàng)建的兩個(gè)樹(shù)由免費(fèi)獲得的C解析器生成的語(yǔ)法樹(shù)和由本發(fā)明的解析器創(chuàng)建的標(biāo)準(zhǔn)樹(shù)。Varl+=abc.曹X氺2;calculate(varl);圖5示出了由標(biāo)準(zhǔn)C解析器建立的語(yǔ)法樹(shù)。對(duì)第一語(yǔ)句的子樹(shù)進(jìn)行了充分?jǐn)U展。而沒(méi)有對(duì)第二語(yǔ)句的子樹(shù)進(jìn)行擴(kuò)展。關(guān)于該樹(shù),注意以下幾項(xiàng)盡管兩個(gè)語(yǔ)句是很不同的語(yǔ)句,但是都開(kāi)始于相同的節(jié)點(diǎn)nSatementE鄧r。在C代碼中已出現(xiàn)過(guò)的符號(hào)照依原樣_例如STAR和D0T。沒(méi)有關(guān)于這些符號(hào)實(shí)際上表示什么的暗示。除非a.你知道該樹(shù)表示C程序,并且b.你了解C語(yǔ)言,否則該樹(shù)的結(jié)構(gòu)基本上是無(wú)意義的。通過(guò)比較,本發(fā)明的解析器創(chuàng)建對(duì)語(yǔ)言的每個(gè)組元進(jìn)行標(biāo)識(shí)和解釋的標(biāo)準(zhǔn)樹(shù),且不管輸入的源語(yǔ)言是C或RPG或其它,該標(biāo)準(zhǔn)樹(shù)的子樹(shù)都具有相同的格式。為了創(chuàng)建這樣的標(biāo)準(zhǔn)樹(shù),解析器必須具有輸入語(yǔ)言的每個(gè)組元的知識(shí)。圖6基于樣本C代碼示出該處理的第一步。接下來(lái),創(chuàng)建該解析器的人將這些語(yǔ)句映射為標(biāo)準(zhǔn)樹(shù)格式,以確定應(yīng)該為每個(gè)組元?jiǎng)?chuàng)建什么類(lèi)型的子樹(shù)。該格式對(duì)于所有的語(yǔ)言是標(biāo)準(zhǔn)的,從而使其與源語(yǔ)言最初是表述為Var+=abc.曹X氺2還是Add(2村arXofabc)toVarl都無(wú)關(guān)。一旦將該語(yǔ)言映射到標(biāo)準(zhǔn)樹(shù)格式,則正在寫(xiě)解析器的人就保證創(chuàng)建的樹(shù)與標(biāo)準(zhǔn)樹(shù)所需的樹(shù)相匹配。得到的標(biāo)準(zhǔn)樹(shù)如圖7所示。此時(shí),可以以多種方式使用該標(biāo)準(zhǔn)樹(shù)。由于對(duì)所有的組元進(jìn)行了命名,因此易于實(shí)現(xiàn)分析。例如,通常必需查找變量在代碼中設(shè)置的所有位置。這可以通過(guò)查找在目標(biāo)節(jié)點(diǎn)(Targetnode)之下出現(xiàn)的所有變量節(jié)點(diǎn)來(lái)實(shí)現(xiàn)。易于實(shí)現(xiàn)增強(qiáng)。通過(guò)多次遍歷標(biāo)準(zhǔn)樹(shù),將信息存儲(chǔ)于知識(shí)庫(kù)中,并檢索知識(shí)庫(kù)中的信息,可以將信息添加到樹(shù)上,或在樹(shù)上移動(dòng)信息。例如,可以將額外的信息,例如變量的類(lèi)型或變量長(zhǎng)度,增加到變量節(jié)點(diǎn)上_這些信息是存儲(chǔ)在知識(shí)庫(kù)中的信息。也易于實(shí)現(xiàn)到另一種語(yǔ)言的配置。各語(yǔ)言配置器知道如何以其目標(biāo)語(yǔ)言寫(xiě)出賦值語(yǔ)句。知識(shí)庫(kù)(R印ository)知識(shí)庫(kù)的目的是令獲取應(yīng)用程序的所有聲明元素;今存儲(chǔ)所有可執(zhí)行代碼及擁有這些可執(zhí)行代碼的聲明項(xiàng)目;令存儲(chǔ)不同聲明項(xiàng)目之間的關(guān)系;今激活數(shù)據(jù)的分析;令記錄針對(duì)工程的元數(shù)據(jù)。為此目的,在知識(shí)庫(kù)中存儲(chǔ)三種類(lèi)型的信息(i)聲明數(shù)據(jù)(DeclarativeData);(ii)分析數(shù)據(jù)(AnalyticalData)以及(iii)元數(shù)據(jù)(Metadata)。(i)聲明數(shù)據(jù)聲明項(xiàng)目可以是程序、或變量、或屏幕等。所有聲明數(shù)據(jù)可以具有與其關(guān)聯(lián)的可執(zhí)行代碼(對(duì)變量的初始化代碼;對(duì)屏幕的合法化代碼;針對(duì)程序的邏輯),以及在應(yīng)用程序中,所有內(nèi)容都必定與某些其它內(nèi)容有某種聯(lián)系-例如,程序可能擁有變量,以及程序可能引用另一程序。所有聲明項(xiàng)目被稱作對(duì)象。它們都存儲(chǔ)在稱作對(duì)象節(jié)點(diǎn)(ObjectNode)的數(shù)據(jù)庫(kù)表中。有些內(nèi)容是所有聲明項(xiàng)目所共有的,例如名稱和類(lèi)型。對(duì)于所有聲明項(xiàng)目來(lái)說(shuō)為公共的內(nèi)容存儲(chǔ)在對(duì)象節(jié)點(diǎn)表格中,即輸入名稱(I即utName)、目標(biāo)名稱(TargetName)、EnglishName(英文名稱)等。將附到該項(xiàng)目的所有可執(zhí)行邏輯都作為語(yǔ)法樹(shù)存儲(chǔ)在該表格中。由于大多數(shù)語(yǔ)言允許存在相同名稱的多個(gè)項(xiàng)目(例如,如果它們?cè)诓煌膸?kù)或路徑中),因此所有表格,包括對(duì)象節(jié)點(diǎn)表格,都由對(duì)象節(jié)點(diǎn)標(biāo)識(shí)(ObjectNodeld)來(lái)標(biāo)識(shí)。對(duì)象節(jié)點(diǎn)必定是幾種不同類(lèi)型中的一種,這幾種類(lèi)型包括模塊(程序、函數(shù)、方法、段落等)、變量、屏幕、文件、表格、報(bào)告等。在這些表中存儲(chǔ)與特定對(duì)象節(jié)點(diǎn)類(lèi)型相關(guān)的所有詳情一例如,變量表存儲(chǔ)了輸入數(shù)據(jù)類(lèi)型(InputDataType)和目標(biāo)數(shù)據(jù)類(lèi)型(TargetDataType)。不同對(duì)象節(jié)點(diǎn)之間的關(guān)系由對(duì)象節(jié)點(diǎn)關(guān)系表(ONR)來(lái)表示。ONR表存儲(chǔ)了所有交叉引用及它們的類(lèi)型。例如,該關(guān)系是擁有者(OWNER)關(guān)系(在沒(méi)有擁有者的情況下,被擁有的對(duì)象是不存在的)還是引用關(guān)系(這兩個(gè)對(duì)象可以在對(duì)方不存在的情況下存在,但是可互相引用)?知識(shí)庫(kù)被設(shè)計(jì)為記錄任一聲明項(xiàng)目的所有屬性。然而,通常在新的語(yǔ)言中,有些不被充分理解或看起來(lái)不相關(guān)的屬性。這些屬性仍然要記錄,但是由于它們不符合我們的任意一種標(biāo)準(zhǔn)屬性,所以沒(méi)有可以存儲(chǔ)它們的列。在這種情況下,將這些信息存儲(chǔ)在附到目標(biāo)節(jié)點(diǎn)表(ObjectNodetable)的額外詳情表(ExtraDetailstable)中。該額外詳情表僅存儲(chǔ)關(guān)鍵字、詳情及目標(biāo)節(jié)點(diǎn)所引用的Id。關(guān)于數(shù)據(jù)庫(kù)可獲得多種視圖,以便容易提取通常需要的信息,并使老式數(shù)據(jù)庫(kù)與該數(shù)據(jù)庫(kù)之間的過(guò)渡變得容易。例如,極普通的需求是查找應(yīng)用程序中的所有方法。為了從表中選擇這些信息,需要目標(biāo)節(jié)點(diǎn)與模塊之間有關(guān)聯(lián),以便查找程序模塊(ProgramModule);需要從程序模塊到引用的關(guān)聯(lián),然后需要從程序模塊返回到目標(biāo)節(jié)點(diǎn)和模塊的關(guān)聯(lián),以便找到方法模塊。這已經(jīng)由單一觀點(diǎn),程序方法所替代。分析數(shù)據(jù)(AnalyticalData)分析表格(analyticaltable)用于記錄關(guān)于如何使用對(duì)象以及在哪里使用對(duì)象的信息。所存儲(chǔ)的分析數(shù)據(jù)包括引用一程序A調(diào)用程序X,以及程序A使用表格Z。這些表格可用于記錄更多的分析信息,以便正確分析變量的使用、數(shù)據(jù)類(lèi)型、代碼拷貝等。該分析信息包括今變量在何處使用或被賦值;今何時(shí)出現(xiàn)沒(méi)有被賦值的待審計(jì)的變量;今何種不同類(lèi)型的引用被傳遞到程序/函數(shù);今在何處對(duì)表格進(jìn)行更新/讀取以及今在何處對(duì)文件進(jìn)行更新/讀取。(ii)元數(shù)據(jù)現(xiàn)在,知識(shí)庫(kù)中有兩個(gè)元數(shù)據(jù)表數(shù)據(jù)類(lèi)型轉(zhuǎn)換表(DataTypeTranslationtable)針對(duì)所有語(yǔ)言,存儲(chǔ)關(guān)于所有20數(shù)據(jù)類(lèi)型的信息。作用域內(nèi)項(xiàng)目表(InScopeltemtable)控制由哪一個(gè)任務(wù)來(lái)處理哪一個(gè)對(duì)象。元數(shù)據(jù)能夠記錄元數(shù)據(jù)中的能夠驅(qū)動(dòng)進(jìn)程的所有信息。信息訪問(wèn)禾口修改(InformationAccessandModification)下面的工具使用了信息存儲(chǔ)組元的唯一結(jié)構(gòu)。對(duì)知識(shí)庫(kù)進(jìn)行訪問(wèn)(AccessingtheR印ository)很明顯,有訪問(wèn)知識(shí)庫(kù)的兩種方法人工或程序化。人工訪問(wèn)知識(shí)庫(kù)實(shí)際上只適合于實(shí)現(xiàn)選擇,或用于實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)更新。數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)化水平以及自動(dòng)生成的ID的使用意味著很難通過(guò)人工SQL語(yǔ)句向數(shù)據(jù)庫(kù)表中插入信息。已在數(shù)據(jù)庫(kù)中創(chuàng)建了大量的視圖,從而使人工查詢易于管理。程序化地訪問(wèn)數(shù)據(jù)庫(kù)很容易。當(dāng)使用類(lèi)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),重要的是理解類(lèi)和數(shù)據(jù)庫(kù)表之間的關(guān)系。數(shù)據(jù)庫(kù)中的各個(gè)表由類(lèi)表示。每個(gè)類(lèi)知道如何自動(dòng)保存/更新/刪除自身,以及如何處理任何結(jié)果錯(cuò)誤。已經(jīng)在每個(gè)類(lèi)中提供了方法,以使程序員能夠容易地表示"該變量是由那個(gè)程序所擁有的"等。然而,還不止這些,每個(gè)類(lèi)可以控制多個(gè)表格。知識(shí)庫(kù)類(lèi)層次結(jié)構(gòu)示于圖8中,其中數(shù)據(jù)庫(kù)表是較小的框,類(lèi)是較大的框。模塊類(lèi)不僅可以控制模塊表格,還可以控制對(duì)象節(jié)點(diǎn)表。這對(duì)于所有聲明項(xiàng)目表格、變量、屏幕、模塊、文件、記錄都是正確的。表示這些項(xiàng)目的每個(gè)類(lèi)能夠控制對(duì)對(duì)象節(jié)點(diǎn)表、額外詳情表和描述表的訪問(wèn)。此外,變量類(lèi)(Variableclass)還能夠控制對(duì)修正器表(Modifiertable)和矩陣維度表(ArrayDimensiontable)的訪問(wèn)。變量類(lèi)中的一個(gè)單一方法能夠更新/插入/刪除這些表中的行。知識(shí)庫(kù)數(shù)據(jù)訪問(wèn)對(duì)象(DAO,R印ositoryDataAccess0bject)類(lèi)對(duì)大量的通用SQL進(jìn)行壓縮,且可以由程序員獲得并使用。通常,這些SQL為以下格式今檢索/插入/更新/刪除所有行(Retrieve/insert/update/deleteallrows)今檢索/插入/更新/刪除具有特定ID的行(Retrieve/insert/update/deletetherowwithaspecificID)今檢索/插入/更新/刪除具有特定輸入名稱的行(Retrieve/insert/update/deleteallrowswithaspecificInputName).樹(shù)遍歷器"樹(shù)遍歷器"是給遍歷標(biāo)準(zhǔn)樹(shù)并實(shí)施指定的任務(wù)_通常以某種方式轉(zhuǎn)換該樹(shù)_的一組進(jìn)程的通用名稱。樹(shù)遍歷器對(duì)于單個(gè)任務(wù)是極特定的-例如,一個(gè)樹(shù)遍歷器可以解析GOTO語(yǔ)句,另一個(gè)樹(shù)遍歷器可以限定變量名稱,等。樹(shù)遍歷器可被寫(xiě)為以下任一種今對(duì)輸入語(yǔ)言是特定的,在有輸入語(yǔ)言特色的樹(shù)上工作;今對(duì)輸入語(yǔ)言是特定的,在通用樹(shù)上工作或令通用的。對(duì)于任一轉(zhuǎn)換,經(jīng)常需要從樹(shù)遍歷器的所有三種類(lèi)型中進(jìn)行選擇。盡管事實(shí)是他們作用于不同的樹(shù),但是,每個(gè)樹(shù)遍歷器在結(jié)構(gòu)上基本相同。每個(gè)樹(shù)遍歷器擴(kuò)展了一稱作遍歷器的類(lèi),并具有稱作遍歷(walk)的基本方法。樹(shù)遍歷器本身并不是主程序,而是由另一程序調(diào)用的,該程序?qū)⒋蓸?shù)遍歷器轉(zhuǎn)換的樹(shù)傳遞給樹(shù)遍歷器。各個(gè)樹(shù)遍歷器遞歸向下經(jīng)過(guò)樹(shù)結(jié)構(gòu),同時(shí)檢查每個(gè)節(jié)點(diǎn),直到發(fā)現(xiàn)感興趣的一個(gè)節(jié)點(diǎn)。當(dāng)樹(shù)遍歷器發(fā)現(xiàn)感興趣的節(jié)點(diǎn),就馬上針對(duì)該特定節(jié)點(diǎn)執(zhí)行必要的動(dòng)作,并繼續(xù)前進(jìn)。各個(gè)樹(shù)遍歷器會(huì)向調(diào)用程序返回新的轉(zhuǎn)換后的樹(shù)??梢愿鶕?jù)需要將樹(shù)遍歷器寫(xiě)成特定的或通用的。它們可以完成的任務(wù)小到改變函數(shù)的名稱,大到對(duì)節(jié)點(diǎn)的部分進(jìn)行完全重新排序,或創(chuàng)建新的節(jié)點(diǎn)。樹(shù)上的每個(gè)節(jié)點(diǎn)為標(biāo)準(zhǔn)節(jié)點(diǎn)的例子,每個(gè)節(jié)點(diǎn)可以是另一子樹(shù)的根。樹(shù)遍歷器以下列四種方式中的一種,在樹(shù)上巡弋并進(jìn)行必要的修改今通過(guò)使用在任一標(biāo)準(zhǔn)節(jié)點(diǎn)上可獲得的方法_標(biāo)準(zhǔn)節(jié)點(diǎn);今根據(jù)特定節(jié)點(diǎn)類(lèi)型的固有結(jié)構(gòu)的編碼器的知識(shí);今通過(guò)使用節(jié)點(diǎn)助手(NodeHelper),該節(jié)點(diǎn)助手知道特定節(jié)點(diǎn)類(lèi)型的確切結(jié)構(gòu),并提供用于獲取信息和轉(zhuǎn)換該結(jié)構(gòu)的有用的方法;或今通過(guò)使用向標(biāo)準(zhǔn)節(jié)點(diǎn)增加功能性的任意一種搜索和檢索方法。該標(biāo)準(zhǔn)節(jié)點(diǎn)類(lèi)提供一些標(biāo)準(zhǔn)方法,供樹(shù)遍歷器使用。該標(biāo)準(zhǔn)節(jié)點(diǎn)包括巡弋樹(shù)遍歷器以及修改、創(chuàng)建或刪除新的節(jié)點(diǎn)和子樹(shù)所需的所有方法。對(duì)于所有不同的節(jié)點(diǎn)類(lèi)型,這些方法是標(biāo)準(zhǔn)的。由此帶來(lái)的問(wèn)題是,盡管每個(gè)節(jié)點(diǎn)有多種方法,但他們都是極通用的。沒(méi)有標(biāo)準(zhǔn)節(jié)點(diǎn)知道他的子樹(shù)結(jié)構(gòu)應(yīng)該像什么。例如,正如上面所述的每個(gè)單一節(jié)點(diǎn)類(lèi)型具有特定的結(jié)構(gòu)。通用節(jié)點(diǎn)類(lèi)不知道特定類(lèi)型的結(jié)構(gòu),因此無(wú)法提供基于該結(jié)構(gòu)的方法。例如,通用類(lèi)不會(huì)知道如果節(jié)點(diǎn)類(lèi)型是IF—STMT,那么預(yù)期在該節(jié)點(diǎn)下有1個(gè)條件(CONDITION)節(jié)點(diǎn)和可選的兩個(gè)動(dòng)作(ACTION)節(jié)點(diǎn)。樹(shù)遍歷器以下面兩種方式中的一種克服了這個(gè)問(wèn)題-或通過(guò)將該結(jié)構(gòu)編碼為樹(shù)遍歷器,或使用Helper。如果編碼樹(shù)遍歷器的人知道任意給定的節(jié)點(diǎn)類(lèi)型的結(jié)構(gòu),則他們能夠相應(yīng)地進(jìn)行編碼。大多樹(shù)遍歷器已被寫(xiě)為對(duì)具體的節(jié)點(diǎn)結(jié)構(gòu)進(jìn)行預(yù)期。然而,有時(shí)節(jié)點(diǎn)知道自身的結(jié)構(gòu)并具有對(duì)具體節(jié)點(diǎn)類(lèi)型所特定的方法是有用的。例如,在調(diào)用模塊表述(InvokeModuleE鄧ression)中(除非已知為函數(shù)調(diào)用),樹(shù)遍歷器可能想獲取所有參數(shù)的列表,或?qū)?shù)的數(shù)目進(jìn)行計(jì)數(shù),等。這些方法對(duì)調(diào)用模塊表述是特定的,所以在標(biāo)準(zhǔn)節(jié)點(diǎn)中還沒(méi)有實(shí)現(xiàn)。助手的概念是它提供特定的節(jié)點(diǎn),并提供轉(zhuǎn)換該節(jié)點(diǎn)必需的所有方法。助手節(jié)點(diǎn)確切地知道特定節(jié)點(diǎn)的結(jié)構(gòu)必定像什么。此時(shí),樹(shù)遍歷器必須知道節(jié)點(diǎn)的類(lèi)型,以便確定調(diào)用哪個(gè)助手。可替換地,助手廠商(HelperFactory)將著眼于任一節(jié)點(diǎn),并提供帶有正確的助手的樹(shù)遍歷器。除此之外,定義了額外的樹(shù)巡弋和搜索類(lèi)。這些可使用在更特定的轉(zhuǎn)換中,例如0S2C到WindowsC的轉(zhuǎn)換。樹(shù)遍歷器既使用助手,還使用可在標(biāo)準(zhǔn)節(jié)點(diǎn)類(lèi)中獲得的標(biāo)準(zhǔn)方法,在樹(shù)上移動(dòng)數(shù)據(jù),并對(duì)該結(jié)構(gòu)和內(nèi)容進(jìn)行修改。另外,它們可以針對(duì)關(guān)于命名的項(xiàng)目的額外信息,查詢知識(shí)庫(kù)。如果解析器不能創(chuàng)建標(biāo)準(zhǔn)樹(shù)格式,或如果需要闡明挖掘器所需要的信息,那么樹(shù)遍歷器只被應(yīng)用于輸入處理。一般來(lái)說(shuō),在輸入側(cè),最好是能保持代碼與其輸入語(yǔ)言盡可能22的相似。在轉(zhuǎn)換側(cè)是所有的其它樹(shù)遍歷器_增強(qiáng)遍歷器和轉(zhuǎn)換遍歷器。以下是現(xiàn)有的樹(shù)遍歷器的列表,以及它們所做工作的簡(jiǎn)單描述Common_Goto_ExitName_Walker搜索僅前進(jìn)到模塊的退出點(diǎn)(exit-point)的所有GOTO語(yǔ)句,并將這些語(yǔ)句變換為RETURN_STMT。Common—ModuleComment—Walker搜索直接位于模塊聲明之前的所有注釋塊。假設(shè)這些注釋實(shí)際上是描述該模塊的,所以同樣將它們附到該模塊Common—PromoteIMEName_Wa1ker提取調(diào)用模塊表述(InvokeModuleExpression)節(jié)點(diǎn)aME),并根據(jù)提供的列表檢查它們的名稱。如果該頂E名稱在列表中,則將指定的參數(shù)增加為名稱的一部分。這有效地從格式方面改變了頂E,例如從write(myFile,"hello")改變?yōu)閙yFile.write("hello")CommonG0T0Wa1kers試著以任意種方式解析GOTO語(yǔ)句Common—ModuleOutOfScope—Walker查找對(duì)不在作用域中的程序的所有調(diào)用,并使用調(diào)用框架方法替換它們,將錯(cuò)誤記入日志。這在J肌a轉(zhuǎn)換中使用,所以如果代碼試著調(diào)用不在作用域中的程序,則將錯(cuò)誤記入日志。Common—RemoveMainAction_Wa1ker很多輸入語(yǔ)言沒(méi)有附在程序中的"main"代碼-相反,所有的代碼包括在方法中。這是4GL的典型,4GL應(yīng)用程序固有地知道首先調(diào)用哪個(gè)方法,所以在代碼中沒(méi)有執(zhí)行實(shí)際的調(diào)用。該遍歷器查找空的程序動(dòng)作(ProgramAction),并刪除它們。23Common_Goto_ExitName_Walker搜索僅前進(jìn)到模塊的退出點(diǎn)(exit-point)的所有GOTO語(yǔ)句,并將這些語(yǔ)句變換為RETURN_STMT。Common—ReverseQualifiedName—Walker合格的名稱是給出關(guān)系A(chǔ).B或A的B的詞。合格名稱(QUALIFIED_NAME)節(jié)點(diǎn)的結(jié)構(gòu)需要第一個(gè)NAME節(jié)點(diǎn)是第二個(gè)NAME節(jié)點(diǎn)的擁有者。然而,有時(shí)這在解析過(guò)程中不容易實(shí)現(xiàn)。所以,在解析輸入語(yǔ)言的過(guò)程中,當(dāng)合格名稱節(jié)點(diǎn)雜亂無(wú)序地出現(xiàn)時(shí),使用該遍歷器。Common_Se1fAssignment_Walker這是增加類(lèi)型遍歷器。其查找數(shù)學(xué)等式的所有例子,其中也在該計(jì)算(例如,X=X+l)中使用TARGET,且將它們變換為X+=1的格式。可以使用在任何語(yǔ)言中。其它遍歷器可以對(duì)輸入語(yǔ)言是特定的。在一些例子中,已經(jīng)開(kāi)發(fā)了對(duì)節(jié)點(diǎn)進(jìn)行簡(jiǎn)化的樹(shù)遍歷器。例如,可能有經(jīng)常執(zhí)行的兩行、三行或更多行代碼的組,這些代碼實(shí)際上應(yīng)該被轉(zhuǎn)換為函數(shù)或轉(zhuǎn)換為不同類(lèi)型的語(yǔ)句。這種樹(shù)遍歷器對(duì)于語(yǔ)言是極特定的。可替換地,遍歷器可以被寫(xiě)為提取代碼模式的列表和替換代碼模式的列表,并且自動(dòng)進(jìn)行這些類(lèi)型的轉(zhuǎn)換。以下是增強(qiáng)遍歷器的簡(jiǎn)單描述BooleanVariableCheck(布爾變量檢查)當(dāng)輸入語(yǔ)言沒(méi)有布爾數(shù)據(jù)類(lèi)型時(shí),在代碼中通常有像'IFX="TRUE",這樣表示的條件。其能夠修改為:使X為布爾類(lèi)型,并將比較轉(zhuǎn)換為"ifX"的表示。該樹(shù)遍歷器需要使用由變量使用挖掘器(VariableUsageMiner)禾口變量值挖掘器(VariableValueMiner)收集的信息。CommonCodePatternR印lacement(普通代碼模式替換)當(dāng)給定為輸入代碼模式(CodePattern)和替換代碼模式時(shí),樹(shù)遍歷器搜索代碼模式的所有例子,并進(jìn)行替換。代碼模式以標(biāo)準(zhǔn)樹(shù)的形式被接受。<table>tableseeoriginaldocumentpage25</column></row><table>樹(shù)操作工具(TreeManipulationTools)以樹(shù)格式存儲(chǔ)所有可執(zhí)行代碼。為了操作這些代碼,并將這些代碼轉(zhuǎn)換為期望的輸出,下面是用于輔助的多個(gè)特定方法。(i)節(jié)點(diǎn)助手節(jié)點(diǎn)助手是匹配節(jié)點(diǎn)類(lèi)型的類(lèi),知道節(jié)點(diǎn)的結(jié)構(gòu),且包含用于使用和轉(zhuǎn)換該節(jié)點(diǎn)的很多有用的方法。當(dāng)他們?cè)谝粋€(gè)地方保存了該節(jié)點(diǎn)的結(jié)構(gòu)的知識(shí)時(shí),節(jié)點(diǎn)助手尤其有用,所以可能容易地實(shí)現(xiàn)向該節(jié)點(diǎn)結(jié)構(gòu)的轉(zhuǎn)換。節(jié)點(diǎn)助手的例子是今NodeHelperME今NodeHelperVARIABLE—DEFINITION今NodeHelperPARAMTERS今NodeHelperMULTIPLE—DEFINITION(ii)節(jié)點(diǎn)穿行器(NodeTraverser):節(jié)點(diǎn)穿行器是以特定方式在樹(shù)上行進(jìn)的簡(jiǎn)單類(lèi)一或是從它們開(kāi)始的地方向上或向下,或是首先向深度前進(jìn),或是首先向兄弟節(jié)點(diǎn)前進(jìn)。通常這些穿行器在自身攜帶訪問(wèn)者(Visitor)類(lèi)。以這種方式想象該穿行器是走特定路線穿過(guò)樹(shù)的公共汽車(chē)。在每個(gè)節(jié)點(diǎn),公共汽車(chē)停下來(lái),訪問(wèn)者下來(lái),完成了他應(yīng)該完成的一些任務(wù),然后回到公共汽車(chē)上,并向下一節(jié)點(diǎn)行進(jìn)。這些穿行器的例子是今后代穿行器(DesendantTraverser)今祖先穿行器(AncestorTraverser)今樹(shù)穿行器(TreeTraverser)今兄弟穿行器(SiblingTraverser)(iii)如上所述的訪問(wèn)者,訪問(wèn)者是有任務(wù)要完成的類(lèi)。它們由穿行器攜帶著在樹(shù)上行進(jìn),并在每個(gè)節(jié)點(diǎn)完成它們的任務(wù)。通常訪問(wèn)者只檢查每個(gè)節(jié)點(diǎn),看該節(jié)點(diǎn)是否是它所感興趣的那個(gè)。如果是,則完成對(duì)它們進(jìn)行編碼時(shí)要求它們完成的所有任務(wù)。否則,訪問(wèn)者只繼續(xù)前進(jìn)。訪問(wèn)者可以創(chuàng)建為查找首個(gè)(FindFirst)訪問(wèn)者,一旦完成其任務(wù),則使公共汽車(chē)停下來(lái);和全查找(FindAll)訪問(wèn)者,其會(huì)一直前進(jìn)到線路的末端。(iv)過(guò)濾器(Filter):過(guò)濾器是檢查該節(jié)點(diǎn)是否是感興趣的節(jié)點(diǎn)的類(lèi)。通常,當(dāng)將訪問(wèn)者派遣到穿行器上時(shí),會(huì)為該訪問(wèn)者給定過(guò)濾器,如果該節(jié)點(diǎn)是應(yīng)該查看的,則該過(guò)濾器返回True,否則返回False。存在以下過(guò)濾器今類(lèi)型過(guò)濾器(TypeFilter):僅針對(duì)其被告知搜索的節(jié)點(diǎn)類(lèi)型,檢查節(jié)點(diǎn)類(lèi)型。令類(lèi)型文本過(guò)濾器(TypeTextFilter):針對(duì)其被告知搜索的節(jié)點(diǎn)類(lèi)型和節(jié)點(diǎn)的文本,檢查節(jié)點(diǎn)的類(lèi)型和節(jié)點(diǎn)的文本。(v)樹(shù)挖掘器(TreeMiner):—旦將輸入文本解析為標(biāo)準(zhǔn)樹(shù)格式,就可以從該標(biāo)準(zhǔn)樹(shù)檢索信息,并保存到知識(shí)庫(kù)中。執(zhí)行該處理的進(jìn)程稱作挖掘器。在知識(shí)庫(kù)中存儲(chǔ)了三種類(lèi)型的數(shù)據(jù)今聲明信息(DeclarativeInformation)今分析信息(AnalyticalInformation)今元數(shù)據(jù)。元數(shù)據(jù)被人工插入到數(shù)據(jù)庫(kù)中。聲明信息基本上是被命名的任何內(nèi)容的定義。該內(nèi)容可以是變量、程序、方法、屏墓坐帶寸。分析數(shù)據(jù)是關(guān)于任一對(duì)象的使用的詳情。通過(guò)挖掘器,將聲明數(shù)據(jù)和分析數(shù)據(jù)都載入到知識(shí)庫(kù)。挖掘器是基本上只反復(fù)向下經(jīng)過(guò)樹(shù)結(jié)構(gòu),直到找到感興趣的節(jié)點(diǎn)的程序-例如,變量定義(VariableDefinition)。一旦挖掘器找到感興趣的節(jié)點(diǎn),就盡其所能取到關(guān)于該節(jié)點(diǎn)的所有信息(挖掘器通常知道感興趣的節(jié)點(diǎn)的結(jié)構(gòu)),并將該信息保存到數(shù)據(jù)庫(kù)中??刂仆诰蚱鞯某绦驎?huì)保證項(xiàng)目被插入到作用域中的正確位置。也就是說(shuō),如果在程序中的方法中聲明了變量,則在數(shù)據(jù)庫(kù)中,該變量由該方法所擁有,該方法又由該程序所擁有?!銇?lái)說(shuō),一旦挖掘了來(lái)自聲明節(jié)點(diǎn)的信息,則將該信息從該樹(shù)上刪除。這是由于既在樹(shù)上存儲(chǔ)項(xiàng)目的定義,又在數(shù)據(jù)庫(kù)中存儲(chǔ)該項(xiàng)目的定義時(shí),會(huì)引起問(wèn)題。樹(shù)上的定義一旦被挖掘,就從樹(shù)上刪除,并且存儲(chǔ)在知識(shí)庫(kù)中的定義是經(jīng)修改和經(jīng)轉(zhuǎn)換的定義。如果該項(xiàng)目附有任何可執(zhí)行代碼(例如,程序和方法既有聲明信息,又有可執(zhí)行代碼),則以樹(shù)格式將該可執(zhí)行代碼與該項(xiàng)目一起存儲(chǔ)在知識(shí)庫(kù)中?!⑤斎胝Z(yǔ)言解析為標(biāo)準(zhǔn)樹(shù),則可以對(duì)其進(jìn)行挖掘。所有程序解析器(ProgramParsexxxx)類(lèi)都會(huì)調(diào)用基本挖掘類(lèi)(適當(dāng)?shù)孛麨橥诰蚱?,以便將最新解析的CN101770363A說(shuō)明書(shū)23/28頁(yè)程序保存到數(shù)據(jù)庫(kù)中。挖掘器會(huì)將該程序劃分為聲明部分和其可執(zhí)行部分,將該可執(zhí)行部分附到正確的聲明部分,并將它們都保存到知識(shí)庫(kù)。這意味著由聲明節(jié)點(diǎn)和邏輯節(jié)點(diǎn)組成的整個(gè)輸入樹(shù)被劃分為數(shù)據(jù)庫(kù)中的多個(gè)對(duì)象節(jié)點(diǎn)(ObjectNode)(每個(gè)程序一個(gè),每個(gè)方法一個(gè)),每個(gè)對(duì)象節(jié)點(diǎn)都附有其自身的邏輯樹(shù),如圖9所示。以下是不同類(lèi)型挖掘器的描述<table>tableseeoriginaldocumentpage27</column></row><table>情配置器(D印loyer)當(dāng)前,配置進(jìn)程包括轉(zhuǎn)換以及配置。每個(gè)目標(biāo)語(yǔ)言具有幾個(gè)獨(dú)立的配置器今變量配置器(variabled印loyer)今邏輯配置器今表格配置器今屏幕配置器今報(bào)告配置器今程序聲明配置器變量配置器、表格配置器和程序聲明配置器完全非除存儲(chǔ)在知識(shí)庫(kù)中的信息。它們載入待配置的項(xiàng)目及該項(xiàng)目所擁有的所有項(xiàng)目,并以目標(biāo)語(yǔ)言寫(xiě)出這些項(xiàng)目的聲明。依賴于初始輸入語(yǔ)言,這些進(jìn)程中的每一個(gè)有標(biāo)準(zhǔn)進(jìn)程和稍不同的進(jìn)程?!銇?lái)說(shuō),依據(jù)在接近每個(gè)轉(zhuǎn)換工程開(kāi)始時(shí)所創(chuàng)建的模板對(duì)這些進(jìn)程進(jìn)行編碼。屏幕配置器和報(bào)告配置器也排除知識(shí)庫(kù)。然而,由于目前沒(méi)有生成這些配置器的通用進(jìn)程,因此它們的格式不是標(biāo)準(zhǔn)的。所有的程序配置都被稱作配置引擎(D印loyEngine)的程序來(lái)運(yùn)行。該配置引擎進(jìn)行如下處理今從知識(shí)庫(kù)中讀取每個(gè)程序模塊的聲明信息;今創(chuàng)建每個(gè)程序模塊的新文件;今載入該模塊的作用域(即獲取該模塊可能使用的所有變量、函數(shù)等);令調(diào)用聲明寫(xiě)作器寫(xiě)出聲明;今獲取附到該模塊的邏輯樹(shù);今對(duì)樹(shù)應(yīng)用任一樹(shù)遍歷器;今調(diào)用邏輯寫(xiě)作器寫(xiě)出該程序模塊的可執(zhí)行代碼;以及今查找附到該模塊的所有子模塊(例如,所有方法、函數(shù)等),并針對(duì)這些子模塊重復(fù)以上的處理。程序邏輯配置器排除標(biāo)準(zhǔn)樹(shù)。使用稱作ANTLR的工具開(kāi)發(fā)程序配置器。邏輯配置器在對(duì)其給定的樹(shù)上前進(jìn),并一行接一行地寫(xiě)出代碼的各行。例如,當(dāng)其到達(dá)IF_STMT節(jié)點(diǎn)時(shí),Java邏輯配置器知道寫(xiě)出"if(",然后是條件,然后是"){",然后是動(dòng)作,然后是"}"。邏輯配置器到達(dá)實(shí)體名稱的任何時(shí)候,其使用該名稱在作用域表中查找該實(shí)體,以便確定該實(shí)體的目標(biāo)名稱和數(shù)據(jù)類(lèi)型。該配置通常使用項(xiàng)目的目標(biāo)名稱,從來(lái)不使用其輸入名稱。該進(jìn)程是由表述類(lèi)進(jìn)行處理的一對(duì)Java配置,表述類(lèi)是JavaE鄧ression類(lèi)。還存在運(yùn)算符類(lèi),因此處理每個(gè)運(yùn)算符類(lèi)型。邏輯配置器知道運(yùn)算符如何影響表述的類(lèi)型(例如表述數(shù)1小于數(shù)2將導(dǎo)致布爾類(lèi)型);且知道每個(gè)表述如何處理每個(gè)運(yùn)算符(例如X=Y,如果X為固定長(zhǎng)度的字符串,則寫(xiě)作X.set(Y),如果X為字符串,則寫(xiě)作X=Y)。程序控制器配置引擎本身是由工程控制器類(lèi)來(lái)控制的。如果該工程是將CSP轉(zhuǎn)換為Java,則會(huì)存在稱作CSP到Java的配置器(CSPtoJavaD印loyer)的類(lèi)。該類(lèi)包含了需要運(yùn)行的樹(shù)遍歷器的列表,需要使用的聲明寫(xiě)作器的類(lèi)型和待使用的作用域載入器的類(lèi)型等。增強(qiáng)增強(qiáng)階段包括重要的自動(dòng)化的代碼重設(shè)計(jì)。在輸入階段,已獲取了輸入代碼中的每個(gè)可獲得的關(guān)于所有操作和變量的信息組元,并且還跟蹤了用于確定執(zhí)行順序的各種執(zhí)行路徑和無(wú)效代碼。重建是在增強(qiáng)過(guò)程中自動(dòng)實(shí)現(xiàn)的。該重建的特征依賴于目標(biāo)環(huán)境。如果目標(biāo)是面向?qū)ο蟮模敲粗亟ň驮O(shè)計(jì)為促進(jìn)多層次00設(shè)計(jì)(multi-tieredOOdesign)的執(zhí)行。這需要大范圍的變量作用域分析。如果目標(biāo)是例如COBOL的結(jié)構(gòu)化的語(yǔ)言,則促進(jìn)結(jié)構(gòu)化的方案。在該增強(qiáng)步驟中的一些處理為今循環(huán)分析令混合升級(jí)的識(shí)別,例如嵌套的IF到CASE,GOTO到PERFORM語(yǔ)句今剩余GOTO語(yǔ)句的刪除今工作識(shí)別的單元今"英文識(shí)別"("Englishification")今組元識(shí)別今變量作用域分析今代碼拷貝分析今進(jìn)程去拷貝今提取數(shù)據(jù)模型今建立目標(biāo)模型(如果針對(duì)基于方案的目標(biāo)模型)今將組元轉(zhuǎn)換為方法,并賦到目標(biāo)模型今Re-factor(如果針對(duì)基于方案的目標(biāo)模型)令界面識(shí)別和分析。增強(qiáng)是作為特征標(biāo)記(tokenisation)之后的自動(dòng)進(jìn)程而進(jìn)行的,因?yàn)榻袢斯?zhí)行重建的付出和努力是有所限制的;以及令如果沒(méi)有以下處理的混合充分的解析和特征標(biāo)記,以及輸入到增強(qiáng)進(jìn)程時(shí)由我們的輸入處理器生成的去除語(yǔ)法的代碼,則自動(dòng)代碼清除的效率很低。通常,構(gòu)建不好的程序的測(cè)圓法復(fù)雜性被減少了大約80%。目標(biāo)是使所生成的代碼的測(cè)圓法復(fù)雜性(CC,cyclometriccomplexity)小于5.0。寫(xiě)得好的COBOL代碼具有5_8的CC,這個(gè)無(wú)法得到顯著的提高。另一方面,寫(xiě)得不好的代碼的CC達(dá)到IOOO。如果CC很高,則很難生成好代碼。通常,寫(xiě)得不好的代碼具有達(dá)到8-100的CC,該CC可以降低到5-15之間?!?duì)代碼進(jìn)行了分析和增強(qiáng),就執(zhí)行配置進(jìn)程。在該進(jìn)程中,將每個(gè)技術(shù)函數(shù)映射到目標(biāo)語(yǔ)言和結(jié)構(gòu)性函數(shù)。這常常需要重大的額外的重建。該執(zhí)行的一些方面由工作分析單元和各種潛在方案所需的重建的復(fù)雜性所確定。結(jié)構(gòu)性框架作為輸出/配置進(jìn)程的一部分,被從元數(shù)據(jù)級(jí)別映射到代碼界面和泛函。目的是生成具有目標(biāo)語(yǔ)言的格式和平臺(tái)的代碼。最終結(jié)果是在進(jìn)程的每個(gè)階段,在與目標(biāo)體系結(jié)構(gòu)的兼容性和依從性方面,將代碼質(zhì)量最佳化。如果沒(méi)有頻繁的分析和重建,則不可能生成具有期望的質(zhì)量和可維護(hù)性的"靈活的"結(jié)構(gòu)化方案。在更詳細(xì)的程度,關(guān)鍵的事實(shí)是不需要建立完全(傳統(tǒng)的)獨(dú)立的語(yǔ)言作為轉(zhuǎn)換的基礎(chǔ)?,F(xiàn)在將描述增強(qiáng)進(jìn)程的實(shí)例。代碼增強(qiáng)和轉(zhuǎn)換—旦將源代碼解析為標(biāo)準(zhǔn)樹(shù)格式,就開(kāi)始對(duì)代碼進(jìn)行分析和轉(zhuǎn)換。由于樹(shù)遍歷器的格式的知識(shí),對(duì)代碼的分析和轉(zhuǎn)換通常是由樹(shù)遍歷器執(zhí)行的,從而可以對(duì)樹(shù)進(jìn)行搜索,查找特定的代碼模式,然后就像所需要的,對(duì)所有實(shí)例進(jìn)行轉(zhuǎn)換。以下是轉(zhuǎn)換和增強(qiáng)處理的例子的詳情(Below-are-details-of-a-samploTransfor_matien_and_Enrichment_{process在一些古老的語(yǔ)言中,GOTO格式的分支語(yǔ)句是極普遍的,經(jīng)常用于強(qiáng)迫代碼一次又一次地循環(huán),直到滿足一些條件。這種類(lèi)型的代碼稱作Goto偽循環(huán)。用于完成該處理的代碼經(jīng)常是冗長(zhǎng)且未結(jié)構(gòu)化的,從而使得對(duì)代碼的讀取和維護(hù)很難。較好的編碼方式是使用循環(huán)結(jié)構(gòu)執(zhí)行相同的功能。這種代碼的結(jié)構(gòu)化更好、更易于讀取和執(zhí)行,并允許進(jìn)一步的分析和對(duì)象化(objectification)。作為增強(qiáng)和轉(zhuǎn)換進(jìn)程的一部分,對(duì)所有的這種Goto偽循環(huán)進(jìn)行識(shí)別,并由真正的29循環(huán)語(yǔ)句代替。該進(jìn)程有兩部分候選項(xiàng)的識(shí)別和轉(zhuǎn)換。為了解釋上述內(nèi)容,考慮圖IO所示的偽代碼的以下實(shí)例。識(shí)別進(jìn)程包括以下步驟1.從GOTO語(yǔ)句開(kāi)始GOTO偽循環(huán)的識(shí)別(a);2.查看該GOTO語(yǔ)句是否指回到代碼中標(biāo)出的語(yǔ)句(b);3.如果是,則著眼于條件(c),并識(shí)別控制元素。在上述情況下,控制元素為變量4.確認(rèn)控制元素在標(biāo)出的語(yǔ)句之前進(jìn)行了初始化(d),以及5.確認(rèn)在標(biāo)出的語(yǔ)句和GOTO語(yǔ)句之間對(duì)控制元素進(jìn)行了修改(e)。如果樹(shù)遍歷器確認(rèn)所有以上條件都滿足,則可以進(jìn)行轉(zhuǎn)換??赡馨l(fā)生一些轉(zhuǎn)換形式上的變化,這依賴于GOTO偽循環(huán)本身的變化。例如,代碼可轉(zhuǎn)換為FOR循環(huán),如果今(代碼3)中的代碼沒(méi)有使用控制元素,并且;今(代碼1)中的代碼沒(méi)有使用控制元素。否則,代碼可以轉(zhuǎn)換為標(biāo)準(zhǔn)的While循環(huán)。針對(duì)該實(shí)體的目的,我們假定可以使用FOR循環(huán)。為了將GOTO偽循環(huán)轉(zhuǎn)換為FOR循環(huán),可以對(duì)標(biāo)準(zhǔn)樹(shù)進(jìn)行如下修改1.創(chuàng)建FOR循環(huán)節(jié)點(diǎn)。2.將(d)中的語(yǔ)句從樹(shù)上取出,并增加到新的循環(huán)開(kāi)始(LoopStart)節(jié)點(diǎn)下面。3.將(e)的語(yǔ)句從樹(shù)上取出,并增加到新的循環(huán)增加(Looplncrement)節(jié)點(diǎn)下面。4.將(b)和(c)之間的代碼從樹(shù)上移動(dòng)到循環(huán)動(dòng)作(LoopAction)節(jié)點(diǎn)。5.將(c)的語(yǔ)句從樹(shù)上取出,增加到新的終止條件(TerminationCondition)下面。6.將GOTO語(yǔ)句從樹(shù)上移除。7.用新的FOR循環(huán)代替標(biāo)出的語(yǔ)句(b)。轉(zhuǎn)換之后,代碼段可以讀出為如圖11所示。該系統(tǒng)使用其樹(shù)結(jié)構(gòu),替代了完全獨(dú)立的語(yǔ)言的建立。這是通過(guò)將所有內(nèi)容映射到"標(biāo)準(zhǔn)節(jié)點(diǎn)"而操作的。對(duì)于在樹(shù)遍歷器技術(shù)中創(chuàng)建和配置結(jié)構(gòu)化節(jié)點(diǎn)的進(jìn)程,有六個(gè)鏈接的部分,在轉(zhuǎn)換引擎中鏈接到輸入、增強(qiáng)和輸出進(jìn)程之下。圖3更詳細(xì)地示出轉(zhuǎn)換引擎進(jìn)程。該進(jìn)程由對(duì)應(yīng)于下表中進(jìn)程列表的編號(hào)的圓圈進(jìn)行標(biāo)識(shí)。方形陰影數(shù)字表示在特殊狀態(tài)下可以使用。帶有較暗陰影的方形的進(jìn)程表示那些使用下面描述的通用組元的進(jìn)程。這些進(jìn)程實(shí)現(xiàn)了轉(zhuǎn)換泛函的關(guān)鍵元素一輸入、增強(qiáng)和輸出。該圖列出了這些特別組元運(yùn)行的上下文。其既示出了關(guān)鍵的自動(dòng)化的進(jìn)程,也示出了相關(guān)的人工進(jìn)程,這些人工進(jìn)程對(duì)轉(zhuǎn)換引擎的步驟進(jìn)行整理,從而使得應(yīng)用程序從其已有的技術(shù)規(guī)定轉(zhuǎn)換到不同的技術(shù)規(guī)定。雖然人工進(jìn)程作為實(shí)現(xiàn)轉(zhuǎn)換應(yīng)用程序的最終目的的基本,在總體認(rèn)識(shí)中很重要,但只是重要軟件進(jìn)程的外圍,以便為進(jìn)程帶來(lái)高的自動(dòng)化水平。本領(lǐng)域技術(shù)人員應(yīng)該理解,在不超出寬泛地描述的本發(fā)明的精神和范圍的情況下,可以對(duì)具體實(shí)施例中示出的本發(fā)明進(jìn)行各種變化和/或修改。所以,在所有方面來(lái)說(shuō),本實(shí)施例僅是解釋性的,而不是限定性的。術(shù)語(yǔ)表過(guò)濾器(Filter)過(guò)濾器是檢查具體節(jié)點(diǎn)是否是感興趣的節(jié)點(diǎn)的類(lèi)。通常,當(dāng)訪問(wèn)者從穿行器上下來(lái)時(shí),會(huì)被給定過(guò)濾器,如果該節(jié)點(diǎn)是感興趣的節(jié)點(diǎn),則過(guò)濾器會(huì)返回True,否則會(huì)返回False。助手(Helper)節(jié)點(diǎn)助手是匹配節(jié)點(diǎn)類(lèi)型,知道其結(jié)構(gòu)并包含用于使用和轉(zhuǎn)換該節(jié)點(diǎn)的方法的類(lèi)。助手記有在一個(gè)位置的節(jié)點(diǎn)結(jié)構(gòu),使得對(duì)該結(jié)構(gòu)的改變?nèi)菀讓?shí)施。挖掘器(Miner)挖掘器是穿行于樹(shù)結(jié)構(gòu),直到找到感興趣的節(jié)點(diǎn)的程序。當(dāng)找到這樣的節(jié)點(diǎn)時(shí),則收集關(guān)于該節(jié)點(diǎn)的所有信息,并將這些信息保存到數(shù)據(jù)庫(kù)中。挖掘器知道其所感興趣的節(jié)點(diǎn)的結(jié)構(gòu)。標(biāo)準(zhǔn)節(jié)點(diǎn)(StandardNode)標(biāo)準(zhǔn)節(jié)點(diǎn)是用于模仿標(biāo)準(zhǔn)樹(shù)上的每個(gè)節(jié)點(diǎn)的類(lèi)的名稱。其包含帶有關(guān)于特定節(jié)點(diǎn)的信息的多個(gè)屬性;將該節(jié)點(diǎn)鏈接到樹(shù)上的正確位置的多個(gè)屬性;以及用于增加關(guān)于節(jié)點(diǎn)的信息或操作節(jié)點(diǎn)的多個(gè)方法。標(biāo)準(zhǔn)樹(shù)(StandardTree)存儲(chǔ)關(guān)于應(yīng)用程序的信息的樹(shù)結(jié)構(gòu)。WSL廣譜語(yǔ)言(Wide-SpectrumLangimge)穿行器(Traversers)穿行器是以特定方式在標(biāo)準(zhǔn)樹(shù)上穿行的簡(jiǎn)單類(lèi)一向上或向下,或首先向深度前進(jìn),或首先向兄弟節(jié)點(diǎn)前進(jìn)。通常,穿行器可攜帶訪問(wèn)者類(lèi)。樹(shù)遍歷器樹(shù)遍歷器是遍歷標(biāo)準(zhǔn)樹(shù),并執(zhí)行特定任務(wù)的進(jìn)程一通常以某種方式對(duì)樹(shù)進(jìn)行轉(zhuǎn)換。31<table>tableseeoriginaldocumentpage32</column></row><table>權(quán)利要求一種將代碼轉(zhuǎn)換為不同編程語(yǔ)言的方法,該方法包括接收所述代碼;基于所述可執(zhí)行代碼創(chuàng)建抽象語(yǔ)法樹(shù);將涉及多個(gè)重建進(jìn)程的識(shí)別數(shù)據(jù)存儲(chǔ)于數(shù)據(jù)存儲(chǔ)器中,所述多個(gè)重建進(jìn)程待在所述抽象語(yǔ)法樹(shù)上運(yùn)行以重建該樹(shù),從而協(xié)助所述到不同語(yǔ)言的代碼轉(zhuǎn)換;在所述抽象語(yǔ)法樹(shù)上自動(dòng)運(yùn)行在所述數(shù)據(jù)存儲(chǔ)器中識(shí)別出的重建進(jìn)程;在該重建的樹(shù)上自動(dòng)運(yùn)行配置進(jìn)程,以將所述代碼轉(zhuǎn)換為所述不同的編程語(yǔ)言;評(píng)估轉(zhuǎn)換后的代碼,并基于該評(píng)估,識(shí)別出另一待在所述抽象語(yǔ)法樹(shù)上運(yùn)行以協(xié)助所述到不同語(yǔ)言的代碼轉(zhuǎn)換的重建進(jìn)程;將所述另一重建進(jìn)程的識(shí)別數(shù)據(jù)存儲(chǔ)到所述數(shù)據(jù)存儲(chǔ)器中;以及重復(fù)所述運(yùn)行步驟。2.如權(quán)利要求1所述的方法,其中所述方法進(jìn)一步包括接收數(shù)據(jù)詞典、元數(shù)據(jù)或與所接收的代碼有關(guān)的任何其它文件。3.如權(quán)利要求1或2所述的方法,其中所述抽象語(yǔ)法樹(shù)是利用權(quán)利要求1至16中任一項(xiàng)所述的方法創(chuàng)建的。4.如權(quán)利要求1、2或3所述的方法,其中所述方法進(jìn)一步包括將所述抽象語(yǔ)法樹(shù)存儲(chǔ)在所述數(shù)據(jù)存儲(chǔ)器中的步驟。5.如權(quán)利要求4所述的方法,其中所述創(chuàng)建抽象語(yǔ)法樹(shù)的步驟進(jìn)一步包括從所述抽象語(yǔ)法樹(shù)上提取聲明元素,并將之存儲(chǔ)到數(shù)據(jù)存儲(chǔ)器中。6.如權(quán)利要求5所述的方法,其中所述聲明元素是利用多個(gè)挖掘進(jìn)程從所述抽象語(yǔ)法樹(shù)上提取的,所述多個(gè)挖掘進(jìn)程對(duì)所述抽象語(yǔ)法樹(shù)進(jìn)行挖掘以識(shí)別該樹(shù)中的聲明元素。7.如權(quán)利要求5或6所述的方法,其中所述每一聲明元素的屬性存儲(chǔ)在所述數(shù)據(jù)存儲(chǔ)器中。8.如權(quán)利要求4至7中任一項(xiàng)所述的方法,其中所述方法進(jìn)一步包括將分析數(shù)據(jù)存儲(chǔ)于所述數(shù)據(jù)存儲(chǔ)器中,所述分析數(shù)據(jù)涉及如何使用以及在何處使用所述代碼的元素。9.如權(quán)利要求4至8中任一項(xiàng)所述的方法,其中所述方法包括將與所述代碼相關(guān)的元數(shù)據(jù)存儲(chǔ)到所述數(shù)據(jù)存儲(chǔ)器中的步驟。10.如權(quán)利要求9所述的方法,其中所述元數(shù)據(jù)包括以下一種或更多種關(guān)于所述代碼的原始語(yǔ)言和/或所述不同的編程語(yǔ)言的信息;所述代碼的原始語(yǔ)言和/或所述不同的編程語(yǔ)言的內(nèi)建組元;以及涉及重建的信息,例如所需可維護(hù)性、經(jīng)轉(zhuǎn)換的代碼的運(yùn)行時(shí)復(fù)雜性和效率。11.如權(quán)利要求9或10所述的方法,其中使用多個(gè)挖掘進(jìn)程,從所述抽象語(yǔ)法樹(shù)上提取所述元數(shù)據(jù)的一個(gè)或更多個(gè)部分。12.如權(quán)利要求1至11中任一項(xiàng)所述的方法,其中所述重建進(jìn)程包括以下一個(gè)或更多個(gè).對(duì)循環(huán)加以識(shí)別并重建為期望循環(huán)結(jié)構(gòu)的進(jìn)程;對(duì)特定可執(zhí)行段加以識(shí)別并重建為更精細(xì)結(jié)構(gòu)的進(jìn)程;對(duì)所述抽象語(yǔ)法樹(shù)中的GOTO語(yǔ)句加以識(shí)別,并重建樹(shù)以移除這些語(yǔ)句的進(jìn)程;對(duì)該樹(shù)中的成組節(jié)點(diǎn)的復(fù)本加以識(shí)別,并重建以便將該組節(jié)點(diǎn)創(chuàng)建為函數(shù)或過(guò)程的進(jìn)程;對(duì)一個(gè)或更多個(gè)變量的作用域加以識(shí)別的進(jìn)程;對(duì)所述抽象語(yǔ)法樹(shù)中的特定節(jié)點(diǎn)組加以識(shí)別,并重排這些節(jié)點(diǎn)的結(jié)構(gòu)的進(jìn)程;對(duì)所述抽象語(yǔ)法樹(shù)中的特定節(jié)點(diǎn)組加以識(shí)別,并替換這些節(jié)點(diǎn)的進(jìn)程,例如使用函數(shù)調(diào)用;將數(shù)據(jù)結(jié)構(gòu)改變?yōu)榈谌龢?biāo)準(zhǔn)形式的進(jìn)程;遍歷該樹(shù)以識(shí)別界面的進(jìn)程;以及遍歷該樹(shù)并分析變量的用途,以改進(jìn)其變量類(lèi)型的進(jìn)程。13.如權(quán)利要求1至12中任一項(xiàng)所述的方法,其中所述方法進(jìn)一步包括編寫(xiě)所述待在抽象語(yǔ)法樹(shù)上運(yùn)行的重建進(jìn)程。14.如權(quán)利要求4至11中任一項(xiàng)所述的方法,其中所述方法進(jìn)一步包括對(duì)存儲(chǔ)于所述數(shù)據(jù)存儲(chǔ)器中的信息執(zhí)行審計(jì),以識(shí)別有無(wú)信息丟失。15.如權(quán)利要求1至14中任一項(xiàng)所述的方法,其中所述自動(dòng)運(yùn)行在所述數(shù)據(jù)存儲(chǔ)器中識(shí)別出的重建進(jìn)程的步驟,還使用存儲(chǔ)在所述數(shù)據(jù)存儲(chǔ)器中的與代碼相關(guān)的聲明信息和元數(shù)據(jù)信息。16.如權(quán)利要求1至15中任一項(xiàng)所述的方法,其中同時(shí)運(yùn)行兩個(gè)或更多個(gè)重建進(jìn)程。17.如權(quán)利要求4所述的方法,其中所述自動(dòng)運(yùn)行配置進(jìn)程的步驟,還使用存儲(chǔ)在所述數(shù)據(jù)存儲(chǔ)器中的與代碼相關(guān)的信息。18.如權(quán)利要求1至17任一項(xiàng)所述的方法,其中對(duì)轉(zhuǎn)換后的代碼的評(píng)估基于以下任意一項(xiàng)或更多項(xiàng)所述代碼的秩復(fù)雜性;代碼的行數(shù);已被替換的進(jìn)程的數(shù)目;對(duì)轉(zhuǎn)換后的代碼的人工評(píng)估;以及配置后的代碼的準(zhǔn)確性。19.如權(quán)利要求1至18中任一項(xiàng)所述的方法,其中所述評(píng)估轉(zhuǎn)換后的代碼的步驟,以所述抽象語(yǔ)法樹(shù)為基礎(chǔ)。20.如權(quán)利要求1至19中任一項(xiàng)所述的方法,其中所述評(píng)估轉(zhuǎn)換后的代碼包括生成異議報(bào)告,所述異議報(bào)告識(shí)別所述轉(zhuǎn)換后的代碼中可能無(wú)法產(chǎn)生所需結(jié)果的部分。21.如權(quán)利要求4所述的方法,其中在評(píng)估轉(zhuǎn)換后的代碼之前,所述方法包括將所述轉(zhuǎn)換后的代碼存儲(chǔ)于所述數(shù)據(jù)存儲(chǔ)器中的步驟。22.如權(quán)利要求21所述的方法,其中包括將該方法前一次迭代的轉(zhuǎn)換后的代碼替換為最新版的轉(zhuǎn)換后的代碼。23.如權(quán)利要求4至11、14、17、21或22中任意兩項(xiàng)或更多項(xiàng)所述的方法,其中所述數(shù)據(jù)存儲(chǔ)器是同一數(shù)據(jù)存儲(chǔ)器。24.—種應(yīng)用軟件,其能夠執(zhí)行權(quán)利要求1至24中任一項(xiàng)所述的方法。25.—種用于轉(zhuǎn)換代碼的計(jì)算機(jī)系統(tǒng),該計(jì)算機(jī)系統(tǒng)具有輸入工具,用于接收所述代碼;存儲(chǔ)工具,用于存儲(chǔ)應(yīng)用軟件和所接收的代碼;以及處理工具,用于使用所述應(yīng)用軟件執(zhí)行權(quán)利要求36至59中任一項(xiàng)所述的方法。26.如權(quán)利要求25所述的計(jì)算機(jī)系統(tǒng),其中所述計(jì)算機(jī)系統(tǒng)進(jìn)一步包括存儲(chǔ)權(quán)利要求4至11、14、17、21或22中任一項(xiàng)的信息的數(shù)據(jù)存儲(chǔ)器。全文摘要本發(fā)明涉及代碼轉(zhuǎn)換,即可執(zhí)行代碼從一種語(yǔ)言到另一種語(yǔ)言的轉(zhuǎn)換。具體地,本發(fā)明涉及代碼的自動(dòng)化轉(zhuǎn)換。本發(fā)明涉及用于創(chuàng)建包括節(jié)點(diǎn)、待在代碼轉(zhuǎn)換中使用的方法、軟件和計(jì)算機(jī)系統(tǒng)。本發(fā)明還涉及建立待在代碼轉(zhuǎn)換中使用的解析器的方法、軟件和計(jì)算機(jī)系統(tǒng)。最后,本發(fā)明還涉及轉(zhuǎn)換、評(píng)估和再轉(zhuǎn)換代碼的自動(dòng)化方法和迭代方法。本發(fā)明的優(yōu)點(diǎn)是其避免使用中間轉(zhuǎn)換語(yǔ)言的能力及其高的自動(dòng)化水平,從而減少了人工轉(zhuǎn)換,并因此更高效,且成本更低。文檔編號(hào)G06F9/44GK101770363SQ20091020584公開(kāi)日2010年7月7日申請(qǐng)日期2006年6月27日優(yōu)先權(quán)日2005年6月27日發(fā)明者阿爾伯特·唐納德·通金,魯思·?,敗ねń鹕暾?qǐng)人:奎樸茲有限公司