代码库文件生成、代码搜索、联结、优化以及移植方法与流程

文档序号:16880844发布日期:2019-02-15 22:07阅读:227来源:国知局
代码库文件生成、代码搜索、联结、优化以及移植方法与流程

本发明涉及计算机领域,特别涉及一种代码库文件生成、代码搜索、联结、优化以及移植方法。



背景技术:

编程,是让计算机为解决某个问题,而使用某种程序设计语言编写程序代码,并最终得到结果的过程。以特定方式辅助开发人员编程,减少开发人员开发时间的方法叫作辅助编程方法。

目前的辅助编程方法多数为特殊关键词突出显示、语句联想输入、错误提示。相关技术只能辅助用户生成单条语句,开发人员通常仍需自行将某一过程转换为代码语句以实现,且必须逐条语句地编写,工作量繁杂且往往还是重复编写已有的代码。

在辅助编程方法中的代码搜索部分,多数基于自然语言描述进行检索,并且代码依靠人工收录导致耗时久以致往往只能检索到陈旧的代码段,基于自然语言描述进行检索也为代码的录入和开发人员的搜索造成了障碍,自然语言也很难在现有搜索技术上精确同时简要地概括代码段的运行方式和逻辑,同时搜索得到的结果仍需人工复制下来再人工修改语句添加到用户的代码。

如何辅助开发人员减少开发人员工作量,高效地辅助用户添加代码段是本技术领域需要解决的问题。



技术实现要素:

本发明的第一目的在于克服现有技术的缺点与不足,提供一种代码库文件方法,该方法所生产的库文件能够概括代码段内容的同时减少了生成代码特征的计算量。

本发明的第二目的在于提供一种基于上述代码库文件生成方法基础上实现的代码搜索方法,该搜索方法具有代码搜索速度快以及准确的优点。

本发明的第三目的在于提供一种基于上述代码库文件生成方法基础上实现的代码自动联结方法,该方法使得用户进行简单操作后即可将用户选定的代码段添加到用户输入的源代码中。

本发明的第四目的在于提供一种基于上述代码库文件生成方法基础上实现的代码优化方法,该方法能够将用户选定的代码段替换为执行速度更快的代码段,提升了代码质量和运行性能。

本发明的第五目的在于提供一种基于上述代码库文件生成方法基础上实现的代码辅助方法,该方法能够减少用户对复杂结构代码段的分析,用户只需要简单的操作即可实现代码的移植,有效节省了用户的编程时间。

本发明的第一目的通过下述技术方案实现:一种代码库文件生成方法,步骤如下:

步骤s1、首先获取到源代码的编程语言及环境信息;

步骤s2、根据源代码的编程语言及环境信息载入对应语言的切片规则文件,然后根据切片规则文件将源代码划分为具有完整功能的各独立代码段;针对于上述获取到的各独立代码段,检索其中是否有被调用的外部代码,若有,则将外部代码添加到元代码段中,最终生成无调用外部代码的各元代码段;

步骤s3、针对各元代码段,首先分别生成一个库文件,将各元代码段及各元代码段对应的源代码地址和语言及环境信息存储到各元代码段对应的库文件中;

同时,针对于各元代码段,检索元代码段的入口,将元代码段中入口到函数调用部分的语句生成对应的调用语句;将上述生成调用语句添加到库文件中;

同时,针对于各元代码段,对其进行扩增生成测试代码,同时生成包括各组测试数据的测试数据列表,然后在测试代码中输入测试数据列表中的各组测试数据,通过测试代码运行后得到对应的各组测试结果,将上述各组测试结果添加到各元代码段对应的库文件中;

同时,针对于各元代码段,根据语法获取其中的输入\输出语句,标记该语句为入口/出口,从输入输出语句中提取出输入\输出参数类型以及函数名,然后将上述提取到的各元代码段的输入\输出参数类型和函数名存储到各元代码段对应的库文件中;并且获取元代码段中的标签,将元代码段中的标签存储到库文件中;

步骤s4、针对于步骤s3获取到的各库文件,分别提取其中存储的语言及环境信息、输入\输出参数类型、函数名、各组测试结果和标签;

针对各库文件,分别生成一个指向其的摘要文件,将各库文件上述提取的内容作为摘要内容存储在指向其的摘要文件中,并且将各库文件的地址添加到指向其的摘要文件中。

优选的,还包括如下步骤:

步骤s5、针对于各摘要文件,定期访问其中存储的库文件地址,确定是否能访问到该库文件及访问到的该库文件中提取出用于作为摘要内容的数据是否有更新;

若未访问到该库文件,则查询该库文件的新地址,若不能查到该库文件新地址,则删除摘要文件,若查询到该库文件的新地址,则将摘要文件中的地址替换为该库文件的新地址;

若该库文件提取出用于作为摘要内容的数据有更新,则重新提取出该库文件存储的用于作为摘要内容的数据,将其指向的摘要文件中的摘要内容替换为上述重新提取出的数据。

优选的:还包括如下步骤:针对步骤s3获取到的库文件进行查重以及合并处理,具体为:

步骤s31、首先筛选出所存储的输入类型、输出类型、测试结果相同的摘要文件;

步骤s32、针对s31所筛选出的摘要文件,在其中添加扩增测试数据,然后调用其指向的库文件中的测试代码,将上述各组扩增测试数据依次输入到测试代码中进行测试后分别依次获取到各组扩增测试结果,当上述获取到的扩增测试结果的组数达到一定值,则停止测试,并且将上述各组扩增测试结果添加到摘要文件;

步骤s33、针对s32获取到的指向各库文件的各摘要文件,匹配各摘要文件中的各组扩增测试结果,从中筛选出各组扩增测试结果对应相同的摘要文件提取出来;

步骤s34、针对于步骤s33筛选出的摘要文件,获取其指向的各库文件,根据语意匹配上述各库文件中元代码段,将匹配后语意相似度大于一定值的库文件视为重复库文件;

步骤s35、对于保存库文件的终端:针对于步骤s34获取到的重复库文件,保留调用时间最少和属性为不允许删除的库文件;然后在终端允许进行标签添加的情况下将其他库文件的标签添加到被保留库文件中,将被保留的库文件的地址添加到其他库文件,并且删除其它重复库文件中除被保留的库文件地址外的内容,使得其它重复库文件仅含被保留库文件地址;

其中,上述仅含被保留库文件地址的其它重复库文件及指向其的摘要文件的保存时间为永久保存或暂时保存;其中,当为暂时保存时,暂时保存的时间为库文件被定期访问的最长时间间隔,在超过上述时间间隔后,其它重复库文件将被删除;在上述时间间隔内,当通过指向其它重复库文件的摘要文件访问其它重复库文件时,将只能检索到被保留库文件的地址,此时该指向其它重复库文件的摘要文件中的库文件地址替换成被保留库文件的地址,从而实现该指向其他库文件指向的摘要文件的更新;

其中,针对于被保留的库文件,当通过指向其的摘要文件访问该库文件时,若得知该库文件中的标签增多,则将增多的标签添加到指向其的摘要文件中;

其中,在库文件访问过程中,若通过摘要文件中的库文件地址无法访问到库文件时,则向终端发出查找请求,终端查找摘要信息与该摘要文件相同的其他摘要文件,查找到符合的摘要文件后将该摘要文件中的库文件地址替换为上述查找到符合的摘要文件中的库文件地址。

优选的,步骤s1中获取到各源代码的编程语言及环境信息的具体过程如下:

步骤s11、针对于源代码,首先检索源代码的注释,确定中有无记录语言及环境信息的字符串,若有,则从中直接读取到语言及环境信息;若无,则进入步骤s12;

步骤s12、从源代码起始开始读取,读取到一个个字符串;

步骤s13、针对于当前获取到的字符串,查找环境判断库中的各语言/环境判断文件,判断是否有语言/环境判断文件包括该字符串;若是,则进入步骤s14;若否,则进入步骤s15;

步骤s14、从当前读取到的字符串所在语言/环境判断文件中读取到语言及环境信息,并且反馈该语言及环境信息;然后判断当前反馈的所有语言及环境信息中是否满足以下第一条件和第二条件,第一条件:当前反馈的所有语言及环境信息中某种语言信息被反馈的次数超过y次,第二条件,当前反馈的所有语言及环境信息中某种环境信息被反馈的次数超过q次;

若均满足第一条件和第二条件,则将源代码的语言判断为该种语言信息,将源代码的环境判断为该种环境信息;

若只满足第一条件,而未满足第二条件,则将源代码的语言判定为该种语言信息,并且结束源代码语言信息的获取,然后进入步骤s15;

若只满足第二条件,而为满足第一条件,则将源代码的环境判断为该种环境信息,并且结束源代码环境信息的获取,然后进入步骤s15;

若均不满足第一条件和第二条件;则进入步骤s15;

步骤s15、判断当前读取到的字符串是否为源代码最后一个字符串,若是,则进入步骤s17;若否,则进入步骤s16;

