999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

人工智能技術在嵌入式代碼審查中的應用與展望*

2020-07-22 07:35:42李楊陽
空間控制技術與應用 2020年3期
關鍵詞:程序人工智能模型

李楊陽,萬 波,梁 森,胡 濤

0 引 言

嵌入式軟件是應用于嵌入式硬件中的操作系統和應用軟件.隨著各個行業中嵌入式計算的應用越來越廣,嵌入式軟硬件的需求也在不斷增多.由于航天領域的特殊性,對嵌入式軟硬件的要求更加苛刻.在嵌入式軟件開發過程中,軟件測試是必不可少的一個環節.軟件測試是一種比較實際輸出與預期輸出間差異的過程,它是一種保證軟件在開發過程中的完整性、正確性和安全性的重要工作.軟件測試按照測試過程逐步推進的角度可分為單元測試、組裝測試、確認測試、系統測試和驗收測試.在這些測試中,確認測試是檢驗軟件是否滿足軟件需求規格說明中規定的軟件功能而進行的測試,通常使用黑盒測試方法來設計測試用例.確認測試主要包括功能測試、性能測試、接口測試、安全性測試、余量測試和強度測試等.為了測試整個軟件是否符合需求,確認測試對代碼測試的覆蓋率要求極高,一般要求達到100%.但是,通常確認測試階段達到語句和分支覆蓋100%的要求是很難達到的,一些異常或者故障的情況難以復現并進行測試(比如,通常難以預測哪些進程會出現系統運行時進程之間的資源訪問沖突),這時便需要代碼審查作補充測試,通過人工分析程序的運行情況找出可能存在的軟件缺陷[1].因而代碼審查在嵌入式軟件在開發過程中有著一定的必要性.

當前的代碼審查以人工代碼審查為主.隨著軟件開發節奏變快,軟件功能日益復雜多樣化,人工代碼審查的弊端日益顯現:一方面,人工代碼審查一方面嚴重依賴于人的經驗,自動化程度低且遺漏率高;另一方面,用于輔助審查人員進行代碼審查工作的軟件工具功能有限,往往只能進行較為簡單的檢查功能(如規范性檢查),無法進行更復雜的檢查(如功能預測、缺陷檢測等).這些弊端隨著軟件的發展日益凸顯,嚴重的情況下會拖延嵌入式軟件的開發周期,降低整體的開發效率.為了提高代碼審查的效率,勢必要減少審查工作對審查人員的審查經驗的依賴性,提升輔助審查手段,讓審查工作變得友好又高效.

近年來,以深度學習為首的人工智能技術在計算視覺、自然語言處理、生物醫學等領域大放異彩.得益于現代計算機強大的計算能力,深度學習模型可以通過訓練獲取處理特定任務的經驗,并將這些經驗應用于實際的任務中.目前,一部分研究人員在探究將深度學習應用于代碼審查的可行性.他們提出了一些處理特定審查任務的深度學習模型,并比較了與傳統方法性能的優劣.

鑒于目前相關研究成果較為分散,缺少一個系統性的總結,本文旨在對目前與代碼審查相關的人工智能研究成果進行歸納總結,并探討未來代碼審查發展的方向.

1 嵌入式代碼審查

嵌入式代碼審查顧名思義,是指嵌入式軟件開發過程中的代碼審查工作.下面分別介紹嵌入式代碼審查相關概念和目前所面臨的挑戰.

1.1 代碼審查

軟件測試按照是否運行被測試程序分為靜態測試和動態測試,靜態測試包括文檔評審、代碼審查等.在嵌入式軟件的第三方測試中廣泛應用的測試方式就是代碼審查[2].

根據IEEE Std.610.12—1990,代碼審查是一種靜態分析技術,它依靠目視檢查開發的產品,發現錯誤、發現和開發標準的偏離以及其他問題[1].軟件代碼審查的目的是檢查代碼和設計的一致性、代碼執行標準的情況、代碼邏輯表達的正確性、代碼結構的合理性以及代碼的可讀性[3].

代碼審查一般分為三個步驟:背景資料閱讀、審查代碼和填寫檢查單.背景資料通常包括任務書、需求說明書、涉及編程的硬件說明書(比如51系列芯片引腳的說明)等.不同工程對審查代碼的仔細程度也有不同要求,高可靠性軟件的代碼往往需要從細節到整體的全方位檢查.審查完代碼后需要將審查出的問題歸納到檢查單中.

代碼審查的優點有:①能夠盡早測試盡早發現問題;②所需投入的測試資源少;③代碼審查所針對的對象是整個軟件代碼,對消除一些特別細節的錯誤大有裨益,尤其是那些容易在閱讀代碼的時候發現的缺陷,比如可維護性與可讀性方面的缺陷;④發現缺陷的效率較高,一般能發現軟件中30-70%的缺陷[4-5].所以代碼審查是軟件測試中發現缺陷比較有效的手段之一,也是提高代碼質量的最強大的技術之一.正因為這些優點,代碼審查得到測試業界的重視.

