亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于深度學(xué)習(xí)的代碼分析研究綜述

        2018-07-05 02:42:24張峰逸趙文耘復(fù)旦大學(xué)軟件學(xué)院上海201203上海市數(shù)據(jù)科學(xué)重點實驗室復(fù)旦大學(xué)上海201203
        計算機應(yīng)用與軟件 2018年6期
        關(guān)鍵詞:語義深度方法

        張峰逸 彭 鑫 陳 馳 趙文耘(復(fù)旦大學(xué)軟件學(xué)院 上海 201203)(上海市數(shù)據(jù)科學(xué)重點實驗室(復(fù)旦大學(xué)) 上海 201203)

        0 引 言

        計算機軟件是現(xiàn)代社會最具代表性的產(chǎn)物,它幾乎被應(yīng)用在人類生活的方方面面,無數(shù)優(yōu)秀的開發(fā)者參與貢獻(xiàn)了大量高水平的軟件代碼。然而由于代碼本身的抽象性、復(fù)雜性與可變性[1],大型軟件的開發(fā)始終是一個艱巨的任務(wù)。隨著軟件代碼規(guī)模的日益增長,開發(fā)者所面臨的壓力越來越大。如何通過分析代碼本身的規(guī)律來幫助開發(fā)者理解、編寫或維護(hù)代碼成為了現(xiàn)代軟件工程所關(guān)注的主要任務(wù)。

        學(xué)界對于代碼分析的研究由來已久,早期的代碼分析研究以形式化的邏輯演繹方法為主[2-4]。隨著開源代碼的興起,大量高質(zhì)量的開源項目提供了諸如源代碼、代碼注釋、故障報告以及測試用例等各方面的程序信息。這激發(fā)了研究者們的新的思路:通過代碼的統(tǒng)計學(xué)特性來獲得人類可以理解的知識。1984年,Don Knuth提出了“文字編程”的概念,他認(rèn)為編程實際上是人類交流的結(jié)果[5]。受到該思想的啟發(fā),Hindle等[6]提出了代碼的“自然性”假說,他們認(rèn)為代碼具有和自然語言相似的性質(zhì),相似的功能的代碼實現(xiàn)往往會有不同程度的相似性,因此代碼是可以預(yù)測的。代碼“自然性”理論的提出像是打開了一扇大門,人們意識到運用統(tǒng)計規(guī)律來分析代碼信息是可行的。大量的機器學(xué)習(xí)算法被運用到代碼中來,代碼的性質(zhì)從各個方面得到了挖掘,這極大地豐富了人類對于代碼的認(rèn)識。但是,現(xiàn)有的機器學(xué)習(xí)算法在很大程度上依賴于特征工程,這是一項勞動密集型的工作,并且只針對于特定的任務(wù)有效[7]。近期的機器學(xué)習(xí)文獻(xiàn)指出,由人類所設(shè)計的特征很有可能無法很好地反應(yīng)數(shù)據(jù)的真實情況,因為人類觀察的準(zhǔn)度與廣度都是非常有限的[8]。因此如何選取合適的特征成為了應(yīng)用機器學(xué)習(xí)算法的一大挑戰(zhàn)。

        深度學(xué)習(xí)是機器學(xué)習(xí)中一種基于對數(shù)據(jù)進(jìn)行表征學(xué)習(xí)的算法[9],其概念源于人工神經(jīng)網(wǎng)絡(luò)的研究,通過組合低層特征形成更加抽象的高層特征表示,從而發(fā)現(xiàn)數(shù)據(jù)的分布特征。與傳統(tǒng)的機器學(xué)習(xí)方法相比,深度學(xué)習(xí)的最大特點是采用了非監(jiān)督或者半監(jiān)督式的特征學(xué)習(xí)與提取方法,因此觀察對象的特征并不需要人為地指定,而是通過大量的訓(xùn)練數(shù)據(jù)學(xué)習(xí)歸納而來[10]。這種“黑盒”式的特征提取與歸納方法在分析代碼數(shù)據(jù)上有著巨大的優(yōu)勢:避免了人類觀察可能的誤判,數(shù)據(jù)量越大,神經(jīng)網(wǎng)絡(luò)模型對于代碼特征的挖掘就越接近數(shù)據(jù)原本的特征分布。這在無形中把代碼中人類難以理解的抽象性轉(zhuǎn)移給了海量的訓(xùn)練數(shù)據(jù)。深度學(xué)習(xí)用海量的訓(xùn)練數(shù)據(jù)來代替人對于代碼的觀察,使算法自己總結(jié)出代碼的性質(zhì)與規(guī)律,其在諸如圖像識別、機器翻譯等領(lǐng)域中顯示了遠(yuǎn)超傳統(tǒng)機器學(xué)習(xí)算法的性能,甚至在某些任務(wù)中表現(xiàn)出了超越人類的智能[11-12]。在軟件工程領(lǐng)域,深度學(xué)習(xí)同樣在諸如代碼生成和代碼理解等任務(wù)上展現(xiàn)了超越傳統(tǒng)工作的潛力。

        1 研究概述

        代碼分析指的是通過分析挖掘代碼本身性質(zhì),幫助開發(fā)者產(chǎn)生、維護(hù)并理解代碼的一類方法。隨著深度學(xué)習(xí)的快速發(fā)展,軟件工程領(lǐng)域也開始接納這一新興的技術(shù),基于深度學(xué)習(xí)的代碼分析更是成為了當(dāng)前研究的熱點。在近期的研究工作中,這種分析方法有很多的用途,其典型的應(yīng)用場景包括根據(jù)已有的代碼信息來推斷下一步的代碼(代碼的推薦與生成)、將一種程序語言的語句“翻譯”成另一種程序語言(代碼遷移)或為代碼片段生成摘要信息(代碼摘要生成)等。這些工作的成功應(yīng)用展示了將深度學(xué)習(xí)技術(shù)與代碼分析任務(wù)相結(jié)合的廣闊應(yīng)用前景。

        不管是用于什么用途,深度學(xué)習(xí)模型的訓(xùn)練都具有相似的技術(shù)流程。如圖1所示,在代碼分析任務(wù)中,神經(jīng)網(wǎng)絡(luò)有一個初始的網(wǎng)絡(luò)參數(shù)(多由0值或隨機值表示),在每次讀入輸入代碼之后,神經(jīng)網(wǎng)絡(luò)根據(jù)任務(wù)目標(biāo)計算損失函數(shù),并設(shè)立閾值來判定是否用反向傳播算法(BP算法)進(jìn)行參數(shù)更新。當(dāng)損失函數(shù)的值小于特定閾值之后,整個網(wǎng)絡(luò)訓(xùn)練完畢,開始執(zhí)行特定的代碼分析任務(wù)。

        圖1 基于深度學(xué)習(xí)代碼理解的一般技術(shù)流程

        本文按照上述的技術(shù)流程對現(xiàn)有研究進(jìn)行了總結(jié)。如表1所示,表中的每一行代表一個具有代表性的研究工作。第一列代表將代碼表征成向量形式的方法,包括one-hot編碼、詞袋編碼以及詞嵌入模型;第二列代表代碼表征的粒度,包括字符級別、詞條級別以及AST數(shù)節(jié)點級別;第三列表示不同研究工作所選用的神經(jīng)網(wǎng)絡(luò)模型,共包括循環(huán)RNN、CNN以及Seq2seq模型三種;最后一列表示不同研究工作的實際應(yīng)用場景,包括代碼推薦、代碼生成、代碼搜索、代碼遷移、代碼摘要以及故障定位六種。本文通過以上的三個標(biāo)準(zhǔn)對現(xiàn)有工作進(jìn)行了分類與總結(jié),歸納出了現(xiàn)有研究工作的優(yōu)勢與局限,并提出了對該方法未來發(fā)展趨勢的若干建議。

        表1 現(xiàn)有研究工作小結(jié)

        2 代碼的表示

        深度學(xué)習(xí)作為一種表征學(xué)習(xí)方法,需要接受向量形式的輸入。因此要討論深度學(xué)習(xí)對代碼的應(yīng)用,首先應(yīng)了解代碼是如何被編碼為向量形式的。目前比較流行的向量表示方法分為以下三種。

        2.1 one-hot編碼

        one-hot編碼又稱一位有效編碼,是數(shù)據(jù)表征中最簡單直接的方法。它的主要思路是采用N位的狀態(tài)寄存向量對N個狀態(tài)進(jìn)行編碼,每個狀態(tài)都對應(yīng)一個獨立的寄存位,并且在任意情況下都只有一位有效。one-hot編碼用最小的技術(shù)成本保證了編碼之間的相互正交,使得每一個被表示的單位都有一個唯一的向量表示。這種方法的弊端是編碼后的向量不表示任何具體含義,僅僅是一個獨立的狀態(tài)標(biāo)記,而且隨著狀態(tài)維度的增大,其空間分布會變得極為稀疏,因此該方法比較適合低維編碼任務(wù)。在代碼分析任務(wù)中,這種編碼多被運用于字符級別的表征方法中,比如Alexandru等[13]在代碼生成任務(wù)中,將上下文中給的代碼和注釋等信息用字符序列來表示,就采用了one-hot編碼方式。Mou等[14]運用seq2seq語言模型實現(xiàn)了由自然語言到代碼片段的映射,在處理輸入自然語言數(shù)據(jù)時同樣適用了字符級別的one-hot編碼。

        2.2 詞袋模型

        詞袋模型是一種經(jīng)典的統(tǒng)計學(xué)表征方法[15],它的特點是以每個詞為單位,不考慮詞與詞之間的相對順序,僅僅統(tǒng)計詞與詞之間的共現(xiàn)次數(shù)。這種思路有點像把詞不加區(qū)別對待地裝進(jìn)一個袋子里,因此得名“詞袋”模型。

        向量空間模型是信息檢索領(lǐng)域的經(jīng)典模型,也是一個典型的“詞袋”模型。其核心思想是把對文本內(nèi)容的處理簡化為向量空間中的向量運算,并且以空間上的相似度表達(dá)語義的相似度。向量空間模型在軟件工程領(lǐng)域有著廣泛的應(yīng)用,并被證明了在許多任務(wù)上具有良好的效果。Zhou等[16]提出的BugLocator工具采用了改進(jìn)版的向量空間模型rVSM。它計算bug報告文件與源代碼文件在空間上的相似度以定位可能存在bug的源文件,并考慮到了代碼文件的長度以及歷史上相似的bug對預(yù)測的影響,取得了很好的效果。Nguyen等[17]在其設(shè)計的人工深度神經(jīng)網(wǎng)絡(luò)(DNN)中也采用了rVSM方法來處理輸入的代碼元素。該工作在代碼分類任務(wù)上取得了超越傳統(tǒng)方法的準(zhǔn)確性。

        在統(tǒng)計學(xué)中也有一些經(jīng)典方法是基于詞袋模型思想的,在代碼表征方面應(yīng)用最廣的要數(shù)隱語義索引LSI(Latent Semantic Indexing)模型以及LDA(Latent Dirichlet Allocation)文檔主題生成模型。這兩種方法都旨在通過統(tǒng)計共現(xiàn)的方法捕捉隱含在文本的潛在信息并將之表示為向量,即所謂的隱語義向量,一些經(jīng)典工作通過這兩種方法為代碼尋找合適的語義向量表示[18-19]。

        2.3 分布式假說與詞嵌入

        詞嵌入技術(shù)是一種新興的向量表征方法,它起源于一個關(guān)鍵的設(shè)想——分布式假說。分布式假說是由Harris于1954年提出的[20],他認(rèn)為在自然語言中,如果兩個詞的上下文很相近,即使這兩個詞本身并不相似,它們也很可能代表了相同的語義信息,即自然語言單詞的語義是由其上下文決定的。這種假說解決了向量空間模型不能歸納近義詞的弊端,并且考慮到了文本分布的順序信息,因而在近期的研究中被廣泛推廣。詞嵌入技術(shù)也被稱為分布式語義模型。在這種分布式模型中,單個的單詞不再被處理為獨立的標(biāo)識符,而是用一個d維的上下文語義向量來表示。這樣具有相似上下文的單詞就會具有相近的向量表示。Mikolov等[21]提出的word2vec模型是目前最有影響力的詞嵌入模型。它用過神經(jīng)網(wǎng)絡(luò)來直接預(yù)測每個單詞的分布式向量表示,因而也被稱為可預(yù)測的分布式模型。word2vec在自然語言的眾多任務(wù)中都展示了超過傳統(tǒng)分布式向量模型的性能。

        word2vec同樣是在代碼分析中應(yīng)用最廣泛的詞嵌入模型。Ye等[22]從API文檔以及API教程網(wǎng)站上抽取了代碼片段和自然語言描述,通過word2vec模型在一個公共的低維向量空間中訓(xùn)練出各自的向量表示,用空間的相對距離來代表文檔之間的相似度,很好地解決了軟件搜索以及故障定位任務(wù)中代碼與自然語言之間的語義鴻溝問題。Nguyen等[23]通過word2vec模型分別對Java和C#代碼中的API調(diào)用進(jìn)行訓(xùn)練,并把兩者的詞向量表示映射到二維空間中,揭示了在不同的語言中,具有相似功能的API往往具有相似的二維空間分布,從而可以解決諸如代碼遷移一類的語義映射問題。Chen等[24]則通過該模型來處理近義詞問題。他們從stack overflow等編程問答社區(qū)中抽取了大量的代碼語料,通過詞向量的空間分布來判定近義詞,其性能超過了傳統(tǒng)的基于語法的同義詞判定方法。除了word2vec模型,研究者也設(shè)計出了一些特定于代碼結(jié)構(gòu)的詞嵌入方法。Peng等[25]提出適用于自然語言的詞嵌入模型并不一定適用于分析代碼,因為代碼語義相比于自然語言具有更強的結(jié)構(gòu)依賴性。他們通過抽象語法樹獲得代碼的結(jié)構(gòu)信息,并參考了自然語言處理中的“平滑性”概念[15],提出了適用于代碼結(jié)構(gòu)的“編碼標(biāo)準(zhǔn)”,使相似的代碼標(biāo)識符具有相似的向量表示。Nguyen等[26]則通過加權(quán)和的模式將word2vec模型與傳統(tǒng)向量空間模型結(jié)合起來,并證明這種結(jié)合后的方法在代碼樣例搜索任務(wù)中具有更好的表現(xiàn)。

        2.4 代碼表征的粒度

        除了合適的向量表示方法,選取合適的分析粒度也是非常有必要的。在軟件工程領(lǐng)域中,代碼表征的粒度一般可以分為以下幾個級別。

        2.4.1 字符級別

        程序代碼中的字符由英文字母、數(shù)字和運算符號構(gòu)成,是軟件分析中最細(xì)粒度的表征級別。該表征方法把源代碼中的每一個單個的字符當(dāng)成獨立的符號并進(jìn)行編碼。由于字符的種類相當(dāng)有限且不包含語義信息,一般采用獨熱編碼方法對其進(jìn)行編碼。這種方法的優(yōu)點在于表示起來相當(dāng)方便,不會出現(xiàn)向量維度爆炸的問題,但是由于單個字符并不包含任何語義信息,程序的語義僅僅能夠通過字符的排列順序來表達(dá),而這樣通常是遠(yuǎn)遠(yuǎn)不夠的。比如在C語言中,string是一個數(shù)據(jù)類型名,而strings是一個方法名,他們擁有不同的程序語義,但是其字符序列卻非常接近。在代碼分析中,字符粒度的分析常常與one-hot編碼一起使用[13-14]。

        2.4.2 詞條級別

        代碼中的詞條類似于自然語言中的單詞,由于它們都是由空格符來區(qū)分的,因此往往是最為直觀的表示方法。詞條級別的表征方法為每一個詞條賦予一個詞向量,詞向量的表示方法多使用詞嵌入或者向量空間模型。詞條是代碼中最小的語義單元,對詞條建模得到的向量表示蘊含了高層的語義關(guān)系,因而可以較好的處理同近義詞等問題。由于程序設(shè)計中的命名規(guī)則是非常自由的,比如變量名string、string1、string123、s、str可能是不同用戶對于同一個變量的命名,因此對詞條的建模很難控制詞表的大小。針對這個問題研究者也提出了一系列處理同近義詞的方法,在一定程度上提高了詞條建模的實用性。詞條級別是代碼分析中最為常見的分析粒度,這可能與詞條代表了代碼最基本的語義單位有關(guān)。

        2.4.3 AST樹節(jié)點級別

        這類表征方法通過代碼的抽象語法樹獲得代碼的結(jié)構(gòu)信息,并以語法樹的節(jié)點為單位進(jìn)行編碼。與前幾種方法相比,這種方法考慮到了代碼的結(jié)構(gòu)信息,因此其向量表示能夠更好地反映程序的實際語義。并且由于抽象語法樹在構(gòu)建階段對代碼元素進(jìn)行了大量的抽象處理,詞表的大小也得到了很好的控制。但是這種表示方法也有其局限性:這種向量表示需要被輸入到樹結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò)中。這就造成了神經(jīng)網(wǎng)絡(luò)訓(xùn)練中的批處理問題:由于語法樹的大小是不定的,所以在訓(xùn)練過程中無法使用批處理技術(shù)對其進(jìn)行加速,這會為訓(xùn)練過程帶來巨大的計算復(fù)雜度。目前對這種粒度的實踐有Mou[7]以及Gu等的工作[27]。

        3 深度學(xué)習(xí)模型

        深度學(xué)習(xí)在近幾年獲得了長足的發(fā)展,幾乎社會的各行各業(yè)都在嘗試使用神經(jīng)網(wǎng)絡(luò)模型來解決領(lǐng)域內(nèi)任務(wù),各式新穎、富有創(chuàng)造性的網(wǎng)絡(luò)結(jié)構(gòu)不斷涌現(xiàn)。然而截止到目前,神經(jīng)網(wǎng)絡(luò)模型最成功、最成熟的應(yīng)用還是在圖像識別與自然語言處理的任務(wù)上。這兩大研究領(lǐng)域分別對應(yīng)了目前最為經(jīng)典、成熟的兩個神經(jīng)網(wǎng)絡(luò)模型——卷積神經(jīng)網(wǎng)絡(luò)(CNN)與循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)。目前軟件工程領(lǐng)域?qū)τ谏疃葘W(xué)習(xí)的實踐也是主要基于這兩大經(jīng)典模型來展開的。

        3.1 卷積神經(jīng)網(wǎng)絡(luò)

        卷積神經(jīng)網(wǎng)絡(luò)是一種前饋神經(jīng)網(wǎng)絡(luò),但是采用卷積層來代替?zhèn)鹘y(tǒng)的全連接層。卷積層極大地減小了網(wǎng)絡(luò)中權(quán)重矩陣的密度,提高了神經(jīng)網(wǎng)絡(luò)的計算效率。不僅如此,卷積層還具有提取數(shù)據(jù)特征的功能,比如在圖像處理中,圖像被表示為二維的矩陣,卷積層可以從二維矩陣中抽取出特征映射。一般來說,最底層的特征對應(yīng)圖像的邊、角部分的特性。隨著不斷地卷積映射,這部分底層的特征被映射成人類可以理解的高層特征,比如識別出圖像中的物體的顏色、大小等。卷積神經(jīng)網(wǎng)絡(luò)有三個結(jié)構(gòu)上的特性:局部連接、權(quán)重共享、以及空間或時間上的次采樣。這些特性使得卷積神經(jīng)網(wǎng)絡(luò)有一定程度上的平移,縮放和扭曲不變性[28]。

        軟件工程對CNN網(wǎng)絡(luò)的應(yīng)用在很大程度上借鑒了圖像處理領(lǐng)域的看圖說話:代碼片段被看成是一幅圖畫,每個代碼元素則對應(yīng)畫面中的一個物體。這樣CNN就可以像捕捉圖片中的邊角信息一樣捕捉源代碼中的底層特征,再通過不斷地卷積映射得到人類可以理解的高層語義特征。在代碼分析任務(wù)中,由于CNN網(wǎng)絡(luò)強大的抽取高層語義的能力,它常常被用在代碼的摘要、標(biāo)注,自動化注釋生成等任務(wù)上。Mou等[29]提出代碼相比于自然語言具有嚴(yán)格的結(jié)構(gòu)限制,因而從代碼的AST樹來代表這種結(jié)構(gòu)信息,并設(shè)計了一套“編碼標(biāo)準(zhǔn)”來計算代碼向量表示。最后通過CNN網(wǎng)絡(luò)捕捉源代碼中的高層語義,實現(xiàn)了代碼分類與搜索的功能。Nguyen等[17]則設(shè)計了一種4層的人工神經(jīng)網(wǎng)絡(luò),將輸入的源代碼逐層進(jìn)行抽象與特征映射,最終得到了人類可以理解的項目級代碼描述。

        3.2 循環(huán)神經(jīng)網(wǎng)絡(luò)

        由于前饋神經(jīng)網(wǎng)絡(luò)的輸入和輸出維度都是固定的,所以不能有效地處理可變長的序列化數(shù)據(jù),循環(huán)神經(jīng)網(wǎng)絡(luò)就是為了解決這個問題而誕生的。在前饋神經(jīng)網(wǎng)絡(luò)中,連接只存在于層與層之間,層內(nèi)的節(jié)點是無連接的,而循環(huán)神經(jīng)網(wǎng)絡(luò)則通過帶自反饋的神經(jīng)元,將同層的節(jié)點通過時序連接起來,不定長的序列信息長度被表示為時序序列的長度,因此能夠處理任意長度的序列[30]。循環(huán)神經(jīng)網(wǎng)絡(luò)被廣泛的應(yīng)用在語音識別、機器翻譯以及自然語言生成等任務(wù)上。

        在循環(huán)神經(jīng)網(wǎng)絡(luò)的應(yīng)用過程中,人們發(fā)現(xiàn)在處理具有長距離數(shù)據(jù)依賴的序列信息時,由于神經(jīng)網(wǎng)絡(luò)的反向傳播特性,損失函數(shù)關(guān)于權(quán)重矩陣的梯度往往會爆炸性的增長或消失。這給神經(jīng)網(wǎng)絡(luò)的訓(xùn)練帶來了很大的困難,這個問題被人們稱為“長時依賴問題”。長時記憶神經(jīng)網(wǎng)絡(luò)(LSTM)[31]是循環(huán)神經(jīng)網(wǎng)絡(luò)的一個重要變體,它可以簡單有效地解決長時依賴問題。LSTM的關(guān)鍵是引入了一組記憶單元,允許神經(jīng)網(wǎng)絡(luò)可以學(xué)習(xí)得出哪些歷史信息應(yīng)該被記住,什么時候應(yīng)該用新的數(shù)據(jù)更新記憶單元。這種有選擇的計算方法顯著地減輕了計算長距離依賴信息的計算負(fù)擔(dān),有效地了解決長時依賴問題。

        由于代碼具有與自然語言相似的性質(zhì)與結(jié)構(gòu),對RNN網(wǎng)絡(luò)的應(yīng)用在軟件工程研究中更加的普遍,也出現(xiàn)了很多特定于分析代碼性質(zhì)的網(wǎng)絡(luò)結(jié)構(gòu)。White等[32]通過對比試驗證明了RNN模型在代碼推薦任務(wù)中有著遠(yuǎn)遠(yuǎn)超過傳統(tǒng)n-gram方法的性能。Dam等[33]提出了DeepSoft模型,通過運用代碼的自然性,本地性等特性構(gòu)建了一個基于LSTM神經(jīng)網(wǎng)絡(luò)的語言模型,從而實現(xiàn)了較好的代碼生成效果。Alexandru[13]同樣運用了LSTM結(jié)構(gòu)來實現(xiàn)代碼生成任務(wù),不過他除了考慮前文代碼之外,還考慮了代碼的注釋、標(biāo)簽等自然語言信息,并采用了逐字生成的策略。

        3.3 Seq2seq模型

        該模型用于解決seq2seq問題。所謂的seq2seq問題指的是根據(jù)一個輸入序列i,來生成一個輸出序列o。該問題被廣泛的應(yīng)用在諸如機器翻譯,文檔摘要和問答系統(tǒng)等場景中。seq2seq模型是一種編碼-解碼模型,所謂的編碼指的是通過一個編碼器將輸入序列轉(zhuǎn)化為一個固定長度的特征向量,而解碼指的是通過一個解碼器將這個特征向量再轉(zhuǎn)化成輸出序列。編碼-解碼模型最大的特點在于其高度的自由性:在實際應(yīng)用中,編碼器和解碼器都不是固定的,使用者可以根據(jù)需求自由地選擇編碼和解碼模型。這種模型的局限性在于編碼和解碼之間唯一的聯(lián)系就是一個固定長度的特征向量。因此如何合理設(shè)計編碼與解碼算法,使得特征向量可以有效的傳遞輸入信息的特征,避免編解碼之間的信息丟失成為了應(yīng)用這種網(wǎng)絡(luò)時需要首要考慮的問題。

        許多代碼分析任務(wù)也是一種seq2seq的問題,比如說代碼遷移可以理解為從一種編程語言到另一種編程語言的翻譯;代碼摘要和注釋生成都可以理解為師編程語言到自然語言的映射等。Murali等[34]的研究工作是這種模型的典型應(yīng)用,他們提出了代碼推薦工具Bayou。這種工具融合了貝葉斯模型與深度學(xué)習(xí)的優(yōu)點,整個模型通過隱語義向量鏈接,通過反向傳播算法進(jìn)行訓(xùn)練。用戶可以輸入諸如前文代碼,需求描述或者包信息等作為輸入,這些信息通過基于貝葉斯的統(tǒng)計模型被轉(zhuǎn)化成隱語義向量,再通過RNN網(wǎng)絡(luò)實現(xiàn)代碼信息的推薦。Gu等[27]借鑒了機器翻譯的思路,使用Seq2seq模型在同一向量坐標(biāo)系下共同訓(xùn)練了自然語言與代碼的向量表示,實現(xiàn)了代碼遷移的功能。

        4 代碼分析應(yīng)用

        代碼分析任務(wù)的核心問題是填補自然語言與程序代碼之間的語義鴻溝,因此在本質(zhì)上可以看作是代碼和自然語言之間的映射問題。本文根據(jù)這種映射關(guān)系將代碼分析常見的應(yīng)用場景歸納為以下三類。

        4.1 自然語言到代碼

        在這種映射關(guān)系下,比較常見的應(yīng)用有代碼搜索和故障定位。代碼搜索,即用戶輸入自然語言的查詢,通過各種檢索算法在代碼庫中匹配到滿足查詢條件的代碼片段。而故障定位則是指用戶根據(jù)故障報告中對故障的自然語言描述,計算文本相似度找到相似的源碼文件,從而確定故障最可能出現(xiàn)的地方。

        4.1.1 代碼搜索

        軟件工程領(lǐng)域解決代碼搜索問題的經(jīng)典方法主要來源于信息檢索技術(shù),通過建立源碼與查詢之間的索引來實現(xiàn)搜索功能。然而正如前文所述的那樣,這種簡單的關(guān)鍵詞匹配方法并不能很好地解決代碼和自然語言之間的語義鴻溝問題,因此始終不能很好地支持實際編程的需要。為了解決這個問題,Gu等[35]提出了DeepAPI方法,這種方法把代碼檢索看成是一個機器翻譯問題,采用深度語言模型把自然語言的查詢翻譯成對應(yīng)的API序列。與傳統(tǒng)的想法相比,該模型具有兩大優(yōu)點:一是通過詞嵌入技術(shù)學(xué)習(xí)了詞語的語義信息,實現(xiàn)了基于語義的代碼搜索;二是用seq2seq(序列到序列)的形式替代傳統(tǒng)方法所采用的詞袋模型,因而可以考慮到查詢的順序。

        4.1.2 故障定位

        現(xiàn)代大型軟件庫采用多分支的開發(fā)模式,并且面臨這頻繁的版本更迭,會不可避免地收到大量的故障報告。如何根據(jù)這些故障報告定位到故障實際發(fā)生的源碼文件,從而方便開發(fā)人員進(jìn)行針對性的勘誤是一個非常具有挑戰(zhàn)性的工作。Zhou等[16]提出了一種改進(jìn)的向量空間模型rVSM,這種模型考慮到了歷史上的故障修改信息,計算故障報告與源文件之間的文本相似度,從而判定最可能出現(xiàn)bug的源碼文件。在上一篇的基礎(chǔ)上,Lam等[36]提出了HyLoc模型。該模型將rVSM模型與深度學(xué)習(xí)結(jié)合起來,一方面借助向量空間模型來計算故障報告與源碼文件之間的文本相似度,另一方面用人工神經(jīng)網(wǎng)絡(luò)來學(xué)習(xí)得到兩者之間的相關(guān)性,最終的相似度又文本相似度與相關(guān)性的加權(quán)和表示。該模型在開源代碼庫上運行的性能超過了傳統(tǒng)基于信息檢索模型的方法,證明了深度學(xué)習(xí)可以強有力的處理故障定位問題。

        4.2 代碼到代碼

        滿足這種映射關(guān)系的應(yīng)用主要是代碼推薦與代碼生成。代碼的推薦與生成像是一對孿生的概念,目前學(xué)界中彼此之間并沒有明顯的界限可以劃分。為了保證敘述的清晰,我們在這里定義,代碼推薦所推薦的是部分的代碼元素,比如用‘.’符號推薦某個對象最可能會調(diào)用的方法,或者根據(jù)一段需求描述生成代碼模板;而代碼生成特指生成可以直接運行的源代碼的方法,比如根據(jù)前10行代碼生成接下來的5行代碼。代碼遷移指的將某種語言的代碼遷移到另一種語言中,由于不同語言有著不同的API使用方法,代碼遷移一直是一個極具挑戰(zhàn)性的任務(wù)。

        4.2.1 代碼推薦與生成

        在過去的十年內(nèi),軟件工程研究者普遍的做法是通過形式化公理或者統(tǒng)計學(xué)知識來完成代碼補全任務(wù),無論是在任務(wù)完成的準(zhǔn)確率或是泛化能力上都只是差強人意,而深度學(xué)習(xí)在自然語言處理領(lǐng)域的出色表現(xiàn)給了解決代碼補全問題的新的希望。Alexandru等[13]認(rèn)為在處理代碼生成任務(wù)時,應(yīng)該被考慮到的上下文不止是開發(fā)者已經(jīng)編寫的代碼,還包括注釋和需求描述信息等?;谶@種思想,他們從代碼的抽象語法樹中抽取豐富的上下文信息,并設(shè)計了雙向RNN網(wǎng)絡(luò)來進(jìn)行訓(xùn)練。實驗數(shù)據(jù)說明這種考慮復(fù)合上下文信息的方法在代碼生成任務(wù)上比以往的方法有著更加優(yōu)越的性能。White等[32]認(rèn)為提高軟件工程任務(wù)的關(guān)鍵在于提高代碼表示過程中的表征能力,而深度學(xué)習(xí)恰恰擅長賦予代碼表征以豐富的語義信息。因此他們結(jié)合了RNN網(wǎng)絡(luò)與統(tǒng)計語言模型,并用來處理代碼推薦問題。與之相似的, Raychev等[37]也認(rèn)為深度學(xué)習(xí)模型可以和統(tǒng)計語言模型結(jié)合起來,這種結(jié)合被描述為一種RNN網(wǎng)絡(luò)和傳統(tǒng)n-gram算法所預(yù)測結(jié)果的加權(quán)和。

        4.2.2 代碼遷移

        在代碼遷移方面, Nguyen等[23]借助了詞嵌入技術(shù),用空間分布的相似性來衡量API之間的相似度。Gu等[27]通過模仿機器翻譯的方式,通過將一種編程語言“翻譯”成另一種語言,在代碼遷移任務(wù)重取得了很好的效果。

        4.3 代碼到自然語言

        滿足這種映射關(guān)系的應(yīng)用主要屬于代碼摘要的范疇。這一類的任務(wù)可以歸結(jié)為給代碼生成簡短的自然語言描述,而代碼分類知識在這種描述的基礎(chǔ)上增加了分類的工作。這一類工作的本質(zhì)是從代碼到自然語言的映射。如上文所述,在實現(xiàn)代碼與自然語言之間的映射時,常常會面臨“語義鴻溝”問題,因此這類工作一般會先采用詞嵌入的方法來填補“語義鴻溝”,然后再借助深度學(xué)習(xí)模型進(jìn)行得到相應(yīng)的自然語言描述。Nguyen等[17]通過經(jīng)驗研究來驗證人工神經(jīng)網(wǎng)絡(luò)是否有完成代碼摘要任務(wù)的能力。他們設(shè)計了一個四層的神經(jīng)網(wǎng)絡(luò),每一層分別代表了從源碼級別到自然語言摘要級別的特征表述。該研究向人們證明了人工神經(jīng)網(wǎng)絡(luò)有能力從底層源碼中捕捉高層概念,使用深度學(xué)習(xí)技術(shù)來實現(xiàn)代碼摘要任務(wù)是切實可行的。Jiang等[38]則運用了深度機器翻譯(NMT)的技術(shù)來自動生成commit信息。作者從github的項目中抽取diff信息以及相應(yīng)的commit信息作為訓(xùn)練集,通過NMT模型進(jìn)行有監(jiān)督地訓(xùn)練,最終實現(xiàn)了對commit信息的預(yù)測。

        5 分析與討論

        深度學(xué)習(xí)技術(shù)在代碼領(lǐng)域的應(yīng)用總體上還處在初步發(fā)展的階段:研究者們在各個任務(wù)上嘗試了深度學(xué)習(xí)技術(shù),其中的一些工具取得了超越傳統(tǒng)方法的性能;一些經(jīng)驗研究論證了RNN、CNN等網(wǎng)絡(luò)結(jié)構(gòu)在代碼領(lǐng)域的可行性,并證明了深度學(xué)習(xí)技術(shù)具有填補代碼與自然語言間語義鴻溝的能力[16]。與此同時,也有一些研究者認(rèn)為與傳統(tǒng)統(tǒng)計學(xué)方法相比,深度學(xué)習(xí)對訓(xùn)練數(shù)據(jù)的需求成量級地增加,其性能卻沒產(chǎn)生明顯的優(yōu)勢[39-40]。由于深度學(xué)習(xí)缺乏像人類智能那樣“舉一反三”的能力,只適合處理單一的任務(wù)目標(biāo),因此在實際應(yīng)用中如何將現(xiàn)實生活中的需求抽象成適用于深度學(xué)習(xí)的任務(wù)也是一大難題。因此這些研究者對于深度學(xué)習(xí)在軟件領(lǐng)域的應(yīng)用持保留態(tài)度。通過對目前學(xué)界研究的總結(jié),我們將代碼領(lǐng)域的深度學(xué)習(xí)的優(yōu)點與現(xiàn)有問題歸納如下。

        5.1 優(yōu)越性

        5.1.1 表征能力

        詞嵌入技術(shù)和分布式假說賦予了深度學(xué)習(xí)工具強大的表征能力,代碼的高層語義和結(jié)構(gòu)信息以向量形式被編碼進(jìn)入神經(jīng)網(wǎng)絡(luò)中,這種強表征能力帶給了深度學(xué)習(xí)至少在三個方面的優(yōu)越性。首先,這種表征能力有利于填補代碼與自然語言間的語義鴻溝,這使得深度學(xué)習(xí)尤其適合于代碼分析任務(wù)。其次,表征能力使得深度學(xué)習(xí)可以以一種無監(jiān)督的“黑盒”模式進(jìn)行特征提取,從而省去了繁瑣的人工特征工程,排除了人為觀察帶來的誤差[10]。最后,強大的表征能力使得深度學(xué)習(xí)不像傳統(tǒng)統(tǒng)計學(xué)方法那樣受限于“詞表越界”問題(OOV),很多研究工作都記錄了深度學(xué)習(xí)生成或合成了訓(xùn)練集中不存在的模式[11,14]。

        5.1.2 訓(xùn)練性能

        深度學(xué)習(xí)在圖像識別和自然語言處理中的蓬勃發(fā)展向我們展示了其巨大的應(yīng)用潛力:在大量優(yōu)質(zhì)訓(xùn)練數(shù)據(jù)的前提下,深度學(xué)習(xí)在某些任務(wù)中可以達(dá)到甚至超過人類智能的表現(xiàn)。因此我們也有理由相信這種技術(shù)在代碼領(lǐng)域的潛力,更何況在已有的研究中,深度學(xué)習(xí)已經(jīng)在一些特定任務(wù)或數(shù)據(jù)集上取得了超越傳統(tǒng)方法的性能。隨著軟件工程的發(fā)展,人們越來越重視代碼數(shù)據(jù)的收集與表征,一些新穎的代碼特定的神經(jīng)網(wǎng)絡(luò)機構(gòu)也被提出,我們有理由期待深度學(xué)習(xí)方法在未來代碼分析任務(wù)中的表現(xiàn)。

        5.2 問題與討論

        雖然深度學(xué)習(xí)具有巨大的優(yōu)越性與應(yīng)用潛力,在目前的代碼分析研究中,該技術(shù)仍然一些方面具有相當(dāng)?shù)木窒扌?。下面列舉了深度學(xué)習(xí)技術(shù)現(xiàn)存的一些問題,并嘗試對未來的解決方案進(jìn)行了討論。

        5.2.1 抽象的任務(wù)描述

        深度學(xué)習(xí)需要人工定義損失函數(shù)來描述任務(wù)執(zhí)行的邊界和目標(biāo),并指導(dǎo)隱層參數(shù)的更新。這就要求所執(zhí)行任務(wù)是相對單一,可用數(shù)學(xué)語言描述的。然而正如前文所分析的,代碼具有高度的抽象性和復(fù)雜性,其大部分性質(zhì)是很難用簡明的數(shù)學(xué)語言來定義的。比如在代碼摘要任務(wù)中,我們很難用數(shù)學(xué)公式來定義摘要好壞的判斷標(biāo)準(zhǔn)。一個合理、具有廣泛適用性的代碼體系衡量標(biāo)準(zhǔn)成為了應(yīng)用深度學(xué)習(xí)技術(shù)的迫切需求。

        Scalabrino等[41]通過一個經(jīng)驗研究指出,軟件工程中現(xiàn)有的評判標(biāo)準(zhǔn),無論是代碼的可讀性還是復(fù)雜度,都無法勝任衡量人對于代碼信息的理解程度。一些研究工作借鑒了機器翻譯的評判標(biāo)準(zhǔn),采用諸如BLEU和Perplexity等體系[42]來進(jìn)行判斷,但是也有研究指出這些評判標(biāo)準(zhǔn)只是對人理解文本方式的模擬,并不能真正的衡量人實際的理解程度。由于神經(jīng)網(wǎng)絡(luò)需要一個評判標(biāo)準(zhǔn)來設(shè)計損失函數(shù),因此評判標(biāo)準(zhǔn)的合理與否直接決定了模型訓(xùn)練的性能,如何設(shè)計有效的代碼分析評價體系成為了代碼理解的關(guān)鍵問題。

        5.2.2 標(biāo)注數(shù)據(jù)集的匱乏

        標(biāo)注數(shù)據(jù)集是解決有監(jiān)督學(xué)習(xí)問題的根本。在圖像識別和自然語言領(lǐng)域,正是有了大量高質(zhì)量的人工標(biāo)注數(shù)據(jù)集,才迎來了深度學(xué)習(xí)應(yīng)用的井噴式發(fā)展[11]。由于理解代碼并進(jìn)行標(biāo)注需要大量的專業(yè)知識,因此代碼標(biāo)注的成本和難度遠(yuǎn)遠(yuǎn)高于圖片和自然語言。如何得到高質(zhì)量的標(biāo)注數(shù)據(jù)集成為了深度學(xué)習(xí)應(yīng)用發(fā)展的一大難題。

        要更好地實現(xiàn)代碼分析任務(wù),研究者應(yīng)致力于建設(shè)一個服務(wù)于該任務(wù)的基準(zhǔn)數(shù)據(jù)集。這個數(shù)據(jù)集需要有關(guān)于具體任務(wù)的標(biāo)注信息,比如人工地標(biāo)注出某個類的摘要信息。這樣的數(shù)據(jù)集可以是研究者不必再煩惱如何為任務(wù)提供先驗知識,更加專注于算法設(shè)計,并且為不同的方法提供了通用的測試平臺。關(guān)于特定任務(wù)的競賽也可以在基準(zhǔn)數(shù)據(jù)集上展開,充分動用大眾的力量來解決現(xiàn)有問題。

        除了采用人工標(biāo)注的數(shù)據(jù)集之外,嘗試使用新的算法也是可行的思路。人工智能領(lǐng)域近期的一些研究指出,通過采用無監(jiān)督、半監(jiān)督和增強學(xué)習(xí)等方法[43],可以大大地減少深度學(xué)習(xí)算法對于標(biāo)注數(shù)據(jù)的依賴。在代碼標(biāo)注“寸土寸金”的軟件工程領(lǐng)域,嘗試使用這些新的深度學(xué)習(xí)訓(xùn)練思路不失為一條可行之道。

        5.2.3 缺少領(lǐng)域知識的理解

        要理解一段代碼,除了代碼本身的性質(zhì)之外,學(xué)習(xí)這段代碼所實現(xiàn)的業(yè)務(wù)邏輯也是必不可少的。現(xiàn)有的代碼理解方法大多從代碼本身的性質(zhì)入手,通過分析API或詞條的分布或者注釋等自然語言信息來實現(xiàn)對代碼的理解,因而很難獲得源代碼背后所蘊含的業(yè)務(wù)邏輯。要真正實現(xiàn)深度的代碼理解,了解必要的業(yè)務(wù)邏輯是必不可少的。

        與深度學(xué)習(xí)不同,知識圖譜是一種自底向上、從細(xì)節(jié)到整體的人工智能方法,它通過一階謂詞邏輯來表述現(xiàn)實世界的知識,通過“實體”的鏈接來把不同領(lǐng)域的知識鏈接到一起[44]。正如上文所述的,深度學(xué)習(xí)的一大缺陷是難以考慮到代碼背后的業(yè)務(wù)邏輯關(guān)系,而這種顯示存在的知識恰恰是知識圖譜技術(shù)最善于描述的。因此將深度學(xué)習(xí)技術(shù)與知識圖譜技術(shù)的優(yōu)點相結(jié)合可能是一個很好的代碼分析的思路。

        6 結(jié) 語

        通過對現(xiàn)有工作的總結(jié),可以看到深度學(xué)習(xí)已經(jīng)在代碼生成及理解領(lǐng)域取得了可喜的進(jìn)步,展示了極具競爭力的性能與廣闊的發(fā)展前景。與此同時,現(xiàn)有的工作也表現(xiàn)出了一定的局限性,比如可標(biāo)注數(shù)據(jù)集的缺乏以及對抽象任務(wù)的處理等。

        在未來的代碼分析研究中,深度學(xué)習(xí)將會扮演越來越重要的角色。軟件工程領(lǐng)域的深度學(xué)習(xí)技術(shù)將會朝著標(biāo)準(zhǔn)化的方向發(fā)展,比如建立基準(zhǔn)數(shù)據(jù)集以及設(shè)計出若干標(biāo)準(zhǔn)化的代碼評判體系。與此同時,無監(jiān)督學(xué)習(xí)、增強學(xué)習(xí)以及知識圖譜等新興人工智能技術(shù)將會得到廣泛的實踐,這些技術(shù)將會與現(xiàn)有深度學(xué)習(xí)技術(shù)進(jìn)行有效互補。在可預(yù)見的未來,代碼分析與理解一定會取得更加令人振奮的進(jìn)展。

        [1] Brooks Jr F P. No Silver Bullet Essence and Accidents of Software Engineering[J]. Computer, 1987, 20(4):10- 19.

        [2] Bessey Al, Block Ken, Chelf Ben, et al. A few billion lines of code later: using static analysis to find bugs in the real world[J]. Communications of the Acm, 2010, 53(2):66- 75.

        [3] Clarke E, Kroening D, Yorav K. Behavioral Consistency of C and Verilog Programs Using Bounded Model Checking[C]//Design Automation Conference. ACM, 2003:368- 371.

        [4] Cousot P, Cousot R, Feret J, et al. The ASTREé Analyzer[J]. Lecture Notes in Computer Science, 2005, 3444:140- 140.

        [5] Knuth D E. Literate Programming[J]. Computer Journal, 1984, 27(2):97- 111.

        [6] Hindle A, Barr E T, Su Z, et al. On the naturalness of software[C]// International Conference on Software Engineering. IEEE, 2012:837- 847.

        [7] Mou L, Li G, Zhang L, et al. Convolutional neural networks over tree structures for programming language processing[C]// Thirtieth AAAI Conference on Artificial Intelligence. AAAI Press, 2016:1287- 1293.

        [8] Scott S, Matwin S. Feature Engineering for Text Classification[C]// Proceedings of the Sixteenth International Conference on Machine Learning,ICML’99. 1999:379- 388.

        [9] Shwartz-Ziv R, Tishby N. Opening the Black Box of Deep Neural Networks via Information[DB]. eprint arXiv:1703.00810, 2017.

        [10] Tishby N, Zaslavsky N. Deep learning and the information bottleneck principle[C]// Information Theory Workshop. IEEE, 2015:1- 5.

        [11] Krizhevsky A, Sutskever I, Hinton G E. ImageNet classification with deep convolutional neural networks[C]// International Conference on Neural Information Processing Systems. Curran Associates Inc. 2012:1097- 1105.

        [12] Wu Y, Schuster M, Chen Z, et al. Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation[DB]. arXiv:1609.08144,2016.

        [13] Alexandru C V. Guided code synthesis using deep neural networks[C]// ACM Sigsoft International Symposium on Foundations of Software Engineering. ACM, 2016:1068- 1070.

        [14] Mou L, Men R, Li G, et al. On End-to-End Program Generation from User Intention by Deep Neural Networks[DB]. arXiv:1510.07211, 2015.

        [15] Zhang Y, Jin R, Zhou Z H. Understanding bag-of-words model: a statistical framework[J]. International Journal of Machine Learning & Cybernetics, 2010, 1(1- 4):43- 52.

        [16] Zhou J, Zhang H, Lo D. Where should the bugs be fixed? More accurate information retrieval-based bug localization based on bug reports[C]// International Conference on Software Engineering. IEEE, 2012:14- 24.

        [17] Nguyen A T, Nguyen T N. Automatic Categorization with Deep Neural Network for Open-Source Java Projects[C]// International Conference on Software Engineering Companion. IEEE Press, 2017:164- 166.

        [18] Panichella A, Dit B, Oliveto R, et al. How to effectively use topic models for software engineering tasks? An approach based on Genetic Algorithms[C]// International Conference on Software Engineering. IEEE Computer Society, 2013:522- 531.

        [19] Poshyvanyk D, Marcus A, Rajlich V, et al. Combining Probabilistic Ranking and Latent Semantic Indexing for Feature Identification[C]// IEEE International Conference on Program Comprehension. IEEE, 2006:137- 148.

        [20] Harris Z S. Distributional Structure[M]// Papers on Syntax. Springer Netherlands, 1981:146- 162.

        [21] Mikolov T, Sutskever I, Chen K, et al. Distributed representations of words and phrases and their compositionality[C]// International Conference on Neural Information Processing Systems. Curran Associates Inc. 2013:3111- 3119.

        [22] Ye X, Shen H, Ma X, et al. From word embeddings to document similarities for improved information retrieval in software engineering[C]// Ieee/acm, International Conference on Software Engineering. IEEE, 2016:404- 415.

        [23] Nguyen T D, Nguyen A T, Phan H D, et al. Exploring API Embedding for API Usages and Applications[C]// International Conference on Software Engineering. IEEE Press, 2017:438- 449.

        [24] Chen C, Xing Z, Wang X. Unsupervised Software-Specific Morphological Forms Inference from Informal Discussions[C]// Ieee/acm, International Conference on Software Engineering. IEEE, 2017:450- 461.

        [25] Peng H, Mou L, Li G, et al. Building Program Vector Representations for Deep Learning[C]// International Conference on Knowledge Science, Engineering and Management. Springer, Cham, 2015:547- 553.

        [26] Nguyen T V, Nguyen A T, Phan H D, et al. Combining Word2Vec with Revised Vector Space Model for Better Code Retrieval[C]// Ieee/acm, International Conference on Software Engineering Companion. IEEE, 2017:183- 185.

        [27] Gu X, Zhang H, Zhang D, et al. DeepAM: Migrate APIs with Multi-modal Sequence to Sequence Learning[C]// Twenty-Sixth International Joint Conference on Artificial Intelligence. 2017:3675- 3681.

        [28] Simard P Y, Haffner P, Lecun Y. Boxlets: a fast convolution algorithm for signal processing and neural networks[C]// Conference on Advances in Neural Information Processing Systems II. MIT Press, 1999:571- 577.

        [29] Mou L, Li G, Jin Z, et al. TBCNN: A Tree-Based Convolutional Neural Network for Programming Language Processing[DB]. arXiv:1409.5718, 2014.

        [30] Graves A. Supervised Sequence Labelling with Recurrent Neural Networks[M]. Springer Berlin Heidelberg, 2012.

        [31] Sepp Hochreiter, Jürgen Schmidhuber. Long Short-Term Memory[J].Neural Computation,1997,9(8):1735- 1780.

        [32] White M, Vendome C, Linares-Vasquez M, et al. Toward Deep Learning Software Repositories[C]// Mining Software Repositories. IEEE, 2015:334- 345.

        [33] Dam H K, Tran T, Grundy J, et al. DeepSoft: a vision for a deep model of software[C]// ACM Sigsoft International Symposium on Foundations of Software Engineering. ACM, 2016:944- 947.

        [34] Murali V, Qi L, Chaudhuri S, et al. Bayesian Sketch Learning for Program Synthesis[DB]. arXiv:1703.05698, 2017.

        [35] Gu X, Zhang H, Zhang D, et al. Deep API learning[C]// ACM Sigsoft International Symposium on Foundations of Software Engineering. ACM, 2016:631- 642.

        [36] An N L, Nguyen A T, Nguyen H A, et al. Combining Deep Learning with Information Retrieval to Localize Buggy Files for Bug Reports (N)[C]// Ieee/acm International Conference on Automated Software Engineering. IEEE, 2016:476- 481.

        [37] Raychev V, Vechev M, Yahav E. Code completion with statistical language models[C]// Acm Sigplan Symposium on Programming Language Design & Implementation. ACM, 2014:419- 428.

        [38] Jiang S, Armaly A, Mcmillan C. Automatically generating commit messages from diffs using neural machine translation[C]// Ieee/acm International Conference on Automated Software Engineering. ACM, 2017:135- 146.

        [39] Fu W, Menzies T. Easy over hard: a case study on deep learning[C]// Joint Meeting on Foundations of Software Engineering. ACM, 2017:49- 60.

        [40] Hellendoorn V J, Devanbu P. Are deep neural networks the best choice for modeling source code?[C]// Joint Meeting on Foundations of Software Engineering.ACM,2017:763- 773.

        [41] Scalabrino S, Bavota G, Vendome C, et al. Automatically assessing code understandability: How far are we?[C]// Ieee/acm International Conference on Automated Software Engineering. IEEE Computer Society, 2017:417- 427.

        [42] Papineni K, Roukos S, Ward T, et al. BLEU: a method for automatic evaluation of machine translation[C]// Meeting on Association for Computational Linguistics. Association for Computational Linguistics, 2002:311- 318.

        [43] Li Y. Deep Reinforcement Learning: An Overview[DB]. arXiv:1701.07274, 2017.

        [44] Wang Z, Zhang J, Feng J, et al. Knowledge Graph and Text Jointly Embedding[C]// Conference on Empirical Methods in Natural Language Processing. 2014:1591- 1601.

        [45] Shu C, Zhang H. Neural Programming by Example[C]// AAAI Conference on Artificial Intelligence. 2017.

        猜你喜歡
        語義深度方法
        深度理解一元一次方程
        語言與語義
        深度觀察
        深度觀察
        深度觀察
        可能是方法不對
        “上”與“下”語義的不對稱性及其認(rèn)知闡釋
        用對方法才能瘦
        Coco薇(2016年2期)2016-03-22 02:42:52
        四大方法 教你不再“坐以待病”!
        Coco薇(2015年1期)2015-08-13 02:47:34
        捕魚
        男女搞黄在线观看视频| 午夜精品一区二区三区的区别| 欧美性猛交xxxx黑人| 久久久久久久久国内精品影视| 亚洲女人天堂成人av在线| 边添小泬边狠狠躁视频| 怡红院免费的全部视频| 亚洲色成人WWW永久在线观看| av免费网站不卡观看| 无遮挡激情视频国产在线观看| 18女下面流水不遮图| 久久亚洲AV无码精品色午夜| 日本在线一区二区三区四区 | 国产影片中文字幕| 久久精品国产亚洲综合色| 亚洲天堂av在线观看免费| 久久久久亚洲av无码专区首| 性高朝久久久久久久| 国产精品黑色丝袜在线播放| 快射视频网站在线观看| 欧美丰满熟妇bbbbbb| 亚洲 欧美 国产 日韩 精品| 青青草视频原手机在线观看| 真实夫妻露脸爱视频九色网| 国产成人无码免费视频在线| 人妻无码中文专区久久综合| 国产av精品久久一区二区| 免费a级毛片无码a∨蜜芽试看 | 亚洲av无码国产精品色午夜软件 | 情侣黄网站免费看| 国产精品久久久久孕妇| 美女视频在线观看一区二区三区| 亚洲av成人无码一二三在线观看| 免费无码成人av在线播放不卡| 久久精品国产av大片| 亚洲国产精品成人av网| 国精品无码一区二区三区在线蜜臀| av天堂精品久久久久| 亚洲精品美女中文字幕久久| 国产精品久久久久9999无码| 亚洲中文字幕第一页在线|