基于方法约束关系的代码预测模型的构建方法技术

技术编号:19023266 阅读:26 留言:0更新日期:2018-09-26 19:01
本发明专利技术属于软件技术领域,尤其涉及基于方法约束关系的代码预测模型构建方法。基于方法约束关系的代码预测模型构建方法,包括:将面向对象代码抽象为对象涉及的方法调用语句序列集合,所述方法调用语句序列集合包括多个方法调用语句序列;所述方法调用语句序列包括一个对象涉及的所有方法调用语句;根据方法之间的约束关系,将所述方法调用语句序列的方法调用语句表示为四元特征组,根据所述四元特征组得出所述面向对象代码的代码特征词序列集合;利用N‑gram模型将所述代码特征词序列集合滑动切分为多个3‑gram序列,提取调用所述3‑gram序列,构建代码预测模型。本发明专利技术构建的方法预测模型具有较高的代码预测准确率。

【技术实现步骤摘要】
基于方法约束关系的代码预测模型的构建方法
本专利技术属于软件
,尤其涉及基于方法约束关系的代码预测模型的构建方法。
技术介绍
在软件开发过程中,开发人员需要调用大量的API,以实现软件的各种功能。但遗憾的是,开发人员通常无法掌握所有API的使用方法。当需要使用一个陌生的类时,即使是有经验的开发人员也需要花费大量的时间来学习该类以及其包含的数十种API的使用方法。为提高软件开发的效率,构建代码预测模型并实现代码推荐已成为目前代码分析领域的研究热点。之前的研究表明,编程语言具有良好的重复性。Gabel等人(GabelM,SuZ.Astudyoftheuniquenessofsourcecode[C].EighteenthACMSigsoftInternationalSymposiumonFoundationsofSoftwareEngineering.ACM,2010:147-156)观察到代码重复,并以6-40个代码元素的粒度报告语法冗余。如循环语句for(inti=0;i<n;i++)在许多源代码中频繁出现。Hindle等(HindleA,BarrET,SuZ,etal.Onthenaturalnessofsoftware[C].InternationalConferenceonSoftwareEngineering.ACM,2012:837-847)的研究表明,这种代码规律可以通过自然语言处理技术(例如,n-gram语言模型)进行捕获,并依此建立模型,实现代码预测与推荐。Raychev等(RaychevV,VechevM,YahavE.Codecompletionwithstatisticallanguagemodels[C].ACMSigplanSymposiumonProgrammingLanguageDesign&Implementation.ACM,2014:419-428)认为代码预测的核心是方法的预测,并提取源代码中的方法调用构建统计语言模型,取得了良好的预测结果。相比于自然语言,编程语言在语法结构和数据类型上有着更为严格的要求,不同的对象、方法甚至参数之间都可能存在着一定的约束关系。这些约束关系体现了语言本身的规则要求和开发人员潜在的思想逻辑。充分利用这些约束关系可以使统计语言模型突破单纯依靠自然语言中句子出现概率的局限性,使代码预测更符合开发人员的编程思维。遗憾的是,在现阶段的研究中,基于自然语言技术构建的统计模型往往缺少对这些约束关系的研究与利用,使得预测的准确率仍有提升的空间。早期的研究人员尝试通过规则匹配、代码搜索等方法完成代码预测,但是一直难以得到较高的准确率。随着计算机性能的提高以及自然语言处理技术的日益成熟,基于代码结构或者自然语言处理来构建代码预测模型以实现代码预测渐渐成为研究热点。由于大规模源代码带来的复杂性,基于规则匹配、代码搜索的方法难以捕获一些潜在的规则,预测的准确率普遍不高。基于程序结构的方法在预测准确率上取得了重大突破,但是复杂的模型必然带来昂贵的时空代价。基于自然语言处理的方法虽然在时空复杂度方面有着较大优势,但是由于没有充分利用源代码中的语法结构信息,使得准确率上仍有提升的空间。
技术实现思路
本专利技术针对现有基于自然语言的代码预测模型对代码之间语法结构关系的利用不足的问题,提出基于方法约束关系的代码预测模型的构建方法,本专利技术构建的方法预测模型具有较高的代码预测准确率。为了实现上述目的,本专利技术采用以下技术方案:基于方法约束关系的代码预测模型的构建方法,包括以下步骤:步骤1:将面向对象代码抽象为对象涉及的方法调用语句序列集合,所述方法调用语句序列集合包括多个方法调用语句序列;所述方法调用语句序列包括一个对象涉及的所有方法调用语句;步骤2:根据方法之间的约束关系,将所述方法调用语句序列的方法调用语句表示为四元特征组,根据所述四元特征组得出所述面向对象代码的代码特征词序列集合;步骤3:利用N-gram模型将所述代码特征词序列集合滑动切分为多个3-gram序列,提取调用所述3-gram序列,构建代码预测模型。进一步地,所述步骤1包括:步骤1.1:将面向对象代码中的方法调用语句根据对象的不同进行分类,方法调用语句之间的相互顺序保持不变,对于包含多个对象的方法调用语句复制多份,放入每个对象中,Code={Object1,Object2,…,Objectn},Object=Method1·Method2…Methodn其中Objectn表示第n个对象涉及到的所有方法调用语句,即第n个对象涉及到的方法调用语句序列;Methodn表示同一个方法调用语句序列中的第n个方法调用语句;源代码被转化为若干个对象涉及的方法调用语句序列集合;步骤1.2:对面向对象代码中的别名现象和代码结构进行分析,并根据分析结果调整所述步骤1.1中所述方法调用语句序列集合,包括:对指向同一地址的不同别名进行归并,视为同一对象;对于条件选择结构,将Objectn根据条件的不同分成若干个相互独立的、不含有条件选择结构的子序列;对于循环结构,将循环的迭代次数统一限定为2次;步骤1.3:将所述步骤1.2调整后的方法调用语句序列集合根据所属类的不同进行分类Code={Class1,Class2,…,Classn},将类中每个对象涉及的方法调用语句视为一个单独序列Class={SeqObject1,SeqObject2,…,SeqObjectn},Seq=Method1·Method2…Methodn,其中Classn表示第n个类涉及到的所有方法调用语句,SeqObjectn表示同一个类中第n个对象涉及到的方法调用语句序列;综上,面向对象代码被抽象为3个层次,即所述方法调用语句序列集合为:进一步地,所述四元特征组为:Method=<ClassN,Name,Return,Relation>(2)其中Method为对象的一个方法调用语句,ClassN为类名,Name为方法名,Return为方法的返回类型,Relation为对象和方法的关系;所述Relation取值方式如下:进一步地,所述代码特征词序列集合为:进一步地,所述步骤3包括:步骤3.1:利用N-gram模型,将所述步骤2中代码特征词序列集合的代码特征序列滑动切分成3-gram片段,Code={s1,s2,…,sn},s=Method1·Method2·Method3,Method=<ClassN,Name,Return,Relation>,其中sn为第n个3-gram片段,s为一个3-gram片段,表示对象连续涉及到的3次方法调用语句序列;步骤3.2:通过对面向对象代码进行训练,统计不同的3-gram片段s出现的频率;步骤3.3:利用马尔科夫假设思想,通过所述步骤3.2的统计结果构建代码预测模型,所述代码预测模型用于预测方法调用语句Method3出现的概率,所述代码预测模型为:其中α和V为平滑参数。与现有技术相比,本专利技术具有的有益效果:本专利技术以同一对象涉及的方法调用语句序列为研究对象,根据面向对象语言中方法之间的约束关系,将类名、方法名、返回类型、对象和方法的关系等要素本文档来自技高网
...

