《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信與網(wǎng)絡(luò) > 設(shè)計(jì)應(yīng)用 > 開(kāi)源對(duì)軟件工程的作用及關(guān)鍵搜索技術(shù)分析
開(kāi)源對(duì)軟件工程的作用及關(guān)鍵搜索技術(shù)分析
2015年微型機(jī)與應(yīng)用第24期
張 康1,曾國(guó)蓀2
(1.同濟(jì)大學(xué) 計(jì)算機(jī)科學(xué)及技術(shù)系,,上海 201804,; 2.國(guó)家高性能計(jì)算機(jī)工程技術(shù)中心同濟(jì)分中心,上海 201804)
摘要: 隨著網(wǎng)絡(luò)技術(shù)的迅速發(fā)展,,開(kāi)源軟件正以前所未有的優(yōu)勢(shì)得以迅速發(fā)展?,F(xiàn)在的開(kāi)源軟件已經(jīng)成為軟件發(fā)展的主要流行趨勢(shì)。開(kāi)源軟件的成功對(duì)軟件產(chǎn)業(yè)起到了巨大的作用,。同時(shí),,由于目前開(kāi)源軟件數(shù)量急劇增加,迅速準(zhǔn)確地尋找到用戶所需的代碼成為一個(gè)關(guān)鍵問(wèn)題?,F(xiàn)有的代碼搜索引擎大都是基于文本的搜索,,并未利用語(yǔ)法、語(yǔ)義信息,,在搜索準(zhǔn)確性方面受到極大限制,。因此,有學(xué)者提出利用代碼的語(yǔ)法和語(yǔ)義等信息輔助代碼搜索。從多個(gè)方面對(duì)開(kāi)源的作用做一個(gè)較全面的介紹,,并對(duì)開(kāi)源代碼的關(guān)鍵搜索技術(shù)做一個(gè)簡(jiǎn)要綜述,。
Abstract:
Key words :

  摘  要: 隨著網(wǎng)絡(luò)技術(shù)的迅速發(fā)展,開(kāi)源軟件正以前所未有的優(yōu)勢(shì)得以迅速發(fā)展?,F(xiàn)在的開(kāi)源軟件已經(jīng)成為軟件發(fā)展的主要流行趨勢(shì),。開(kāi)源軟件的成功對(duì)軟件產(chǎn)業(yè)起到了巨大的作用。同時(shí),,由于目前開(kāi)源軟件數(shù)量急劇增加,迅速準(zhǔn)確地尋找到用戶所需的代碼成為一個(gè)關(guān)鍵問(wèn)題?,F(xiàn)有的代碼搜索引擎大都是基于文本的搜索,,并未利用語(yǔ)法、語(yǔ)義信息,,在搜索準(zhǔn)確性方面受到極大限制,。因此,有學(xué)者提出利用代碼的語(yǔ)法和語(yǔ)義等信息輔助代碼搜索,。從多個(gè)方面對(duì)開(kāi)源的作用做一個(gè)較全面的介紹,,并對(duì)開(kāi)源代碼的關(guān)鍵搜索技術(shù)做一個(gè)簡(jiǎn)要綜述。

  關(guān)鍵詞: 開(kāi)源,;復(fù)用,;搜索;關(guān)鍵詞,;語(yǔ)法,;語(yǔ)義

0 引言

  隨著網(wǎng)絡(luò)時(shí)代的來(lái)臨和開(kāi)源運(yùn)動(dòng)的發(fā)展,軟件的開(kāi)發(fā)模式,、運(yùn)行環(huán)境和提供方式都發(fā)生了巨大改變,。興起于20世紀(jì)90年代的開(kāi)源軟件取得了巨大成功,其開(kāi)發(fā)活動(dòng)具有開(kāi)放分享,、頻繁發(fā)布等特點(diǎn),,能夠有效匯聚軟件各利益相關(guān)方的創(chuàng)意和貢獻(xiàn),其自由松散的表象下隱藏著重要的軟件工程新理論,,對(duì)軟件產(chǎn)業(yè)的發(fā)展和格局產(chǎn)生了深遠(yuǎn)的影響,。目前,開(kāi)源軟件有著良好的發(fā)展態(tài)勢(shì),。開(kāi)源文化是人類(lèi)幾千年的智慧結(jié)晶,,是一種必然的歷史趨勢(shì),這種發(fā)展趨勢(shì)是誰(shuí)也阻擋不了的,。

  開(kāi)源軟件[1]就是在開(kāi)發(fā)源代碼許可證的規(guī)范下發(fā)布的軟件,,以保障用戶自由使用軟件及接觸源代碼的權(quán)利,同時(shí)也保障了用戶自行修改、復(fù)制以及再分發(fā)的權(quán)利,。開(kāi)源軟件的數(shù)量目前正在不斷大量增長(zhǎng),,大量開(kāi)源軟件的出現(xiàn),對(duì)軟件工程的實(shí)施起到巨大作用,,本文以開(kāi)源對(duì)軟件工程的作用和關(guān)鍵技術(shù)為研究點(diǎn),,主要分析開(kāi)源對(duì)當(dāng)前軟件工程的作用和針對(duì)開(kāi)源代碼的關(guān)鍵搜索技術(shù)。

