複製鏈接
請複製以下鏈接發送給好友

程序理解

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

程序理解任務

程序理解的任務就是要揭示程序的功能與實現機制,即理解系統的外部行為和內部構造,其具體任務可分解如下。
1)通過檢查單個的程序設計結構,程序被表示成抽象語法樹、符號表或普通源文本,這其中包括手工代碼閲讀、人工製品提取、程序分析、靜態分析和動態分析幾個過程。
2)儘量做到程序隱含信息的顯性表示及程序內部關係的可視化。如控制流和數據流分析,各種程序視圖的構造等。
3)從源代碼中提取信息,並存放在通用的數據庫中,然後通過查詢語言對數據庫進行查詢。
4)檢查程序構造過程中的結構關係,明確表示程序組成部分之間的依賴關係。
5)識別程序的高層概念,如標準算法、數據結構、語法及語義匹配等。 [2] 

程序理解內容

經過分析,全面、準確、迅速地理解程序,對於軟件的開發、維護、質量保證及逆向工程和再工程有着重要意義。不過,程序理解的內容比較多,要講述程序理解的內容,就必須結合具體的程序設計語言。儘管如此,程序理解一般都包含如下內容:
·程序理解的功能和目標。
·掌握程序的結構信息,即從程序中細分出若干結構成分,如程序系統結構、控制結構、數據結構、輸入/輸出結構等。
·瞭解數據流信息,即涉及的數據源於何處,在哪裏被使用。
·瞭解控制流信息,即瞭解每條路徑的結果。
·程序理解的操作(使用)要求。
·面向對象的理解(對象、類、繼承、通信等等)。 [3] 

程序理解相關技術

語句分析
與自然語言類似,程序文件是由語句構成的,包括標識符、操作符、關鍵字、字符串、數字、標點符號等詞法單元。語句分析分別構造程序的詞法模型與語法模型,它們對應於詞法分析與語法分析。由於這兩種分析不生成任何語義信息,所以它們生成的模型僅僅適用於源代碼的模式匹配。
程序流分析
程序流分析技術,即在程序運行之前,通過靜態分析去發現程序在運行行為方面的某些特性。程序流分析包括控制流分析和數據流分析兩種,其中控制流分析側重於對程序結構的分析,而數據流分析則側重於對變量控制結構中數據的賦值、使用及傳遞情況的分析。
程序理解的首要任務是發現它的控制結構,即語句的可能執行路徑,通過控制流分析建立過程內部的控制層次。控制流分析可以分為兩大類:必經點分析和區間分析,這兩種分析方法都是先對程序文本進行分析,將其轉化成某種中間表示,然後在中問表示的基礎上進行分析,具體選用哪種方法需根據程序理解的任務而定。
數據流分析是為了計算被分析程序在生成數據方面的行為,通常用於程序優化,即為程序優化建立環境。目前,使用最為廣泛的方法是對控制流圖進行循環分析,稱為迭代數據流分析。
由於非結構化程序會給測試、排錯和程序維護帶來較大的困難,因此按照結構化程序設計的要求,理想的程序設計是儘量避免使用goto語句,程序的控制結構儘量做到單入口、單出口。基於這些原因,在對被測軟件進行分析時,系統地檢查程序的控制結構成了十分有意義的工作。
軟件結構圖
軟件結構圖分程序調用關係圖(或函數調用關係圖)和系統結構圖。函數調用關係圖或者説是程序調用關係圖,都是對源程序中函數關係的一種靜態描述,在函數調用關係圖中,節點表示函數,邊表示函數之間的調用關係。 [3] 

程序理解基本策略