1.2 嵌入式軟件特性[3]

嵌入式軟件是基于嵌入式系統設計的軟件,它是由程序以及文檔組成.嵌入式軟件與通用軟件的區別主要表現在以下幾方面:首先,與通用的軟件有很強的兼容性不同,嵌入式軟件只能運行在特定的目標機上,與其所屬的目標機系統有很強的耦合性,軟件的實現細節和目標機系統的結構、I/O 端口配置等都有關系;其次,嵌入式系統需要在規定的時間內完成相關的任務,因此具有很強的軟件實時性要求;即使是中斷處理方式也會影響到嵌入式系統的實時性能.在實際應用中,由于中斷的復雜性,對于嵌入式軟件很難進行充分的測試,只能通過充分的中斷分析來彌補.

1.3 嵌入式軟件與代碼審查

由嵌入式軟件特性可知,嵌入式軟件具有兼容性差、實時性強、種類繁多等特點.因為確認測試對測試的覆蓋率有極高的要求,嵌入式軟件繁多的特性會極大地增大確認測試地工作量和難度.為了在測試的效率和測試的覆蓋率之間達到平衡,確認測試一般通過黑盒測試技術驗證嵌入式軟件的大部分代碼和運行狀態的正確性,然后使用代碼審查作為補充去驗證前面未能覆蓋的剩余區域.

嵌入式軟件代碼審查一般依據代碼檢查單進行[1],可以針對不同的編程語言的代碼、設計文檔、需求文檔等不同對象分別制定,并可以不斷累積和豐富.

檢查單的范圍可以很廣,可以根據需要設置不同的檢查項目,如對常見設計缺陷的檢查、針對各種編程語言常見問題使用錯誤的檢查、針對軟件所使用的芯片常見錯誤的檢查等[1].典型的代碼檢查單如表1所示.由于代碼檢查單的特性,代碼審查可以較為簡便地針對軟件中較難進行黑盒測試的情況進行驗證,進而避免了測試工作復雜性的提升,一定程度上保證了確認測試的效率.

表1 典型代碼檢查單示例Tab.1 Typical code checklist examples

1.4 代碼審查所面臨的挑戰

時至今日,傳統嵌入式代碼審查目前主要面臨的幾個方面的問題:

(1)代碼審查工作效率下降

嵌入式系統軟件功能的日益強大,其功能和復雜性也日益增加,這導致代碼審查的檢查項目增多,檢查難度增加,進而降低代碼審查的工作效率.

(2)審查人員工作成本增加

根據代碼審查的定義,代碼審查也是一種程序理解活動.代碼審查工作的進行速度依賴于審查人員的專業知識水平和經驗.為了保證工作效率,軟件復雜度的提高間接提升了審查人員的專業知識和審查經驗的門檻,審查人員的工作成本增加.

(3)現有代碼審查輔助軟件功能不強

現有的輔助軟件大多都是以靜態分析技術為基礎,如軟件編程規范檢查、資源訪問沖突分析(如specchecker)等.這些軟件在許多軟件功能性的檢查項目上能力較弱,只能提供靜態數據讓審查人員去分析,對審查人員的幫助有限.

以上三個問題制約著嵌入式代碼審查的審查效率,是代碼審查目前所面臨的主要挑戰.

1.5 機遇

軟件代碼審查中,審查人員閱讀代碼、理解代碼、審查代碼的過程可以看作是程序理解活動.程序理解存在于認知代碼相關的任何領域,同時也是一個研究領域.現今,隨著人工智能技術在程序理解領域的應用,出現了一些先進的程序理解算法,這些算法相較于傳統方法更加智能,能幫助程序員進行程序理解.這些程序理解算法的出現對代碼審查來說是一個機遇:將基于人工智能的程序理解應用于代碼審查過程,能夠減輕審查人員的認知負擔,提升代碼審查的工作效率.

2 程序理解

程序理解是軟件工程中的一個經典話題,又叫軟件理解或系統理解.自軟件出現以來,甚至在軟件工程提出之前,就有了程序理解這個問題[6].1968 年第一次軟件工程研討會之后,程序理解成為軟件工程中的關鍵活動,在進行軟件重用、維護、遷移、逆向工程以及軟件系統擴展等任務時,都要依賴于對程序的理解.比如,源碼逆向工程通過分析目標系統來識別系統的成分及其相互關系,創建系統的更高抽象層次上的表示,包括構建目標系統的概念模型、抽取程序結構和控制信息以及進行數據抽取和系統抽象.在軟件維護和演化中,例如軟件適應(adaptive)、軟件修復(corrective)、軟件復用(reuse)等任務,程序理解也是其首要活動,其他活動都是在程序理解的基礎上進行的.例如:完成軟件適應任務的流程包括理解系統、定義適應需求、制定適應策略、設計、代碼修改、調試、回歸測試;軟件修復任務的流程包括理解系統、提出/評估問題假設、修復代碼、回歸測試.隨著程序設計語言的不斷變化和軟件復雜性不斷提高,程序理解一直面臨著挑戰,新的研究問題不斷涌現.在實際的軟件工程項目中,程序員往往會花費超過一半的時間用于程序理解活動[7],程序理解研究的重要性不言而喻.