1 開(kāi)源對(duì)軟件工程的作用

  1.1 基于開(kāi)源庫(kù)的瀏覽學(xué)習(xí)

  數(shù)量巨大的開(kāi)源庫(kù)對(duì)于程序員來(lái)說(shuō)是一座巨大的寶藏,,源代碼融合了作者數(shù)十年的方法,、經(jīng)驗(yàn)和教訓(xùn),對(duì)于初學(xué)者來(lái)說(shuō)不可多得的學(xué)習(xí)資源,。

  對(duì)于初學(xué)者來(lái)說(shuō),,開(kāi)源主要有以下兩個(gè)方面作用:

  (1)有助于從理論到實(shí)踐的平滑過(guò)渡,。從理論到實(shí)踐是一個(gè)痛苦的過(guò)程,,正是因?yàn)檫@種痛苦讓很多初學(xué)者望而卻步。

 ?。?)有助于初學(xué)者了解技術(shù)潮流,。開(kāi)源項(xiàng)目往往沒(méi)有遺留系統(tǒng)的負(fù)擔(dān),比較有利于新技術(shù)和新想法的實(shí)現(xiàn),。初學(xué)者通過(guò)閱讀源碼可以緊跟這些新技術(shù)和新想法,。

  1.2 開(kāi)源有助于了解API使用方法

  在現(xiàn)代軟件行業(yè)中,越來(lái)越多的程序員依靠API庫(kù)來(lái)完成他們?nèi)粘5拈_(kāi)發(fā)任務(wù),。HOFFLNANN R[2]等人的研究指出,,程序員在軟件開(kāi)發(fā)的過(guò)程中經(jīng)常需要調(diào)用到其他庫(kù)里的API。對(duì)于一個(gè)簡(jiǎn)單的API來(lái)說(shuō),,通過(guò)一個(gè)使用例子,,可以更加直觀地看到使用方法,這會(huì)讓用戶使用API變得更加快捷方便,,省下了閱讀API文檔的過(guò)程,,提高了開(kāi)發(fā)效率。

  通過(guò)示例代碼學(xué)習(xí)具體API的使用方法是開(kāi)發(fā)人員進(jìn)行軟件復(fù)用的高效手段,。例如,,Java程序員要使用排序函數(shù)sort,通常需要打開(kāi)文檔,,找到sort函數(shù),,然后仔細(xì)查看文檔。這里使用開(kāi)源代碼的搜索引擎krugle,,在開(kāi)源代碼庫(kù)里輸入關(guān)鍵字“sort”,,通過(guò)對(duì)照著搜索結(jié)果中調(diào)用API的方法使用該API,,就會(huì)省下很多時(shí)間,提高開(kāi)發(fā)效率,。

  1.3 開(kāi)源有利于代碼精確復(fù)用

  代碼復(fù)用可以說(shuō)是任何一個(gè)軟件企業(yè)都不能漠視的課題,,因?yàn)閺?fù)用已有的代碼意味著開(kāi)發(fā)人員可以節(jié)省許多對(duì)代碼進(jìn)行測(cè)試和提升代碼質(zhì)量的時(shí)間。在軟件開(kāi)發(fā)中,,軟件的每個(gè)部分幾乎都包括可復(fù)用的代碼塊,。隨著開(kāi)源的流行,開(kāi)源代碼庫(kù)的數(shù)量的日益龐大,,開(kāi)源代碼的數(shù)量可以說(shuō)是不計(jì)其數(shù),。如此龐大基數(shù)的代碼幾乎包含了各個(gè)方面的代碼??梢哉f(shuō)很多程序員正在寫(xiě)或者將要寫(xiě)的代碼都是代碼庫(kù)里已有的代碼,,這就浪費(fèi)了大量的人力、物力,。因此,,開(kāi)源就是使得任何所需要的代碼幾乎可以復(fù)用,。

  1.4 開(kāi)源有助于軟件的推廣

  十年前,,開(kāi)源支持者在試圖推廣免費(fèi)軟件時(shí)陷入了困戰(zhàn),推廣實(shí)施的障礙包括軟件質(zhì)量,、安全保障,、后期支持等。然而十年后,,開(kāi)源模式已經(jīng)被大眾接受,,相當(dāng)一部分公司在使用開(kāi)源軟件,開(kāi)源甚至更加有助于軟件的推廣[3],。開(kāi)源已經(jīng)走過(guò)了從忽視到嘲笑到打擊到被大家接受的過(guò)程[4],,究其原因,可以從以下三點(diǎn)來(lái)說(shuō)明:

 ?。?)注重安全的人更加傾向于開(kāi)源軟件,。開(kāi)源可以讓大家更加清楚軟件背后到底在做哪些不為人知的事,會(huì)讓使用開(kāi)源軟件的人更加放心,。

 ?。?)節(jié)約成本的人更加傾向于開(kāi)源軟件。在使用軟件時(shí)一個(gè)不可避免的因素就是用戶是否愿意為其付費(fèi),。隨著開(kāi)源軟件的質(zhì)量的提高,,用戶更愿意使用一個(gè)安全的、高質(zhì)量的,、便宜的開(kāi)源軟件,。

 ?。?)開(kāi)源社區(qū)積攢了大量的人群。在開(kāi)源代管平臺(tái)上發(fā)布項(xiàng)目會(huì)發(fā)布得更快,,軟件發(fā)布后很快就會(huì)被各種用戶使用,、轉(zhuǎn)載,形成了一個(gè)無(wú)形的軟件“供需超市”,。開(kāi)源社區(qū)內(nèi)不同背景,、不同專長(zhǎng)的人匯集成一股集體的力量,對(duì)于開(kāi)源項(xiàng)目的推廣起到了重要的作用,。正如圖1所示,,開(kāi)發(fā)者和用戶通過(guò)社區(qū)學(xué)習(xí)知識(shí)、提升能力,、提升知名度,、擴(kuò)展人際圈子,企業(yè)通過(guò)社區(qū)可以提高企業(yè)知名度,、找到合適的人才,、推廣技術(shù)和產(chǎn)品、降低成本等,,社區(qū)在開(kāi)源項(xiàng)目的推廣中起到了重要的作用,。

