張志宏 包東輝
【摘 要】軟件分析、演化和再工程是軟件生命周期的重要領(lǐng)域。維護大型軟件的任務(wù)一直是軟件從業(yè)者面臨的挑戰(zhàn)。本文從程序理解、源代碼建模、組件恢復(fù)、二進制逆向工程和重構(gòu)、網(wǎng)絡(luò)為中心的平臺遷移、工具和環(huán)境六個軟件逆向工程領(lǐng)域探討了研究新趨勢,以更好地滿足軟件分析、進化和再工程的需要。
【關(guān)鍵詞】軟件逆向工程;軟件演化;軟件再工程
一、前言
軟件分析、演化和再工程技術(shù)在過去幾年中已經(jīng)顯著成熟,并且已經(jīng)與軟件工程的其他幾個領(lǐng)域形成了強有力的技術(shù)聯(lián)系,例如解析和編譯技術(shù)、軟件建模和可視化、模式分析和集成開發(fā)環(huán)境等。同時,由于迭代和增量開發(fā)模型的引入,例如極限編程(XP)和統(tǒng)一過程(RUP),為軟件分析、演化和再工程領(lǐng)域提供了新方向。在這種迭代和增量模型的上下文中,軟件開發(fā)可以采取模型的分析、演化和轉(zhuǎn)換的形式,這些模型涉及廣泛的軟件組件,例如業(yè)務(wù)模型、需求模型、體系結(jié)構(gòu)和設(shè)計模型,以及實現(xiàn)和測試模型。在這些方面,產(chǎn)生了很多新的研究方向,從而將軟件分析和演化技術(shù)納入此類工程模型。
本文對軟件分析、演化和再工程的六個主要領(lǐng)域進行研究:
1、程序理解:該領(lǐng)域涉及支持源代碼分析和設(shè)計恢復(fù)的技術(shù)。
2、源代碼建模和表示:該領(lǐng)域涉及在更高抽象級別上對源代碼建模的技術(shù)。
3、組件恢復(fù):該領(lǐng)域涉及大型軟件系統(tǒng)的架構(gòu)分析和模塊化技術(shù)。
4、二進制代碼逆向工程:該領(lǐng)域涉及分析二進制代碼和反編譯復(fù)雜系統(tǒng)的技術(shù)。
5、網(wǎng)絡(luò)為中心的平臺遷移:該領(lǐng)域涉及支持遺留系統(tǒng)演化到支持Web環(huán)境的技術(shù)。
6、工具和環(huán)境:該領(lǐng)域主要關(guān)注系統(tǒng)分析和重構(gòu)的實用方法和支持工具。
二、研究綜述
程序理解一直被認為是逆向工程和軟件維護的核心工作,高達50%的維護工作用于程序理解任務(wù),而最近的研究表明,涉及的時間甚至更多,高達70%。程序理解被定義為“在不同抽象層次上構(gòu)建底層軟件的模型,從代碼本身的模型到底層應(yīng)用領(lǐng)域的模型”[1]。因此,這是一個開發(fā)人員根據(jù)所面臨的維護任務(wù)、程序的功能、工作方式、體系結(jié)構(gòu)或資源使用情況來識別的過程。到目前為止,對程序理解的研究主要集中在兩個問題上:程序的哪種表示方式能夠幫助開發(fā)人員在執(zhí)行任務(wù)時恢復(fù)適當?shù)哪P?,以及如何通過工具自動構(gòu)建這種表示方式。
奧本大學(xué)的D.A.Umphress,D.Hendrix,J.H.Cross II在文章《改進和測量源代碼可理解性的軟件可視化》中介紹了軟件可視化的兩種形式,并在實驗中驗證了它們?nèi)绾螏椭绦蚶斫?,為了便于理解程序的結(jié)構(gòu)和執(zhí)行,分析了控制結(jié)構(gòu)圖,并分析了復(fù)雜度圖對源代碼可理解性的測量能力。兩種方法都被證明是有效的,并被納入了Grasp IDE項目。然而,軟件可視化的有效性仍然需要在實際環(huán)境中得到更多證明。
CWI和Delft大學(xué)的A.van Deursen和L.Moonen在Cobol程序環(huán)境下使用類型來記錄軟件系統(tǒng)的方法,提出了一種自動程序理解工具構(gòu)建的解決方案。它引入了TypeExplorer,一種基于推斷類型瀏覽Cobol遺留系統(tǒng)的工具。TypeExplorer首先從源文件中提取信息,分析它并使它來推斷類型,然后構(gòu)建一個基于超文本的文檔,該文檔可供瀏覽,以便發(fā)現(xiàn)單個變量的低級結(jié)構(gòu)以及整個系統(tǒng)架構(gòu)的全局概覽。該項目的一個重要特點是支持將遺留Cobol-85代碼遷移到面向?qū)ο蟮腃obol標準中來。多年來,幾個研究小組開發(fā)了程序分析技術(shù)和工具,不同研究人員之間展開合作,所面臨的關(guān)鍵問題是需要工具的互操作性,即一個工具從另一個工具導(dǎo)入數(shù)據(jù)并將其結(jié)果導(dǎo)出到另一個工具的能力?;诖艘粋€新的研究領(lǐng)域誕生了,同時也得到了第一屆標準交換格式研討會的認可。
滑鐵盧大學(xué)的R.C.Holt,達姆施塔特理工大學(xué)的A.Shuerr,加利福尼亞大學(xué)的S.E.Sim和科布倫茨蘭道大學(xué)的A.Winter,提出了一種基于圖的標準交換格式,描述了這種協(xié)作的工作模式,并介紹了作為標準交換格式的GXL語言。這可看成是軟件分析的統(tǒng)一源代碼建模和表示的重要里程碑。GXL是一種基于XML的語言,用于表示類型圖、屬性圖、有向圖、有序圖以及超圖和層次圖?;诖?,實例圖可以用GXL表示并與相應(yīng)的模式信息交換。同時,介紹了標準交換格式的基本要求,詳細說明了GXL,并討論了使用GXL交換圖形。
逆向工程不僅是一門理論研究學(xué)科,也是一個應(yīng)用領(lǐng)域。當軟件必須轉(zhuǎn)移使用一種新開發(fā)技術(shù)或一種新平臺上時,現(xiàn)有軟件的應(yīng)用程序塊(稱為組件)應(yīng)該被提取并用作構(gòu)建新軟件。在軟件再工程的背景下,當前還須解決兩個主要問題:一個是識別現(xiàn)有軟件的哪些部分是潛在可重用的,另一個是開發(fā)能夠圍繞已有代碼塊構(gòu)建新軟件的技術(shù)。
德國斯圖加特大學(xué)的R.Koschke和J.czeranski以及意大利RCOST大學(xué)的G.Canfora對組件恢復(fù)的dIC方法,提出了識別潛在可重用代碼片段的解決方案。更具體地說,通過dIC方法來檢測抽象數(shù)據(jù)對象,dIC方法也被擴展到檢測抽象數(shù)據(jù)類型和集成一個良好的內(nèi)聚度量來識別候選組件。由于文獻表明,任何一種構(gòu)件恢復(fù)方法的有效性在很大程度上取決于主體系統(tǒng)的特性,因此有必要進一步研究構(gòu)件恢復(fù)方法與系統(tǒng)特性之間的關(guān)系。
亞利桑那州立大學(xué)的S.V.Mudiam、G.C.Gannod的文章《使用適配器將遺留組件進行集成》,提出了一種通過重用現(xiàn)有代碼片段和將遺留組件遷移到以網(wǎng)絡(luò)為中心的平臺來構(gòu)建軟件的解決方案。具體來說,它提出了將組件視為服務(wù)的觀點,然后可以構(gòu)建客戶機應(yīng)用程序來與這些被視為數(shù)據(jù)和行為提供者的服務(wù)進行交互。該技術(shù)利用架構(gòu)描述語言將組件描述為服務(wù),并使用包裝器或適配器生成“粘合代碼”,實現(xiàn)服務(wù)的運行時集成。工作包括開發(fā)一個環(huán)境,通過提供服務(wù)瀏覽和將建議技術(shù)遷移到.NET和web服務(wù)框架,來幫助創(chuàng)建基于服務(wù)的應(yīng)用程序。到目前為止,提到的所有方法都依賴于源代碼可用于分析的假設(shè),同時允許使用多種標準技術(shù),通常基于編譯,如抽象語法樹構(gòu)造或依賴關(guān)系識別。不幸的是,在許多實際的工業(yè)應(yīng)用中,程序分析有時必須在沒有完全訪問源代碼的情況下開始。二進制分析可能是唯一有效的替代方法,即直接分析程序的二進制機器代碼。
昆士蘭大學(xué)的D.Ung的發(fā)表了《帶運行時反饋的二進制代碼動態(tài)重構(gòu)》。二進制翻譯是一種允許為一臺機器編譯的軟件被轉(zhuǎn)換成在另一臺機器上高效運行的技術(shù)。這種重構(gòu)活動在逆向工程階段分解。在逆向工程階段,二進制指令被解碼到更高的抽象級別,然后是正向工程階段,在此階段,抽象數(shù)據(jù)被編碼成另一種二進制形式。該文介紹了UQDBT二進制轉(zhuǎn)換器,它通過指定機器屬性及其指令集來提供適應(yīng)性,它以一種特殊的方式處理頻繁執(zhí)行的代碼,獲得比其他轉(zhuǎn)換器更快的翻譯。
【參考文獻】
[1]劉彥宇,唐運樂.支持源代碼逆向建模的關(guān)系模型設(shè)計[J].河池學(xué)院學(xué)報,2013,33(02):91-96.
作者簡介:張志宏(1990-),男,山西忻州人,漢族,本科,單位:北海職業(yè)學(xué)院,研究方向:計算機網(wǎng)絡(luò)技術(shù)。包東輝(1971-),男,廣西北海人,漢族,本科,講師,單位:北海職業(yè)學(xué)院,研究方向:職業(yè)教育。
課題項目:2018年度廣西高校中青年基礎(chǔ)能力提升項目(2018KY1190 )《支持信息檢索的程序理解輔助系統(tǒng)設(shè)計與實現(xiàn)》。