軟件心理學和認知學的角度,通過對維護人員和維護人員理解過程的研究,總結出3種理解策略,並且提出若干相應的模型。
1.自頂向下的程序理解策略
自頂向下理解策略的原則是維護人員從程序的頂層開始,以從上到下的方式逐步理解下層細節。主要的自頂向下模型有Soloway模型等。Soloway在他的模型中採用自頂向下的方法,根據所擁有的知識和假設,把系統分解成能夠在代碼中實現的預料中的子系統,然後逐個分解每個子系統直到實現既定功能的一個個代碼塊。用這種方法構造的智力模型由目標和設計的層次構成,利用論述規則把目標分解成設計,繼而分解成更低層的設計。該模型使用3種不同的設計類型:
(1)戰略性設計,它描述程序中的整體策略;
(2)策略性設計,它與局部的問題解決策略有關;
(3)實現性設計,它考慮實現策略格局的語言的特徵。
2.自底向上的理解策略
自底向上理解策略的原則是軟件人員自底向上認知程序的模式,聚合這些模式可以得到更有意義的高層結構,然後再按照自底向上的方式把這些高層結構聚合在一起,構成更大的結構,直到程序被完全理解。在構造的過程中使用了交叉引用表,可把過程層或語句層的表示直接映射到功能層表示。更高層次的設計可讓維護人員重新考慮程序模型並做出必要的變更和改進。
3.機會主義的理解策略
在實際工作中,程序理解過程很少像上述這些模型所描述的那樣定義完備。所以,VonMayrhauser和Vans提出了使用一種集成模型的機會主義的理解策略。他們的研究發現,理解過程是自頂向下與自底向上這兩種方法的結合過程。集成模型包括4個主要部分,即程序模型、狀況模型、自頂向下模型和知識庫。當對代碼熟悉時,使用自頂向下模型,而對代碼完全不熟悉時,使用自底向上模型,通過這種靈活的方式推進理解過程。知識庫能夠幫助對其他3個部分模型的構造,每個模型均由代碼的中間表示以及建立這種中間表示的策略構成,知識庫融合了以前需要的相關信息和知識。在理解過程中,新的信息被開發出來放在知識庫中以便將來使用。 [4] 

程序理解具體方法

下面簡單介紹幾種程序理解方法。
1、工程法:利用工程的方法來進行程序理解。工程法包括正向工程、逆向工程、再結構、重用工程以及軟件再工程的方法等。
2)程序切片法:程序切片(program slicing)是根據控制流和數據流分析引進的一種程序分析技術。包括語句切片、無定型切片、過程間和過程內切片以及面向對象切片方法等。
3)格局識別法:維護人員必須在改正、加強和再工程程序之前找到相關代碼,通常是適合某種模式的代碼。模式是一種結構或行為,依賴於尋找有特定語法結構的代碼,還是與程序執行有關的特定數據流、控制流或動態相關的代碼。為定位這種模式需要一種更接近軟件工程師智力模型的搜尋機制(而不是一般的程序分析工具),這種機制稱為格局識別。
4)概念賦值和概念分析法:概念賦值(concept assignment)是發現面向人類的概念中的問題,並把它們賦值給它們在軟件系統內部的實現實例。概念賦值是在用户終端應用語義層的模式匹配,是一個在源代碼內重新識別概念,並通過聯繫可識別概念及對應程序來建立程序的一種理解的過程。概念分析(concept analysis)把任何對象和屬性之問的關係轉換成一個完全的概念格,可通過代數含義來研究這些概念格,並且利用概念格能夠很成功地研究初始關係的特性和結構的本質。
5)模式匹配法:模式匹配是在不同的抽象層次卜對程序的各種模式進行匹配的過程。軟件理解技術按如下遞增抽象形式考慮源代碼:粗糙文本、預處理文本、詞彙標誌、語法樹、帶符號表的註解抽象語法樹、控制流/數據流圖、程序格局、構築範式描述和概念模型等。對不同的用户和不同的軟件理解目的來説必須進行不同層次的分析。用基於語法、語義和概念模式匹配的逆向工程理解方法能夠加強對程序的理解。
6)程序分析法:程序分析包括靜態程序分析和動態程序分析兩種:靜態程序分析無需執行主題程序而只是根據一些模型推斷程序本質結果的過程。靜態程序分析包括語法分析、類型檢查和推理、控制和數據流分析、結構化分析、交叉引用、複雜度度量等過程;動態程序分析是在一個主題系統中發現運行時依賴的過程。它包括對象實例依賴、動態聯編和多態性、方法調用圖、路徑覆蓋測試、內存管理、功能瓶頸、分支和併發等。
7)智能理解(intelligent understanding)法:利用人工智能和專家系統技術幫助進行軟件理解。 [1] 

程序理解輔助工具

