程式理解

程式理解

程式理解是一個從電腦程式中獲取知識信息的過程。這些知識信息可以套用於程式排錯、增強程式、重用程式以及整理文檔等方面的工作上。程式理解是軟體工程領域裡的一個重要部分。 通俗地講,程式理解就是通過一定的設施和方法來弄清楚一個程式是“做什麼的”以及“如何做的”。如果對它進行精確定義,可以把程式理解看作這樣的任務:以軟體維護、升級和再工程為目的,在不同的抽象級別上建立基本軟體的概念模型,包括從代碼本身的模型到基本套用領域的模型,即建立從問題/套用領域到程式設計/實現域的映射集。

任務

程式理解的任務就是要揭示程式的功能與實現機制,即理解系統的外部行為和內部構造,其具體任務可分解如下。

1)通過檢查單個的程式設計結構,程式被表示成抽象語法樹、符號表或普通源文本,這其中包括手工代碼閱讀、人工製品提取、程式分析、靜態分析和動態分析幾個過程。

2)儘量做到程式隱含信息的顯性表示及程式內部關係的可視化。如控制流和數據流分析,各種程式視圖的構造等。

3)從原始碼中提取信息,並存放在通用的資料庫中,然後通過查詢語言對資料庫進行查詢。

4)檢查程式構造過程中的結構關係,明確表示程式組成部分之間的依賴關係。

5)識別程式的高層概念,如標準算法、數據結構、語法及語義匹配等。

內容

經過分析,全面、準確、迅速地理解程式,對於軟體的開發、維護、質量保證及逆向工程和再工程有著重要意義。不過,程式理解的內容比較多,要講述程式理解的內容,就必須結合具體的程式設計語言。儘管如此,程式理解一般都包含如下內容:

·程式理解的功能和目標。

·掌握程式的結構信息,即從程式中細分出若干結構成分,如程式系統結構、控制結構、數據結構、輸入/輸出結構等。

·了解數據流信息,即涉及的數據源於何處,在哪裡被使用。

·了解控制流信息,即了解每條路徑的結果。

·程式理解的操作(使用)要求。

·面向對象的理解(對象、類、繼承、通信等等)。

相關技術

1.語句分析

與自然語言類似,程式檔案是由語句構成的,包括標識符、操作符、關鍵字、字元串、數字、標點符號等詞法單元。語句分析分別構造程式的詞法模型與語法模型,它們對應於詞法分析與語法分析。由於這兩種分析不生成任何語義信息,所以它們生成的模型僅僅適用於原始碼的模式匹配。

2.程式流分析

程式流分析技術,即在程式運行之前,通過靜態分析去發現程式在運行行為方面的某些特性。程式流分析包括控制流分析和數據流分析兩種,其中控制流分析側重於對程式結構的分析,而數據流分析則側重於對變數控制結構中數據的賦值、使用及傳遞情況的分析。

程式理解的首要任務是發現它的控制結構,即語句的可能執行路徑,通過控制流分析建立過程內部的控制層次。控制流分析可以分為兩大類:必經點分析和區間分析,這兩種分析方法都是先對程式文本進行分析,將其轉化成某種中間表示,然後在中問表示的基礎上進行分析,具體選用哪種方法需根據程式理解的任務而定。

數據流分析是為了計算被分析程式在生成數據方面的行為,通常用於程式最佳化,即為程式最佳化建立環境。目前,使用最為廣泛的方法是對控制流圖進行循環分析,稱為疊代數據流分析。

由於非結構化程式會給測試、排錯和程式維護帶來較大的困難,因此按照結構化程式設計的要求,理想的程式設計是儘量避免使用goto語句,程式的控制結構儘量做到單入口、單出口。基於這些原因,在對被測軟體進行分析時,系統地檢查程式的控制結構成了十分有意義的工作。

3.軟體結構圖

軟體結構圖分程式調用關係圖(或函式調用關係圖)和系統結構圖。函式調用關係圖或者說是程式調用關係圖,都是對源程式中函式關係的一種靜態描述,在函式調用關係圖中,節點表示函式,邊表示函式之間的調用關係。

基本策略

從軟體心理學和認知學的角度,通過對維護人員和維護人員理解過程的研究,總結出3種理解策略,並且提出若干相應的模型。

1.自頂向下的程式理解策略