步骤s16、读取源代码中的下一个字符串,作为当前读取到的字符串,然后进入步骤s13;

步骤s17、获取步骤s14反馈的所有语言及环境信息;当源代码的语言信息还未被判断出时,则将被反馈次数最多的语言信息作为源代码的语言信息;当源代码的环境信息还未被判断出时,则将被反馈次数最多的环境信息作为源代码的环境信息。

更进一步的,所述步骤s3针对于各元代码段,对其进行扩增生成测试代码的方法采用模板添加法、剔除法或增补法,其中:

采用模板添加法得到测试代码的步骤如下:

步骤1.根据元代码段参数类型和元代码段的语言及环境信息筛选模板;

步骤2:检索元代码段,通过关键字和语意分析识别出元代码段的入口/出口并标记;

步骤3:将被标记的语句拆分为字符串,将拆分出来的字符串对上述筛选的模板的入口/出口关键字进行匹配,选出匹配项最多的模板,匹配模板完成;

将元代码段添加到上述选出的模板,得到测试代码,并且存入到对应库文件中;

采用剔除法得到测试代码的步骤如下:

首先生成源代码的副本,将对应要生成测试代码的元代码段定义为目标代码段;在源代码的副本中,将上述目标代码段语句标记为保留语句,并且将其他元代码段删除,同时删除调用其他元代码段的语句;

检索目标代码段调用语句得到其中的输入变量,通过输入变量名检索保留在目标代码段调用语句中调用主体函数前使输入变量相关联的语句以及定义输入变量的语句,标记为保留语句,删除包含输入变量名的其余语句;同时删除其余无关语句;

采用边删变debug的办法删除源代码的副本中未被标记为保留的语句,将最后得到的语句最少并且完整的代码作为测试代码,并且存入到对应的库文件中;

采用增补法得到测试代码的步骤如下:

步骤s3a、根据元代码段参数类型和元代码段的语言及环境信息筛选模板;

步骤s3b、操作1:根据元代码段参数类型和元代码段的语言及环境信息筛选模板;操作2:检索元代码段,通过关键字和语意分析识别出元代码段的入口/出口并标记;操作3:将被标记的语句拆分为字符串,将拆分出来的字符串对上述筛选的模板的入口/出口关键字进行匹配,选出匹配项最多的模板,匹配模板完成;

步骤s3c、将元代码段添加到步骤s3b选出的模板,得到测试代码;

步骤s3d、采用步骤s3c得到的测试代码对输入的测试数据进行测试,若测试无法通过;则执行以下步骤:

步骤s3d1、生成源代码的副本,将对应要生成测试代码的元代码段定义为目标代码段;在源代码的副本中,将上述目标代码段语句标记为保留语句,并且将其他元代码段删除,同时删除调用其他元代码段的语句;

步骤s3d2、检索目标代码段调用语句得到其中的输入变量,通过输入变量名检索保留在目标代码段调用语句中调用主体函数前使输入变量相关联的语句以及定义输入变量的语句,标记为保留语句,删除包含输入变量名的其余语句;同时删除其余无关语句;

步骤s3d3、针对于源代码的副本中未被保留的语句,进行关联性分析,将相互关联的语句归纳到一起,作为一个部分代码;

步骤s3d4、针对于上述得到的各个部分代码,首先选取其中一个部分代码,作为当前部分代码;

步骤s3d5、将当前部分代码添加到步骤s3b筛选出的模板中,然后将元代码段添加到上述获取到的模板中,得到测试代码;针对于上述测试代码,输入测试数据进行一次测试,若测试通过,则将上述测试代码作为最终测试代码,若测试不通过,进入步骤s3d6;

步骤s3d6、选取下一个部分代码作为当前部分代码,然后执行步骤s3d5,直到得到的测试代码输入测试数据进行一次测试后能够通过,并且将上述通过测试后的测试代码存入到对应库文件中;

所述步骤s3中,针对于各元代码,在生成调用语句时,首先判断其中函数调用语句是否有数据关联性语句;若是,则首先在元代码段中的函数调用语句前添加该数据关联性语句,然后检索元代码段的入口,将优化代码段中入口到函数调用部分的语句生成对应调用语句;若否,则直接检索元代码段的入口,将元代码段中入口到函数调用部分的语句生成对应调用语句

本发明的第而目的通过下述技术方案实现:一种代码搜索方法,步骤如下:

步骤x1、首先获取权利要求1至5中任一项所述的代码库文件生成方法生成库文件及指向库文件的摘要文件;

步骤x2、当接收到用户的代码段搜索请求后:

步骤x21、获取用户需要的代码段输入类型,然后筛选出输入类型与该代码段的输入类型相同的摘要文件;

步骤x22、获取用户需要的代码段输出类型,从步骤x21中筛选出的摘要文件中再次筛选出输出类型与该代码段的输出类型相同的摘要文件;

步骤x23、根据用户输入的输入类型生成由多组测试数据按照一定次序排列而成的测试数据列表,通过该测试数据列表供用户选定对应的测试数据,由用户根据其选定的测试数据输入对应的输出值;针对于用户对其选定的各组测试数据输入的各组输出值,将各组输出值与步骤x22中筛选出的摘要文件中的各组输出结果进行匹配,从中筛选出各组输出结果与用户对其选定的各组测试数据输入的各组输出值相同的摘要文件;

步骤x24、获取用户选定的需要保留的第一标签,针对于步骤x23筛选出的摘要文件,将其中的标签与第一标签进行对比,再次筛选出标签和第一标签相同的摘要文件,获取用户选定的需要删除的第二标签,从上述再次筛选出的摘要文件中筛选出标签与第二标签相同的摘要文件,并且进行删除;

步骤x25、将步骤x24最终保留的摘要文件推荐给用户,供用户获取到相应的库文件进行测试和选择。

本发明的第三目的通过下述技术方案实现:一种代码自动联结方法,步骤如下:

步骤y1、首先获取权利要求1至5中任一项所述的代码库文件生成方法生成供用户选定的库文件及指向库文件的摘要文件;

步骤y2、获取自定义的用户函数名,针对于用户选定的库文件,读取指向该库文件的摘要文件的函数名,并且定义为库文件函数名;提取到该库文件元代码中对应的函数定义内容并做如下修改:将函数定义内容中库文件函数名替换为用户函数名,然后将上述修改后的函数定义内容添加到用户输入的源代码中;

获取自定义的用户函数名;针对于用户选定的库文件,读取指向该库文件的摘要文件的函数名,并且定义为库文件函数名;同时新建头文件并且以用户函数名命名,然后提取到该库文件元代码中对应的函数定义内容并做如下修改:将函数定义内容中库文件函数名替换为用户函数名,并且将上述修改后的函数定义内容添加到新建的头文件中,最后在用户输入的源代码中添加调用该头文件的语句;

步骤y3,针对于用户选定的库文件,在用户选择传入变量后获取该库文件中的调用语句,将上述调用语句添加到用户输入的源代码中用户指定函数调用位置,并且将其中的变量修改为用户传入的变量名。

本发明的第四目的通过下述技术方案实现:一种代码优化方法,步骤如下:

步骤z1、首先获取权利要求1至5中任一项所述的代码库文件生成方法生成库文件及指向库文件的摘要文件,定义为第一库文件以及第一摘要文件;

针对于用户选定的源代码段,首先生成一个第二库文件,同时获取该源代码段的入口和出口,从入口和出口提取出输入\输出参数类型和函数名,然后将该源代码段及其提取出的输入\输出参数类型和函数名均添加到第二库文件;

同时针对于用户选定的源代码段,对其进行扩增生成测试代码,并且存储到第二库文件中,同时生成测试数据列表,然后在测试代码中输入测试数据列表中的各组测试数据,通过测试代码运行后得到对应的各组输出结果,将上述各组输出结果添加到第二库文件;

同时,在第二库文件中添加扩增测试数据;

步骤z2、针对于步骤z1生成的第二库文件,生成一个指向其的第二摘要文件,提取第二库文件中存储的输入\输出参数类型、函数名、各组输出结果以及扩增测试数据,并且将上述提取的结果作为摘要内容存储到第二摘要文件中,同时将第二库文件的地址存储到第二摘要文件中;

步骤z3、将步骤z2得到的指向第二库文件的第二摘要文件与步骤z1中获取到的指向各第一库文件的各第一摘要文件进行匹配,具体匹配过程如下:

步骤z31、获取第二摘要文件中的输入类型,然后从各第一摘要文件中筛选选出输入类型与第二摘要文件中的输入类型相同的第一摘要文件;

步骤z32、获取第二摘要文件中的输出类型,从步骤z31中筛选出的各第一摘要文件中再次筛选出输出类型与第二摘要文件中的输出类型相同的第一摘要文件;

步骤z33、获取第二摘要文件中的各组输出结果,从步骤z32中筛选出的各第一摘要文件中再次筛选出各组输出结果与第二摘要文件中的各组输出结果对应相同的第一摘要文件;