001.jpg

  1.5 開(kāi)源有助于軟件的個(gè)性化定制

  開(kāi)源軟件能夠迅速推廣得益于個(gè)性化定制。個(gè)性化定制是用戶介入產(chǎn)品的生產(chǎn)過(guò)程,,將指定的圖案和文字印刷到指定的產(chǎn)品上,,用戶獲得自己定制的個(gè)人屬性強(qiáng)烈的商品。

  由于開(kāi)源的關(guān)系,,軟件也可以個(gè)性化定制,。開(kāi)源意味著任何人都可以去下載修改開(kāi)源軟件的源碼,制作出屬于自己的專屬軟件版本,,而且可以將自己的個(gè)性化軟件進(jìn)行傳播,。

  以往,軟件給人的思想是“給你什么你就有什么”,,大多數(shù)專有軟件公司根據(jù)投資回報(bào)比來(lái)投資軟件,,一些個(gè)性化的需求往往得不到他們的重視。然而,,開(kāi)源流行開(kāi)后,,個(gè)人或者企業(yè)可以添加自己想要的功能,這種個(gè)性化的定制往往使得開(kāi)源能夠更好地服務(wù)于個(gè)人或者企業(yè),。

  1.6 開(kāi)源有助于軟件質(zhì)量的分析

  軟件質(zhì)量是軟件產(chǎn)品的靈魂,。關(guān)于開(kāi)源和閉源的軟件質(zhì)量的討論一直沒(méi)有停止過(guò)。閉源,,相對(duì)來(lái)說(shuō),,表面上是安全的,,因?yàn)樗拇a是不公開(kāi)的,沒(méi)有高水平編程能力很難去破解,,但它的缺點(diǎn)是本身因開(kāi)發(fā)人員思路的局限性會(huì)有很多漏洞,,而自己又不知道,這就給了黑客作惡以可乘之機(jī),。

  開(kāi)源軟件由于源碼的開(kāi)放性,,使得用戶和第三方評(píng)測(cè)者能夠直接通過(guò)代碼的分析了解軟件的內(nèi)部質(zhì)量情況,是一種直觀,、精確的評(píng)測(cè)方式,。此外,開(kāi)源軟件能集中群體的力量做到及時(shí)發(fā)現(xiàn)漏洞修補(bǔ)漏洞,,可以集思廣益發(fā)揮群智群力的作用,,讓開(kāi)源軟件迅速完善起來(lái)。