本節從三個方面介紹程序理解,分別是程序理解的認知策略、程序理解的方法和程序理解的挑戰與機遇.

2.1 程序理解的認知策略和方法

程序理解是一個學習和認知的過程.代碼是編程語言形式的知識編碼,而程序理解就是要從這些知識編碼中學習代碼所表達的知識的過程.根據構建式學習的理論,學習和認知的過程是面向目標或者模型驅動的歸納抽象過程.第一,學習是學習者個體從學習材料中通過提取或抽象等手段構建知識體的過程;第二,所構建的知識體除了依賴學習材料,很大程度上還依賴于學習者已有的知識背景和本次學習的目的.從構建式學習理論出發,程序理解的基本策略可以分為三種:

(1)自底向上的策略

該策略從具體的代碼開始閱讀,然后將具體代碼的含義組合,形成更高級的抽象信息,最后在認知層面形成一個具有整體抽象意義的知識集合.例如,一種程序認知框架區分語法和語義兩個層次:語法層關注程序的語句和基本單元;語義層與程序語言無關,是逐層抽象直到所抽象的知識能描述應用領域.另一種認知框架區分程序模型(program model)和情景模型(situation model):程序模型對程序的控制流進行抽象;情景模型則是封裝了關于數據流抽象和功能抽象的知識,表達了程序的目標層次[8].用傳統的軟件開發方式可以解釋這種策略背后的原因,即,程序理解是為了還原自底向上的軟件開發過程.

(2)自頂向下的策略

這種策略將程序理解看作是重新組織程序員自身已有的關于程序應用領域的知識,并建立這些知識到程序源碼上的映射.比如,一個典型的過程是:從關于領域應用的假設出發,根據已有的領域知識進行逐層分解,同時與程序源碼進行比對或驗證,從而建立假設和源代碼之間的關聯.這種方式體現了模型驅動的思想,也就是:如果模型存在,程序理解就是將具體的程序片段關聯到已知的模型上,通過模型的結構和語義去刻畫程序的結構和語義.

(3)集成式程序理解模型

集成式程序理解模型結合了自底向上和自頂向下的策略,它認為:對比較熟悉的代碼,可以采用自頂向下的方式進行理解,直接建立源碼和應用知識之間的關聯;而對不太熟悉的代碼,則需要采用自底向上的策略從底層開始進行逐層抽象,以獲得程序所表達的領域知識.比如von Mayrhauser and Vans的集成式程序理解模型就由自頂向下策略、構建程序模型、構建情景模型、知識領域四個成分組成.

2.2 程序理解的方法

程序理解的方法是程序理解的認知策略在工程上的實現.現有的程序理解方法可以分為基于分析的方法和基于學習的方法.

基于分析的方法分為靜態分析方法和動態分析方法.靜態分析方法直接分析程序源代碼,從中獲取相關信息,并且不需要執行程序.靜態分析方法由于其特點具有較強的靈活性,在開發的早期階段就可以進行,相比動態方法更具有普適性,可以覆蓋所有可能的執行路徑.IDE(集成開發工具)中常用的代碼語法糾錯就是一種靜態分析技術,它在程序員編程階段就能分析源代碼,幫助程序員檢查語法錯誤;動態分析方法是程序執行時運行的分析方法,它主要理解程序運行時所具有的性質.動態方法可以通過提取輸入輸出關系或者內部狀態獲得更精確的分析,但是往往是針對特定輸入而言,因此普適性不及靜態分析.

基于學習的方法是一種應用了數據挖掘或機器學習技術的程序理解方法.近年來,隨著計算機運算能力的提升,計算機在短時間內處理大量信息所需要的時間不斷縮短,許多基于學習的方法得以廣泛應用.數據挖掘和機器學習技術在圖像處理、自然語言處理、模式識別等多個領域取得了豐碩的成果.因此,基于學習的技術也受到了更多研究者的關注,一些研究者開始使用這些相關技術進行程序理解.基于學習的程序理解主要是從源代碼和代碼文檔中獲取信息,使用數據挖掘或者機器學習技術學習程序的相關特征,并在實際的程序理解使用.例如,文獻[9]使用了基于有監督學習的神經網絡學習不同編程語言的源代碼特征,并使用這些特征進行源代碼文件分類任務.

2.3 基于人工智能的程序理解

傳統的基于靜態或動態的程序理解一般致力于獲取并分析程序部分特征來達到認知程序的目的.這么做的優點是能夠使用較少的數據和計算量獲得較為準確的局部認知結果.隨著計算機硬件能力的發展和開源項目的增多,發展基于大量代碼的認知計算方法已具備足夠的條件,基于機器學習的程序理解方法順勢而生.

