李楊陽,萬 波,梁 森,胡 濤
嵌入式軟件是應(yīng)用于嵌入式硬件中的操作系統(tǒng)和應(yīng)用軟件.隨著各個(gè)行業(yè)中嵌入式計(jì)算的應(yīng)用越來越廣,嵌入式軟硬件的需求也在不斷增多.由于航天領(lǐng)域的特殊性,對(duì)嵌入式軟硬件的要求更加苛刻.在嵌入式軟件開發(fā)過程中,軟件測(cè)試是必不可少的一個(gè)環(huán)節(jié).軟件測(cè)試是一種比較實(shí)際輸出與預(yù)期輸出間差異的過程,它是一種保證軟件在開發(fā)過程中的完整性、正確性和安全性的重要工作.軟件測(cè)試按照測(cè)試過程逐步推進(jìn)的角度可分為單元測(cè)試、組裝測(cè)試、確認(rèn)測(cè)試、系統(tǒng)測(cè)試和驗(yàn)收測(cè)試.在這些測(cè)試中,確認(rèn)測(cè)試是檢驗(yàn)軟件是否滿足軟件需求規(guī)格說明中規(guī)定的軟件功能而進(jìn)行的測(cè)試,通常使用黑盒測(cè)試方法來設(shè)計(jì)測(cè)試用例.確認(rèn)測(cè)試主要包括功能測(cè)試、性能測(cè)試、接口測(cè)試、安全性測(cè)試、余量測(cè)試和強(qiáng)度測(cè)試等.為了測(cè)試整個(gè)軟件是否符合需求,確認(rèn)測(cè)試對(duì)代碼測(cè)試的覆蓋率要求極高,一般要求達(dá)到100%.但是,通常確認(rèn)測(cè)試階段達(dá)到語句和分支覆蓋100%的要求是很難達(dá)到的,一些異?;蛘吖收系那闆r難以復(fù)現(xiàn)并進(jìn)行測(cè)試(比如,通常難以預(yù)測(cè)哪些進(jìn)程會(huì)出現(xiàn)系統(tǒng)運(yùn)行時(shí)進(jìn)程之間的資源訪問沖突),這時(shí)便需要代碼審查作補(bǔ)充測(cè)試,通過人工分析程序的運(yùn)行情況找出可能存在的軟件缺陷[1].因而代碼審查在嵌入式軟件在開發(fā)過程中有著一定的必要性.
當(dāng)前的代碼審查以人工代碼審查為主.隨著軟件開發(fā)節(jié)奏變快,軟件功能日益復(fù)雜多樣化,人工代碼審查的弊端日益顯現(xiàn):一方面,人工代碼審查一方面嚴(yán)重依賴于人的經(jīng)驗(yàn),自動(dòng)化程度低且遺漏率高;另一方面,用于輔助審查人員進(jìn)行代碼審查工作的軟件工具功能有限,往往只能進(jìn)行較為簡(jiǎn)單的檢查功能(如規(guī)范性檢查),無法進(jìn)行更復(fù)雜的檢查(如功能預(yù)測(cè)、缺陷檢測(cè)等).這些弊端隨著軟件的發(fā)展日益凸顯,嚴(yán)重的情況下會(huì)拖延嵌入式軟件的開發(fā)周期,降低整體的開發(fā)效率.為了提高代碼審查的效率,勢(shì)必要減少審查工作對(duì)審查人員的審查經(jīng)驗(yàn)的依賴性,提升輔助審查手段,讓審查工作變得友好又高效.
近年來,以深度學(xué)習(xí)為首的人工智能技術(shù)在計(jì)算視覺、自然語言處理、生物醫(yī)學(xué)等領(lǐng)域大放異彩.得益于現(xiàn)代計(jì)算機(jī)強(qiáng)大的計(jì)算能力,深度學(xué)習(xí)模型可以通過訓(xùn)練獲取處理特定任務(wù)的經(jīng)驗(yàn),并將這些經(jīng)驗(yàn)應(yīng)用于實(shí)際的任務(wù)中.目前,一部分研究人員在探究將深度學(xué)習(xí)應(yīng)用于代碼審查的可行性.他們提出了一些處理特定審查任務(wù)的深度學(xué)習(xí)模型,并比較了與傳統(tǒng)方法性能的優(yōu)劣.
鑒于目前相關(guān)研究成果較為分散,缺少一個(gè)系統(tǒng)性的總結(jié),本文旨在對(duì)目前與代碼審查相關(guān)的人工智能研究成果進(jìn)行歸納總結(jié),并探討未來代碼審查發(fā)展的方向.
嵌入式代碼審查顧名思義,是指嵌入式軟件開發(fā)過程中的代碼審查工作.下面分別介紹嵌入式代碼審查相關(guān)概念和目前所面臨的挑戰(zhàn).
軟件測(cè)試按照是否運(yùn)行被測(cè)試程序分為靜態(tài)測(cè)試和動(dòng)態(tài)測(cè)試,靜態(tài)測(cè)試包括文檔評(píng)審、代碼審查等.在嵌入式軟件的第三方測(cè)試中廣泛應(yīng)用的測(cè)試方式就是代碼審查[2].
根據(jù)IEEE Std.610.12—1990,代碼審查是一種靜態(tài)分析技術(shù),它依靠目視檢查開發(fā)的產(chǎn)品,發(fā)現(xiàn)錯(cuò)誤、發(fā)現(xiàn)和開發(fā)標(biāo)準(zhǔn)的偏離以及其他問題[1].軟件代碼審查的目的是檢查代碼和設(shè)計(jì)的一致性、代碼執(zhí)行標(biāo)準(zhǔn)的情況、代碼邏輯表達(dá)的正確性、代碼結(jié)構(gòu)的合理性以及代碼的可讀性[3].
代碼審查一般分為三個(gè)步驟:背景資料閱讀、審查代碼和填寫檢查單.背景資料通常包括任務(wù)書、需求說明書、涉及編程的硬件說明書(比如51系列芯片引腳的說明)等.不同工程對(duì)審查代碼的仔細(xì)程度也有不同要求,高可靠性軟件的代碼往往需要從細(xì)節(jié)到整體的全方位檢查.審查完代碼后需要將審查出的問題歸納到檢查單中.
代碼審查的優(yōu)點(diǎn)有:①能夠盡早測(cè)試盡早發(fā)現(xiàn)問題;②所需投入的測(cè)試資源少;③代碼審查所針對(duì)的對(duì)象是整個(gè)軟件代碼,對(duì)消除一些特別細(xì)節(jié)的錯(cuò)誤大有裨益,尤其是那些容易在閱讀代碼的時(shí)候發(fā)現(xiàn)的缺陷,比如可維護(hù)性與可讀性方面的缺陷;④發(fā)現(xiàn)缺陷的效率較高,一般能發(fā)現(xiàn)軟件中30-70%的缺陷[4-5].所以代碼審查是軟件測(cè)試中發(fā)現(xiàn)缺陷比較有效的手段之一,也是提高代碼質(zhì)量的最強(qiáng)大的技術(shù)之一.正因?yàn)檫@些優(yōu)點(diǎn),代碼審查得到測(cè)試業(yè)界的重視.
嵌入式軟件是基于嵌入式系統(tǒng)設(shè)計(jì)的軟件,它是由程序以及文檔組成.嵌入式軟件與通用軟件的區(qū)別主要表現(xiàn)在以下幾方面:首先,與通用的軟件有很強(qiáng)的兼容性不同,嵌入式軟件只能運(yùn)行在特定的目標(biāo)機(jī)上,與其所屬的目標(biāo)機(jī)系統(tǒng)有很強(qiáng)的耦合性,軟件的實(shí)現(xiàn)細(xì)節(jié)和目標(biāo)機(jī)系統(tǒng)的結(jié)構(gòu)、I/O 端口配置等都有關(guān)系;其次,嵌入式系統(tǒng)需要在規(guī)定的時(shí)間內(nèi)完成相關(guān)的任務(wù),因此具有很強(qiáng)的軟件實(shí)時(shí)性要求;即使是中斷處理方式也會(huì)影響到嵌入式系統(tǒng)的實(shí)時(shí)性能.在實(shí)際應(yīng)用中,由于中斷的復(fù)雜性,對(duì)于嵌入式軟件很難進(jìn)行充分的測(cè)試,只能通過充分的中斷分析來彌補(bǔ).
由嵌入式軟件特性可知,嵌入式軟件具有兼容性差、實(shí)時(shí)性強(qiáng)、種類繁多等特點(diǎn).因?yàn)榇_認(rèn)測(cè)試對(duì)測(cè)試的覆蓋率有極高的要求,嵌入式軟件繁多的特性會(huì)極大地增大確認(rèn)測(cè)試地工作量和難度.為了在測(cè)試的效率和測(cè)試的覆蓋率之間達(dá)到平衡,確認(rèn)測(cè)試一般通過黑盒測(cè)試技術(shù)驗(yàn)證嵌入式軟件的大部分代碼和運(yùn)行狀態(tài)的正確性,然后使用代碼審查作為補(bǔ)充去驗(yàn)證前面未能覆蓋的剩余區(qū)域.
嵌入式軟件代碼審查一般依據(jù)代碼檢查單進(jìn)行[1],可以針對(duì)不同的編程語言的代碼、設(shè)計(jì)文檔、需求文檔等不同對(duì)象分別制定,并可以不斷累積和豐富.
檢查單的范圍可以很廣,可以根據(jù)需要設(shè)置不同的檢查項(xiàng)目,如對(duì)常見設(shè)計(jì)缺陷的檢查、針對(duì)各種編程語言常見問題使用錯(cuò)誤的檢查、針對(duì)軟件所使用的芯片常見錯(cuò)誤的檢查等[1].典型的代碼檢查單如表1所示.由于代碼檢查單的特性,代碼審查可以較為簡(jiǎn)便地針對(duì)軟件中較難進(jìn)行黑盒測(cè)試的情況進(jìn)行驗(yàn)證,進(jìn)而避免了測(cè)試工作復(fù)雜性的提升,一定程度上保證了確認(rèn)測(cè)試的效率.
表1 典型代碼檢查單示例Tab.1 Typical code checklist examples
時(shí)至今日,傳統(tǒng)嵌入式代碼審查目前主要面臨的幾個(gè)方面的問題:
(1)代碼審查工作效率下降
嵌入式系統(tǒng)軟件功能的日益強(qiáng)大,其功能和復(fù)雜性也日益增加,這導(dǎo)致代碼審查的檢查項(xiàng)目增多,檢查難度增加,進(jìn)而降低代碼審查的工作效率.
(2)審查人員工作成本增加
根據(jù)代碼審查的定義,代碼審查也是一種程序理解活動(dòng).代碼審查工作的進(jìn)行速度依賴于審查人員的專業(yè)知識(shí)水平和經(jīng)驗(yàn).為了保證工作效率,軟件復(fù)雜度的提高間接提升了審查人員的專業(yè)知識(shí)和審查經(jīng)驗(yàn)的門檻,審查人員的工作成本增加.
(3)現(xiàn)有代碼審查輔助軟件功能不強(qiáng)
現(xiàn)有的輔助軟件大多都是以靜態(tài)分析技術(shù)為基礎(chǔ),如軟件編程規(guī)范檢查、資源訪問沖突分析(如specchecker)等.這些軟件在許多軟件功能性的檢查項(xiàng)目上能力較弱,只能提供靜態(tài)數(shù)據(jù)讓審查人員去分析,對(duì)審查人員的幫助有限.
以上三個(gè)問題制約著嵌入式代碼審查的審查效率,是代碼審查目前所面臨的主要挑戰(zhàn).
軟件代碼審查中,審查人員閱讀代碼、理解代碼、審查代碼的過程可以看作是程序理解活動(dòng).程序理解存在于認(rèn)知代碼相關(guān)的任何領(lǐng)域,同時(shí)也是一個(gè)研究領(lǐng)域.現(xiàn)今,隨著人工智能技術(shù)在程序理解領(lǐng)域的應(yīng)用,出現(xiàn)了一些先進(jìn)的程序理解算法,這些算法相較于傳統(tǒng)方法更加智能,能幫助程序員進(jìn)行程序理解.這些程序理解算法的出現(xiàn)對(duì)代碼審查來說是一個(gè)機(jī)遇:將基于人工智能的程序理解應(yīng)用于代碼審查過程,能夠減輕審查人員的認(rèn)知負(fù)擔(dān),提升代碼審查的工作效率.
程序理解是軟件工程中的一個(gè)經(jīng)典話題,又叫軟件理解或系統(tǒng)理解.自軟件出現(xiàn)以來,甚至在軟件工程提出之前,就有了程序理解這個(gè)問題[6].1968 年第一次軟件工程研討會(huì)之后,程序理解成為軟件工程中的關(guān)鍵活動(dòng),在進(jìn)行軟件重用、維護(hù)、遷移、逆向工程以及軟件系統(tǒng)擴(kuò)展等任務(wù)時(shí),都要依賴于對(duì)程序的理解.比如,源碼逆向工程通過分析目標(biāo)系統(tǒng)來識(shí)別系統(tǒng)的成分及其相互關(guān)系,創(chuàng)建系統(tǒng)的更高抽象層次上的表示,包括構(gòu)建目標(biāo)系統(tǒng)的概念模型、抽取程序結(jié)構(gòu)和控制信息以及進(jìn)行數(shù)據(jù)抽取和系統(tǒng)抽象.在軟件維護(hù)和演化中,例如軟件適應(yīng)(adaptive)、軟件修復(fù)(corrective)、軟件復(fù)用(reuse)等任務(wù),程序理解也是其首要活動(dòng),其他活動(dòng)都是在程序理解的基礎(chǔ)上進(jìn)行的.例如:完成軟件適應(yīng)任務(wù)的流程包括理解系統(tǒng)、定義適應(yīng)需求、制定適應(yīng)策略、設(shè)計(jì)、代碼修改、調(diào)試、回歸測(cè)試;軟件修復(fù)任務(wù)的流程包括理解系統(tǒng)、提出/評(píng)估問題假設(shè)、修復(fù)代碼、回歸測(cè)試.隨著程序設(shè)計(jì)語言的不斷變化和軟件復(fù)雜性不斷提高,程序理解一直面臨著挑戰(zhàn),新的研究問題不斷涌現(xiàn).在實(shí)際的軟件工程項(xiàng)目中,程序員往往會(huì)花費(fèi)超過一半的時(shí)間用于程序理解活動(dòng)[7],程序理解研究的重要性不言而喻.
本節(jié)從三個(gè)方面介紹程序理解,分別是程序理解的認(rèn)知策略、程序理解的方法和程序理解的挑戰(zhàn)與機(jī)遇.
程序理解是一個(gè)學(xué)習(xí)和認(rèn)知的過程.代碼是編程語言形式的知識(shí)編碼,而程序理解就是要從這些知識(shí)編碼中學(xué)習(xí)代碼所表達(dá)的知識(shí)的過程.根據(jù)構(gòu)建式學(xué)習(xí)的理論,學(xué)習(xí)和認(rèn)知的過程是面向目標(biāo)或者模型驅(qū)動(dòng)的歸納抽象過程.第一,學(xué)習(xí)是學(xué)習(xí)者個(gè)體從學(xué)習(xí)材料中通過提取或抽象等手段構(gòu)建知識(shí)體的過程;第二,所構(gòu)建的知識(shí)體除了依賴學(xué)習(xí)材料,很大程度上還依賴于學(xué)習(xí)者已有的知識(shí)背景和本次學(xué)習(xí)的目的.從構(gòu)建式學(xué)習(xí)理論出發(fā),程序理解的基本策略可以分為三種:
(1)自底向上的策略
該策略從具體的代碼開始閱讀,然后將具體代碼的含義組合,形成更高級(jí)的抽象信息,最后在認(rèn)知層面形成一個(gè)具有整體抽象意義的知識(shí)集合.例如,一種程序認(rèn)知框架區(qū)分語法和語義兩個(gè)層次:語法層關(guān)注程序的語句和基本單元;語義層與程序語言無關(guān),是逐層抽象直到所抽象的知識(shí)能描述應(yīng)用領(lǐng)域.另一種認(rèn)知框架區(qū)分程序模型(program model)和情景模型(situation model):程序模型對(duì)程序的控制流進(jìn)行抽象;情景模型則是封裝了關(guān)于數(shù)據(jù)流抽象和功能抽象的知識(shí),表達(dá)了程序的目標(biāo)層次[8].用傳統(tǒng)的軟件開發(fā)方式可以解釋這種策略背后的原因,即,程序理解是為了還原自底向上的軟件開發(fā)過程.
(2)自頂向下的策略
這種策略將程序理解看作是重新組織程序員自身已有的關(guān)于程序應(yīng)用領(lǐng)域的知識(shí),并建立這些知識(shí)到程序源碼上的映射.比如,一個(gè)典型的過程是:從關(guān)于領(lǐng)域應(yīng)用的假設(shè)出發(fā),根據(jù)已有的領(lǐng)域知識(shí)進(jìn)行逐層分解,同時(shí)與程序源碼進(jìn)行比對(duì)或驗(yàn)證,從而建立假設(shè)和源代碼之間的關(guān)聯(lián).這種方式體現(xiàn)了模型驅(qū)動(dòng)的思想,也就是:如果模型存在,程序理解就是將具體的程序片段關(guān)聯(lián)到已知的模型上,通過模型的結(jié)構(gòu)和語義去刻畫程序的結(jié)構(gòu)和語義.
(3)集成式程序理解模型
集成式程序理解模型結(jié)合了自底向上和自頂向下的策略,它認(rèn)為:對(duì)比較熟悉的代碼,可以采用自頂向下的方式進(jìn)行理解,直接建立源碼和應(yīng)用知識(shí)之間的關(guān)聯(lián);而對(duì)不太熟悉的代碼,則需要采用自底向上的策略從底層開始進(jìn)行逐層抽象,以獲得程序所表達(dá)的領(lǐng)域知識(shí).比如von Mayrhauser and Vans的集成式程序理解模型就由自頂向下策略、構(gòu)建程序模型、構(gòu)建情景模型、知識(shí)領(lǐng)域四個(gè)成分組成.
程序理解的方法是程序理解的認(rèn)知策略在工程上的實(shí)現(xiàn).現(xiàn)有的程序理解方法可以分為基于分析的方法和基于學(xué)習(xí)的方法.
基于分析的方法分為靜態(tài)分析方法和動(dòng)態(tài)分析方法.靜態(tài)分析方法直接分析程序源代碼,從中獲取相關(guān)信息,并且不需要執(zhí)行程序.靜態(tài)分析方法由于其特點(diǎn)具有較強(qiáng)的靈活性,在開發(fā)的早期階段就可以進(jìn)行,相比動(dòng)態(tài)方法更具有普適性,可以覆蓋所有可能的執(zhí)行路徑.IDE(集成開發(fā)工具)中常用的代碼語法糾錯(cuò)就是一種靜態(tài)分析技術(shù),它在程序員編程階段就能分析源代碼,幫助程序員檢查語法錯(cuò)誤;動(dòng)態(tài)分析方法是程序執(zhí)行時(shí)運(yùn)行的分析方法,它主要理解程序運(yùn)行時(shí)所具有的性質(zhì).動(dòng)態(tài)方法可以通過提取輸入輸出關(guān)系或者內(nèi)部狀態(tài)獲得更精確的分析,但是往往是針對(duì)特定輸入而言,因此普適性不及靜態(tài)分析.
基于學(xué)習(xí)的方法是一種應(yīng)用了數(shù)據(jù)挖掘或機(jī)器學(xué)習(xí)技術(shù)的程序理解方法.近年來,隨著計(jì)算機(jī)運(yùn)算能力的提升,計(jì)算機(jī)在短時(shí)間內(nèi)處理大量信息所需要的時(shí)間不斷縮短,許多基于學(xué)習(xí)的方法得以廣泛應(yīng)用.數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)技術(shù)在圖像處理、自然語言處理、模式識(shí)別等多個(gè)領(lǐng)域取得了豐碩的成果.因此,基于學(xué)習(xí)的技術(shù)也受到了更多研究者的關(guān)注,一些研究者開始使用這些相關(guān)技術(shù)進(jìn)行程序理解.基于學(xué)習(xí)的程序理解主要是從源代碼和代碼文檔中獲取信息,使用數(shù)據(jù)挖掘或者機(jī)器學(xué)習(xí)技術(shù)學(xué)習(xí)程序的相關(guān)特征,并在實(shí)際的程序理解使用.例如,文獻(xiàn)[9]使用了基于有監(jiān)督學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)不同編程語言的源代碼特征,并使用這些特征進(jìn)行源代碼文件分類任務(wù).
傳統(tǒng)的基于靜態(tài)或動(dòng)態(tài)的程序理解一般致力于獲取并分析程序部分特征來達(dá)到認(rèn)知程序的目的.這么做的優(yōu)點(diǎn)是能夠使用較少的數(shù)據(jù)和計(jì)算量獲得較為準(zhǔn)確的局部認(rèn)知結(jié)果.隨著計(jì)算機(jī)硬件能力的發(fā)展和開源項(xiàng)目的增多,發(fā)展基于大量代碼的認(rèn)知計(jì)算方法已具備足夠的條件,基于機(jī)器學(xué)習(xí)的程序理解方法順勢(shì)而生.
早期的基于學(xué)習(xí)的程序理解技術(shù)多使用經(jīng)典的機(jī)器學(xué)習(xí)方法,如SVM、隨機(jī)森林、決策樹[10]等算法.相較于傳統(tǒng)基于分析的程序分析方法來說,機(jī)器學(xué)習(xí)算法可以接受信息密度更高的特征輸入,因此程序特征的提取方法可以做得更一般化,同一類程序特征可以供多個(gè)相近任務(wù)使用.另外,經(jīng)典的機(jī)器學(xué)習(xí)技術(shù)可以通過訓(xùn)練強(qiáng)化與任務(wù)相關(guān)的程序特征,減弱無關(guān)程序特征的影響,一定程序上也防止特征維度過多產(chǎn)生計(jì)算復(fù)雜度爆炸的情況.
基于傳統(tǒng)機(jī)器學(xué)習(xí)的程序理解技術(shù)在一定程度上擺脫了過度降維帶來的信息損失,但它仍然存在不足.例如,仍然需要降維處理獲取特征、過多的特征帶來了龐大的計(jì)算冗余等.21世紀(jì)10年代,人工智能領(lǐng)域迎來了新的革命——深度學(xué)習(xí)技術(shù).與傳統(tǒng)機(jī)器學(xué)習(xí)方法不同的是,深度學(xué)習(xí)致力于直接從信息的本體,即信息源挖掘信息特征,并進(jìn)行相關(guān)任務(wù).眾多領(lǐng)域隨著深度學(xué)習(xí)的興起迎來新一輪的革命,人工智能技術(shù)也隨著深度學(xué)習(xí)技術(shù)的普及,正式廣泛應(yīng)用于民用領(lǐng)域.
深度學(xué)習(xí)技術(shù)[11]相較于傳統(tǒng)機(jī)器學(xué)習(xí)技術(shù)的優(yōu)勢(shì)在于,深度學(xué)習(xí)更不依賴特征工程.例如,對(duì)于人臉識(shí)別問題,傳統(tǒng)方法往往是設(shè)計(jì)相關(guān)特征,讓算法能識(shí)別出眼鏡、嘴巴、鼻子等器官,再綜合判斷這些特征組合起來是不是一個(gè)人臉;而深度學(xué)習(xí)方法只需要將圖像輸入神經(jīng)網(wǎng)絡(luò)中進(jìn)行計(jì)算,最終直接獲得結(jié)果.算法模型在訓(xùn)練的過程中自己會(huì)在隱藏層中就完成特征的認(rèn)知、學(xué)習(xí)和識(shí)別.這種優(yōu)勢(shì)讓深度學(xué)習(xí)大大降低了對(duì)特征工程的依賴.
深度學(xué)習(xí)技術(shù)的特性也讓學(xué)者們注意到其在程序理解領(lǐng)域應(yīng)用的潛力.科學(xué)家們開始將深度學(xué)習(xí)技術(shù)應(yīng)用于基于學(xué)習(xí)的程序理解方法中.如圖1,本文調(diào)研中收集的程序理解相關(guān)文獻(xiàn)中,09年后基于學(xué)習(xí)的論文數(shù)量就已經(jīng)超過了傳統(tǒng)基于特征分析方法的文章,15年以后基于學(xué)習(xí)的程序理解更是占比83%.近五年內(nèi)發(fā)表的基于學(xué)習(xí)的程序理解研究中,63%的研究是基于深度學(xué)習(xí)技術(shù),且論文隨著時(shí)間推移數(shù)量呈上升趨勢(shì)(截至19年11月,一些會(huì)議尚未舉辦,所以19年未計(jì)入統(tǒng)計(jì)).由此可見深度學(xué)習(xí)技術(shù)在程序理解領(lǐng)域也是同樣廣受歡迎.
程序理解發(fā)展到今日已經(jīng)有了非常豐富的成果,但仍然面臨著準(zhǔn)確性、可拓展性等問題的挑戰(zhàn).新技術(shù)的引入對(duì)程序理解來說既是一種新的發(fā)展機(jī)遇,也對(duì)研究人員來說是一種挑戰(zhàn).人工智能技術(shù)能否很好地運(yùn)用在程序理解領(lǐng)域是目前需要探索的一個(gè)命題.
近幾年深度學(xué)習(xí)逐漸成為程序理解領(lǐng)域更為關(guān)注的技術(shù).如圖1所示,近四年的程序理解論文中,基于深度學(xué)習(xí)技術(shù)的文章數(shù)量處于一個(gè)上升趨勢(shì).
圖1 程序理解相關(guān)論文發(fā)表情況Fig.1 The program understands publication
人工智能應(yīng)用于實(shí)現(xiàn)基于學(xué)習(xí)的程序理解方法.基于學(xué)習(xí)的程序理解是一種從程序代碼中獲取知識(shí),并利用通過學(xué)習(xí)獲得的經(jīng)驗(yàn)去對(duì)這些知識(shí)進(jìn)行處理,最終獲得想要的結(jié)果輸出的過程.因此,實(shí)現(xiàn)基于學(xué)習(xí)的程序理解必須解決以下三個(gè)問題:
(1)如何進(jìn)行知識(shí)表示?
(2)如何利用知識(shí)獲得期望的結(jié)果?
(3)如何將軟件與實(shí)際的程序理解工作相結(jié)合?
對(duì)于知識(shí)表示問題,研究人員普遍采用代碼詞嵌入作代碼知識(shí)的表征,將代碼與知識(shí)相互映射,形成關(guān)系;獲得了從代碼中提取的知識(shí)后,需要利用這些知識(shí)得到特定的結(jié)論才能完成程序理解.目前大多數(shù)基于人工智能的程序理解都是使用有監(jiān)督學(xué)習(xí)模型實(shí)現(xiàn)的,它們的功能可以歸類為代碼分類;因?yàn)榇a審查工作是一個(gè)小組協(xié)作且需要大量人機(jī)交互的過程,獲取了基于學(xué)習(xí)的程序理解后,還要將軟件與實(shí)際的工作相結(jié)合.下面將對(duì)代碼詞嵌入、代碼分類和結(jié)合了人工智能技術(shù)的智能代碼審查系統(tǒng)作介紹.
程序理解中有一類重要的問題是代碼的表征,即讓計(jì)算機(jī)將程序語言表示為人可以理解的抽象概念.上述過程可以看成是將一個(gè)維數(shù)為代碼長度的高維空間,嵌入到一個(gè)維數(shù)低得多且每個(gè)向量映射為一個(gè)程序概念的連續(xù)向量空間中的過程,這與自然語言處理領(lǐng)域(NLP)中語言模型與表征學(xué)習(xí)非常相似.在NLP中語言模型與表征學(xué)習(xí)技術(shù)統(tǒng)稱為詞嵌入技術(shù),因而在程序理解領(lǐng)域,我們將代碼的語言模型與表征學(xué)習(xí)技術(shù)統(tǒng)稱為代碼詞嵌入.
代碼詞嵌入的主要目的是程序信息的表征和降維,將代碼詞嵌入應(yīng)用于代碼理解模型具有深遠(yuǎn)意義.一般的源代碼文件中常含有成百上千行的代碼,每行代碼由若干單詞構(gòu)成,每個(gè)單詞由若干字符組成,再加上程序語言的單詞種類很少,如果作為程序理解的輸入會(huì)產(chǎn)生非常多的冗余,這將不利于程序理解保持高效.通過代碼詞嵌入,可以將代碼的含義抽象到低維的向量空間中,讓程序代碼更易理解且更利于提升更進(jìn)一步的程序理解的計(jì)算效率.
早期的詞嵌入使用散列法(Hash),將輸入的詞語轉(zhuǎn)換為定長度的散列值.文獻(xiàn)[12-13]就使用了這一方法去做代碼詞嵌入.數(shù)據(jù)處理中最常用的散列法詞嵌入為獨(dú)熱編碼(One-Hot Encoding),它是一種用N位向量來表示N種狀態(tài)(抽象含義)的編碼方式.由于程序語言的詞語種類不多,獨(dú)熱碼的長度往往不會(huì)很長,因而使用獨(dú)熱編碼進(jìn)行詞嵌入既能保證不會(huì)占用過多計(jì)算機(jī)資源,又能獲得不錯(cuò)的詞嵌入效果.但是,散列法也存在著一定的問題.首先,散列法只能一般用于詞語表示,無法囊括更高級(jí)的語法表示;其次,散列法獲得的詞嵌入無法包含一些程序結(jié)構(gòu)信息,所以仍然會(huì)產(chǎn)生冗余,單純使用獨(dú)熱碼的詞嵌入需要添加很多冗余信息(如括號(hào),分號(hào)等)來保持語句的結(jié)構(gòu)性.
為了讓詞嵌入具有更強(qiáng)的代碼抽象能力,研究者們將抽象語法樹(Abstract Syntax Tree,AST)應(yīng)用于詞嵌入當(dāng)中.抽象語法樹是一種以樹狀結(jié)構(gòu)表示程序語言的語法結(jié)構(gòu),樹上的每一個(gè)節(jié)點(diǎn)都表示代碼的一個(gè)子結(jié)構(gòu).一個(gè)簡(jiǎn)單的抽象語法樹如圖2所示.
圖2 簡(jiǎn)單if語句的抽象語法樹.該語法樹結(jié)構(gòu)所表示的語句為“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 ”)”
抽象語法樹利用樹形結(jié)構(gòu)簡(jiǎn)化了程序代碼文本,刪去了沒有實(shí)際意義的符號(hào),將具有實(shí)意的信息以樹的結(jié)點(diǎn)的形式保存.抽象語法樹常用于程序語言靜態(tài)分析工具中,它可以結(jié)合令牌化(Tokenization)技術(shù)完成對(duì)程序語言詞法、語法和少許語義上的抽象工作.文獻(xiàn)[14-15]都在數(shù)據(jù)預(yù)處理階段采用了抽象語法樹和令牌化的代碼詞嵌入方法,如圖3所示.這種方法中抽象語法樹的結(jié)點(diǎn)信息以向量的形式保存,然后通過一個(gè)映射表將結(jié)點(diǎn)信息向量中具有實(shí)意的字符串與數(shù)字進(jìn)行一一映射,最終結(jié)點(diǎn)信息轉(zhuǎn)換為以具有特定意義的數(shù)字為樣本空間的特征向量,所有特征向量的集合即為整個(gè)源程序代碼的特征向量.
抽象語法樹和令牌化的代碼詞嵌入技術(shù)雖然讓輸入神經(jīng)網(wǎng)絡(luò)的特征向量有了詞法、語法和少許語義上的特征信息,但明顯這種方法從代碼上獲取的語義層次的信息是不夠的.
在自然語言處理領(lǐng)域,由于語言文字種類繁多且詞義組合多變復(fù)雜,不同的詞語組合會(huì)出現(xiàn)不同的語義信息,這些組合產(chǎn)生的爆炸般信息增長讓特征向量的維數(shù)變得特別大,嚴(yán)重增大了模型的計(jì)算負(fù)擔(dān).顯然,語法層次的預(yù)處理成為了自然語言處理模型的性能短板.為了進(jìn)一步減少輸入樣本空間的大小(維度),模型需要在進(jìn)行任務(wù)之前對(duì)文本進(jìn)行更強(qiáng)的語義級(jí)的詞嵌入.經(jīng)過研究者們的努力,學(xué)術(shù)界誕生了以Word2Vec[16]為代表的語義級(jí)文本詞嵌入,自然語言處理模型的能力得到了極大的提高.語義級(jí)詞嵌入的發(fā)明意義在于它進(jìn)一步對(duì)輸入的信息進(jìn)行了降維,加強(qiáng)了模型的運(yùn)行效率;同時(shí)它讓詞語之間產(chǎn)生了一定的語義上聯(lián)系,提高了模型的泛化能力.程序理解領(lǐng)域也有與自然語言處理相似的預(yù)處理問題.程序語言的詞語種類雖然不多,但是通過不同的組合,相似語法結(jié)構(gòu)的程序會(huì)執(zhí)行完全不同的功能.比如有的循環(huán)語句是用來賦值的,有的循環(huán)語句是用于排序數(shù)據(jù)結(jié)構(gòu)的.再者,由不同的程序語言寫成的代碼雖然在詞法、語法上可能不同,但它們可能執(zhí)行著相同的功能.如果這樣的預(yù)處理應(yīng)用在對(duì)代碼功能進(jìn)行分類的模型上,這些預(yù)處理獲得的特征向量將帶有詞法、語法層面的信息冗余.倘若模型在預(yù)處理階段就能獲得這些代碼語義級(jí)別的表征,在后續(xù)階段的處理中這些詞法、語法級(jí)別的冗余內(nèi)容將會(huì)被忽略,模型的效率和泛化能力將會(huì)得到進(jìn)一步加強(qiáng).
最新的研究成果中,已經(jīng)有研究者將語義級(jí)的詞嵌入擴(kuò)展到代碼詞嵌入中.文獻(xiàn)[17]提出了可用于代碼預(yù)處理的一種將代碼表示為連續(xù)的分布式向量的神經(jīng)網(wǎng)絡(luò)模型.該模型在抽象語法樹的基礎(chǔ)之上增添了一個(gè)神經(jīng)網(wǎng)絡(luò),該神經(jīng)網(wǎng)絡(luò)經(jīng)過訓(xùn)練后可以獲得一個(gè)上下文特征向量和一個(gè)注意力向量,這兩個(gè)向量與所有代碼語句令牌化的抽象語法樹特征向量進(jìn)行運(yùn)算后獲得了全局代碼的特征向量,這個(gè)全局的特征代碼向量即可直接用于預(yù)測(cè)相應(yīng)的標(biāo)簽.簡(jiǎn)單的來說,代碼經(jīng)過該模型處理,輸出的不再是以詞句信息或者語法結(jié)構(gòu)信息為主要信息的特征向量,而是以帶有上下文信息的語義信息的特征向量.這種特征向量具有更強(qiáng)的信息抽象,因而模型具有了更好的泛化能力.文獻(xiàn)[18]提出了另一種語義級(jí)的代碼詞嵌入技術(shù).與文獻(xiàn)[17]提出的詞嵌入技術(shù)不同的是,該模型是基于循環(huán)神經(jīng)網(wǎng)絡(luò)的編碼器-解碼器結(jié)構(gòu)實(shí)現(xiàn)的,此種結(jié)構(gòu)與自然語言處理中的翻譯機(jī)的結(jié)構(gòu)相似.模型實(shí)現(xiàn)原理略微不同,但是它們都是對(duì)代碼進(jìn)行語義級(jí)的特征映射,得到相應(yīng)的特征向量.
圖3 抽象語法樹和令牌化的代碼詞嵌入流程圖Fig.3 Abstract syntax tree and tokenized code word embedding flowchart
程序員通過閱讀代碼,對(duì)代碼的功能或特性進(jìn)行分類是一種常見的程序理解活動(dòng),實(shí)現(xiàn)這種程序理解活動(dòng)的人工智能模型統(tǒng)稱為代碼分類模型.常見的代碼分類任務(wù)有源碼分類、功能分類、缺陷預(yù)測(cè)等,其中又以缺陷預(yù)測(cè)最為受到關(guān)注.代碼審查中,評(píng)判源代碼是否有缺陷實(shí)際上就是一種代碼缺陷預(yù)測(cè)任務(wù).因此,下面圍繞以代碼缺陷預(yù)測(cè)為主的代碼分類技術(shù)的發(fā)展作介紹.
早些年,代碼分類依托程序分析技術(shù)進(jìn)行.按照是否運(yùn)行源代碼進(jìn)行分析,程序分析技術(shù)可分為靜態(tài)程序分析和動(dòng)態(tài)程序分析兩種,靜態(tài)程序分析不需要運(yùn)行源代碼直接分析代碼的屬性,動(dòng)態(tài)程序分析則主要分析程序運(yùn)行中產(chǎn)生的輸入輸出以及狀態(tài)變化.常用的靜態(tài)程序分析方法有代碼度量分析、程序抽象語法樹分析、函數(shù)調(diào)用關(guān)系分析等;常用的動(dòng)態(tài)分析技術(shù)以數(shù)據(jù)流分析為主.早期的代碼分類模型依托程序分析技術(shù)獲得程序的相關(guān)信息,通過對(duì)這些信息的對(duì)比來進(jìn)行代碼分類工作.
雖然傳統(tǒng)程序分析技術(shù)對(duì)程序理解工作有一定的幫助,但這些分析技術(shù)在某些任務(wù)上難以取得比較好的效果.比如抽象語法樹只能從程序語言語法層面提取代碼特征,遇到語法不同的源代碼文件就需要對(duì)二者的特征進(jìn)行歸一化處理,歸一化處理的過程中會(huì)產(chǎn)生信息的丟失或冗余,影響代碼分類結(jié)果.傳統(tǒng)程序分析技術(shù)還存在著易用性低、操作略微繁瑣的問題.文獻(xiàn)[7]中提到有相當(dāng)一定數(shù)量的程序員沒有采用或者很少采用審查輔助工具去進(jìn)行代碼審查,其中的原因便是傳統(tǒng)審查工具缺少使用友好性,程序員很難將審查工具與自己的審查習(xí)慣結(jié)合.
隨著人工智能技術(shù)的發(fā)展,人工智能技術(shù)在代碼分類領(lǐng)域逐漸得到應(yīng)用.文獻(xiàn)[19]使用了多種機(jī)器學(xué)習(xí)算法進(jìn)行代碼缺陷預(yù)測(cè)工作,這些機(jī)器學(xué)習(xí)算法包括Bagging、Boosting、Decorate、C4.5、Naive Bayes、神經(jīng)網(wǎng)絡(luò)、隨機(jī)森林和RIPPER,并比較了各種機(jī)器學(xué)習(xí)算法的性能.值得一提的是,文獻(xiàn)使用軟件的代碼度量和測(cè)試度量作為特性對(duì)代碼缺陷進(jìn)行預(yù)測(cè).在所有方法中,隨機(jī)森林總體上取得了較好的結(jié)果.文獻(xiàn)[13]使用了卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行源代碼編程語言地分類.該任務(wù)只需要依據(jù)源代碼編程語言特征進(jìn)行分類,所以在只使用了簡(jiǎn)單的代碼詞嵌入的情況下仍然取得了95%以上的正確率.文獻(xiàn)[14]、文獻(xiàn)[15]分別使用深度信念網(wǎng)絡(luò)[20]和卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行代碼缺陷預(yù)測(cè),后者聲稱相較于前者的方法獲得了更好的結(jié)果.這兩個(gè)模型在預(yù)處理階段使用了相同的抽象語法樹結(jié)合令牌化的方法,區(qū)別只在于后面神經(jīng)網(wǎng)絡(luò)使用的不同.根據(jù)兩個(gè)文獻(xiàn)的比較可知,卷積神經(jīng)網(wǎng)絡(luò)在此類缺陷預(yù)測(cè)中有更好的效果.
除了程序理解領(lǐng)域,研究人員也試圖將人工智能方法與代碼審查工作相結(jié)合.
審查輔助軟件作為程序理解必不可少的工具,在代碼審查工作中的作用卻較為有限.這是因?yàn)?,代碼審查大多數(shù)是一種靜態(tài)測(cè)試方法,而現(xiàn)有的靜態(tài)測(cè)試工具能完成的程序理解較為基礎(chǔ),實(shí)際工作中往往只能給予審查人員更多參考信息,而不能替代審查人員進(jìn)行程序理解.以往的大多數(shù)關(guān)于代碼審查的研究也顯示,現(xiàn)有工具對(duì)審查人員進(jìn)行程序理解的幫助非常有限[7].基于機(jī)器學(xué)習(xí)的人工智能方法讓研究人員看到了新的曙光,他們開始嘗試將基于人工智能的程序理解引入代碼審查系統(tǒng)中,增強(qiáng)代碼審查軟件的輔助能力.
文獻(xiàn)[21]提出了一種基于深度學(xué)習(xí)的代碼審查系統(tǒng).它自動(dòng)學(xué)習(xí)歷史同行評(píng)審,建立代碼段和代碼評(píng)審與分析之間的聯(lián)系,并將這種匹配關(guān)系應(yīng)用到新的代碼評(píng)審中,對(duì)新的待評(píng)審代碼進(jìn)行分析,生成這個(gè)待評(píng)審代碼的評(píng)審項(xiàng)目.生成的評(píng)審項(xiàng)目給與評(píng)審人員一定的建議,告訴他們哪些地方的代碼最有可能需要進(jìn)行審查以及進(jìn)行什么類型的審查.該模型是一種交互式的有監(jiān)督學(xué)習(xí)模型,模型除了使用前需要進(jìn)行訓(xùn)練外,隨著歷史評(píng)審數(shù)據(jù)的增加,模型還能進(jìn)行二次訓(xùn)練,通過不斷累積歷史評(píng)審數(shù)據(jù)來達(dá)到提升準(zhǔn)確性的目的.它雖然做到了幫助審查人員進(jìn)行一部分的程序理解,但僅限于向?qū)彶槿藛T給與審查項(xiàng)目的建議,還無法做到幫助審查人員去理解審查的代碼,完成一部分代碼缺陷的評(píng)判,所以仍然有進(jìn)一步發(fā)展的空間.
文獻(xiàn)[26]描述了一種深度學(xué)習(xí)技術(shù)在代碼搜索上的應(yīng)用.該文描述的模型使用了代碼詞嵌入和文本詞嵌入,將代碼和文字映射到同一語義空間中,通過匹配代碼和文本的語義向量來完成基于文字信息的代碼搜索.該研究雖然不是針對(duì)代碼審查工作,但是它所描述的方法很適合應(yīng)用于代碼審查的場(chǎng)景.例如,在做需求一致性審查時(shí),審查人員往往需要根據(jù)需求去尋找對(duì)應(yīng)代碼.基于文本的代碼匹配就可以很好地幫助審查人員更快地定位代碼位置,對(duì)代碼進(jìn)行審查.
從審查人員的角度來看,智能化的代碼審查系統(tǒng)和他們也是相得益彰的.文獻(xiàn)[21]還對(duì)他們提出的技術(shù)做了用戶研究,調(diào)查使用者是怎么看代碼審查輔助軟件的.結(jié)果表明,所有被調(diào)查者都愿意接納有更好功能的代碼審查軟件,即使這個(gè)軟件只能幫他們推薦評(píng)審項(xiàng)目,也明顯減少了他們?cè)谕ㄓ迷u(píng)審上所花的精力,他們也因此可以將更多注意力放在更復(fù)雜的功能性審查上.由此可見,在代碼審查過程中引入新技術(shù)對(duì)于審查人員是有顯而易見的正面影響的.
人工智能技術(shù)在代碼審查領(lǐng)域的應(yīng)用尚在起步階段,現(xiàn)階段應(yīng)用的技術(shù)也較為基礎(chǔ),最新的人工智能技術(shù)成果尚未在代碼審查領(lǐng)域應(yīng)用.例如,對(duì)于深度學(xué)習(xí)代碼詞嵌入有啟發(fā)性意義的文本詞嵌入方法word2vec早在2013年就被著名的科技公司google開源;卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)的誕生更能追溯到上個(gè)世紀(jì)末.之所以這些技術(shù)在近幾年才引入程序理解領(lǐng)域,是因?yàn)檫@些人工智能技術(shù)獲得的成就足夠成功,這才引起了更多研究人員的興趣并嘗試將這些方法應(yīng)用于其他領(lǐng)域.參考學(xué)術(shù)界最新的技術(shù)發(fā)展,我們分別對(duì)未來可能用于程序理解和代碼審查領(lǐng)域的技術(shù)和可能出現(xiàn)的代碼審查輔助軟件做一個(gè)展望.
當(dāng)今最火的人工智能技術(shù)就是深度學(xué)習(xí).深度學(xué)習(xí)技術(shù)通過學(xué)習(xí)樣本數(shù)據(jù)的內(nèi)在規(guī)律和表示層次讓算法具有分析能力,因而在很多任務(wù)中都獲得了相當(dāng)好的成果.程序理解作為一種研究對(duì)程序代碼認(rèn)知方法的學(xué)科,非常適合應(yīng)用深度學(xué)習(xí)相關(guān)技術(shù).
在代碼表征方法上,目前最新的方法使用注意力網(wǎng)絡(luò)[17]或基于RNN的編碼器-解碼器結(jié)構(gòu)網(wǎng)絡(luò)[18],這兩種方法都是為了加強(qiáng)模型預(yù)處理階段對(duì)代碼語義特征的表征.相比于這兩種特征抽取神經(jīng)網(wǎng)絡(luò),Transformer[22]擁有更強(qiáng)的表征能力,現(xiàn)在多數(shù)最新的自然語言處理模型都基于由transformer組成的Bert模型,并獲得了相當(dāng)可觀的進(jìn)步.除了代碼文本的表征方法外,還有代碼屬性的表征方法.傳統(tǒng)的代碼屬性表征方法是將代碼屬性直接轉(zhuǎn)換為特征向量輸入人工智能模型中計(jì)算,而圖網(wǎng)絡(luò)[23-24]的存在提供了另一種思路:使用圖網(wǎng)絡(luò)進(jìn)行代碼屬性表征[25],既可以讓代碼的各種屬性保存在圖的節(jié)點(diǎn)之上,又能讓屬性之間產(chǎn)生一定相關(guān)性,體現(xiàn)代碼屬性之間的內(nèi)部關(guān)聯(lián).雖然代碼不像文本語言那種具有豐富的詞性和詞語之間的相關(guān)性,強(qiáng)大的抽象表征方法顯得有些“性能過?!?,但將這些先進(jìn)方法用在程序理解領(lǐng)域也不是一件沒有意義的探索.
人工智能技術(shù)在程序理解領(lǐng)域的應(yīng)用相比其他熱門領(lǐng)域數(shù)量較少,目前它們的主要應(yīng)用場(chǎng)景還是以缺陷檢測(cè)、代碼分類為主.這些場(chǎng)景執(zhí)行的功能較為簡(jiǎn)單,所以模型也并不復(fù)雜,深度普遍不高,且以有監(jiān)督學(xué)習(xí)模型為主.這也是一個(gè)有發(fā)展?jié)摿Φ牡胤?
代碼審查工具發(fā)展至今日,審查軟件仍然以被動(dòng)的程序理解為主.被動(dòng)的程序理解是指輔助軟件需要審查人員自行操作才能對(duì)審查中的代碼進(jìn)行分析,這一特性無疑加大了審查人員審查操作的繁瑣程度.如果軟件可以替代審查人員進(jìn)行一部分的程序理解,代碼審查的難易度和效率定會(huì)有所提升.因此,發(fā)展主動(dòng)的程序理解方法對(duì)幫助審查人員提高高效審查工作有深遠(yuǎn)意義.
另外,代碼審查工作是一種多人協(xié)同的工作,對(duì)一個(gè)大項(xiàng)目的審查往往需要數(shù)個(gè)審查人員組成的審查小組來完成,因此代碼審查是擁有一個(gè)獨(dú)立系統(tǒng)的.代碼審查軟件如果可以將每個(gè)審查人員的成功聯(lián)合,實(shí)現(xiàn)群體智能,無疑對(duì)審查工作的質(zhì)量提升也有非常大的幫助.
圖4 智能代碼審查系統(tǒng)框圖Fig.4 Block diagram of intelligent code review system
基于文獻(xiàn)[21]所述系統(tǒng)和以上介紹的需求,我們對(duì)未來的智能代碼審查系統(tǒng)作了番構(gòu)想,如圖4所示.編譯器/開發(fā)環(huán)境位于系統(tǒng)的前端,是軟件系統(tǒng)與審查人員進(jìn)行交互的場(chǎng)所;智能審查工具從編譯器/開發(fā)環(huán)境中獨(dú)立,負(fù)責(zé)進(jìn)行代碼信息和知識(shí)之間轉(zhuǎn)換處理;云端知識(shí)庫存放各種知識(shí),并在系統(tǒng)中與每一個(gè)人機(jī)交互端共享知識(shí).在系統(tǒng)中,智能審查工具獨(dú)立進(jìn)行訓(xùn)練和執(zhí)行,但訓(xùn)練和執(zhí)行所需要的相關(guān)信息需要審查人員進(jìn)行操作,審查人員對(duì)智能審查系統(tǒng)的學(xué)習(xí)起到了監(jiān)督的作用,保證代碼審查仍然以審查人員為核心進(jìn)行.
相信隨著更多更強(qiáng)的智能程序理解應(yīng)用于代碼審查任務(wù),智能代碼審查系統(tǒng)將獲得更強(qiáng)的審查能力,進(jìn)一步幫助審查人員減輕工作負(fù)擔(dān),審查工作將變得更簡(jiǎn)單且高效.
現(xiàn)代科技日新月異,造就了嵌入式軟件代碼審查的需求不斷增多,代碼審查效率勢(shì)必要有所提升才能滿足這種增長.在已有的人工審查手段成為瓶頸的情況下,引入新的軟件技術(shù)幫助提高代碼審查的效率就顯得尤為重要.人工智能技術(shù)身為目前發(fā)展最為迅速的軟件技術(shù),對(duì)當(dāng)前代碼審查來說是一個(gè)不小的機(jī)遇.
本文首先對(duì)嵌入式代碼審查的情況作了簡(jiǎn)要的介紹,引出代碼審查的必要活動(dòng),即程序理解.通過程序理解的定義、方法以及所面臨的挑戰(zhàn)與機(jī)遇的介紹,闡述了現(xiàn)今與代碼審查關(guān)系較為密切的人工智能程序理解技術(shù)的發(fā)展與應(yīng)用情況.由介紹可知,目前以深度學(xué)習(xí)為首的人工智能技術(shù)在程序理解乃至代碼審查領(lǐng)域的應(yīng)用仍然數(shù)量較少,落后于最新技術(shù)較多.因此,人工智能技術(shù)在代碼審查領(lǐng)域仍然有很大的應(yīng)用潛力,這需要更多的研究人員參與到該領(lǐng)域的探索中.未來更加智能化的代碼審查系統(tǒng)值得期待.