2 源代碼搜索的關(guān)鍵技術(shù)分析

  2.1 基于字符串匹配的搜索技術(shù)

  2.1.1 基于關(guān)鍵詞的搜索

  對(duì)源代碼搜索而言,,目前絕大多數(shù)的解決方案都可歸類(lèi)為兩種:一是借助于開(kāi)源代碼搜索工具或平臺(tái)如Github或者Sourceforge等,;二是借助于通用搜索引擎。兩者都是基于關(guān)鍵詞的搜索,。

  在基于關(guān)鍵詞的搜索中,,主要采用了布爾搜索模型的搜索策略[5]。在布爾搜索中,,用戶的查詢要求用普通的語(yǔ)言敘述,,即用戶可完全按照自己的思維習(xí)慣提問(wèn),。其中的查詢要求(條件)A,、B…可以分別用若干個(gè)標(biāo)引詞來(lái)表示,接著可以用布爾邏輯算符“∨”,、“∧”,、“?劭”將用戶的提問(wèn)“翻譯”成系統(tǒng)可以接受的形式。

  一般用tk表示標(biāo)引詞序列,,dkn表示與tk有關(guān)的文獻(xiàn),,則tk*={dk1,dk2,,…,,dkn}就可以用來(lái)表示與標(biāo)引詞tk有關(guān)的文獻(xiàn)全體組成的集合。令Χ(q)表示關(guān)于查詢q的檢出文獻(xiàn),,則:

 ?。?)q=t,Χ(q)=t*

 ?。?)q=?劭t,,Χ(q)=t*=Dt*

 ?。?)q=t1∨t2,Χ(q)=t1*∪t2*

 ?。?)q=t1∧t2,,Χ(q)=t1*∩t2*

  很明顯,布爾邏輯運(yùn)算實(shí)際上就是集合之間的并,、交,、補(bǔ)運(yùn)算,也就是說(shuō),,布爾邏輯檢索系統(tǒng)實(shí)際上是通過(guò)對(duì)若干個(gè)代碼文件集合(代碼文件集D或D的子集)的并,、交、補(bǔ)運(yùn)算回答用戶提問(wèn)的,。

  然而,,這種方法局限性較大,不能充分利用代碼在語(yǔ)法結(jié)構(gòu),、語(yǔ)義等方面的特性,,也無(wú)法保證查詢到的代碼與用戶查詢相關(guān)。

  2.1.2 基于代碼段的搜索

  盡管基于關(guān)鍵詞的搜索也在一定程度上幫助程序員復(fù)用源代碼,,但是它還是會(huì)返回給用戶數(shù)量巨大的搜索結(jié)果,,其中包括了很多用戶并不需要的結(jié)果。這是由于基于關(guān)鍵詞的搜索并未區(qū)分搜索的粒度,,比如文件,、類(lèi)或者是函數(shù),而僅僅是將匹配到的所有結(jié)果返回給用戶,。因此,,代碼搜索技術(shù)需要根據(jù)用戶需要返回不同粒度的結(jié)果?;谝褟?fù)用代碼的搜索技術(shù)[6]就是返回在過(guò)去曾經(jīng)復(fù)用過(guò)的代碼片段,,可以根據(jù)用戶需求返回粒度較小的函數(shù)或者代碼段。

  在基于已復(fù)用代碼的搜索技術(shù)中,,可以認(rèn)為,,過(guò)去復(fù)用過(guò)的代碼很有可能會(huì)在將來(lái)再次被復(fù)用,因此返回給用戶的結(jié)果是在過(guò)去被復(fù)用過(guò)的代碼片段,。該方法主要包括了代碼分析部分和代碼搜索部分,。代碼分析部分探測(cè)將要被返回給用戶的重復(fù)代碼片段集合。代碼搜索部分返回給用戶的是與他們輸入相關(guān)的重復(fù)代碼片段,。利用基于代碼段的搜索方法可以搜索得到更小的粒度,,而不僅僅是代碼文件,滿足用戶對(duì)于搜索代碼段的需求,。

  2.1.3 源代碼及時(shí)錄入及時(shí)搜索參考技術(shù)

  據(jù)調(diào)查表明,,現(xiàn)代軟件開(kāi)發(fā)過(guò)程,,開(kāi)發(fā)人員大約有19%的工作是在搜索代碼。開(kāi)發(fā)人員經(jīng)常需要參考Web上的代碼搜索結(jié)果來(lái)學(xué)習(xí)新技術(shù)或者輔助開(kāi)發(fā)工作[7],。通常情況下,,開(kāi)發(fā)人員需要從IDE或者代碼編輯器切換到瀏覽器,在某個(gè)代碼搜索網(wǎng)站例如github上搜索,,搜索結(jié)果會(huì)出現(xiàn)很多結(jié)果,,每個(gè)結(jié)果對(duì)應(yīng)著一個(gè)鏈接,開(kāi)發(fā)人員不得不一一打開(kāi)鏈接查看結(jié)果是否滿足需求,,十分影響程序員的開(kāi)發(fā)效率,。因此,源代碼實(shí)時(shí)錄入,、實(shí)時(shí)搜索技術(shù)能夠幫助用戶改善這種狀況,。

  源代碼即時(shí)錄入即時(shí)搜索技術(shù)旨在即時(shí)找到與用戶輸入代碼片段類(lèi)似或者相同的代碼段,并將其實(shí)時(shí)返回給用戶,,以幫助用戶學(xué)習(xí)參考或者復(fù)用,。源代碼即時(shí)錄入即時(shí)搜索技術(shù)并非是一種新的代碼搜索技術(shù),它根據(jù)用戶在編輯器中實(shí)時(shí)輸入的結(jié)果,,來(lái)搜索和當(dāng)前用戶輸入的代碼類(lèi)似的代碼片段返回給用戶,,輔助用戶進(jìn)行開(kāi)發(fā)。

  2.2 基于語(yǔ)法的源代碼搜索技術(shù)

  2.2.1 利用程序結(jié)構(gòu)的搜索方法

  與網(wǎng)頁(yè)文件搜索相比,,代碼文件有著自己的特點(diǎn),,而在傳統(tǒng)代碼搜索中還只是利用關(guān)鍵字進(jìn)行搜索,忽略代碼本身的特性,,因此,,有研究人員提出了基于程序結(jié)構(gòu)的源代碼搜索。

  在結(jié)構(gòu)化程序設(shè)計(jì)方法中,,任何程序都可以用三種基本結(jié)構(gòu)(順序結(jié)構(gòu),、分支結(jié)構(gòu),、循環(huán)結(jié)構(gòu),,如圖2所示)來(lái)表示,可以利用其程序結(jié)構(gòu)輔助搜索,。