早期的基于學習的程序理解技術多使用經典的機器學習方法,如SVM、隨機森林、決策樹[10]等算法.相較于傳統基于分析的程序分析方法來說,機器學習算法可以接受信息密度更高的特征輸入,因此程序特征的提取方法可以做得更一般化,同一類程序特征可以供多個相近任務使用.另外,經典的機器學習技術可以通過訓練強化與任務相關的程序特征,減弱無關程序特征的影響,一定程序上也防止特征維度過多產生計算復雜度爆炸的情況.

基于傳統機器學習的程序理解技術在一定程度上擺脫了過度降維帶來的信息損失,但它仍然存在不足.例如,仍然需要降維處理獲取特征、過多的特征帶來了龐大的計算冗余等.21世紀10年代,人工智能領域迎來了新的革命——深度學習技術.與傳統機器學習方法不同的是,深度學習致力于直接從信息的本體,即信息源挖掘信息特征,并進行相關任務.眾多領域隨著深度學習的興起迎來新一輪的革命,人工智能技術也隨著深度學習技術的普及,正式廣泛應用于民用領域.

深度學習技術[11]相較于傳統機器學習技術的優勢在于,深度學習更不依賴特征工程.例如,對于人臉識別問題,傳統方法往往是設計相關特征,讓算法能識別出眼鏡、嘴巴、鼻子等器官,再綜合判斷這些特征組合起來是不是一個人臉;而深度學習方法只需要將圖像輸入神經網絡中進行計算,最終直接獲得結果.算法模型在訓練的過程中自己會在隱藏層中就完成特征的認知、學習和識別.這種優勢讓深度學習大大降低了對特征工程的依賴.

深度學習技術的特性也讓學者們注意到其在程序理解領域應用的潛力.科學家們開始將深度學習技術應用于基于學習的程序理解方法中.如圖1,本文調研中收集的程序理解相關文獻中,09年后基于學習的論文數量就已經超過了傳統基于特征分析方法的文章,15年以后基于學習的程序理解更是占比83%.近五年內發表的基于學習的程序理解研究中,63%的研究是基于深度學習技術,且論文隨著時間推移數量呈上升趨勢(截至19年11月,一些會議尚未舉辦,所以19年未計入統計).由此可見深度學習技術在程序理解領域也是同樣廣受歡迎.

2.4 程序理解的挑戰與機遇

程序理解發展到今日已經有了非常豐富的成果,但仍然面臨著準確性、可拓展性等問題的挑戰.新技術的引入對程序理解來說既是一種新的發展機遇,也對研究人員來說是一種挑戰.人工智能技術能否很好地運用在程序理解領域是目前需要探索的一個命題.

近幾年深度學習逐漸成為程序理解領域更為關注的技術.如圖1所示,近四年的程序理解論文中,基于深度學習技術的文章數量處于一個上升趨勢.

圖1 程序理解相關論文發表情況Fig.1 The program understands publication

3 人工智能技術在代碼審查相關領域應用現狀

人工智能應用于實現基于學習的程序理解方法.基于學習的程序理解是一種從程序代碼中獲取知識,并利用通過學習獲得的經驗去對這些知識進行處理,最終獲得想要的結果輸出的過程.因此,實現基于學習的程序理解必須解決以下三個問題:

(1)如何進行知識表示?

(2)如何利用知識獲得期望的結果?

(3)如何將軟件與實際的程序理解工作相結合?

對于知識表示問題,研究人員普遍采用代碼詞嵌入作代碼知識的表征,將代碼與知識相互映射,形成關系;獲得了從代碼中提取的知識后,需要利用這些知識得到特定的結論才能完成程序理解.目前大多數基于人工智能的程序理解都是使用有監督學習模型實現的,它們的功能可以歸類為代碼分類;因為代碼審查工作是一個小組協作且需要大量人機交互的過程,獲取了基于學習的程序理解后,還要將軟件與實際的工作相結合.下面將對代碼詞嵌入、代碼分類和結合了人工智能技術的智能代碼審查系統作介紹.

3.1 代碼特征的表征:代碼詞嵌入

程序理解中有一類重要的問題是代碼的表征,即讓計算機將程序語言表示為人可以理解的抽象概念.上述過程可以看成是將一個維數為代碼長度的高維空間,嵌入到一個維數低得多且每個向量映射為一個程序概念的連續向量空間中的過程,這與自然語言處理領域(NLP)中語言模型與表征學習非常相似.在NLP中語言模型與表征學習技術統稱為詞嵌入技術,因而在程序理解領域,我們將代碼的語言模型與表征學習技術統稱為代碼詞嵌入.

代碼詞嵌入的主要目的是程序信息的表征和降維,將代碼詞嵌入應用于代碼理解模型具有深遠意義.一般的源代碼文件中常含有成百上千行的代碼,每行代碼由若干單詞構成,每個單詞由若干字符組成,再加上程序語言的單詞種類很少,如果作為程序理解的輸入會產生非常多的冗余,這將不利于程序理解保持高效.通過代碼詞嵌入,可以將代碼的含義抽象到低維的向量空間中,讓程序代碼更易理解且更利于提升更進一步的程序理解的計算效率.