步骤z34、针对于步骤z33筛选出的各第一摘要文件,在其中添加扩增测试数据,同时获取其指向的各第一库文件;针对于上述获取到的每一第一库文件中,在测试代码中输入指向其的第一摘要文件中的各组扩增测试数据,通过测试代码运行后得到对应的各组临时输出结果,将上述各组临时输出结果按照对应各组扩增测试数据的排序添加到的该第一库文件及指向该第一库文件的第一摘要文件中;

同时针对于第二库文件,调用其中的测试代码,然后在测试代码中分别输入第二摘要文件中的各组扩增测试数据,通过测试代码运行后得到对应的各组临时输出结果,将上述各组临时输出结果添加到的该第二库文件及第一摘要文件中;

步骤z35、获取第一摘要文件中的各组临时输出结果,从步骤z34获取到的各第一摘要文件中筛选出各组临时输出结果与第二摘要文件中的各组临时输出结果对应相同的第一摘要文件;

步骤z36、针对步骤z35筛选出的各第一摘要文件,通过其中存储的库文件地址查找到各第一库文件,获取到上述各第一库文件中测试代码的运行时间;然后将步骤z35筛选出的各第一摘要文件以及其指向的各第一库文件中测试代码的运行时间展示给用户,以供用户进行选择,最后将用户选择出的第一摘要文件中存储的库文件地址所指向的第一库文件中的元代码段作为优化代码段,用优化代码段替换掉用户选定的源代码段。

优选的,所述步骤z36中,采用优化代码段替换掉用户选定的代码段的具体过程如下:

步骤z361、检索指向优化代码段所在第一库文件的第一摘要文件和指向被优化代码段的第二摘要文件,读取该第一摘要文件和第二摘要文件中的函数名,分别对应定义为库文件函数名和用户函数名;提取到该第一库文件元代码中对应的函数定义内容并做如下修改:将函数定义内容中的库文件函数名替换为用户函数名;然后将上述修改后的函数定义内容添加到用户输入的源代码中;

或者检索指向优化代码段所在第一库文件的第一摘要文件和指向被优化代码段的第二摘要文件,读取该第一摘要文件和第二摘要文件中的函数名,分别对应定义为库文件函数名和用户函数名;新建头文件并且以用户函数名命名,提取到该第一库文件元代码中对应的函数定义内容并做如下修改:将函数定义内容中的库文件函数名替换为用户函数名;然后将上述修改后的函数定义内容添加到新建的头文件中,最后在用户输入的源代码中添加调用该头文件的语句;

步骤z362、针对于优化代码段所在第一库文件,在用户选择传入变量后获取该第一库文件中的调用语句,将上述调用语句添加到用户输入的源代码中用户指定函数调用位置,并且将其中的变量修改为用户传入的变量名。

本发明的第五目的通过下述技术方案实现:一种代码辅助移植方法,步骤如下:

步骤b1、首先获取权利要求1至5中任一项所述的代码库文件生成方法生成库文件及指向库文件的摘要文件,定义为第一库文件以及第一摘要文件;

在接收到用户的源代码移植请求时,首先根据切片规则文件将源代码划分为具有完整功能的各独立代码段;针对于上述获取到的需要进行移植的各代码段,首先分别生成一个第三库文件,并且检索各代码段的输入\输出语句,从输入输出语句中提取出输入\输出参数类型以及函数名,然后将上述提取到的输入\输出参数类型、函数名存储到各代码段对应的第三库文件中;

同时,针对于上述获取到的需要进行移植的各代码段,对其进行扩增生成测试代码,并且生成多组测试数据,由多组测试数据排序生成测试数据列表,然后在测试代码段中输入测试数据列表中的各组测试数据,通过测试代码运行后得到对应的各组输出结果,将上述各组输出结果按照对应各组测试数据的排序添加到的第三库文件;

针对于上述获取到的各代码段的第三库文件,生成一个指向其的第三摘要文件,提取第三库文件中存储的输入\输出参数类型、函数名以及各组输出结果,并且将上述提取的结果作为摘要内容存储到第三摘要文件中,同时将第三库文件的地址存储到第三摘要文件中;

步骤b2、针对于步骤b1得到的指向各第三库文件的各第三摘要文件,将其与步骤b1中获取到的指向各第一库文件的各第一摘要文件进行匹配,具体匹配过程如下:

步骤b21、获取第三摘要文件中的输入类型和输出类型,同时获取用户要移植到的代码的语言及环境信息,作为指定语言及环境信息,然后从各第一摘要文件中筛选出输入类型和输出类型与第三摘要文件相同且语言及环境信息为上述指定语言及环境信息的第一摘要文件;

步骤b22、获取第三摘要文件中的各组输出结果,从步骤b21中筛选出的各第一摘要文件中再次筛选出各组输出结果与第三摘要文件中的各组输出结果对应相同的第一摘要文件;针于上述筛选出的各第一摘要文件,通过其中存储的库文件地址查找到各第一库文件,获取到上述各第一库文件中测试代码的运行时间;然后将上述筛选出的各第一摘要文件以及其指向的各第一库文件中测试代码的运行时间展示给用户,以供用户为需要移植的各代码段选定对应第一摘要文件;

步骤b23、针对于用户最终为需要移植的代码段对应所选定第一摘要文件和需要移植的代码段的第三摘要文件,读取该第一摘要文件和第三摘要文件中的函数名,分别对应定义为库文件函数名和用户函数名;提取到该第一摘要文件所指向的第一库文件元代码中对应的函数定义内容并做如修改:将函数定义内容中的库文件函数名替换为用户函数名;然后将上述修改后的函数定义内容添加到用户输入的源代码中;

或者针对于用户最终为需要移植的代码段对应所选定第一摘要文件和需要移植的代码段的第三摘要文件,读取该第一摘要文件和第三摘要文件中的函数名,分别对应定义为库文件函数名和用户函数名;新建头文件并且以用户函数名命名;提取到该第一摘要文件所指向的第一库文件元代码中对应的函数定义内容并做如下修改:将函数定义内容中的库文件函数名替换为用户函数名;然后将上述修改后的函数定义内容添加到新建的头文件中,最后在用户输入的源代码中添加调用该头文件的语句;

步骤b24、针对于用户最终为需要移植的每个源代码段对应所选定的第一摘要文件所指向的第一库文件,在用户选择传入变量后获取该第一库文件中的调用语句,将上述调用语句添加到用户输入的源代码中用户指定函数调用位置,并且将其中的变量修改为用户传入的变量名。

本发明相对于现有技术具有如下的优点及效果:

(1)本发明代码库文件方法中,针对于源代码,划分成多个具有完整功能的独立代码段,各个具有完整功能的独立代码段被称之为元代码段,针对各元代码段均生成一个库文件,其中在库文件中存储元代码段、调用语句、测试代码元代码段对应的源代码地址和语言及环境信息、输入\输出参数类型、函数名、标签和各组测试结果;针对于每个库文件,分别生成指向其的摘要文件,将库文件中的摘要部分(包含:源代码语言及环境信息、输入\输出参数类型、函数名、标签、各组测试结果、库文件地址以及扩增数据)均添加到摘要文件中,由上述可知,本发明对源代码划分后的元代码段进行自动化处理后得到的指向其库文件的摘要文件仅仅保存了元代码段简化后的特征信息,如此只对代码段的输入\输出参数类型以及测试结果等进行分析,无需对代码段进行全文语意分析(即是忽略代码段对某个功能具体实现方式的语句),概括了元代码段内容的同时减少了特征的计算量。另外,本发明获取到的库文件可以保存到服务器,摘要文件可以保存到用户终端,当要针对源代码中的各代码段进行检索时,只检索小文件的摘要文件即可找到对应库文件,且摘要方便移动和保存,减少了检索和保存的计算机资源开销。

(2)本发明代码库文件方法中,还针对于生成得到的各个库文件进行查重以及合并处理,具体为,首先筛选出所存储的输入类型、输出类型、测试结果相同的摘要文件;然后针对于上述筛选出的摘要文件,进一步的调用其指向的库文件中测试代码,将摘要文件中各组扩增数据输入测试代码进行测试再次得到各组扩增测试结果,然后从上述筛选出的摘要文件中再次筛选出各组扩增测试结果也相同的摘要文件,最后获取其指向的各库文件,根据语意匹配上述各库文件中元代码段,将匹配后语意相似度大于一定值的库文件视为重复库文件。针对于上述得到的重复库文件,仅仅保留调用时间最少和属性为不允许删除的库文件,对于其他重复库文件,在终端允许进行标签添加的情况下,将其中的标签分别添加到被保留的库文件中,其中仅存储被保留的库文件的地址。上述针对于库文件查重以及合并处理,能够有效节省库文件存储空间。