002.jpg

  一方面,,根據(jù)用戶的查詢輸入,生成所需的程序結(jié)構(gòu)的特征向量,,這些結(jié)構(gòu)特征包括:順序結(jié)構(gòu)數(shù),、分支結(jié)構(gòu)數(shù)、循環(huán)結(jié)構(gòu)數(shù)等,。另一方面,,分析出開(kāi)源庫(kù)中的源代碼文件,,得到程序結(jié)構(gòu)的特征向量,并建立數(shù)據(jù)庫(kù),。若兩個(gè)向量的相似度達(dá)到一定值,,則說(shuō)明該向量對(duì)應(yīng)的代碼與用戶所需的程序結(jié)構(gòu)相似,將其返回給用戶,。

  2.2.2 利用控制流圖的搜索方法

  隨后又有研究人員提出利用控制流圖輔助搜索,。在結(jié)構(gòu)化程序設(shè)計(jì)方法中,程序是一系列過(guò)程的集合,,而控制流圖是表示一個(gè)過(guò)程內(nèi)所有基本快執(zhí)行的可能流向和每個(gè)基本塊所對(duì)應(yīng)的語(yǔ)句表,,能反映一個(gè)過(guò)程的實(shí)時(shí)執(zhí)行過(guò)程。因此,,利用控制流圖來(lái)輔助搜索可以幫助提高精確度,。

  在該搜索方法中,每個(gè)源代碼由一個(gè)控制流圖來(lái)表達(dá),,每一個(gè)節(jié)點(diǎn)表示一個(gè)基本塊,。利用從用戶輸入得到的信息,系統(tǒng)生成一個(gè)控制流圖,,如果兩個(gè)控制流圖是同構(gòu)的,,則可以認(rèn)為該控制流圖對(duì)應(yīng)的代碼即為用戶要搜索的結(jié)果[8]。例如圖3(a)中的代碼可以生成圖3(b)所示的控制流圖,。