早期的詞嵌入使用散列法(Hash),將輸入的詞語轉換為定長度的散列值.文獻[12-13]就使用了這一方法去做代碼詞嵌入.數據處理中最常用的散列法詞嵌入為獨熱編碼(One-Hot Encoding),它是一種用N位向量來表示N種狀態(抽象含義)的編碼方式.由于程序語言的詞語種類不多,獨熱碼的長度往往不會很長,因而使用獨熱編碼進行詞嵌入既能保證不會占用過多計算機資源,又能獲得不錯的詞嵌入效果.但是,散列法也存在著一定的問題.首先,散列法只能一般用于詞語表示,無法囊括更高級的語法表示;其次,散列法獲得的詞嵌入無法包含一些程序結構信息,所以仍然會產生冗余,單純使用獨熱碼的詞嵌入需要添加很多冗余信息(如括號,分號等)來保持語句的結構性.

為了讓詞嵌入具有更強的代碼抽象能力,研究者們將抽象語法樹(Abstract Syntax Tree,AST)應用于詞嵌入當中.抽象語法樹是一種以樹狀結構表示程序語言的語法結構,樹上的每一個節點都表示代碼的一個子結構.一個簡單的抽象語法樹如圖2所示.

圖2 簡單if語句的抽象語法樹.該語法樹結構所表示的語句為“if(a==10) printf(“hoge ”);else printf(“piyo ”)”Fig.2 Abstract syntax tree of simple if statements.The sentence represented by the syntax tree structure is“if (a==10) printf (“hoge ”); else printf (“piyo ”)”

抽象語法樹利用樹形結構簡化了程序代碼文本,刪去了沒有實際意義的符號,將具有實意的信息以樹的結點的形式保存.抽象語法樹常用于程序語言靜態分析工具中,它可以結合令牌化(Tokenization)技術完成對程序語言詞法、語法和少許語義上的抽象工作.文獻[14-15]都在數據預處理階段采用了抽象語法樹和令牌化的代碼詞嵌入方法,如圖3所示.這種方法中抽象語法樹的結點信息以向量的形式保存,然后通過一個映射表將結點信息向量中具有實意的字符串與數字進行一一映射,最終結點信息轉換為以具有特定意義的數字為樣本空間的特征向量,所有特征向量的集合即為整個源程序代碼的特征向量.

抽象語法樹和令牌化的代碼詞嵌入技術雖然讓輸入神經網絡的特征向量有了詞法、語法和少許語義上的特征信息,但明顯這種方法從代碼上獲取的語義層次的信息是不夠的.

在自然語言處理領域,由于語言文字種類繁多且詞義組合多變復雜,不同的詞語組合會出現不同的語義信息,這些組合產生的爆炸般信息增長讓特征向量的維數變得特別大,嚴重增大了模型的計算負擔.顯然,語法層次的預處理成為了自然語言處理模型的性能短板.為了進一步減少輸入樣本空間的大小(維度),模型需要在進行任務之前對文本進行更強的語義級的詞嵌入.經過研究者們的努力,學術界誕生了以Word2Vec[16]為代表的語義級文本詞嵌入,自然語言處理模型的能力得到了極大的提高.語義級詞嵌入的發明意義在于它進一步對輸入的信息進行了降維,加強了模型的運行效率;同時它讓詞語之間產生了一定的語義上聯系,提高了模型的泛化能力.程序理解領域也有與自然語言處理相似的預處理問題.程序語言的詞語種類雖然不多,但是通過不同的組合,相似語法結構的程序會執行完全不同的功能.比如有的循環語句是用來賦值的,有的循環語句是用于排序數據結構的.再者,由不同的程序語言寫成的代碼雖然在詞法、語法上可能不同,但它們可能執行著相同的功能.如果這樣的預處理應用在對代碼功能進行分類的模型上,這些預處理獲得的特征向量將帶有詞法、語法層面的信息冗余.倘若模型在預處理階段就能獲得這些代碼語義級別的表征,在后續階段的處理中這些詞法、語法級別的冗余內容將會被忽略,模型的效率和泛化能力將會得到進一步加強.

