慕江林,劉克劍*,林 晗
(1.西華大學計算機與軟件工程學院, 四川 成都 610039;2.成都理工大學管理科學學院, 四川 成都 610059)
軟件開發者基于Github、SourceForge等開源代碼倉庫上的可復用的基礎軟件包再次開發,可降低開發的時間和成本。開發者如果使用某些未在接口的使用方法中聲明的方法,需要在代碼搜索引擎搜索相關代碼片段。如何有效地幫助開發者從代碼庫中搜索與任務相關的代碼,成為代碼搜索[1-3]的研究方向之一。
用戶將少量關鍵詞輸入到代碼搜索引擎中,搜索引擎搜索相關代碼片段按照與關鍵詞的匹配度返回給用戶。基于開發者的開發經驗,搜索的關鍵詞為 “iterate a java hashmap”,搜索引擎應該返回java有關于hashmap迭代的示例,如圖1所示。

已有的代碼搜索引擎,如Ohlh Code[4]、 Krugle[5]等,將用戶輸入關鍵詞當作純文本,通過關鍵詞檢索類似的代碼片段。使用該方法搜索到的結果中只包含單一的關鍵詞,搜索結果與用戶期望相差較大。
近期的一些代碼搜索方法開始對代碼結構和代碼語義分析。PARSEWeb將代碼抽象為方法調用序列,對方法調用序列聚類排序,查找相似使用模式的代碼片段[6],是一種基于結構的代碼搜索,準確率不高。PRIME將代碼片段作為輸入,從結構上對代碼片段進行分析,尋找代碼片段的相似之處[7],它忽略了代碼語義,在搜索結果上表現不佳。SWIM算法通過詞袋模型將自然語言查詢語句翻譯成API,再通過API生成代碼片段[8]。雖然該方法有效地利用了查詢的語義,但是基于詞袋模型的語義匹配結果不太理想,基于API生成的代碼片段,考慮了代碼結構特性,忽略了代碼之間的語言特性。……