003.jpg

  但是在利用控制流圖的搜索方法中,,用戶需要輸入一個(gè)控制流圖,這無(wú)疑加重了用戶的使用負(fù)擔(dān),,如何根據(jù)用戶簡(jiǎn)單的輸入自動(dòng)生成控制流圖值得研究,。

  2.2.3 利用程序語(yǔ)法樹(shù)的搜索方法

  在2.2.1中,利用程序結(jié)構(gòu)進(jìn)行代碼搜索,,然而Sourcerer[9]等搜索引擎比較簡(jiǎn)單粗糙地利用程序結(jié)構(gòu)信息(比如if語(yǔ)句的個(gè)數(shù),、for循環(huán)結(jié)構(gòu)的個(gè)數(shù)等)能使搜索結(jié)果精確一些,但是并沒(méi)有深入全面地利用語(yǔ)法信息來(lái)輔助代碼搜索,,而本文可以利用程序語(yǔ)法樹(shù)來(lái)輔助代碼搜索,。

  語(yǔ)法樹(shù)是程序代碼的樹(shù)狀表示,它是形式化,、規(guī)范化的程序語(yǔ)義表示,,是程序設(shè)計(jì)者思想的形式化表示。語(yǔ)法樹(shù)是程序的編譯或者解釋過(guò)程中的一個(gè)中間數(shù)據(jù)結(jié)構(gòu),,處于源代碼和中間語(yǔ)言代碼之間,。源代碼太具體,中間語(yǔ)言代碼又過(guò)于抽象,而語(yǔ)法樹(shù)介于兩者之間,,能夠形象地抽象出程序的結(jié)構(gòu)信息,,為代碼的搜索提供更加準(zhǔn)確、全面的信息,。例如如下代碼:

  if(x==2){

  x=a+b,;

  }

  這段代碼的語(yǔ)法樹(shù)如圖4所示。