最新的研究成果中,已經有研究者將語義級的詞嵌入擴展到代碼詞嵌入中.文獻[17]提出了可用于代碼預處理的一種將代碼表示為連續的分布式向量的神經網絡模型.該模型在抽象語法樹的基礎之上增添了一個神經網絡,該神經網絡經過訓練后可以獲得一個上下文特征向量和一個注意力向量,這兩個向量與所有代碼語句令牌化的抽象語法樹特征向量進行運算后獲得了全局代碼的特征向量,這個全局的特征代碼向量即可直接用于預測相應的標簽.簡單的來說,代碼經過該模型處理,輸出的不再是以詞句信息或者語法結構信息為主要信息的特征向量,而是以帶有上下文信息的語義信息的特征向量.這種特征向量具有更強的信息抽象,因而模型具有了更好的泛化能力.文獻[18]提出了另一種語義級的代碼詞嵌入技術.與文獻[17]提出的詞嵌入技術不同的是,該模型是基于循環神經網絡的編碼器-解碼器結構實現的,此種結構與自然語言處理中的翻譯機的結構相似.模型實現原理略微不同,但是它們都是對代碼進行語義級的特征映射,得到相應的特征向量.

圖3 抽象語法樹和令牌化的代碼詞嵌入流程圖Fig.3 Abstract syntax tree and tokenized code word embedding flowchart

3.2 功能模型:代碼分類

程序員通過閱讀代碼,對代碼的功能或特性進行分類是一種常見的程序理解活動,實現這種程序理解活動的人工智能模型統稱為代碼分類模型.常見的代碼分類任務有源碼分類、功能分類、缺陷預測等,其中又以缺陷預測最為受到關注.代碼審查中,評判源代碼是否有缺陷實際上就是一種代碼缺陷預測任務.因此,下面圍繞以代碼缺陷預測為主的代碼分類技術的發展作介紹.

早些年,代碼分類依托程序分析技術進行.按照是否運行源代碼進行分析,程序分析技術可分為靜態程序分析和動態程序分析兩種,靜態程序分析不需要運行源代碼直接分析代碼的屬性,動態程序分析則主要分析程序運行中產生的輸入輸出以及狀態變化.常用的靜態程序分析方法有代碼度量分析、程序抽象語法樹分析、函數調用關系分析等;常用的動態分析技術以數據流分析為主.早期的代碼分類模型依托程序分析技術獲得程序的相關信息,通過對這些信息的對比來進行代碼分類工作.

雖然傳統程序分析技術對程序理解工作有一定的幫助,但這些分析技術在某些任務上難以取得比較好的效果.比如抽象語法樹只能從程序語言語法層面提取代碼特征,遇到語法不同的源代碼文件就需要對二者的特征進行歸一化處理,歸一化處理的過程中會產生信息的丟失或冗余,影響代碼分類結果.傳統程序分析技術還存在著易用性低、操作略微繁瑣的問題.文獻[7]中提到有相當一定數量的程序員沒有采用或者很少采用審查輔助工具去進行代碼審查,其中的原因便是傳統審查工具缺少使用友好性,程序員很難將審查工具與自己的審查習慣結合.

隨著人工智能技術的發展,人工智能技術在代碼分類領域逐漸得到應用.文獻[19]使用了多種機器學習算法進行代碼缺陷預測工作,這些機器學習算法包括Bagging、Boosting、Decorate、C4.5、Naive Bayes、神經網絡、隨機森林和RIPPER,并比較了各種機器學習算法的性能.值得一提的是,文獻使用軟件的代碼度量和測試度量作為特性對代碼缺陷進行預測.在所有方法中,隨機森林總體上取得了較好的結果.文獻[13]使用了卷積神經網絡進行源代碼編程語言地分類.該任務只需要依據源代碼編程語言特征進行分類,所以在只使用了簡單的代碼詞嵌入的情況下仍然取得了95%以上的正確率.文獻[14]、文獻[15]分別使用深度信念網絡[20]和卷積神經網絡進行代碼缺陷預測,后者聲稱相較于前者的方法獲得了更好的結果.這兩個模型在預處理階段使用了相同的抽象語法樹結合令牌化的方法,區別只在于后面神經網絡使用的不同.根據兩個文獻的比較可知,卷積神經網絡在此類缺陷預測中有更好的效果.

3.3 智能代碼審查系統

除了程序理解領域,研究人員也試圖將人工智能方法與代碼審查工作相結合.

審查輔助軟件作為程序理解必不可少的工具,在代碼審查工作中的作用卻較為有限.這是因為,代碼審查大多數是一種靜態測試方法,而現有的靜態測試工具能完成的程序理解較為基礎,實際工作中往往只能給予審查人員更多參考信息,而不能替代審查人員進行程序理解.以往的大多數關于代碼審查的研究也顯示,現有工具對審查人員進行程序理解的幫助非常有限[7].基于機器學習的人工智能方法讓研究人員看到了新的曙光,他們開始嘗試將基于人工智能的程序理解引入代碼審查系統中,增強代碼審查軟件的輔助能力.

文獻[21]提出了一種基于深度學習的代碼審查系統.它自動學習歷史同行評審,建立代碼段和代碼評審與分析之間的聯系,并將這種匹配關系應用到新的代碼評審中,對新的待評審代碼進行分析,生成這個待評審代碼的評審項目.生成的評審項目給與評審人員一定的建議,告訴他們哪些地方的代碼最有可能需要進行審查以及進行什么類型的審查.該模型是一種交互式的有監督學習模型,模型除了使用前需要進行訓練外,隨著歷史評審數據的增加,模型還能進行二次訓練,通過不斷累積歷史評審數據來達到提升準確性的目的.它雖然做到了幫助審查人員進行一部分的程序理解,但僅限于向審查人員給與審查項目的建議,還無法做到幫助審查人員去理解審查的代碼,完成一部分代碼缺陷的評判,所以仍然有進一步發展的空間.

