《電子技術(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)確地尋找到用戶(hù)所需的代碼成為一個(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)確地尋找到用戶(hù)所需的代碼成為一個(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ā)布的軟件,以保障用戶(hù)自由使用軟件及接觸源代碼的權(quán)利,同時(shí)也保障了用戶(hù)自行修改、復(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é)者望而卻步。

  (2)有助于初學(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ì)讓用戶(hù)使用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è)不可避免的因素就是用戶(hù)是否愿意為其付費(fèi)。隨著開(kāi)源軟件的質(zhì)量的提高,用戶(hù)更愿意使用一個(gè)安全的、高質(zhì)量的、便宜的開(kāi)源軟件。

 ?。?)開(kāi)源社區(qū)積攢了大量的人群。在開(kāi)源代管平臺(tái)上發(fā)布項(xiàng)目會(huì)發(fā)布得更快,軟件發(fā)布后很快就會(huì)被各種用戶(hù)使用、轉(zhuǎn)載,形成了一個(gè)無(wú)形的軟件“供需超市”。開(kāi)源社區(qū)內(nèi)不同背景、不同專(zhuān)長(zhǎng)的人匯集成一股集體的力量,對(duì)于開(kāi)源項(xiàng)目的推廣起到了重要的作用。正如圖1所示,開(kāi)發(fā)者和用戶(hù)通過(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è)性化定制是用戶(hù)介入產(chǎn)品的生產(chǎn)過(guò)程,將指定的圖案和文字印刷到指定的產(chǎn)品上,用戶(hù)獲得自己定制的個(gè)人屬性強(qiáng)烈的商品。

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

  以往,軟件給人的思想是“給你什么你就有什么”,大多數(shù)專(zhuān)有軟件公司根據(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)放性,使得用戶(hù)和第三方評(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]。在布爾搜索中,用戶(hù)的查詢(xún)要求用普通的語(yǔ)言敘述,即用戶(hù)可完全按照自己的思維習(xí)慣提問(wèn)。其中的查詢(xún)要求(條件)A、B…可以分別用若干個(gè)標(biāo)引詞來(lái)表示,接著可以用布爾邏輯算符“∨”、“∧”、“?劭”將用戶(hù)的提問(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)于查詢(xún)q的檢出文獻(xiàn),則:

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

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

  (3)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)算回答用戶(hù)提問(wèn)的。

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

  2.1.2 基于代碼段的搜索

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

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

  源代碼即時(shí)錄入即時(shí)搜索技術(shù)旨在即時(shí)找到與用戶(hù)輸入代碼片段類(lèi)似或者相同的代碼段,并將其實(shí)時(shí)返回給用戶(hù),以幫助用戶(hù)學(xué)習(xí)參考或者復(fù)用。源代碼即時(shí)錄入即時(shí)搜索技術(shù)并非是一種新的代碼搜索技術(shù),它根據(jù)用戶(hù)在編輯器中實(shí)時(shí)輸入的結(jié)果,來(lái)搜索和當(dāng)前用戶(hù)輸入的代碼類(lèi)似的代碼片段返回給用戶(hù),輔助用戶(hù)進(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ù)用戶(hù)的查詢(xún)輸入,生成所需的程序結(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)的代碼與用戶(hù)所需的程序結(jié)構(gòu)相似,將其返回給用戶(hù)。

  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è)基本塊。利用從用戶(hù)輸入得到的信息,系統(tǒng)生成一個(gè)控制流圖,如果兩個(gè)控制流圖是同構(gòu)的,則可以認(rèn)為該控制流圖對(duì)應(yīng)的代碼即為用戶(hù)要搜索的結(jié)果[8]。例如圖3(a)中的代碼可以生成圖3(b)所示的控制流圖。

003.jpg

  但是在利用控制流圖的搜索方法中,用戶(hù)需要輸入一個(gè)控制流圖,這無(wú)疑加重了用戶(hù)的使用負(fù)擔(dān),如何根據(jù)用戶(hù)簡(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)了基于需求的搜索方法。該方法搜索的輸入比較繁雜,需要用戶(hù)給出各個(gè)過(guò)程的實(shí)現(xiàn)方法,使用起來(lái)會(huì)比較復(fù)雜。

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

  基于測(cè)試的源代碼搜索(TDCS)[11]是以測(cè)試用例作為用戶(hù)搜索的輸入來(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)造出用戶(hù)的查詢(xún)輸入,根據(jù)該查詢(xún)輸入在開(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ú)立于用戶(hù)查詢(xún)的情況下進(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)生了各種其他的代碼搜索方法,希望更快更好地幫助用戶(hù)找到高質(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)載。