004.jpg

  黃麗韶等人[10]在Sourcerer的經(jīng)驗(yàn)上進(jìn)行了基于程序語(yǔ)法樹(shù)的源代碼搜索的研究,,從語(yǔ)法結(jié)構(gòu)角度提出一種源代碼的搜索方法,,構(gòu)造基于語(yǔ)法結(jié)構(gòu)的代碼過(guò)濾器,通過(guò)遍歷抽象語(yǔ)法樹(shù)來(lái)抽取源代碼的信息建立索引,。

  2.3 基于語(yǔ)義的源代碼搜索技術(shù)

  2.3.1利用功能需求的源代碼搜索方法

  1998年夏威夷大學(xué)的Woods等人提出了基于需求的代碼搜索方法,,通過(guò)建立代碼的抽象數(shù)據(jù)描述來(lái)建立索引,之后通過(guò)一種需求描述(Plan)語(yǔ)言來(lái)描述軟件的功能需求,。通過(guò)需求描述語(yǔ)言對(duì)功能需求的詳細(xì)描述,,可以全面地得到各個(gè)功能的具體實(shí)現(xiàn)方式,代碼搜索引擎將該需求描述和代碼庫(kù)中的抽象數(shù)據(jù)描述進(jìn)行匹配,,得到匹配后的代碼,,通過(guò)一定的排序和過(guò)濾方式,實(shí)現(xiàn)了基于需求的搜索方法,。該方法搜索的輸入比較繁雜,,需要用戶給出各個(gè)過(guò)程的實(shí)現(xiàn)方法,使用起來(lái)會(huì)比較復(fù)雜,。

  2.3.2 基于測(cè)試的源代碼搜索方法

  基于測(cè)試的源代碼搜索(TDCS)[11]是以測(cè)試用例作為用戶搜索的輸入來(lái)進(jìn)行搜索的一種源代碼搜索方法,。由于測(cè)試用例可以用來(lái)描述系統(tǒng)中缺失的特征,因此測(cè)試用例對(duì)于代碼搜索來(lái)說(shuō)能夠提供更多的語(yǔ)義信息,,也會(huì)讓代碼搜索結(jié)果更加準(zhǔn)確,。

  TDCS確保測(cè)試用例描述了要被搜索的代碼的特征。在TDCS中,,測(cè)試用例被設(shè)計(jì)用來(lái)描述系統(tǒng)中缺失的特征,。開(kāi)發(fā)人員通過(guò)測(cè)試用例來(lái)搜索結(jié)果,該方法會(huì)根據(jù)測(cè)試用例來(lái)構(gòu)造出用戶的查詢輸入,,根據(jù)該查詢輸入在開(kāi)源庫(kù)中進(jìn)行搜索,,然后,將搜索得到的結(jié)果編織進(jìn)自己的代碼中,。

  2.3.3 基于輸入輸出的源代碼搜索方法

  KATHRYN S[12]提出了一種新的代碼搜索方法,,基于輸入輸出來(lái)進(jìn)行源代碼搜索。利用該方法,,程序設(shè)計(jì)者只需編寫(xiě)輕量級(jí)的需求描述來(lái)定義輸入和期望的輸出。與現(xiàn)有的搜索不同的是,該方法利用SMT(Satisfiability Modulo Theories)求解,,對(duì)設(shè)計(jì)者提供的描述采用符號(hào)分析,,自動(dòng)轉(zhuǎn)換為匹配的約束,從而在代碼倉(cāng)庫(kù)中識(shí)別程序或程序片段,。

  整套方法的核心在于:對(duì)代碼倉(cāng)庫(kù)在獨(dú)立于用戶查詢的情況下進(jìn)行了離線的信息索引,,索引使用獨(dú)特的符號(hào)分析,將程序的語(yǔ)義和描述其行為的約束進(jìn)行映射,。

  2.4 其他源代碼搜索方法

  2.4.1 利用程序員行為輔助搜索

  程序員始終是軟件開(kāi)發(fā)活動(dòng)的主體,,無(wú)論哪種源代碼搜索方法,都離不開(kāi)程序員,,對(duì)程序員習(xí)慣進(jìn)行調(diào)查有助于改進(jìn)搜索方法和搜索體驗(yàn),。通過(guò)研究程序員習(xí)慣,然后填補(bǔ)程序員搜索活動(dòng)細(xì)節(jié),,能夠輔助源代碼搜索技術(shù),,幫助解決程序員搜索代碼面臨的困難。

  例如在沈玲等人[13]對(duì)于程序員搜索習(xí)慣的研究中發(fā)現(xiàn),,程序員一般搜索范圍都很廣,,產(chǎn)生很多不相關(guān)的結(jié)果?;谒麄兊挠^察,,如果能在返回結(jié)果中包含上下文的信息將是非常有價(jià)值的。因此,,在代碼搜索時(shí),,如果能在搜索結(jié)果中提供上下文的信息,這將能讓程序員更快地做出是否相關(guān)的判斷,。

  2.4.2 基于語(yǔ)法結(jié)構(gòu)和輸入輸出的搜索方法

  要提高代碼搜索的精度,,不僅要從代碼的表層字符串含義入手,還要挖掘代碼的功能結(jié)構(gòu)和語(yǔ)義信息,,這也是當(dāng)前代碼搜索的難點(diǎn),。通過(guò)分析語(yǔ)法樹(shù)和代碼的輸入輸出可以得到非常豐富的信息,進(jìn)而提高代碼搜索的精度,。由此產(chǎn)生了結(jié)合語(yǔ)法結(jié)構(gòu)和輸入輸出的搜索方法,。

  該方法通過(guò)分析語(yǔ)法樹(shù)得到代碼的邏輯結(jié)構(gòu)特征,通過(guò)分析源代碼的輸入和輸出信息得到程序的語(yǔ)義功能,。將語(yǔ)法與語(yǔ)義信息結(jié)合起來(lái),,可以提高搜索的精度。該方法結(jié)合了語(yǔ)法語(yǔ)義信息,,為代碼搜索方法提供了新的思路,。