(3)本发明代码搜索方法中,首先获取本发明代码库文件方法所生成的库文件及指向库文件的摘要文件,针对于用户需要检索的相应功能的代码段,根据用户输入的输入\输出参数类型、用户针对其选定的测试数据输入的输出值以及用户输入的标签对上述生成的摘要文件进行依次筛选,即可筛选出符合条件的摘要文件,针对于筛选出的各摘要文件,用户可以再根据各摘要文件指向的各库文件中存储的测试代码运行时间、元代码复杂度以及代码占用内存空间等条件再次进行最终选择。因此在本发明下,用户检索时无需关注代码段内部代码,只需关注需要代码的输入\输出参数类型和测试结果,通过规范的输入方式即可从大量代码中快速筛选出最适宜的代码段,具有能够减少代码搜索所消耗的计算机资源、代码搜索速度快以及准确的优点。

(4)本发明代码自动联结方法中,首先获取本发明代码库文件方法所生成的库文件及指向库文件的摘要文件,针对于用户选定的库文件,获取指向该库文件的摘要文件,读取摘要文件中的函数名,将库文件中对应的函数定义内容修改成自定义的用户函数名后直接复制到用户输入的源代码中;或者新建头文件,将对应修改成自定义的用户函数名的函数定义内容添加到新建以读取到的函数名命名的头文件中,然后在用户输入的源代码中添加调用该头文件的语句;针对于用户选定的库文件,在用户选择传入变量后获取该库文件中的调用语句,将上述调用语句添加到用户输入的源代码中用户指定函数调用位置,并且将其中的变量修改为用户传入的变量名。由上述可知,本发明方法在用户选定代码段后,只需用户按照规定的方式简单选择传入变量即可实现代码自动添加,并且在添加过程中,能够自动生成匹配的变量名,以联结上下文,因此本发明代码自动联结方法能够减少用户工作量以及修改添加的代码时间。

(5)本发明代码自动优化方法中,首先获取本发明代码库文件方法所生成的第一库文件及指向第一库文件的第一摘要文件,针对于用户输入的源代码段,参考本发明代码库文件方法生成库文件以及指向第二库文件的第二摘要文件。然后依据输入类型、输出类型以及测试结果针对第二摘要文件和第一摘要文件进行匹配,筛选得到输入类型、输出类型以及测试结果均与第二摘要文件相同的第一摘要文件,然后调用第一库文件中的测试代码,将第一摘要文件中的各组扩增数据输入到测试代码再进行测试,得到各组临时测试结果并且存储到第一摘要文件中,同时将上述扩增数据输入到第二库文件的测试代码中,得到各组临时测试结果并且存储到第二摘要文件中;针对有上述获取到的第一摘要文件和第二摘要文件,对比两者的各组临时测试结果,再次筛选出各组临时测试结果与第二摘要文件相同的第一摘要文件,并且推荐给用户;用户最后可以根据第一库文件中的信息(如代码、运行时间等)最终选择出一个第一摘要文件,将该第一摘要文件的源原代码作为优化代码段替换掉用于选定的源代码段。由上述可知,本发明方法通过减速用户输入的源代码段,能够将用户输入的源代码段替换成执行速度更快的代码段,方便用户提升代码质量和运行性能。

(6)本发明代码辅助移植方法,首先获取本发明代码库文件方法所生成的第一库文件及指向第一库文件的第一摘要文件,在接收到用户的源代码移植请求时,针对源代码进行切片并且生成切片后各代码段的第三库文件以及指向第三库文件的第三摘要文件,针对于指向各第三库文件的各第三摘要文件,将其与指向各第一库文件的各第一摘要文件进行匹配,首先匹配两者的输入类型、输出类型、语言及环境信息,从各第一摘要文件中筛选出输入类型和输出类型与第三摘要文件相同且语言及环境信息为上述指定语言及环境信息的第一摘要文件;针对于上述选取出的各第一摘要文件,将其中存储的测试结果与第三摘要文件中的测试结果进行对比,从中再次筛选出测试结果与第三摘要文件相同的第一摘要文件,并且将这些第一摘要文件和其指向第一库文件中的信息(如代码、运行时间等信息)展示给用户,供用户选择,针对于用户最终选择的第一摘要文件,通过本发明代码自动联结方法将第一库文件中对应的元代码段移植到用户输入的源代码中。由上述可见,本发明通过摘要文件中特征信息即可匹配不同语言和环境下的两种相同功能的代码段,并且在移植过程中以代码段为单位,相比现有技术中以语句为单位的移植方式,本发明方法具有移植速度快,同时减少了用户对复杂结构代码段的分析,用户只需简单的操作即可实现程序的移植,节省用户的编程时间。

(7)综上所述,用户可以通过使用本发明方法检索直接得到实现某一功能的代码段,减少了用户为实现功能的而进行逻辑分析以及编写具体语句的工作量,用户也能花更多的时间关注整个程序的架构,通过代码段推荐和代码自动优化使得优秀算法更加容易地普及到用户,因此该方法对于软件产业来说是有积极意义的。

附图说明

图1是本发明代码库文件生成方法流程图。

具体实施方式

下面结合实施例以及附图对本发明作进一步详细的描述,但本发明的实施方式不限于此。

实施例1

本实施例公开了一种代码库文件生成方法,如图1所示,步骤如下:

步骤s1、首先获取到源代码的编程语言及环境信息;

步骤s2、根据源代码的编程语言及环境信息载入对应语言的切片规则文件,然后根据切片规则文件内的切片程序将源代码划分为具有完整功能的各独立代码段;针对于上述获取到的各独立代码段,检索其中是否有被调用的外部代码,若有,则将外部代码添加到元代码段中,最终生成无调用外部代码的各元代码段;

步骤s3、针对各元代码段,首先分别生成一个库文件,然后将各元代码段及各元代码段对应的源代码地址和语言及环境信息存储到各元代码段对应的库文件中;

同时,针对于各元代码段,检索元代码段的入口,将元代码段中入口到函数调用部分的语句生成对应的调用语句;将上述生成调用语句添加到库文件中;本实施例中,针对于各元代码,在生成调用语句时,首先判断其中函数调用语句是否有数据关联性语句;若是,则首先在元代码段中的函数调用语句前添加该数据关联性语句,然后检索元代码段的入口,将优化代码段中入口到函数调用部分的语句生成对应调用语句;若否,则检索元代码段的入口,将元代码段中入口到函数调用部分的语句生成对应调用语句;检索元代码段,通过关键字和语意分析识别出元代码段的入口/出口并标记;其中本实施例中,入口是指代码段中输入参数的语句,出口是指代码段中输出参数的语句,出入口标记指的是在语句所在行添加入口/出口标识符的注释。

同时,针对于各元代码段,对其进行扩增生成测试代码,同时生成测试数据列表,列表中各测试数据按照一定次序排列,然后在测试代码中输入测试数据列表中的各组测试数据,通过测试代码运行后得到对应的各组测试结果,将上述测试代码以及各组测试结果按照对应各组测试数据的排序添加到各元代码段对应的库文件中;

同时,针对于各元代码段,根据语法获取其中的输入\输出语句,标记该语句为入口/出口,从输入输出语句中提取出输入\输出参数类型以及函数名,然后将上述提取到的各元代码段的输入\输出参数类型和函数名存储到各元代码段对应的库文件中;并且获取元代码段中的标签,将元代码段中的标签存储到库文件中。

步骤s4、针对于步骤s3获取到的各库文件,分别提取其中存储的语言及环境信息、输入\输出参数类型、函数名、各组测试结果和标签;

针对各库文件,分别生成一个指向其的摘要文件,将各库文件上述提取的内容以及扩增数据作为摘要内容存储在指向其的摘要文件中,并且将各库文件的地址添加到指向其的摘要文件中。在本实施例中,还可以将摘要文件指向的库文件中测试代码在标准环境下的执行时间、元代码的复杂度以及库文件内存空间占用大小信息添加到摘要文件中。

步骤s5、针对于各摘要文件,定期访问其中存储的库文件地址,确定是否能访问到该库文件及访问到的该库文件中提取出用于作为摘要内容的数据是否有更新;

若未访问到该库文件,则查询该库文件的新地址,若不能查到该库文件新地址,则删除摘要文件,若查询到该库文件的新地址,则将摘要文件中的地址替换为该库文件的新地址;

若该库文件提取出用于作为摘要内容的数据有更新,则重新提取出该库文件存储的用于作为摘要内容的数据,将其指向的摘要文件中的摘要内容替换为上述重新提取出的数据。

在本实施例中,步骤s3中获取到的库文件存储的内容如下:

在本实施例中,步骤s4中获取到的摘要文件中存储的内容如下:

:/*(函数名);(输入参数类型:);(输出参数类型);*/

/*(测试结果)结果1;结果2;结果3;......;*/

/*(编程语言);(环境信息);(测代代码标准环境下的执行时间);(复杂度);(内存空间占用)*/

/*{标签}这里的标签是指库文件的函数段所能解决什么样的编程问题或是功能注释,比如有的函数段是排序的,有的是做字符串匹配的,那么这里的标签分别为“排序”,“字符串匹配”*/

/*库文件地址:ftp地址/本地文件地址*/

