由于软件系统规模越来越大,因此开发者往往采用成熟的框架、软件库来进行开发,以提高软件开发的效率和质量。然而,即使是有经验的程序员要想学习并记住不断增长的、大量的API也是很困难的。研究者提出了许多新技术应用于代码帮助系统来帮助开发者熟悉和使用这些API。但是,目前许多主流代码帮助系统都存在一定缺陷。比如,一部分研究者认为大多数的软件是“自然”的,并用自然语言处理中的方法进行API元素的推荐。自然语言处理模型具有高效的特点,但是该方法无法利用代码中的结构化信息。为了利用结构化信息,另一部分研究者提出了一种基于图模型的方法。基于图模型的方法准确度高,但是图的存储占据较大空间,且由于需要进行图匹配,该方法的时间效率低。为了结合自然语言处理模型和基于图模型方法的优势,本文考虑将程序的结构信息转化为序列。由于程序的控制流图中记录了程序的部分结构信息,通过提取控制流图中局部结构里全部的API方法调用序列,可以将程序控制流图中的局部结构信息(如分支、循环等)以序列的形式表示出来。然后,就可以将方法调用序列类比于自然语言处理中的语句,利用统计语言模型进行训练、预测。基于以上分析,本文提出了基于程序控制流图的N元模型,即Pro-N-gram模型,并实现了 Eclipse插件,将模型应用于代码帮助中。首先,提出了一种利用程序控制流图生成基于程序的N元API方法序列(即Pro-N-gram)的技术。通过分情况分析控制语句结构构建了语句级控制流图,并利用解析复杂调用来根据语句级控制流图生成方法级控制流图,然后利用PPA(Partial Program Analysis)工具解析方法的全限定名并替换控制流图中的节点内容。接着,通过在控制流图中进行广度优先遍历查找所有基于方法的N元序列Pro-N-gram,并进行计数统计。最后,针对控制流图和自然语言的差异,我们采取重计算保证Pro-N-gram模型与自然语言模型的一致性,并提出多上下文的情况下预测空缺方法的Pro-N-gram代码帮助模型。本文的主要创新性及贡献点在于:(一)使用PPA解析方法全限定名,从而消除了不同类中存在同名方法带来的方法名歧义,同时防止了方法名词典过大。(二)提出一种静态分析方法,用于生成方法级控制流图。并利用广度优先遍历提取基于API方法的N元序列,这些序列记录了所有可能的方法执行顺序,并能编码控制流图中的局部结构信息。(三)将语言模型与程序控制流图结合。利用上述构造的基于方法的N元序列,并结合N-gram语言模型,提出可以根据多上下文预测空缺方法的Pro-N-gram代码帮助模型。
暂无评论