趙鋼
(西安航空職業(yè)技術(shù)學(xué)院,陜西西安710089)
所謂注釋是為顯著提升源代碼可讀性,編制的相應(yīng)源代碼的自然語言文本描述,目的是幫助程序員充分理解代碼,提升軟件系統(tǒng)的可維護(hù)性。而完善的軟件都需配置高質(zhì)量代碼、精確注釋、文檔等。當(dāng)前多數(shù)開源軟件周期相對較短,應(yīng)用與影響范圍廣泛,但是相關(guān)注釋并不完善,根本無法滿足初級(jí)開發(fā)人員需求。而且開源軟件版本更新速度越來越快,相應(yīng)注釋無法隨著版本實(shí)時(shí)更新,所以開源軟件代碼與注釋間依舊存在覆蓋率較低,以及注釋信息更新落后且不精確全面等現(xiàn)象[1]。因此,為促使初級(jí)開發(fā)人員深入理解與學(xué)習(xí)源代碼,必須全面保障注釋完整性與準(zhǔn)確性,據(jù)此,本文針對計(jì)算機(jī)挖掘軟件設(shè)計(jì)了源代碼注釋自動(dòng)生成方法。
代碼克隆即計(jì)算機(jī)軟件源代碼中存在的重復(fù)的相同或者類似的代碼片段,其可能完全相同,也可能經(jīng)過編輯性、邏輯性修改??寺〈a片段的邏輯運(yùn)算大體類似,具備相似功能特性。代碼克隆是復(fù)制粘貼代碼重復(fù)使用,或者解決類似問題的模式化思維等導(dǎo)致的,大部分儲(chǔ)存于軟件系統(tǒng),其在軟件工程中與軟件質(zhì)量、復(fù)雜、框架、升級(jí)、專利、盜竊等問題息息相關(guān)。
代碼克隆檢測的應(yīng)用十分廣泛,即隨開源項(xiàng)目發(fā)展,代碼復(fù)用規(guī)模擴(kuò)展,代碼復(fù)用廣泛性可作為代碼質(zhì)量評(píng)估標(biāo)準(zhǔn)以及復(fù)用代碼模塊選擇依據(jù);基于代碼克隆檢測可尋找軟件系統(tǒng)的克隆代碼,并重新構(gòu)建,以刪除克隆代碼,保障源代碼產(chǎn)量與質(zhì)量。
根據(jù)源代碼文本與功能類似性劃分克隆代碼類型,即除空格與注釋之外全部相同的代碼片段(Type-1);除標(biāo)志符號(hào)、類型、空格、注釋之外的句法相同代碼片段(Type-2);添加、刪除、修改語句的復(fù)制粘貼代碼片段(Type-3);功能相同句法不同的代碼片段(Type-4)[2]。
計(jì)算機(jī)挖掘軟件的源代碼注釋自動(dòng)生成流程[3]具體如圖1所示。
圖1 代碼注釋自動(dòng)生成流程
在生成注釋前需進(jìn)行克隆代碼檢測,其是代碼注釋提取的重要基礎(chǔ),也是自動(dòng)生成代碼注釋的關(guān)鍵環(huán)節(jié)。以Nicad工具進(jìn)行檢測,其基于文本準(zhǔn)確檢測前三類(Type-1、Type-2、Type-3)代碼,不僅可檢測軟件內(nèi)部代碼,還可檢測跨版本軟件代碼,以此為后續(xù)研究分析提供數(shù)據(jù)依據(jù)。通??寺〈a檢測會(huì)嚴(yán)格遵守既定流程[3],具體如圖2所示。
圖2 克隆檢測流程
3.2.1 預(yù)處理
刪除無關(guān)項(xiàng),統(tǒng)一源代碼布局,刪除無關(guān)字符串,以減少計(jì)算次數(shù),降低無關(guān)項(xiàng)的影響;明確源單元,剩下源代碼劃分為不相交代碼片段,即所謂的源單元,其參與了整個(gè)代碼克隆過程;明確對比單元,就源單元對比算法,需深入劃分為更加微小的單元。
3.2.2 轉(zhuǎn)換
此階段是代碼檢測的必備環(huán)節(jié),轉(zhuǎn)變源代碼變量與標(biāo)識(shí)符號(hào)為中間形式,以對比分析。Token串提取,基于詞法分析器實(shí)現(xiàn)源代碼Token 化,各行源代碼分別轉(zhuǎn)變?yōu)門oken序列;抽象語法樹提取,轉(zhuǎn)變源代碼為抽象語法樹,以子樹對比分析得到檢測結(jié)果;程序依賴圖構(gòu)建,代表控制與數(shù)據(jù)圖,各節(jié)點(diǎn)代表程序語句與條件,以語義技術(shù)為輔助由源代碼生成子圖對比分析。
3.2.3 匹配
源代碼通過預(yù)處理與轉(zhuǎn)換后,進(jìn)行匹配,通過相關(guān)算法計(jì)算源單元與對比單元,并合并鄰居單元為整體大單元,然后輸出聚集的轉(zhuǎn)化代碼內(nèi)所包含匹配列表,以構(gòu)成候選克隆組對。
3.2.4 格式化
企業(yè)的發(fā)展離不開大數(shù)據(jù),可以說沒有數(shù)據(jù)的強(qiáng)有力支撐企業(yè)就得不到最優(yōu)化的發(fā)展方案,同時(shí)大數(shù)據(jù)能幫助并引導(dǎo)企業(yè)高層進(jìn)行更明智的決策。企業(yè)需要建立基礎(chǔ)平臺(tái)或有效工具來收集數(shù)據(jù),同時(shí)要利用大數(shù)據(jù)開拓思路。 讓數(shù)據(jù)來說話,整合多方力量。從某種程度上說,大數(shù)據(jù)是數(shù)據(jù)分析的前沿技術(shù)。簡言之,從各種各樣類型的數(shù)據(jù)中,快速獲得有價(jià)值信息的能力,就是大數(shù)據(jù)技術(shù)。
將克隆組隊(duì)列表轉(zhuǎn)變?yōu)閷?yīng)源代碼的全新克隆組隊(duì)列表。通過克隆結(jié)果與原始結(jié)果的映射,獲得新克隆組對與克隆類具體位置,進(jìn)而轉(zhuǎn)變?yōu)樵次募鄳?yīng)位置。
3.2.5 后處理
基于手動(dòng)或自動(dòng)啟發(fā)式方式,對克隆代碼進(jìn)行過濾,以篩選誤報(bào)、漏保代碼。其中,自動(dòng)啟發(fā)式方法基于多元性、頻率、長度及其他特性自動(dòng)排序、過濾克隆代碼。
3.2.6 結(jié)果可視化
為確保直觀形象了解軟件中克隆代碼,需采用易于理解的方式儲(chǔ)存并可視化結(jié)果。最常用的方式是HTML(超文本標(biāo)記語言)與XML(可擴(kuò)展標(biāo)記語言),其都具備相應(yīng)節(jié)點(diǎn),可明確呈現(xiàn)克隆間銜接與包含關(guān)系。
3.3.1 提取代碼
基于克隆檢測所獲XML文件,了解其名稱與路徑等相關(guān)信息。通過字符流進(jìn)行XML文件讀取,以文件路徑與行號(hào)獲取文件,并構(gòu)建可于文件內(nèi)編寫字符數(shù)據(jù)的輸出流對象,便于數(shù)據(jù)儲(chǔ)存。數(shù)據(jù)編寫時(shí),應(yīng)先評(píng)估文件的存在性,不存在需自動(dòng)創(chuàng)建,存在則被覆蓋。同時(shí)以是否處于指定行內(nèi)區(qū)分文件,并儲(chǔ)存于緩沖區(qū),獲取指定行內(nèi)文件內(nèi)容,并編寫進(jìn)文件,以實(shí)現(xiàn)代碼提取。
3.3.2 提取注釋
此階段需提取克隆代碼相應(yīng)注釋,利用XML文件所提供信息,獲取其ID、名稱、路徑、源文件起始與終點(diǎn)等相關(guān)信息。獲取克隆代碼,在獲取文件之后,解析文件為AST,并由數(shù)據(jù)庫克隆代碼片段AST中進(jìn)行注釋檢索,同時(shí)于文本中加以儲(chǔ)存[4]。
3.4.1 精簡代碼
代碼中含有大量無用詞,其對代碼與注釋映射的作用并不顯著,且會(huì)影響結(jié)果準(zhǔn)確性,所以需加以優(yōu)化處理。在克隆代碼提取之后,并非所有代碼都適合添加注釋,需就實(shí)際需要篩選具有現(xiàn)實(shí)意義的克隆代碼,以實(shí)現(xiàn)代碼精簡優(yōu)化?;趦蓷l啟發(fā)式規(guī)則過濾不同類型停用詞[5],具體如表1所示。
表1 停用詞相關(guān)規(guī)則
3.4.2 精簡注釋
源軟件所提取代碼注釋與目標(biāo)軟件代碼闡述的含義功能可能不統(tǒng)一,或描述過于冗繁,會(huì)降低軟件代碼可讀性與可維護(hù)性。所以在代碼注釋匹配錢,需進(jìn)行預(yù)處理,刪除無關(guān)項(xiàng)與不符合代碼含義功能的字符,并精簡優(yōu)化,以確保易于理解,提高開發(fā)效率。就所提取的代碼注釋,基于三條啟發(fā)式規(guī)則進(jìn)行精簡,具體如表2所示。
表2 注釋精簡相關(guān)規(guī)則
所提取克隆代碼與注釋在精簡后,將其映射于目標(biāo)軟件代碼,以提取目標(biāo)代碼與源軟件提取精簡后注釋相匹配,從而把注釋映射于目標(biāo)軟件代碼片段?;贜icad配置文件行號(hào)進(jìn)行過濾,為行號(hào)內(nèi)部代碼,則添加源軟件所提取代碼注釋,為所有方法與語句添加注釋,重構(gòu)目標(biāo)軟件,非行號(hào)內(nèi)部代碼,則直接編寫于文件內(nèi)。
于目標(biāo)軟件與源軟件之間檢測克隆代碼,發(fā)現(xiàn)相同或類似代碼,并精簡優(yōu)化處理,于源軟件進(jìn)行代碼注釋提取,通過啟發(fā)式方式精簡代碼注釋,然后將其映射于目標(biāo)軟件代碼,以此完成源代碼注釋自動(dòng)生成,將自動(dòng)生成的代碼注釋映射為Java文件。
目標(biāo)軟件注釋少,質(zhì)量差,所以基于檢測尋找源軟件與目標(biāo)軟件之間的克隆代碼,提取并精簡代碼與注釋,以獲得高質(zhì)適量的代碼與注釋。選擇5 款目標(biāo)軟件通過克隆代碼檢測所得60 個(gè)代碼片段,以生成80 條注釋,展示了各源軟件生成的代碼與注釋數(shù)量,5 款軟件共生成110萬行代碼,產(chǎn)量偏低。
基于Github下載了110款軟件,在評(píng)價(jià)中為5款目標(biāo)軟件自動(dòng)生成代碼注釋,即Jabref、Jbidwatcher、Vuze、MegaMek、FreeMind,軟件詳細(xì)信息如表3所示。
表3 軟件信息
這些軟件的應(yīng)用十分普遍,具備代表性與典型性,歷史時(shí)間較長,相對成熟,比較適合進(jìn)行實(shí)驗(yàn)分析。通過Cloc對軟件進(jìn)行代碼數(shù)量計(jì)算[6]。
在源軟件與目標(biāo)軟件之間的克隆代碼檢測過程中,選用Nicad 作為檢測工具,其以文本為基礎(chǔ)進(jìn)行檢測,可有效檢測出源軟件與目標(biāo)軟件中的前三類(Type-1、Type-2、Type-3)克隆代碼,并于XML文件內(nèi)儲(chǔ)存檢測結(jié)果,以便后續(xù)讀取應(yīng)用相關(guān)數(shù)據(jù)信息。
以通過Clocom工具的Token克隆代碼檢測方法,與本文基于Nicad 工具的文本克隆代碼檢測方法進(jìn)行對比分析,由于代碼與注釋處理方式不同,所以只比較分析二者自動(dòng)生成的代碼注釋產(chǎn)量與質(zhì)量。由Github下載Java開源軟件,以Ubuntu 64位、8GB內(nèi)存的操作系統(tǒng)為平臺(tái)開展實(shí)驗(yàn)。
不同自動(dòng)生成方法下的源代碼注釋產(chǎn)量比較分析結(jié)果具體如表4所示。
表4 產(chǎn)量比較分析結(jié)果
由表4可知,相比Clocom法,本文方法所檢測出的克隆代碼類型更多,且在5款軟件中,共生成了80條代碼注釋,多生成了8條,產(chǎn)量明顯較高。所以在此4項(xiàng)參數(shù)中,相比Clocom法,本文方法自動(dòng)生成的代碼注釋產(chǎn)量更多。
不同自動(dòng)生成方法下的源代碼注釋質(zhì)量比較分析結(jié)果具體如表5所示。
表5 質(zhì)量比較分析結(jié)果
由表5可知,就每款軟件而言,相比Clocom 法,本文方法自動(dòng)生成的代碼注釋質(zhì)量都明顯較高,大體都提高了約5%,其中4 款軟件自動(dòng)生成的良好代碼注釋占據(jù)比重都相對較大,說明代碼注釋質(zhì)量較好??傊?,相比Clocom 法,本文方法下計(jì)算機(jī)挖掘軟件自動(dòng)生成的代碼注釋產(chǎn)量與質(zhì)量都顯著較高[7-9]。
綜上所述,針對計(jì)算機(jī)挖掘軟件源代碼注釋量少質(zhì)低等,造成的軟件可讀性與可維護(hù)性偏低問題,本文面向挖掘軟件設(shè)計(jì)了源代碼注釋自動(dòng)生成方法,以提升代碼注釋數(shù)量與質(zhì)量,以助于程序員讀取與理解代碼。利用Nicad 檢測源軟件與目標(biāo)軟件的克隆代碼,基于XML 文件提取克隆代碼,并依據(jù)行號(hào)進(jìn)行代碼注釋提取與精簡,同時(shí)映射匹配,以此自動(dòng)生成代碼注釋。最后對本文設(shè)計(jì)方法與Clocom 法進(jìn)行了實(shí)驗(yàn)對比分析,結(jié)果表明,相比Clocom 法,本文方法所檢測出的克隆代碼類型更多,且在5款軟件中,共生成了80條代碼注釋,多生成了8條,產(chǎn)量明顯較高;相比Clocom法,就每款軟件而言,本文方法自動(dòng)生成的代碼注釋質(zhì)量都明顯較高,大體都提高了約5%,其中4 款軟件自動(dòng)生成的良好代碼注釋占據(jù)比重都相對較大,說明代碼注釋質(zhì)量較好,總之,本文方法下計(jì)算機(jī)挖掘軟件自動(dòng)生成的代碼注釋產(chǎn)量與質(zhì)量都顯著較高。
自動(dòng)化技術(shù)與應(yīng)用2022年1期