自頂向下理解策略的原則是維護人員從程式的頂層開始,以從上到下的方式逐步理解下層細節。主要的自頂向下模型有Soloway模型等。Soloway在他的模型中採用自頂向下的方法,根據所擁有的知識和假設,把系統分解成能夠在代碼中實現的預料中的子系統,然後逐個分解每個子系統直到實現既定功能的一個個代碼塊。用這種方法構造的智力模型由目標和設計的層次構成,利用論述規則把目標分解成設計,繼而分解成更低層的設計。該模型使用3種不同的設計類型:

(1)戰略性設計,它描述程式中的整體策略;

(2)策略性設計,它與局部的問題解決策略有關;

(3)實現性設計,它考慮實現策略格局的語言的特徵。

2.自底向上的理解策略

自底向上理解策略的原則是軟體人員自底向上認知程式的模式,聚合這些模式可以得到更有意義的高層結構,然後再按照自底向上的方式把這些高層結構聚合在一起,構成更大的結構,直到程式被完全理解。在構造的過程中使用了交叉引用表,可把過程層或語句層的表示直接映射到功能層表示。更高層次的設計可讓維護人員重新考慮程式模型並做出必要的變更和改進。

3.機會主義的理解策略

在實際工作中,程式理解過程很少像上述這些模型所描述的那樣定義完備。所以,VonMayrhauser和Vans提出了使用一種集成模型的機會主義的理解策略。他們的研究發現,理解過程是自頂向下與自底向上這兩種方法的結合過程。集成模型包括4個主要部分,即程式模型、狀況模型、自頂向下模型和知識庫。當對代碼熟悉時,使用自頂向下模型,而對代碼完全不熟悉時,使用自底向上模型,通過這種靈活的方式推進理解過程。知識庫能夠幫助對其他3個部分模型的構造,每個模型均由代碼的中間表示以及建立這種中間表示的策略構成,知識庫融合了以前需要的相關信息和知識。在理解過程中,新的信息被開發出來放在知識庫中以便將來使用。

具體方法

下面簡單介紹幾種程式理解方法。

1、工程法:利用工程的方法來進行程式理解。工程法包括正向工程、逆向工程、再結構、重用工程以及軟體再工程的方法等。

2)程式切片法:程式切片(program slicing)是根據控制流和數據流分析引進的一種程式分析技術。包括語句切片、無定型切片、過程間和過程內切片以及面向對象切片方法等。

3)格局識別法:維護人員必須在改正、加強和再工程程式之前找到相關代碼,通常是適合某種模式的代碼。模式是一種結構或行為,依賴於尋找有特定語法結構的代碼,還是與程式執行有關的特定數據流、控制流或動態相關的代碼。為定位這種模式需要一種更接近軟體工程師智力模型的搜尋機制(而不是一般的程式分析工具),這種機制稱為格局識別。

4)概念賦值和概念分析法:概念賦值(concept assignment)是發現面向人類的概念中的問題,並把它們賦值給它們在軟體系統內部的實現實例。概念賦值是在用戶終端套用語義層的模式匹配,是一個在原始碼內重新識別概念,並通過聯繫可識別概念及對應程式來建立程式的一種理解的過程。概念分析(concept analysis)把任何對象和屬性之問的關係轉換成一個完全的概念格,可通過代數含義來研究這些概念格,並且利用概念格能夠很成功地研究初始關係的特性和結構的本質。

5)模式匹配法:模式匹配是在不同的抽象層次卜對程式的各種模式進行匹配的過程。軟體理解技術按如下遞增抽象形式考慮原始碼:粗糙文本、預處理文本、辭彙標誌、語法樹、帶符號表的註解抽象語法樹、控制流/數據流圖、程式格局、構築範式描述和概念模型等。對不同的用戶和不同的軟體理解目的來說必須進行不同層次的分析。用基於語法、語義和概念模式匹配的逆向工程理解方法能夠加強對程式的理解。

6)程式分析法:程式分析包括靜態程式分析和動態程式分析兩種:靜態程式分析無需執行主題程式而只是根據一些模型推斷程式本質結果的過程。靜態程式分析包括語法分析、類型檢查和推理、控制和數據流分析、結構化分析、交叉引用、複雜度度量等過程;動態程式分析是在一個主題系統中發現運行時依賴的過程。它包括對象實例依賴、動態聯編和多態性、方法調用圖、路徑覆蓋測試、記憶體管理、功能瓶頸、分支和並發等。