閲讀源代碼是程序理解的一項重要活動,但是閲讀別人的代碼是枯燥乏味而且比較困難的工作,所以開發輔助工具成了程序理解的一項重要研究內容,並且在這一領域已經有了很多成果。這些工具能以更清晰、更可讀、更可理解的方式組織和表示源代碼,把人們從煩躁的代碼閲讀中解放出來。常見的輔助工具有以下幾種:程序切分器、靜態分析器、動態分析器等。程序切分器能夠幫助程序員選擇並只觀察所提議更改影響的程序部件,不受無關部件的干擾,顯示數據鏈和相關特徵,使程序員能夠跟蹤更改影響。靜態分析器能夠幫助程序員快速提取模塊、過程、變量、數據元素、對象與類、類層次結構等信息。在理解過程中,理解人員應該使用這些工具,以提高理解效率。
目前,除了針對C++Java以及Ada等語言而專門開發的程序理解工具Understand外,專門用於程序理解的工具還不是很多,並且其中大多是作為輔助功能用於支持開發、測試或其他任務,如Logiscope、Panorama++、McCabe IQ、Klocwork以及有關的IDE。國內北大青鳥在“九五”期間專門將c++的程序理解工具作為科技攻關項目,並取得了較好的成績,但遺憾的是並未看到他們普及應用的商業化產品或開源產品。 [3] 

程序理解提高對策

正確、完整、快速地理解程序意味着程序理解的效率高。在程序理解過程中,維護人員要儘可能多地蒐集信息(程序文檔、源代碼、程序的組織與表示等),而這些信息的完整性、易讀性、可靠性都直接影響理解的效率。另外,軟件人員自身的專業知識和應用領域知識也很重要,這些都是影響程序理解的因素,針對這些因素,可採用下列對策。
1.提高維護人員的素質
維護人員是軟件理解過程的主體,所以維護人員自身的素質直接影響理解的效率。維護人員在應用領域或編程語言方面的經驗越多,越容易理解程序以及整個軟件系統。因此,應該多給維護人員培訓的機會,提高他們的專業水平,使維護團隊的整體素質得到提高。另外,還應該拓寬維護人員的知識領域。例如,若要理解的是某個應用在金融領域的系統,在理解的開始,就應該邀請該領域的專家對理解者做相應的培訓工作,拓寬他們的知識面,幫助他們較快地進入到軟件理解的環境中去。
2.科學地管理開發過程
程序理解是在現有系統和保存信息的基礎上進行的,所以程序理解活動中經常要諮詢系統開發時的參與者。但這存在一定的困難,原因之一可能是這些工作人員任務繁重,或是由於遺忘,很難配合維護人員的工作;也可能這些人已經離開了本單位,根本無法諮詢。所以,在系統開發時就應該採取科學的管理。它包含兩層含義:一是保留所有有關的文檔,並做到及時更新。例如從最初的需求規格説明,系統設計文檔到維護文檔,都要做到妥善保存、及時更新。這些信息都直接影響到維護人員蒐集信息的質量。二是要注意系統的實現問題,例如命名風格、註釋、嵌套層次,最好使用統一的規則,這些都直接影響維護人員理解的容易程度和深度。
3.有效地使用自動化輔助工具
開發輔助工具是軟件理解的一項重要研究內容,並且在這一領域已經有了很多成果。這些工具能以更清晰、更可讀、更可理解的方式組織和表示源代碼,把人們從煩瑣的代碼閲讀中解放出來。常見的輔助工具有程序切分器、靜態分析器、動態分析器等。程序切分器能夠幫助維護人員選擇並只觀察要修改和受修改影響的程序部件,不受其他無關部件的干擾,顯示數據鏈和相關特徵,使維護人員能夠跟蹤變更的影響。靜態分析器能夠幫助維護人員快速提取模塊、過程、變量、數據元素、對象與類、類層次結構等信息。在理解過程中,維護人員應該使用這些工具,提高理解效率。 [4] 
參考資料
  • 1.    蔡建平編著.軟件測試大學教程:清華大學出版社,2009.09
  • 2.    田文洪主編;王玉林,李凡,周俊臨副主編.軟件工程:共同演進的方法與實踐:機械工業出版社,2013.04
  • 3.    蔡建平編著.軟件測試實驗指導教程:清華大學出版社,2009.11
  • 4.    殷人昆,鄭人傑,馬素霞等編著.實用軟件工程:清華大學出版社,2010.11