论文部分内容阅读
随着互联网的快速发展以及开源软件的广泛普及,通过重用已有的开源软件或者相关代码,可极大地提高软件开发效率,降低开发成本。软件开发者花费大量的时间在互联网上搜索相关的软件或者代码加以重用,故如何提高开源代码搜索的效率得到了业界的广泛关注。通过能够体现代码功能的关键字进行代码搜索是一种常用的开源代码搜索方法,但该方法主要通过语法上的关键字内容匹配来实现代码查询,故存在搜索准确度不高的问题,需要用户对搜索结果进行人工筛选,才能得到期望的源代码。目前,基于输入输出匹配的开源代码搜索方法解决了关键字代码搜索方法的上述不足,它是一种重要的基于语义匹配的搜索方法。该方法将代码存储库中的代码编码为约束,同时也将用户提供的输入输出对转化成约束,通过使用Satisfiability Modulo Theories(SMT,可满足性模理论)求解器查询相匹配的约束,以返回用户需要的源代码。基于输入输出匹配的源代码搜索方法虽然弥补了关键字代码搜索方法的缺陷,但也存在明显不足。首先,该方法仅仅考虑了顺序结构代码的处理方式,未对复杂结构进行处理。其次,该方法是在代码匹配阶段才将代码转化为约束,故导致搜索效率较低。本文经过调查和研究已有的工作,针对他们研究中的不足,对已有的基于输入输出的开源代码搜索方法进行改进和完善。首先,将已有输入输出源代码搜索方法中代码约束转换提前至代码组织阶段,把复杂结构转换成顺序结构,然后再进行约束转换。在代码匹配阶段只需将给定的输入输出与已转换的约束进行匹配,将减少搜索所花费的时间。其次,提出将选择结构程序代码转换为顺序结构程序代码,并在语义上证明转换的逻辑正确性。该方法提出了根据选择路径的特性,将选择路径的代码处理为多个单路径的代码析取关系,并证明了这种转换方式的语义正确性。在上述基础上分别设计双分支结构转换算法、多分支结构转换算法、以及分支嵌套结构转换算法。然后,提出将包含循环结构的程序代码转换为顺序结构,并在语义上证明转换的逻辑正确性。转换思路是将循环转换成分支结构,首先需通过差分方程求出循环的次数,进而确定转换的分支结构,最终将其转换为顺序结构。最后,用Python编程语言实现将复杂结构转换为顺序结构的工具。该工具包括代码载入模块、语法正确性分析模块、代码转换模块三个部分。实例运行表明,针对输入的复杂结构代码,该工具能得到期望的转换代码,与理论分析结果相符。