其中在摘要文件中,上述库文件地址复制到摘要的结尾处。在本实施例中,库文件和摘要文件中存储的标签是由开发者/用户提交经审核后得到的,系统可以通过检索代码语句、注释、参数生成的标签。在本实施例中,摘要文件严格按照格式保存信息,由标点符号区隔不同项,借此检索不同项。摘要文件里面的内容都由系统规定的特定的符号来间隔开来,比如输出类型和测试结果之间就用@来进行间隔开来,则当用户编程时敲入searchin:int后,则这个int便开始在摘要文件里面的输入类型这个区域内的字符串做匹配,若摘要文件里面输入类型这个区域内的字符只有一个int,则说明匹配成功,这第一次筛选成功。

本实施例上述步骤s1中,获取到各源代码的编程语言及环境信息的具体过程如下:

步骤s11、针对于源代码,首先检索源代码的注释,确定中有无记录语言及环境信息的字符串,若有,则从中直接读取到语言及环境信息;若无,则进入步骤s12;

步骤s12、从源代码起始开始读取,读取到一个个字符串;

步骤s13、针对于当前获取到的字符串,查找环境判断库中的各语言/环境判断文件,判断是否有语言/环境判断文件包括该字符串;若是,则进入步骤s14;若否,则进入步骤s15;

步骤s14、从当前读取到的字符串所在语言/环境判断文件中读取到语言及环境信息,并且反馈该语言及环境信息;然后判断当前反馈的所有语言及环境信息中是否满足以下第一条件和第二条件,第一条件:当前反馈的所有语言及环境信息中某种语言信息被反馈的次数超过y次,第二条件,当前反馈的所有语言及环境信息中某种环境信息被反馈的次数超过q次;

若均满足第一条件和第二条件,则将源代码的语言判断为该种语言信息,将源代码的环境判断为该种环境信息;

若只满足第一条件,而未满足第二条件,则将源代码的语言判定为该种语言信息,并且结束源代码语言信息的获取,然后进入步骤s15;

若只满足第二条件,而为满足第一条件,则将源代码的环境判断为该种环境信息,并且结束源代码环境信息的获取,然后进入步骤s15;

若均不满足第一条件和第二条件;则进入步骤s15;

步骤s15、判断当前读取到的字符串是否为源代码最后一个字符串,若是,则进入步骤s17;若否,则进入步骤s16;

步骤s16、读取源代码中的下一个字符串,作为当前读取到的字符串,然后进入步骤s13;

步骤s17、获取步骤s14反馈的所有语言及环境信息;当源代码的语言信息还未被判断出时,则将被反馈次数最多的语言信息作为源代码的语言信息;当源代码的环境信息还未被判断出时,则将被反馈次数最多的环境信息作为源代码的环境信息。

不同的编程语言写成的代码,比如c语言,c++,java等实现同一算法,但代码一定是有区别的,本实施例上述步骤就是通过对代码中独有特征(例如代码中包含的标准库文件,头文件,输入输出语句等)来进行语言及环境识别和区分。例如针对于如下的源代码(记为代码1),第一行检索到c++语言独有语句“#include<iostream>”,则把“编程语言:c++”输出给系统,且“编程语言:c++”频次计数+1(首次检测到该语言/环境的特有字符串则将其频次计数记为1),此时语言/环境的频次计数均未超过y/q次,故继续检索。在第24行检索到注释“c++语言”,则把“编程语言:c++”输出给系统,且该关键词计数+1,此时语言/环境的频次计数均未超过y/q次,故继续检索。第24行检索到注释“通用平台”→则把“编程环境:通用平台”这条信息输出给系统,并“编程环境:通用平台”计数+1。若在读取完源代码未有语言信息或环境信息仍未达到出现频次y和q次,则分别选择出现频次最多的语言信息(即编程语言:c++)和环境信息(即编程环境:通用平台)为判断结果。系统将其(“//编程语言:c++;编程环境:通用平台”)添加到源代码头部。

代码1:

在本实施例上述步骤s3中,为了识别区分输入和输出的方式,特命名4种类型以保存于库文件的输入类型和输出类型部分信息:1、用户输入类型:由用户手动键入的变量,比如用cin>>a语句输入的那个变量a的类型名int,检索得到其变量类型名后应作修改:其变量类型名加前缀(如:”c_”即“c_类型名”:c_int)后添加到库文件。2、打印输出类型:用到输出语句后输出的那种变量的类型,比如用到cout<<语句后出现的变量的类型,检索得到其变量类型名后应作修改:其变量类型名加前缀(如:”p_”即“p_类型名”:p_int)后添加到库文件。3、传入类型:非用户输入类型,含:充当函数形参的那些变量的类型、宏定义、指针、数组等变量的类型,检索变量对应的类型名并将其添加到库文件;4、传出类型:非打印输出类型,含:函数有返回值时返回值的类型、宏定义变量、指针变量等对应的类型,将其变量对应的类型名添加到库文件。在本实施例中识别元代码段中函数名、输入/输出类型时,需要告诉计算机怎样识别,即识别的依据,比如一段函数代码必定会有函数的类型名,例如void,void之后并且“(”之前的一定为函数名,所以把这之间的字符提取出来就是我们想得到的函数名;识别输入和输出类型的道理是一样的,比如把常见的输入类型比如:int,char,float等等,按照一个个字符串的形式保存到一起,然后把它和函数代码段做字符串匹配,从而找出函数代码段的输入类型。例如下列的代码中(标记为代码2)中,通过本实施例上述识别后,得到:(函数名)insert_sort;(传/输入类型:)int[],int;(传/输出类型)int[]。

代码2:

上述方法仅能面对简单调用,无法解决宏定义变量、自定义类型作参数的问题。故本实施例提出另一种更完善方法:变量检索法:1.根据语法中运算部分和输入/输出的规则(运算语句中变量紧挨运算符故通过运算符找到变量、输入/输出语句中变量挨着关键字<<和>>)检索得到代码段中的变量名;2.通过查找该变量名检索到含该变量的语句(查找源代码),检索该语句中是否为宏定义语句、输入/输出语句,若否则检索下一条,若是则标记该语句为入口/出口并检索变量定义的语句,(1)若变量为基本类型则直接输出,(2)若为宏定义的变量添加到代码段并标记为宏定义,检索该语句得到变量的类型并输出给系统;(3)若为字符常量则将字符常量添加到代码段中;(4)则若变量为自定义类型,则将自定义类型的定义语句添加到代码段并标记为自定义类型,检索该自定义类型的定义语句得到变量名的变量类型并输出给系统。

在本实施例中,步骤s3针对于各元代码段,对其进行扩增生成测试代码的方法采用模板添加法、剔除法或增补法,其中:

本实施例中,采用模板添加法得到测试代码的步骤如下:

步骤1.根据元代码段参数类型和元代码段的语言及环境信息筛选模板;模板的定义:已经编写好的代码框架,只需将元代码段添加到模板的代码中就可形成可执行的完整程序;模板由两部分组成:检索内容和代码;检索内容用于筛选时系统检索。

步骤2:检索元代码段,通过关键字和语意分析识别出元代码段的入口/出口并标记;其中本实施例中,入口是指代码段中输入参数的语句,出口是指代码段中输出参数的语句,出入口标记指的是在语句所在行添加入口/出口标识符的注释。

步骤3:将被标记的语句拆分为字符串,将拆分出来的字符串对上述筛选的模板的入口/出口关键字进行匹配,选出匹配项最多的模板,匹配模板完成;

将元代码段添加到上述选出的模板,得到测试代码,并且存入到对应库文件中;

例如元代码段如下:

根据以上信息匹配模板并添加元代码段得到测试代码如下:

本实施例中,采用剔除法得到测试代码的步骤如下:

首先生成源代码的副本,将对应要生成测试代码的元代码段定义为目标代码段;在源代码的副本中,将上述目标代码段语句标记为保留语句,并且将其他元代码段删除,同时删除调用其他元代码段的语句;

检索目标代码段调用语句得到其中的输入变量,通过输入变量名检索保留在目标代码段调用语句中调用主体函数前使输入变量相关联的语句以及定义输入变量的语句,标记为保留语句,删除包含输入变量名的其余语句;同时删除其余无关语句;

采用边删变debug的办法删除源代码的副本中未被标记为保留的语句,将最后得到的语句最少并且完整的代码作为测试代码,并且存入到对应的库文件中;

例如采用本实施例上述剔除法对以下源代码的副本(标记为代码3)进行处理,其中必要结构语句是指使代码可执行的必要语句,由开发者定义。边删边debug的方法具体如下:1、首先进行一次debug和测试(检索代码段入口和出口,在入口给代码段赋值,在出口插入测试语句获取结果,测试可省略);2、将非保留的语句进行关联性分析(语句间的相互调用、嵌套),相互关联的语句为一个部分;3、逐个部分进行删除,每删除一个部分进行一次debug和测试,若通过(debug无问题,测试结果同首次测试相同)则继续删除下一部分,若无法通过则恢复该部分并将其标记为保留,继续删除下一部分,直至剩余语句全被标记为保留。

代码3如下:

本实施例中,采用增补法得到测试代码的步骤如下:

步骤s3a、根据元代码段参数类型和元代码段的语言及环境信息筛选模板;

步骤s3b、操作1:根据元代码段参数类型和元代码段的语言及环境信息筛选模板;操作2:检索元代码段,通过关键字和语意分析识别出元代码段的入口/出口并标记;操作3:将被标记的语句拆分为字符串,将拆分出来的字符串对上述筛选的模板的入口/出口关键字进行匹配,选出匹配项最多的模板,匹配模板完成;

步骤s3c、将元代码段添加到步骤s3b选出的模板,得到测试代码;

步骤s3d、采用步骤s3c得到的测试代码对输入的测试数据进行测试,若测试无法通过;则执行以下步骤:

步骤s3d1、生成源代码的副本,将对应要生成测试代码的元代码段定义为目标代码段;在源代码的副本中,将上述目标代码段语句标记为保留语句,并且将其他元代码段删除,同时删除调用其他元代码段的语句;

步骤s3d2、检索目标代码段调用语句得到其中的输入变量,通过输入变量名检索保留在目标代码段调用语句中调用主体函数前使输入变量相关联的语句以及定义输入变量的语句,标记为保留语句,删除包含输入变量名的其余语句;同时删除其余无关语句;

步骤s3d3、针对于源代码的副本中未被保留的语句,进行关联性分析,将相互关联的语句归纳到一起,作为一个部分代码;

步骤s3d4、针对于上述得到的各个部分代码,首先选取其中一个部分代码,作为当前部分代码;

步骤s3d5、将当前部分代码添加到步骤s3b筛选出的模板中,然后将元代码段添加到上述获取到的模板中,得到测试代码;针对于上述测试代码,输入测试数据进行一次测试,若测试通过,则将上述测试代码作为最终测试代码,若测试不通过,进入步骤s3d6;

步骤s3d6、选取下一个部分代码作为当前部分代码,然后执行步骤s3d5,直到得到的测试代码输入测试数据进行一次测试后能够通过,并且将上述通过测试后的测试代码存入到对应库文件中。

本实施例代码库文件生成方法中,还包括针对于步骤s3获取到的库文件查重以及合并处理,其中重复的库文件是指:几个库文件输入类型相同,输出类型相同也相同,并且代码中用的算法等都相同,但定义变量用的变量名可能不同,这段代码的标签多少可能不同,这样的几个库文件才称为重复的库文件

具体步骤如下:

步骤s31、首先筛选出所存储的输入类型、输出类型、测试结果相同的摘要文件;

步骤s32、针对s31所筛选出的摘要文件及其指向的库文件,在其中添加扩增测试数据,然后调用其指向的库文件中的测试代码,将上述各组扩增测试数据依次输入到测试代码中进行测试后分别依次获取到各组扩增测试结果,当上述获取到的扩增测试结果的组数达到一定值,则停止测试,并且将上述各组扩增测试结果添加到摘要文件;

步骤s33、针对s32获取到的指向各库文件的各摘要文件,匹配各摘要文件中的各组扩增测试结果,从中筛选出各组扩增测试结果对应相同的摘要文件提取出来;

步骤s34、针对于步骤s33筛选出的摘要文件,获取其指向的各库文件,根据语意匹配上述各库文件中元代码段,将匹配后语意相似度大于一定值的库文件视为重复库文件;

步骤s35、对于保存库文件的终端:针对于步骤s34获取到的重复库文件,保留调用时间最少和属性为不允许删除的库文件;然后在终端允许进行标签添加的情况下将其他库文件的标签添加到被保留库文件中,将被保留的库文件的地址添加到其他库文件,并且删除其它重复库文件中除被保留的库文件地址外的内容,使得其它重复库文件仅含被保留库文件地址;

其中,上述仅含被保留库文件地址的其它重复库文件及指向其的摘要文件的保存时间为永久保存或暂时保存;其中,当为暂时保存时,暂时保存的时间为库文件被定期访问的最长时间间隔,在超过上述时间间隔后,其它重复库文件将被删除;在上述时间间隔内,当通过指向其它重复库文件的摘要文件访问其它重复库文件时,将只能检索到被保留库文件的地址,此时该指向其它重复库文件的摘要文件中的库文件地址替换成被保留库文件的地址,从而实现该指向其他库文件指向的摘要文件的更新;

其中,针对于被保留的库文件,当通过指向其的摘要文件访问该库文件时,若得知该库文件中的标签增多,则将增多的标签添加到指向其的摘要文件中;

其中,在库文件访问过程中,若通过摘要文件中的库文件地址无法访问到库文件时,则向终端发出查找请求,终端查找摘要信息与该摘要文件相同的其他摘要文件,查找到符合的摘要文件后将该摘要文件中的库文件地址替换为上述查找到符合的摘要文件中的库文件地址;

例如,在本实施例中,库文件放在某个电脑(终端)内的存储区域或服务器上,假如这个时候在电脑内的存储区域或是服务器上有5个库文件,编号分别是1,2,3,4,5,同时有5个摘要文件,编号也为1-,2-,3-,4-,5-,每个摘要文件和对应的库文件相关联,比如1-号摘要文件指向1号库文件相关联,经过我们的步骤31至34后,发现了1号库文件和2号库文件是重复的,所以要对它们进行步骤35的合并处理;合并之前,我们需要判断1,2号这两个库文件哪个更优,保留更优的库文件,那么问题来了,如何判断哪个库文件更优呢?这就用到“库文件调用时间”这个概念,“库文件调用时间”的意思是指在终端访问摘要里面的地址(这个地址是自身服务器或存储区里面某个库文件的地址)到库文件下载到终端的时间,当然,这个时间越短,说明这个库文件更优,那么假如通过测试发现,1号库文件更优,则需要保留1号库文件,则把2号库文件中的标签复制到了1号库文件中,同时2号库文件中的内容全部删掉,且把1号库文件的地址添加到2号库文件,也就是说这个时候2号库文件里面保存的信息只有1号库文件的地址,那么当用户通过2-号摘要文件去访问2号库文件的时候,发现2号库文件里面只有一个地址链接,则通过此链接找到了1号库文件,2-号摘要文件将依据1号库文件更新摘要信息和地址:在超过库文件被定期访问的最长时间间隔时2号库文件和2-号摘要文件一起删除;其中当在库文件被定期访问的最长时间间隔内时,当通过指向2-号摘要文件访问2号库文件时,将只能在2号库文件中检索到被保留的1号库文件的地址,此时该2-号摘要文件中的库文件地址替换成1号库文件的地址,从而实现2-号摘要文件的更新。当用户通过1-号摘要文件去访问1号库文件的时候,发现这里面的库文件标签增多了,则把这些增加的标签也复制到1-号摘要文件,这就实现了摘要文件的更新,同时也把重复的2号库文件和2-号摘要文件一并删除了,从而实现了库文件的查重以及合并的功能。

实施例2

本实施例公开了一种代码搜索方法,步骤如下:

步骤x1、首先获取实施例1中代码库文件生成方法生成库文件及指向库文件的摘要文件;

步骤x2、当接收到用户的代码段搜索请求后:

步骤x21、获取用户需要的代码段输入类型,然后筛选出输入类型与该代码段的输入类型相同的摘要文件;

在本实施例中,设定用户输入的搜索快捷键,可以是朝向左下方的箭头↙,当用户输入:searchin:int,int:↙,则系统会根据用户输入的输入类型和各个摘要进行匹配,如步骤x21,这个时候则假如有1000个摘要文件符合这种情况,将会给我们显示出搜索结果为:

result:1000counts(共有1000条搜索结果);

如果用户想要的代码段没有输入,那么我们就规定此时用户应该敲入searchin:回车键,表示无输入类型,则系统将会按照这个条件进行筛选,筛选出无输入的函数代码段,并把共有多少个这样的摘要文件显示给用户。在本实施例中,假如出现用户想要在理想代码段中进行用户键入或是打印输出,比如用到scanf,cin,printf,cout等输入输出方式的时候,搜索键入的输入方式则需要在输入类型名前加前缀“c_”即键入:“searchin:c_类型名”搜索,搜索打印输出的输出方式则需要需要在输出类型名前加前缀“p_”即输入:“键入:searchout:p_类型名。

步骤x22、获取用户需要的代码段输出类型,从步骤x21中筛选出的摘要文件中再次筛选出输出类型与该代码段的输出类型相同的摘要文件;

在本实施例中,用户输入的输出类型可以设定为:searchout:int:↙,其中searchout是表明输出类型的标识符,假设这里输出类型为一个int型变量,则需要在打上标识符searchout:后打上int即可,这个时候会再次对步骤x21操作一完成后生成的那1000条搜索结果进行二轮匹配,本次匹配是根据输出类型结果进行匹配,匹配完成后假设由原来的1000条搜索结果变成了500条搜索结果,则会在界面上显示:

result:500counts

这样的语句用来提示用户筛选结果。

步骤x23、根据用户输入的输入类型生成由多组测试数据按照一定次序排列而成的测试数据列表,通过该测试数据列表供用户选定对应的测试数据,由用户根据其选定的测试数据输入对应的输出值;针对于用户对其选定的各组测试数据输入的各组输出值,将各组输出值与步骤x22中筛选出的摘要文件中的各组测试结果进行匹配,从中筛选出各组测试结果与用户对其选定的各组测试数据输入的各组输出值相同的摘要文件;

在本步骤中,用户可以按照自己想要的代码段的功能根据选定的系统推荐的多组输入数值,去手动的输入对应的输出值,比如想要一段求两个整形数最大值的代码段,这个时候系统推荐了[1,2]这组输入数值,当然,用户这个时候就需要在敲下输出类型后再手动输入对应的输入的输出值为[2],后面的那3组推荐数值是同样的道理,这个时候,系统会根据上述输出值和摘要文件中的测试结果进行匹配,因为对具体类型的输入的系统推荐值是确定的,所以,根据这个输入在测试代码中运行的结果也是确定的,并且生成摘要文件的时候会把上述的测试结果一同收录到摘要文件里面,就是为了本步骤的数据结果匹配使用,同样是在步骤x22剩余的500条摘要结果中筛选后假设剩余20条,则显示下列一段字符提醒用户,其中系统可以规定当搜索结果的条数小于等于30的时候,就会显示tags标签:

[2][3][4][4]

显示的一段提醒字符:

result:20counts

tags:0-[求最大值=3],1-[排序=1],2-[arm平台=4],

3-[x86平台=3],4-[全平台=4];

其中0号标签表示的意思是指最后剩余3个代码段是用来求最大值的并且符合步骤x21至步骤x23三轮筛选的条件,1号标签表示的意思是指最后剩余1个代码段是用来排序的并且符合步骤x21至步骤x23三轮筛选的条件,2号标签是指剩余4个代码段既能够在arm平台上运行并且也能够满足步骤x21至步骤x23三轮筛选的条件。

步骤x24、获取用户选定的需要保留的第一标签,针对于步骤x23筛选出的摘要文件,将其中的标签与第一标签进行对比,再次筛选出标签和第一标签相同的摘要文件,获取用户选定的需要删除的第二标签,从上述再次筛选出的摘要文件中筛选出标签与第二标签相同的摘要文件,并且进行删除;

在本实施例中,设定保留某个标签的关键字时使用“hold:”,意思是输入这个关键字后,某号标签的代码段将会在推荐中保留下来,删除某个标签的关键字时使用“remove:”,意思是把该标签对应的在推荐的现实中进行删除,例如:

hold:0,4;或者remove:1,2,3;

表示满足0号标签和4号标签共同要求的元代码段在推荐显示中留下,其余删除,比如满足0号标签的,要求代码段能够求最大值功能,共有3个元代码段,满足4号标签的,要求代码段在能够求最大值的前提下也能够在全平台上运行,这样筛选下来,假如最后只剩下3条推荐,则会有如下语句提示用户:

result:3counts

xxx(表示3条摘要对应的库文件代码)。

步骤x25、将步骤x24最终保留的摘要文件推荐给用户,供用户获取到相应的库文件进行测试和选择。在本实施例中,当用户获取到系统推荐的每个摘要文件时,调用该摘要文件指向的库文件中的测试代码,同时用户选定测试数据以及输入对应测试数据的输出值,将测试输出输入到测试代码中进行运行,获取到测试结果,若获取到的上述测试结果与用户针对选定的测试数据输入的输出值相同,则该摘要文件保留,反之则删除。

在本实施例中,步骤x25之后,用户可以根据摘要文件所指向的库文件中测试代码的运行时间以及库文件占用内存空间等参数进行更加深入的筛选;例如用户手动输入3组[int,int]的具体数值,在对应推荐的摘要文件所指向的库文件中的测试代码中运行并显示出运行结果和耗用时间,例如手动输入了testin:[7,4][12,2][999,0](其中testin是表示手动测试库文件的关键字或是称它为标识符),这个时候,这个输入会在剩余推荐的a元代码段,b元代码段,c元代码段中进行运行,并且显示出运行结果和耗用时间,例如显示出:

testout:a:[7][12][999]:0.01s

b:[7][12][999]:0.03s

c:[7][12][999]:0.02s

此时,用户可以根据上述运行时间最短的a元代码段。

其中,如果用户想要看符合要求的代码段的一些参数(复杂度,运行速度,占用内存空间大小等),需要手动敲入关键字:show-文件名.up,.up表示参数上升排序,.f表示参数大小下降排序;

例如手动敲入:

show-a.up或者show(复杂度上升的顺序排序-默认排序)

则会显示三个库文件的运行参数(排好序的)如下:

sort:a-[复杂度],b-[运行速度],c-[内存占用大小];

a.h:10;0.02s;0.1kb;

b.h:20;0.03s;0.2kb;

c.h:30;0.01s;0.3kb;

上述操作后,若想保留理想的代码段或是移除相对不理想的代码段,则可以进行以下操作例如:

hold:[7][12][999];↙

或者hold:a.test(保留与a.h测试结果相同的库文件);↙

或者remove:b.test(移除与b.h测试结果相同的库文件);↙

删除后剩余显示:

a.h:10;0.02s;0.1kb;

c.h:30;0.01s;0.3kb;

随着上述操作,符合条件的元代码即对应库文件将越来越少,其中在上述操作后,若剩下了两个符合条件的代码段分别是a.h,和b.h,那么如果程序员想要查看某个库文件的具体代码段就可以敲入关键字+库文件名字,例如敲入view:a.h,c.h↙后则会显示对应库文件的元代码段供用户参考,以便于用户选择一个最终的代码段。另外,在用户确定某个库文件后,并且想用该库文件中的元代码段的话,只需要手动敲入determine+库文件名字即可,例如:determine:a.h↙。

实施例3

本实施例公开了一种代码自动联结方法,步骤如下:

步骤y1、首先获取实施例1中代码库文件生成方法生成供用户选定的库文件及指向库文件的摘要文件;

步骤y2、获取自定义的用户函数名,针对于用户选定的库文件,读取指向该库文件的摘要文件的函数名,并且定义为库文件函数名;提取到该库文件元代码中对应的函数定义内容并做如下修改:将函数定义内容中库文件函数名替换为用户函数名,然后将上述修改后的函数定义内容添加到用户输入的源代码中;

获取自定义的用户函数名;针对于用户选定的库文件,读取指向该库文件的摘要文件的函数名,并且定义为库文件函数名;同时新建头文件并且以用户函数名命名,然后提取到该库文件元代码中对应的函数定义内容并做如下修改:将函数定义内容中库文件函数名替换为用户函数名,并且将上述修改后的函数定义内容添加到新建的头文件中,最后在用户输入的源代码中添加调用该头文件的语句;

步骤y3,针对于用户选定的库文件,在用户选择传入变量后获取该库文件中的调用语句,将上述调用语句添加到用户输入的源代码中用户指定函数调用位置,并且将其中的变量名修改为用户传入的变量名。

在本实施例中,如下代码4为用户选定的库文件中元代码段,当将库文件元代码段中函数名对应的函数定义内容直接添加到用户的源代码后,得到的用户源代码为如下的代码5。在本实施例代码自动联结方法中会提醒用户修改传入变量:inta[],intn;//传入类型变量名;此时用户输入以下内容:a[]->b[],n->n↙,即可实现将调用语句中的a[]和n变量分别修改为用户选择传入的变量b[]和n,将“n=sizeof(a)/sizeof(int);”修改成了“n=sizeof(b)/sizeof(int);”,将“insert_sort(a,n)”修改成了“insert_sort(b,n);”

代码4:

代码5:

实施例4

本实施例公开了一种代码优化方法,步骤如下:

步骤z1、首先获取权利要求1至5中任一项所述的代码库文件生成方法生成库文件及指向库文件的摘要文件,定义为第一库文件以及第一摘要文件;

针对于用户选定的源代码段,首先生成一个第二库文件,同时获取该源代码段的入口和出口,从入口和出口提取出输入\输出参数类型和函数名,然后将该源代码段及其提取出的输入\输出参数类型和函数名均添加到第二库文件;

同时针对于用户选定的源代码段,对其进行扩增生成测试代码,并且存储到第二库文件中,同时生成测试数据列表,然后在测试代码中输入测试数据列表中的各组测试数据,通过测试代码运行后得到对应的各组输出结果,将上述各组输出结果添加到第二库文件;

同时,在第二库文件中添加扩增测试数据;

步骤z2、针对于步骤z1生成的第二库文件,生成一个指向其的第二摘要文件,提取第二库文件中存储的输入\输出参数类型、函数名、各组输出结果以及扩增测试数据,并且将上述提取的结果作为摘要内容存储到第二摘要文件中,同时将第二库文件的地址存储到第二摘要文件中;

步骤z3、将步骤z2得到的指向第二库文件的第二摘要文件与步骤z1中获取到的指向各第一库文件的各第一摘要文件进行匹配,具体匹配过程如下:

步骤z31、获取第二摘要文件中的输入类型,然后从各第一摘要文件中筛选选出输入类型与第二摘要文件中的输入类型相同的第一摘要文件;

步骤z32、获取第二摘要文件中的输出类型,从步骤z31中筛选出的各第一摘要文件中再次筛选出输出类型与第二摘要文件中的输出类型相同的第一摘要文件;

步骤z33、获取第二摘要文件中的各组输出结果,从步骤z32中筛选出的各第一摘要文件中再次筛选出各组输出结果与第二摘要文件中的各组输出结果对应相同的第一摘要文件;

步骤z34、针对于步骤z33筛选出的各第一摘要文件,在其中添加扩增测试数据,同时获取其指向的各第一库文件并且在其中添加扩增测试数据;针对于上述获取到的每一第一库文件中,在测试代码中输入指向其的第一摘要文件中的各组扩增测试数据,通过测试代码运行后得到对应的各组临时输出结果,将上述各组临时输出结果按照对应各组扩增测试数据的排序添加到的该第一库文件及指向该第一库文件的第一摘要文件中;

同时针对于第二库文件,调用其中的测试代码,然后在测试代码中分别输入第二摘要文件中的各组扩增测试数据,通过测试代码运行后得到对应的各组临时输出结果,将上述各组临时测试结果按照对应各组扩增数据的排序添加到的该第二库文件及第一摘要文件中;

步骤z35、获取第一摘要文件中的各组临时测试结果,从步骤z34获取到的各第一摘要文件中筛选出各组临时测试结果与第二摘要文件中的各组临时测试结果对应相同的第一摘要文件;

步骤z36、针对步骤z35筛选出的各第一摘要文件,通过其中存储的库文件地址查找到各第一库文件,获取到上述各第一库文件中测试代码的运行时间;然后将步骤z35筛选出的各第一摘要文件以及其指向的各第一库文件中测试代码的运行时间展示给用户,以供用户进行选择,最后将用户选择出的第一摘要文件中存储的库文件地址所指向的第一库文件中的元代码段作为优化代码段,用优化代码段替换掉用户选定的源代码段。

本实施例中,采用优化代码段替换掉用户选定的代码段的具体过程如下:

步骤z361、检索指向优化代码段所在第一库文件的第一摘要文件和指向被优化代码段的第二摘要文件,读取该第一摘要文件和第二摘要文件中的函数名,分别对应定义为库文件函数名和用户函数名;提取到该第一库文件元代码中对应的函数定义内容并做如下修改:将函数定义内容中的库文件函数名替换为用户函数名;然后将上述修改后的函数定义内容添加到用户输入的源代码中;

或者检索指向优化代码段所在第一库文件的第一摘要文件和指向被优化代码段的第二摘要文件,读取该第一摘要文件和第二摘要文件中的函数名,分别对应定义为库文件函数名和用户函数名;新建头文件并且以用户函数名命名,提取到该第一库文件元代码中对应的函数定义内容并做如下修改:将函数定义内容中的库文件函数名替换为用户函数名;然后将上述修改后的函数定义内容添加到新建的头文件中,最后在用户输入的源代码中添加调用该头文件的语句;

步骤z362、针对于优化代码段所在第一库文件,在用户选择传入变量后获取该第一库文件中的调用语句,将上述调用语句添加到用户输入的源代码中用户指定函数调用位置,并且将其中的变量修改为用户传入的变量名。

在本实施例步骤s36中,用户可以根据第一摘要文件所指向的第一库文件中测试代码的运行时间以及库文件占用内存空间等参数进行更加深入的筛选,并且进行代码参数的显示、查看代码以及确定代码的操作;具体更深入的筛选方式以及代码参数显示、查看代码和确定代码的操作和实施例2中一样。

实施例5

本实施例公开了一种代码辅助移植方法,步骤如下:

步骤b1、首先获取实施例1所述代码库文件生成方法生成库文件及指向库文件的摘要文件,定义为第一库文件以及第一摘要文件;

在接收到用户的源代码移植请求时,首先根据切片规则文件将源代码划分为具有完整功能的各独立代码段;针对于上述获取到的需要进行移植的各代码段,首先分别生成一个第三库文件,并且检索各代码段的输入\输出语句,从输入输出语句中提取出输入\输出参数类型以及函数名,然后将上述提取到的输入\输出参数类型、函数名存储到各代码段对应的第三库文件中;

同时,针对于上述获取到的需要进行移植的各代码段,对其进行扩增生成测试代码,并且生成多组测试数据,由多组测试数据排序生成测试数据列表,然后在测试代码段中输入测试数据列表中的各组测试数据,通过测试代码运行后得到对应的各组测试结果,将上述各组测试结果按照对应各组测试数据的排序添加到的第三库文件;

针对于上述获取到的各代码段的第三库文件,生成一个指向其的第三摘要文件,提取第三库文件中存储的输入\输出参数类型、函数名以及各组测试结果,并且将上述提取的结果作为摘要内容存储到第三摘要文件中,同时将第三库文件的地址存储到第三摘要文件中;

步骤b2、针对于步骤b1得到的指向各第三库文件的各第三摘要文件,将其与步骤b1中获取到的指向各第一库文件的各第一摘要文件进行匹配,具体匹配过程如下:

步骤b21、获取第三摘要文件中的输入类型和输出类型,同时获取用户要移植到的代码的语言及环境信息,作为指定语言及环境信息,然后从各第一摘要文件中筛选出输入类型和输出类型与第三摘要文件相同且语言及环境信息为上述指定语言及环境信息的第一摘要文件;

步骤b22、获取第三摘要文件中的各组输出结果,从步骤b21中筛选出的各第一摘要文件中再次筛选出各组输出结果与第三摘要文件中的各组输出结果对应相同的第一摘要文件;针于上述筛选出的各第一摘要文件,通过其中存储的库文件地址查找到各第一库文件,获取到上述各第一库文件中测试代码的运行时间;然后将上述筛选出的各第一摘要文件以及其指向的各第一库文件中测试代码的运行时间展示给用户,以供用户为需要移植的各代码段选定对应第一摘要文件;

步骤b23、针对于用户最终为需要移植的代码段对应所选定第一摘要文件和需要移植的代码段的第三摘要文件,读取该第一摘要文件和第三摘要文件中的函数名,分别对应定义为库文件函数名和用户函数名;提取到该第一摘要文件所指向的第一库文件元代码中对应的函数定义内容并做如修改:将函数定义内容中的库文件函数名替换为用户函数名;然后将上述修改后的函数定义内容添加到用户输入的源代码中;

或者针对于用户最终为需要移植的代码段对应所选定第一摘要文件和需要移植的代码段的第三摘要文件,读取该第一摘要文件和第三摘要文件中的函数名,分别对应定义为库文件函数名和用户函数名;新建头文件并且以用户函数名命名;提取到该第一摘要文件所指向的第一库文件元代码中对应的函数定义内容并做如下修改:将函数定义内容中的库文件函数名替换为用户函数名;然后将上述修改后的函数定义内容添加到新建的头文件中,最后在用户输入的源代码中添加调用该头文件的语句;

步骤b24、针对于用户最终为需要移植的每个源代码段对应所选定的第一摘要文件所指向的第一库文件,在用户选择传入变量后获取该第一库文件中的调用语句,将上述调用语句添加到用户输入的源代码中用户指定函数调用位置,并且将其中的变量修改为用户传入的变量名。

在本实施例中,步骤b1所述的源代码划分可以是用户手动划分或系统自动划分,其中:

手动划分是指:用户手动选定一些语句划为一个代码段;比如:

(划分操作)divide:3(行语句)-9(行语句),......toinsert_sort(代码段名1);

系统自动划分是指:按照实现具体功能的结构的定义语句进行识别,比如:c++中的函数结构,java中的类结构。

例如用户的旧源代码(标记为代码6)为如下:

代码6:

则代码7的c语言通过通过本实施例方法移植后得到java语言环境下的新源代码(标记为代码7)如下:

需要说明的是,上述各实施例中所涉及到的测试数据均是系统规定的,多组测试数据按照确定的次序排列形成测试数据表列,测试数据表列同样是系统规定的。每种基本类型数据都有对应的测试数据。摘要文件中保存的测试结果按照测试数据表列的次序对应保存。故系统可以根据用户选定的测试数据的次序找到对应的测试结果。举例说明:输入类型为int的→int的测试数据表列为:0,1,2,3,4,5并反馈给用户选择,此时用户选择了:0(表列中次序为1),1(表列中次序为2),用户输入对应结果:0,2,系统根据次序检索测试结果中第一个输出(次序1)结果为0且第二个(次序2)测试结果为2的摘要文件,以此可以寻找到测试结果与用户针对选定的测试数据所述输入的输出值的摘要文件。

上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1