【技术保护点】
1.基于方法约束关系的代码预测模型的构建方法,其特征在于,包括以下步骤:步骤1:将面向对象代码抽象为对象涉及的方法调用语句序列集合,所述方法调用语句序列集合包括多个方法调用语句序列;所述方法调用语句序列包括一个对象涉及的所有方法调用语句;步骤2:根据方法之间的约束关系,将所述方法调用语句序列的方法调用语句表示为四元特征组,根据所述四元特征组得出所述面向对象代码的代码特征词序列集合;步骤3:利用N‑gram模型将所述代码特征词序列集合滑动切分为多个3‑gram序列,提取调用所述3‑gram序列,构建代码预测模型。

【技术特征摘要】
1.基于方法约束关系的代码预测模型的构建方法,其特征在于,包括以下步骤:步骤1:将面向对象代码抽象为对象涉及的方法调用语句序列集合,所述方法调用语句序列集合包括多个方法调用语句序列;所述方法调用语句序列包括一个对象涉及的所有方法调用语句;步骤2:根据方法之间的约束关系,将所述方法调用语句序列的方法调用语句表示为四元特征组,根据所述四元特征组得出所述面向对象代码的代码特征词序列集合;步骤3:利用N-gram模型将所述代码特征词序列集合滑动切分为多个3-gram序列,提取调用所述3-gram序列,构建代码预测模型。2.根据权利要求1所述的基于方法约束关系的代码预测模型的构建方法,其特征在于,所述步骤1包括:步骤1.1:将面向对象代码中的方法调用语句根据对象的不同进行分类,方法调用语句之间的相互顺序保持不变,对于包含多个对象的方法调用语句复制多份,放入每个对象中,Code={Object1,Object2,…,Objectn},Object=Method1·Method2…Methodn其中Objectn表示第n个对象涉及到的所有方法调用语句,即第n个对象涉及到的方法调用语句序列;Methodn表示同一个方法调用语句序列中的第n个方法调用语句;源代码被转化为若干个对象涉及的方法调用语句序列集合;步骤1.2:对面向对象代码中的别名现象和代码结构进行分析,并根据分析结果调整所述步骤1.1中所述方法调用语句序列集合,包括:对指向同一地址的不同别名进行归并,视为同一对象;对于条件选择结构,将Objectn根据条件的不同分成若干个相互独立的、不含有条件选择结构的子序列;对于循环结构,将循环的迭代次数统一限定为2次;步骤1.3:将所述步骤1.2调整后的方法调用语句序列集合根据所属类的不同进行分类Code={Class1,Class2,…,Classn},将类中每个对象涉及的方法调用语句...

【专利技术属性】
技术研发人员:刘琰方文渊魏强刘楝张文悦左青松
申请(专利权)人:中国人民解放军战略支援部队信息工程大学
类型:发明
国别省市:河南,41

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1