3 結(jié)論

  開(kāi)源軟件正在席卷全球,根據(jù)Black Duck公司提供的數(shù)據(jù),在過(guò)去的一年中,,他們統(tǒng)計(jì)了5 000個(gè)有開(kāi)源項(xiàng)目的網(wǎng)址,,包括了1 000億源代碼行,發(fā)現(xiàn)開(kāi)源項(xiàng)目的數(shù)目已經(jīng)翻了一番,。

  傳統(tǒng)的基于關(guān)鍵字的源代碼搜索方法已經(jīng)不能滿足人們的需求,,由此產(chǎn)生了各種其他的代碼搜索方法,希望更快更好地幫助用戶找到高質(zhì)量代碼,。然而目前的源代碼搜索引擎大都是基于文本的搜索,,沒(méi)有利用代碼在語(yǔ)法、語(yǔ)義等上的特性,,在搜索準(zhǔn)確性方面受到極大的限制,。針對(duì)這些現(xiàn)有流行的源代碼搜索引擎存在的問(wèn)題已經(jīng)有越來(lái)越多的學(xué)者投入了該領(lǐng)域的研究。未來(lái)筆者也會(huì)繼續(xù)深入研究開(kāi)源的相關(guān)技術(shù),。

參考文獻(xiàn)

  [1] 徐哲,,蔡建平.基于開(kāi)源軟件的軟件工程實(shí)施系統(tǒng)研究[J].微計(jì)算機(jī)信息,2009,,25(9):178-180.

  [2] HOFFLNANN R,, FOGARTY J, WELD D S. Assieme: finding and leveraging implicit references in a web search interface for programmars In proceedings of the 20th annual AC symposium on User interface software and technology[C]. Newport,, Rhode Island,, USA, 2007:13-22.

  [3] 熊瑞萍,,萬(wàn)江平.開(kāi)源軟件的突圍之路——關(guān)于開(kāi)源運(yùn)動(dòng)的若干思考[J].科技管理研究,,2009(3):252-255.

  [4] 謝世誠(chéng).“開(kāi)源十杰”Michael Tiemann來(lái)華開(kāi)博客[J].微型機(jī)與應(yīng)用,2007,,26(11):22.

  [5] 劉紅泉,,張亮峰.布爾邏輯檢索模型的分析探討[J].現(xiàn)代情報(bào),2004(9):4-6.

  [6] ISHIHARA T,, HOTTA K,, HIGO Y, et al. Reusing reused code[J]. WCRE 2013,, Koblenz,, Germany: ERA-Track,457-461.

  [7] 陸晨.一種基于Web資源的代碼范例搜索工具[J].科技資訊,,2011(33):23-25.

  [8] BAJRACHARYA S,, NGO T, LINSTEAD E,, et al. Sourcerer: a search engine for open source code supporting structure-based search[C]. Proceedings of International Conference on Object-Oriented Programming,, 2006:25-26.

  [9] 陳新.基于程序控制流圖源代碼相似程度分析系統(tǒng)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,,2013,22(3):144-147.

  [10] 黃麗韶.基于語(yǔ)法結(jié)構(gòu)的源代碼搜索的研究[J].電腦與電信,,2013(5):30-33,,39.

  [11] LAZZARINI LEMOS O A,, CARVALHO de P A,, KONISHI G. Using thesaurus-based tag clouds to improve test-driven code search[J]. VII Brazilian Symposium on Software Components, 2013,,46(1):99-108.

  [12] STOLEE K T,, ELBAUM S, DOBOS D. Solving the search for source code[J]. ACM Transactions on Software Engineering and Methodology,,2014,,23(3):1-45.

  [13] 沈玲,黃熹,,李艷陽(yáng).程序員搜索習(xí)慣的研究及對(duì)搜索工具開(kāi)發(fā)的啟示[J].中國(guó)高新技術(shù)企業(yè),,2012(27):27-30.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載,。