7)智慧型理解(intelligent understanding)法:利用人工智慧和專家系統技術幫助進行軟體理解。

輔助工具

閱讀原始碼是程式理解的一項重要活動,但是閱讀別人的代碼是枯燥乏味而且比較困難的工作,所以開發輔助工具成了程式理解的一項重要研究內容,並且在這一領域已經有了很多成果。這些工具能以更清晰、更可讀、更可理解的方式組織和表示原始碼,把人們從煩躁的代碼閱讀中解放出來。常見的輔助工具有以下幾種:程式切分器、靜態分析器、動態分析器等。程式切分器能夠幫助程式設計師選擇並只觀察所提議更改影響的程式部件,不受無關部件的干擾,顯示數據鏈和相關特徵,使程式設計師能夠跟蹤更改影響。靜態分析器能夠幫助程式設計師快速提取模組、過程、變數、數據元素、對象與類、類層次結構等信息。在理解過程中,理解人員應該使用這些工具,以提高理解效率。

目前,除了針對C++、Java以及Ada等語言而專門開發的程式理解工具Understand外,專門用於程式理解的工具還不是很多,並且其中大多是作為輔助功能用於支持開發、測試或其他任務,如Logiscope、Panorama++、McCabe IQ、Klocwork以及有關的IDE。國內北大青鳥在“九五”期間專門將c++的程式理解工具作為科技攻關項目,並取得了較好的成績,但遺憾的是並未看到他們普及套用的商業化產品或開源產品。

提高對策

正確、完整、快速地理解程式意味著程式理解的效率高。在程式理解過程中,維護人員要儘可能多地蒐集信息(程式文檔、原始碼、程式的組織與表示等),而這些信息的完整性、易讀性、可靠性都直接影響理解的效率。另外,軟體人員自身的專業知識和套用領域知識也很重要,這些都是影響程式理解的因素,針對這些因素,可採用下列對策。

1.提高維護人員的素質

維護人員是軟體理解過程的主體,所以維護人員自身的素質直接影響理解的效率。維護人員在套用領域或程式語言方面的經驗越多,越容易理解程式以及整個軟體系統。因此,應該多給維護人員培訓的機會,提高他們的專業水平,使維護團隊的整體素質得到提高。另外,還應該拓寬維護人員的知識領域。例如,若要理解的是某個套用在金融領域的系統,在理解的開始,就應該邀請該領域的專家對理解者做相應的培訓工作,拓寬他們的知識面,幫助他們較快地進入到軟體理解的環境中去。

2.科學地管理開發過程

程式理解是在現有系統和保存信息的基礎上進行的,所以程式理解活動中經常要諮詢系統開發時的參與者。但這存在一定的困難,原因之一可能是這些工作人員任務繁重,或是由於遺忘,很難配合維護人員的工作;也可能這些人已經離開了本單位,根本無法諮詢。所以,在系統開發時就應該採取科學的管理。它包含兩層含義:一是保留所有有關的文檔,並做到及時更新。例如從最初的需求規格說明,系統設計文檔到維護文檔,都要做到妥善保存、及時更新。這些信息都直接影響到維護人員蒐集信息的質量。二是要注意系統的實現問題,例如命名風格、注釋、嵌套層次,最好使用統一的規則,這些都直接影響維護人員理解的容易程度和深度。

3.有效地使用自動化輔助工具

開發輔助工具是軟體理解的一項重要研究內容,並且在這一領域已經有了很多成果。這些工具能以更清晰、更可讀、更可理解的方式組織和表示原始碼,把人們從煩瑣的代碼閱讀中解放出來。常見的輔助工具有程式切分器、靜態分析器、動態分析器等。程式切分器能夠幫助維護人員選擇並只觀察要修改和受修改影響的程式部件,不受其他無關部件的干擾,顯示數據鏈和相關特徵,使維護人員能夠跟蹤變更的影響。靜態分析器能夠幫助維護人員快速提取模組、過程、變數、數據元素、對象與類、類層次結構等信息。在理解過程中,維護人員應該使用這些工具,提高理解效率。

相關詞條

相關搜尋

熱門詞條

聯絡我們