文獻[26]描述了一種深度學習技術在代碼搜索上的應用.該文描述的模型使用了代碼詞嵌入和文本詞嵌入,將代碼和文字映射到同一語義空間中,通過匹配代碼和文本的語義向量來完成基于文字信息的代碼搜索.該研究雖然不是針對代碼審查工作,但是它所描述的方法很適合應用于代碼審查的場景.例如,在做需求一致性審查時,審查人員往往需要根據需求去尋找對應代碼.基于文本的代碼匹配就可以很好地幫助審查人員更快地定位代碼位置,對代碼進行審查.

從審查人員的角度來看,智能化的代碼審查系統和他們也是相得益彰的.文獻[21]還對他們提出的技術做了用戶研究,調查使用者是怎么看代碼審查輔助軟件的.結果表明,所有被調查者都愿意接納有更好功能的代碼審查軟件,即使這個軟件只能幫他們推薦評審項目,也明顯減少了他們在通用評審上所花的精力,他們也因此可以將更多注意力放在更復雜的功能性審查上.由此可見,在代碼審查過程中引入新技術對于審查人員是有顯而易見的正面影響的.

4 對智能人工審查的展望

人工智能技術在代碼審查領域的應用尚在起步階段,現階段應用的技術也較為基礎,最新的人工智能技術成果尚未在代碼審查領域應用.例如,對于深度學習代碼詞嵌入有啟發性意義的文本詞嵌入方法word2vec早在2013年就被著名的科技公司google開源;卷積神經網絡、循環神經網絡的誕生更能追溯到上個世紀末.之所以這些技術在近幾年才引入程序理解領域,是因為這些人工智能技術獲得的成就足夠成功,這才引起了更多研究人員的興趣并嘗試將這些方法應用于其他領域.參考學術界最新的技術發展,我們分別對未來可能用于程序理解和代碼審查領域的技術和可能出現的代碼審查輔助軟件做一個展望.

4.1 對人工智能技術的展望

當今最火的人工智能技術就是深度學習.深度學習技術通過學習樣本數據的內在規律和表示層次讓算法具有分析能力,因而在很多任務中都獲得了相當好的成果.程序理解作為一種研究對程序代碼認知方法的學科,非常適合應用深度學習相關技術.

在代碼表征方法上,目前最新的方法使用注意力網絡[17]或基于RNN的編碼器-解碼器結構網絡[18],這兩種方法都是為了加強模型預處理階段對代碼語義特征的表征.相比于這兩種特征抽取神經網絡,Transformer[22]擁有更強的表征能力,現在多數最新的自然語言處理模型都基于由transformer組成的Bert模型,并獲得了相當可觀的進步.除了代碼文本的表征方法外,還有代碼屬性的表征方法.傳統的代碼屬性表征方法是將代碼屬性直接轉換為特征向量輸入人工智能模型中計算,而圖網絡[23-24]的存在提供了另一種思路:使用圖網絡進行代碼屬性表征[25],既可以讓代碼的各種屬性保存在圖的節點之上,又能讓屬性之間產生一定相關性,體現代碼屬性之間的內部關聯.雖然代碼不像文本語言那種具有豐富的詞性和詞語之間的相關性,強大的抽象表征方法顯得有些“性能過剩”,但將這些先進方法用在程序理解領域也不是一件沒有意義的探索.

人工智能技術在程序理解領域的應用相比其他熱門領域數量較少,目前它們的主要應用場景還是以缺陷檢測、代碼分類為主.這些場景執行的功能較為簡單,所以模型也并不復雜,深度普遍不高,且以有監督學習模型為主.這也是一個有發展潛力的地方.

4.2 對智能代碼審查系統的展望

代碼審查工具發展至今日,審查軟件仍然以被動的程序理解為主.被動的程序理解是指輔助軟件需要審查人員自行操作才能對審查中的代碼進行分析,這一特性無疑加大了審查人員審查操作的繁瑣程度.如果軟件可以替代審查人員進行一部分的程序理解,代碼審查的難易度和效率定會有所提升.因此,發展主動的程序理解方法對幫助審查人員提高高效審查工作有深遠意義.

另外,代碼審查工作是一種多人協同的工作,對一個大項目的審查往往需要數個審查人員組成的審查小組來完成,因此代碼審查是擁有一個獨立系統的.代碼審查軟件如果可以將每個審查人員的成功聯合,實現群體智能,無疑對審查工作的質量提升也有非常大的幫助.

圖4 智能代碼審查系統框圖Fig.4 Block diagram of intelligent code review system

基于文獻[21]所述系統和以上介紹的需求,我們對未來的智能代碼審查系統作了番構想,如圖4所示.編譯器/開發環境位于系統的前端,是軟件系統與審查人員進行交互的場所;智能審查工具從編譯器/開發環境中獨立,負責進行代碼信息和知識之間轉換處理;云端知識庫存放各種知識,并在系統中與每一個人機交互端共享知識.在系統中,智能審查工具獨立進行訓練和執行,但訓練和執行所需要的相關信息需要審查人員進行操作,審查人員對智能審查系統的學習起到了監督的作用,保證代碼審查仍然以審查人員為核心進行.

相信隨著更多更強的智能程序理解應用于代碼審查任務,智能代碼審查系統將獲得更強的審查能力,進一步幫助審查人員減輕工作負擔,審查工作將變得更簡單且高效.

5 結 論

現代科技日新月異,造就了嵌入式軟件代碼審查的需求不斷增多,代碼審查效率勢必要有所提升才能滿足這種增長.在已有的人工審查手段成為瓶頸的情況下,引入新的軟件技術幫助提高代碼審查的效率就顯得尤為重要.人工智能技術身為目前發展最為迅速的軟件技術,對當前代碼審查來說是一個不小的機遇.

本文首先對嵌入式代碼審查的情況作了簡要的介紹,引出代碼審查的必要活動,即程序理解.通過程序理解的定義、方法以及所面臨的挑戰與機遇的介紹,闡述了現今與代碼審查關系較為密切的人工智能程序理解技術的發展與應用情況.由介紹可知,目前以深度學習為首的人工智能技術在程序理解乃至代碼審查領域的應用仍然數量較少,落后于最新技術較多.因此,人工智能技術在代碼審查領域仍然有很大的應用潛力,這需要更多的研究人員參與到該領域的探索中.未來更加智能化的代碼審查系統值得期待.

猜你喜歡
程序人工智能模型
一半模型
重要模型『一線三等角』
重尾非線性自回歸模型自加權M-估計的漸近分布
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
2019:人工智能
商界(2019年12期)2019-01-03 06:59:05
人工智能與就業
IT經理世界(2018年20期)2018-10-24 02:38:24
“程序猿”的生活什么樣
數讀人工智能
小康(2017年16期)2017-06-07 09:00:59
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
3D打印中的模型分割與打包
主站蜘蛛池模板: 97超碰精品成人国产| 亚洲av无码专区久久蜜芽| 中文字幕无码制服中字| 久久中文电影| 老司机午夜精品网站在线观看| 在线观看热码亚洲av每日更新| 日本久久久久久免费网络| 亚洲高清资源| 国产欧美日韩在线一区| 少妇人妻无码首页| 日韩精品欧美国产在线| 色噜噜狠狠狠综合曰曰曰| 91青青草视频在线观看的| 超碰免费91| 美女一区二区在线观看| 国产激情无码一区二区免费| 亚洲精品少妇熟女| 91国内视频在线观看| 成人另类稀缺在线观看| 国产福利免费视频| 婷婷六月综合网| 蜜桃视频一区| 囯产av无码片毛片一级| 欧美午夜网| 国产在线97| 欧美午夜网| 国产精品七七在线播放| 久热99这里只有精品视频6| 丝袜亚洲综合| 凹凸国产分类在线观看| 久久久久人妻一区精品色奶水| 亚洲高清日韩heyzo| 九九热这里只有国产精品| 欧美成人在线免费| 真实国产精品vr专区| 欧美国产日韩在线| 亚洲精品国产综合99久久夜夜嗨| 国产视频大全| 亚洲综合中文字幕国产精品欧美 | 欧美亚洲一二三区| www成人国产在线观看网站| 欧美日韩精品一区二区视频| 国产精品福利导航| 99人妻碰碰碰久久久久禁片| 久久人体视频| 国产99视频精品免费视频7| 婷婷中文在线| 国产在线拍偷自揄拍精品| 午夜国产理论| 婷婷五月在线| 国产毛片网站| 国产丰满大乳无码免费播放| 亚洲天堂免费观看| 中文字幕无线码一区| 国产不卡国语在线| 无码在线激情片| 成人午夜在线播放| 婷婷综合色| 欧美在线国产| 一本大道在线一本久道| 亚洲综合色婷婷| 五月激情婷婷综合| 亚洲an第二区国产精品| 婷婷亚洲最大| 无码啪啪精品天堂浪潮av| 狼友视频一区二区三区| 一级看片免费视频| 久久五月视频| 精品91视频| 日韩欧美中文亚洲高清在线| 欧美日韩国产综合视频在线观看 | 国产99视频在线| 国产成人一区| 亚洲手机在线| 日韩精品毛片| 99视频在线免费看| 免费观看欧美性一级| 日韩精品亚洲人旧成在线| 亚洲视频无码| 中文字幕无码中文字幕有码在线| 不卡视频国产| 4虎影视国产在线观看精品|