CN116166236A - 代码推荐方法、装置、计算机设备及存储介质 - Google Patents
代码推荐方法、装置、计算机设备及存储介质 Download PDFInfo
- Publication number
- CN116166236A CN116166236A CN202211500911.1A CN202211500911A CN116166236A CN 116166236 A CN116166236 A CN 116166236A CN 202211500911 A CN202211500911 A CN 202211500911A CN 116166236 A CN116166236 A CN 116166236A
- Authority
- CN
- China
- Prior art keywords
- code
- intermediate representation
- function
- codes
- generating
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/33—Intelligent editors
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Stored Programmes (AREA)
Abstract
本公开提供了一种代码推荐方法、装置、计算机设备及存储介质,其中,该方法包括:获取经过代码编辑器输入的第一代码;基于第一代码,生成第一代码对应的中间表示代码;调用训练的代码推荐模型,代码推荐模型采用神经网络结构,以待预测代码的中间表示代码为输入,以该待预测代码相关联的参考代码对应的中间表示代码作为输出,通过代码推荐模型基于第一代码对应的中间表示代码预测得到第一代码相关的目标参考代码对应的中间表示代码;基于目标参考代码对应的中间表示代码,生成与第一代码的代码类型匹配的目标参考代码,目标参考代码用于作为进行后续代码编写的参考代码进行代码推荐。
Description
技术领域
本公开涉及互联网技术领域,具体而言,涉及一种代码推荐方法、装置、计算机设备及存储介质。
背景技术
在互联网行业中,程序员会根据业务需求编写代码,而程序员编写的代码通常与已有的其他代码相似。因此,需要提出一个能够帮助程序员搜索已有代码的代码搜索工具,以利用代码搜索工具协助程序员扩展编写的代码片段。
一般的,在程序员编写部分代码之后,代码搜索工具通过确定编写的部分代码的代码特征、和已有代码的代码特征,比如代码特征包括方法名、应用程序编程接口(Application Programming Interface,API)序列等,并通过确定的代码特征之间的相似度,确定为部分代码推荐的代码片段。但是,上述方式中未考虑代码的上下文信息,以及所推荐的代码片段未进行实例化处理、未进行上下文融合,使得代码推荐的精准度较低。
发明内容
本公开实施例至少提供一种代码推荐方法、装置、计算机设备及存储介质。
第一方面,本公开实施例提供了一种代码推荐方法,包括:
获取经过代码编辑器输入的第一代码;
基于所述第一代码,生成所述第一代码对应的中间表示代码;
调用训练的代码推荐模型,所述代码推荐模型采用神经网络结构,以待预测代码的中间表示代码为输入,以该待预测代码相关联的参考代码对应的中间表示代码作为输出,通过所述代码推荐模型基于所述第一代码对应的中间表示代码预测得到所述第一代码相关的目标参考代码对应的中间表示代码;
基于所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码,所述目标参考代码用于作为进行后续代码编写的参考代码进行代码推荐。
一种可选的实施方式中,所述目标参考代码对应的中间表示代码由至少一条中间表示语句构成,所述通过所述代码推荐模型基于所述第一代码对应的中间表示代码预测得到所述第一代码相关的目标参考代码对应的中间表示代码,包括:
将所述第一代码对应的中间表示代码作为当前输入数据,输入至所述代码推荐模型,得到至少一条中间表示语句;
将所述至少一条中间表示语句作为新的当前输入数据,返回至输入至所述代码推荐模型,得到至少一条中间表示语句的步骤,直至得到的至少一条中间表示语句中存在截止语句;
基于得到的中间表示语句,得到所述第一代码相关的目标参考代码对应的中间表示代码。
一种可选的实施方式中,所述基于所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码,包括:
调用训练得到的代码转换模型,以所述第一代码和所述目标参考代码对应的中间表示代码为输入,以与所述第一代码的代码类型相关的参考代码为输出,通过所述代码转换模型基于所述第一代码和所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码;或者
基于所述第一代码的代码类型、与所述中间表示代码的代码类型之间的代码映射关系,以及所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码。
一种可选的实施方式中,在所述获取经过代码编辑器输入的第一代码之后,还包括:
确定所述第一代码对应的第一特征向量;
基于所述第一代码对应的第一特征向量、和代码库中各个候选函数代码分别对应的第二特征向量,确定与所述第一代码匹配的预设数量个目标函数代码;
基于所述预设数量个目标函数代码,对第一待训练神经网络进行训练,得到所述代码推荐模型。
一种可选的实施方式中,所述确定所述第一代码对应的第一特征向量,包括:
对所述第一代码进行符号执行分析,得到所述第一代码对应的至少一组多项式;
对所述至少一组多项式进行特征提取,生成所述第一代码对应的多项式特征数据;
利用所述多项式特征数据,和/或,对所述第一代码进行特征提取得到的函数特征数据,生成所述第一代码对应的第一特征向量。
一种可选的实施方式中,所述基于所述预设数量个目标函数代码,对第一待训练神经网络进行训练,得到所述代码推荐模型,包括:
生成每个所述目标函数代码对应的样本中间表示代码;其中,所述目标函数代码包括多个函数代码块,所述样本中间表示代码包括每个所述函数代码块对应的局部中间表示代码;
针对每个所述目标函数代码,将所述目标函数代码中多个函数代码块划分为第一函数代码块和第二函数代码块;将所述第一函数代码块对应的局部中间表示代码输入至第一待训练神经网络,生成预测中间表示代码;
基于各个所述目标函数代码分别对应的所述预测中间表示代码和所述第二函数代码块的局部中间表示代码,对所述第一待训练神经网络进行训练,得到代码推荐模型。
一种可选的实施方式中,在所述目标参考代码为利用代码转换模型得到时,所述方法还包括:
针对每个所述目标函数代码,将所述第一函数代码块和所述第二函数代码块对应的局部中间表示代码,输入至第二待训练神经网络,生成预测代码块;
基于各个所述目标函数代码分别对应的所述预测代码块和所述第二函数代码块,对所述第二待训练神经网络进行训练,得到代码转换模型。
一种可选的实施方式中,在所述获取经过代码编辑器输入的第一代码之后,所述方法还包括:
在所述第一代码的代码类型属于编译类代码时,检测所述第一代码是否可编译;
若不可编译,则对所述第一代码进行调整,得到可编译的调整后第一代码;
所述基于所述第一代码,生成所述第一代码对应的中间表示代码,包括:
基于所述调整后第一代码,生成所述调整后第一代码对应的中间表示代码。
第二方面,本公开实施例还提供一种代码推荐装置,包括:
获取模块,用于获取经过代码编辑器输入的第一代码;
第一生成模块,用于基于所述第一代码,生成所述第一代码对应的中间表示代码;
第二生成模块,用于调用训练的代码推荐模型,所述代码推荐模型采用神经网络结构,以待预测代码的中间表示代码为输入,以该待预测代码相关联的参考代码对应的中间表示代码作为输出,通过所述代码推荐模型基于所述第一代码对应的中间表示代码预测得到所述第一代码相关的目标参考代码对应的中间表示代码;
第三生成模块,用于基于所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码,所述目标参考代码用于作为进行后续代码编写的参考代码进行代码推荐。
一种可选的实施方式中,所述目标参考代码对应的中间表示代码由至少一条中间表示语句构成,所述第二生成模块,在通过所述代码推荐模型基于所述第一代码对应的中间表示代码预测得到所述第一代码相关的目标参考代码对应的中间表示代码时,用于:
将所述第一代码对应的中间表示代码作为当前输入数据,输入至所述代码推荐模型,得到至少一条中间表示语句;
将所述至少一条中间表示语句作为新的当前输入数据,返回至输入至所述代码推荐模型,得到至少一条中间表示语句的步骤,直至得到的至少一条中间表示语句中存在截止语句;
基于得到的中间表示语句,得到所述第一代码相关的目标参考代码对应的中间表示代码。
一种可选的实施方式中,所述第三生成模块,在基于所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码时,用于:
调用训练得到的代码转换模型,以所述第一代码和所述目标参考代码对应的中间表示代码为输入,以与所述第一代码的代码类型相关的参考代码为输出,通过所述代码转换模型基于所述第一代码和所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码;或者
基于所述第一代码的代码类型、与所述中间表示代码的代码类型之间的代码映射关系,以及所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码。-
一种可选的实施方式中,在所述获取经过代码编辑器输入的第一代码之后,还包括:训练模块,用于:
确定所述第一代码对应的第一特征向量;
基于所述第一代码对应的第一特征向量、和代码库中各个候选函数代码分别对应的第二特征向量,确定与所述第一代码匹配的预设数量个目标函数代码;
基于所述预设数量个目标函数代码,对第一待训练神经网络进行训练,得到所述代码推荐模型。
一种可选的实施方式中,所述训练模块,在确定所述第一代码对应的第一特征向量时,用于:
对所述第一代码进行符号执行分析,得到所述第一代码对应的至少一组多项式;
对所述至少一组多项式进行特征提取,生成所述第一代码对应的多项式特征数据;
利用所述多项式特征数据,和/或,对所述第一代码进行特征提取得到的函数特征数据,生成所述第一代码对应的第一特征向量。
一种可选的实施方式中,所述训练模块,在基于所述预设数量个目标函数代码,对第一待训练神经网络进行训练,得到所述代码推荐模型时,用于:
生成每个所述目标函数代码对应的样本中间表示代码;其中,所述目标函数代码包括多个函数代码块,所述样本中间表示代码包括每个所述函数代码块对应的局部中间表示代码;
针对每个所述目标函数代码,将所述目标函数代码中多个函数代码块划分为第一函数代码块和第二函数代码块;将所述第一函数代码块对应的局部中间表示代码输入至第一待训练神经网络,生成预测中间表示代码;
基于各个所述目标函数代码分别对应的所述预测中间表示代码和所述第二函数代码块的局部中间表示代码,对所述第一待训练神经网络进行训练,得到代码推荐模型。
一种可选的实施方式中,在所述目标参考代码为利用代码转换模型得到时,所述训练模块,还用于:
针对每个所述目标函数代码,将所述第一函数代码块和所述第二函数代码块对应的局部中间表示代码,输入至第二待训练神经网络,生成预测代码块;
基于各个所述目标函数代码分别对应的所述预测代码块和所述第二函数代码块,对所述第二待训练神经网络进行训练,得到代码转换模型。
一种可选的实施方式中,在所述获取经过代码编辑器输入的第一代码之后,所述装置还包括:检测模块,用于:
在所述第一代码的代码类型属于编译类代码时,检测所述第一代码是否可编译;
若不可编译,则对所述第一代码进行调整,得到可编译的调整后第一代码;
所述基于所述第一代码,生成所述第一代码对应的中间表示代码,包括:
基于所述调整后第一代码,生成所述调整后第一代码对应的中间表示代码。
第三方面,本公开实施例还提供一种计算机设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当计算机设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
第四方面,本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
本公开实施例提供的代码推荐方法、装置、计算机设备及存储介质,通过对第一代码进行处理,生成第一代码对应的中间表示代码,由于中间表示代码能够消除第一代码中用例名称的干扰,排除高级语言语法糖(Syntactic suga)的干扰,简化了代码语句比如简化了类似for循环等的关键词,去除了第一代码中的部分无效的冗余信息,使得中间表示代码能够较准确的表征代码意图,进而基于中间表示代码,使得代码推荐模型能够较准确的确定推荐的目标参考代码对应的中间表示代码,再基于目标参考代码对应的中间表示代码,较准确的生成目标参考代码,提高了代码推荐的精准度和效果。同时,由于中间表示代码包括上下文信息,使得代码推荐模型能够结合上下文信息,实现代码的精准推荐。
为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,此处的附图被并入说明书中并构成本说明书中的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。应当理解,以下附图仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1示出了本公开实施例所提供的一种代码推荐方法的流程图;
图2示出了本公开实施例所提供的代码推荐方法中,确定第一代码对应的多项式的具体方法的流程图;
图3示出了本公开实施例所提供的另一种代码推荐方法的流程图;
图4示出了本公开实施例所提供的另一种代码推荐方法的流程图;
图5示出了本公开实施例所提供的一种代码推荐装置的示意图;
图6示出了本公开实施例所提供的一种计算机设备的结构示意图。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
相关技术中,一种方式中,在程序员编写部分代码之后,代码搜索工具通过确定编写的部分代码的代码特征、和已有代码的代码特征,比如代码特征包括方法名、应用程序编程接口(Application Programming Interface,API)序列等,并通过确定的代码特征之间的相似度,确定为部分代码推荐的代码片段。但是,上述方式中未考虑代码的上下文信息,以及所推荐的代码片段未进行实例化处理、未进行上下文融合,使得代码推荐的精准度较低。
另一种方式中,可以利用深度学习技术进行代码推荐。比如,可以通过在已有的完整的代码中获取不同长度的代码片段作为训练样本,对构建的神经网络模型进行训练,得到目标神经网络模型。或者,在获取到不同长度的代码片段后,确定代码片段的抽象语法树(Abstract Syntax Tree,AST)信息,利用多个代码片段分别对应的AST信息作为训练样本,对构建的神经网络模型进行训练,得到目标神经网络模型。由于程序员的需求比较模糊、代码意图比较开放,而代码片段或代码片段对应的AST信息无法较准确的表征代码意图,造成训练得到的目标神经网络模型无法较精准的确定程序员的意图和需求,使得目标神经网络模型确定的推荐代码的精度较低,代码推荐的效果较差。
基于上述研究,本公开提供了一种代码推荐方法,该方法通过对第一代码进行处理,生成第一代码对应的中间表示代码,由于中间表示代码能够消除第一代码中用例名称的干扰,排除高级语言语法糖的干扰,简化了代码语句比如简化了类似for循环等的关键词,去除了第一代码中的部分无效的冗余信息,使得中间表示代码能够较准确的表征代码意图,进而基于中间表示代码,使得代码推荐模型能够较准确的确定推荐的目标参考代码的中间表示代码,再基于目标参考代码的中间表示代码,较准确的生成目标参考代码,提高了代码推荐的精准度和效果。同时,由于中间表示代码包括上下文信息,使得代码推荐模型能够结合上下文信息,实现代码的精准推荐。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
本文中术语“和/或”,仅仅是描述一种关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合,例如,包括A、B、C中的至少一种,可以表示包括从A、B和C构成的集合中选择的任意一个或多个元素。
可以理解的是,在使用本公开各实施例公开的技术方案之前,均应当依据相关法律法规通过恰当的方式对本公开所涉及个人信息的类型、使用范围、使用场景等告知用户并获得用户的授权。
例如,在响应于接收到用户的主动请求时,向用户发送提示信息,以明确地提示用户,其请求执行的操作将需要获取和使用到用户的个人信息。从而,使得用户可以根据提示信息来自主地选择是否向执行本公开技术方案的操作的电子设备、应用程序、服务器或存储介质等软件或硬件提供个人信息。
作为一种可选的但非限定性的实现方式,响应于接收到用户的主动请求,向用户发送提示信息的方式例如可以是弹窗的方式,弹窗中可以以文字的方式呈现提示信息。此外,弹窗中还可以承载供用户选择“同意”或者“不同意”向电子设备提供个人信息的选择控件。
可以理解的是,上述通知和获取用户授权过程仅是示意性的,不对本公开的实现方式构成限定,其它满足相关法律法规的方式也可应用于本公开的实现方式中。
为便于对本实施例进行理解,首先对本公开实施例所公开的一种代码推荐方法进行详细介绍,本公开实施例所提供的代码推荐方法的执行主体一般为具有一定计算能力的计算机设备。
下面以执行主体为服务器为例对本公开实施例提供的代码推荐方法加以说明。本公开提出的代码推荐方法可以应用于集成开发环境(Integrated DevelopmentEnvironment,IDE)的代码预测场景中,也可以应用在代码错误修复场景中。
参见图1所示,为本公开实施例提供的代码推荐方法的流程图,所述方法包括S101~S104,其中:
S101,获取经过代码编辑器输入的第一代码;
S102,基于所述第一代码,生成所述第一代码对应的中间表示代码;
S103,调用训练的代码推荐模型,所述代码推荐模型采用神经网络结构,以待预测代码的中间表示代码为输入,以该待预测代码相关联的参考代码对应的中间表示代码作为输出,通过所述代码推荐模型基于所述第一代码对应的中间表示代码预测得到所述第一代码相关的目标参考代码对应的中间表示代码;
S104,基于所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码,所述目标参考代码用于作为进行后续代码编写的参考代码进行代码推荐。
下述对S101-S104进行具体说明。
在S101中,第一代码为程序员基于业务需求,在代码编辑器中输入的代码,进而服务器可以从代码编辑器中获取第一代码。第一代码的代码类型可以为任意类型,比如,第一代码包括但不限于:Java类代码、golang类代码(即go语言代码)、C语言代码等需要编译的编译型代码,以及Python类代码、js(即Javascript)类代码等不需要编译的解释型代码。
在S102中,在获取待第一代码之后,可以对第一代码进行转换处理,生成第一代码对应的中间表示(Intermediate Representation,IR)代码。在编程行业内,IR是表示程序结构的一种方式。
实施时,编译型代码可以通过调用编译模块对源代码进行编译,生成源代码(比如第一代码)对应的IR代码,解释型代码可以直接基于源代码生成IR代码。比如,可以利用已有的代码转换模块,对解释型代码进行转换处理,生成对应的IR代码。或者,也可以对解释型代码进行微调,将微调后的代码作为IR代码。再或者,还可以直接将解释型代码作为IR代码。
一般的,每种代码类型存在对应结构的IR代码,故第一代码的转换处理方式和IR代码的结构类型,可以根据第一代码的实际情况进行选取,此处仅为示例性说明。比如,golang语言可以使用go/ast包将源代码(即第一代码)转化成静态单赋值(Static Single-Assignment,SSA)结构的IR代码,即SSA结构代码为golang语言对应的IR代码;swift语言可以使用swiftc-emit-sil将源代码转成swift中间语言(Swift Intermediate Language,sil)格式的IR代码等。
一种可选实施方式中,在所述获取经过代码编辑器输入的第一代码之后,所述方法还包括:在所述第一代码的代码类型属于编译类代码时,检测所述第一代码是否可编译;若不可编译,则对所述第一代码进行调整,得到可编译的调整后第一代码。
基于所述第一代码,生成所述第一代码对应的中间表示代码,包括:基于所述调整后第一代码,生成所述调整后第一代码对应的中间表示代码。
考虑到编译类代码需要进行编译,以便生成对应的中间表示代码,故在获取待第一代码之后,可以确定第一代码的代码类型。在第一代码的代码类型属于解释类代码时,则无需进行代码调整,可直接将第一代码进行转换处理,生成IR代码。
在第一代码的代码类型属于编译类代码时,检测第一代码是否可编译。若第一代码可编译,则直接对该第一代码进行转换处理,生成第一代码对应的中间表示代码。若第一代码不可编译,则可以对第一代码进行调整,得到可编译的调整后第一代码,以便后续基于调整后第一代码,生成调整后第一代码的中间表示代码。
其中,在保障第一代码中完整代码块不改动的基础上,第一代码的调整策略可以根据实际情况进行确定。比如,如果第一代码中最后一行代码没有完成,则调整策略可以为将未完成的代码删除。再比如,如果第一代码中if类型的block没有完成,则可以直接添加block结束符。再比如,如果第一代码编译需要校验未使用字符,则可以在第一代码中添加简单的log打印,以便将未使用过的字符进行使用。
这里,在第一代码属于编译类代码时,通过对不可编译的第一代码进行调整,得到调整后的第一代码,以便能够获取到调整后的第一代码的中间表示代码,为后续代码推荐过程提供保障和数据支持。
在S103中,在得到第一代码对应的中间表示代码之后,可以调用训练的代码推荐模型,将第一代码的中间表示代码输入至代码推荐模型,预测得到第一代码相关的目标参考代码对应的中间表示代码。其中,代码推荐模型可以为利用样本训练得到的通用模型,也可以为与第一代码匹配的模型,即与第一代码匹配的代码推荐模型为利用与第一代码匹配的已有函数代码训练得到的模型。比如,可以获取与第一代码匹配的已有的函数代码和函数代码的中间表示代码,利用函数代码和函数代码的中间表示代码,对待训练神经网络模型进行训练,得到与第一代码匹配的代码推荐模型。
这里,代码推荐模型采用神经网络结构,比如代码推荐模型可以为循环神经网络等。代码推荐模型的输入为待预测代码的中间表示代码,输出为待预测代码相关联的参考代码对应的中间表示代码。
一种可选实施方式中,所述目标参考代码对应的中间表示代码由至少一条中间表示语句构成,所述通过所述代码推荐模型基于所述第一代码对应的中间表示代码预测得到所述第一代码相关的目标参考代码对应的中间表示代码,包括:
将所述第一代码对应的中间表示代码作为当前输入数据,输入至所述代码推荐模型,得到至少一条中间表示语句;将所述至少一条中间表示语句作为新的当前输入数据,返回至输入至所述代码推荐模型,得到至少一条中间表示语句的步骤,直至得到的至少一条中间表示语句中存在截止语句;基于得到的中间表示语句,得到所述第一代码相关的目标参考代码对应的中间表示代码。
目标参考代码对应的中间表示代码可以有至少一条中间表示语句构成。实施时,可以将第一代码对应的中间表示代码作为当前输入数据,输入至代码推荐模型,代码推荐模型输出得到当前输入数据对应的至少一条中间表示语句。再将至少一条中间表示语句作为当前输入数据,输入至代码推荐模型,模型输出得到当前输入数据对应的至少一条中间表示语句。重复多次上述步骤,直至得到的至少一条中间表示语句中存在截止语句。其中,截止语句可以为IR代码中的默认截止语句,也可以为程序员根据需要设置的特定语句。
进而基于得到的中间表示语句,生成第一代码相关的目标参考代码对应的中间表示代码。比如,可以按照代码推荐模型的语句输出顺序,将各条中间表示语句进行组合,得到目标参考代码对应的中间表示代码。
这里,利用代码推荐模型和中间表示代码,通过多次迭代检测的方式,能够较准确的得到代码推荐模型推荐的中间表示语句,进而能够提高目标参考代码的精准度。
在S104中,在得到目标参考代码对应的中间表示代码之后,可以对目标参考代码对应的中间表示代码进行转换处理,生成与第一代码的代码类型匹配的目标参考代码。比如,若第一代码的代码类型为Java类代码,则目标参考代码也为Java类代码;若第一代码的代码类型为go语言类代码,则目标参考代码也可以go语言类代码。
一种可选实施方式中,所述基于所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码,包括:
方式一、调用训练得到的代码转换模型,以所述第一代码和所述目标参考代码对应的中间表示代码为输入,以与所述第一代码的代码类型相关的参考代码为输出,通过所述代码转换模型基于所述第一代码和所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码。
方式二、基于所述第一代码的代码类型、与所述中间表示代码的代码类型之间的代码映射关系,以及所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码。
针对方式一,可以训练一个代码转换模型,该代码转换模型用于将中间表示代码转换为与第一代码的代码类型匹配的代码,即将IR代码转换为源代码。代码转换模型可以为神经网络结构,代码转换模型的网络结构可以根据需要进行设置,比如代码转换模型可以为长短期记忆网络、转换transformer网络等。
将第一代码和目标参考代码对应的中间表示代码输入至代码转换模型,以第一代码作为参考数据,实现对目标参考代码对应的中间表示代码的转换,得到与第一代码的代码类型匹配的目标参考代码。其中,代码转换模型可以为训练的通用模型,也可以为利用与第一代码匹配的已有函数代码训练得到的、与第一代码匹配的模型。
针对方式二,确定第一代码的代码类型与中间表示代码的代码类型之间的代码映射关系,该代码映射关系可以为代码开发商提供的开源信息,也可以为程序员根据第一代码和中间表示代码生成。再可以根据代码映射关系,对目标中间代码进行转换处理,生成与第一代码的代码类型匹配的目标参考代码。
这里,通过上述两种方式,基于目标参考代码对应的中间表示代码,较灵活的生成与第一代码的代码类型匹配的目标参考代码。同时,本公开提出的方式一能够较精准的确定目标参考代码,方式二能够较高效的确定目标参考代码。
一种可选实施方式中,在所述获取经过代码编辑器输入的第一代码之后,还包括:
步骤1、确定所述第一代码对应的第一特征向量。
步骤2、基于所述第一代码对应的第一特征向量、和代码库中各个候选函数代码分别对应的第二特征向量,确定与所述第一代码匹配的预设数量个目标函数代码。
步骤3、基于所述预设数量个目标函数代码,对第一待训练神经网络进行训练,得到所述代码推荐模型。
针对步骤1,确定第一代码对应的第一特征向量。比如可以对第一代码进行特征提取,得到第一代码包括的特征信息,特征信息比如可以包括函数名、API信息等。对第一代码对应的特征信息进行向量化处理,生成第一代码对应的第一特征向量。
一种可选实施方式中,确定所述第一代码对应的第一特征向量,包括:对所述第一代码进行符号执行分析,得到所述第一代码对应的至少一组多项式;对所述至少一组多项式进行特征提取,生成所述第一代码对应的多项式特征数据;利用所述多项式特征数据,和/或,对所述第一代码进行特征提取得到的函数特征数据,生成所述第一代码对应的第一特征向量。
符号执行(Symbolic Execution)是一种程序分析技术,它可以通过分析程序来得到让特定代码区域执行的输入。利用符号执行技术,对第一代码进行分析,可以得到第一代码对应的至少一组多项式。
参见图2所示,该图2中的a区域示例性的示出了源代码(即第一代码),对图2中a区域的源代码进行符号执行分析,可以得到图2中b区域所示的代码流图、和c区域所示的分析表。根据图2中c区域的分析表可知,a区域示出的源代码对应的至少一组多项式包括:X>Y&Y-X<=0;X≤Y;X>Y&Y-X>0。
再可以对至少一组多项式进行特征提取,生成第一代码对应的多项式特征数据。其中,多项式特征数据包括的特征信息可以根据需要进行设置,此处不进行具体限定。
如下表1所示,表1示例性的提供了部分多项式特征数据:
表1多项式特征数据
再可以对多项式特征数据进行向量化处理,生成第一代码对应的第一特征向量。
考虑到第一代码对应的多项式能够较准确的表征代码执行路径,较准确的反应代码意图,故对多项式进行特征提取,生成多项式特征数据,该多项式特征数据能够较准确表征代码意图和业务需求;进而,利用多项式特征数据,生成第一代码对应的第一特征向量,该第一特征向量能够较准确的表征第一代码的特征信息,以便后续能够利用第一特征向量,较精准的确定与第一代码匹配的目标函数代码。
同时,通过符号执行技术将第一代码的输入空间转化为至少一组多项式,对此多项式组进行特征提取,生成多项式特征数据,利用多项式特征数据表征第一代码的特征信息,该多项式特征数据通过对代码输入空间的划分,能够更准确的获取到与代码输入、代码结构相关的特征信息,该特征信息能够较准确的表现出第一代码的功能。
实施时,还可以对第一代码进行特征提取,得到第一代码对应的函数特征数据,再对函数特征数据进行向量化处理,生成所述第一代码对应的第一特征向量。
实施时,还可以对第一代码进行特征提取,生成第一代码对应的函数特征数据。其中,函数特征数据的特征内容可以根据需要进行设置,此处不进行具体限定。
如下表2所示,表2示例性的提供了部分函数特征数据:
表2函数特征数据
特征 | 数值类型 |
函数名 | string |
函数参数及类型 | map(string,string) |
函数含有的api及个数 | map(string,int) |
函数返回值及类型 | map(string,string) |
函数所含分支及类型 | int |
另一种方式中,还可以对函数特征数据和多项式特征数据进行向量化处理,生成第一代码对应的第一特征向量。
这里,对第一代码对应的多项式进行特征提取得到多项式特征数据,以及对第一代码进行特征提取得到函数特征数据,再利用多项式特征数据和函数特征数据,生成第一特征向量,该第一特征向量表征的特征信息较为丰富,以便后续利用第一特征向量能够较准确的确定目标函数代码。
针对步骤2,实施时,可以预先确定代码库中各个候选函数代码对应的第二特征向量,其中,第二特征向量的确定过程可参考上述确定第一特征向量的描述,此处不在详述。代码库包括但不限于GitHub、China code等。
再基于第一代码对应的第一特征向量、和代码库中各个候选函数代码分别对应的第二特征向量,确定特征相似度;基于特征相似度,从各个候选函数代码中确定预设数量个目标函数代码,其中预设数量可以根据需要进行设置。比如,可以确定第一特征向量和第二特征向量之间的向量距离,基于该向量距离确定特征相似度;向量距离包括但不限于:欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离等。
针对步骤3,在确定了预设数量个目标函数代码之后,可以利用目标函数代码,对第一待训练神经网络进行训练,得到代码推荐模型。其中,第一待训练神经网络的网络结构可以根据需要进行设置,比如第一待训练神经网络可以为循环神经网络。
实施时,可以基于长短期记忆网络(Long Short-Term Memory,LSTM)构建第一待训练神经网络,或者,也可以基于transformer构建第一待训练神经网络。
一种可选实施方式中,所述基于所述预设数量个目标函数代码,对第一待训练神经网络进行训练,得到所述代码推荐模型,包括:
生成每个所述目标函数代码对应的样本中间表示代码;其中,所述目标函数代码包括多个函数代码块,所述样本中间表示代码包括每个所述函数代码块对应的局部中间表示代码;
针对每个所述目标函数代码,将所述目标函数代码中多个函数代码块划分为第一函数代码块和第二函数代码块;将所述第一函数代码块对应的局部中间表示代码输入至第一待训练神经网络,生成预测中间表示代码;
基于各个所述目标函数代码分别对应的所述预测中间表示代码和所述第二函数代码块的局部中间表示代码,对所述第一待训练神经网络进行训练,得到代码推荐模型。
实施时,可以生成每个目标函数代码对应的样本中间表示代码。其中,样本中间表示代码的生成过程,可以参考前述对S102中生成第一代码对应的中间表示代码的过程描述,此处不在详述。
其中,目标函数代码可以包括多个函数代码块,生成的样本中间表示代码可以包括每个函数代码块对应的局部中间表示代码。
针对每个目标函数代码,可以将目标函数代码中多个函数代码块划分为第一函数代码块和第二函数代码块,比如可以按照函数代码块的执行顺序,将将多个函数代码块中前面的至少一个函数代码块作为第一函数代码块、将其他函数代码块作为第二函数代码块。比如,若目标函数代码块包括函数代码块1、函数代码块2、…、函数代码块n,将函数代码块1至函数代码块m,作为第一函数代码块,将函数代码块m+1至函数代码块n作为第二函数代码块,其中,m、n为正整数,且m小于n。
再将第一函数代码块对应的局部中间表示代码输入至第一待训练神经网络,生成预测中间表示代码。再基于各个目标函数代码分别对应的预测中间表示代码和第二函数代码块的局部中间表示代码,对第一待训练神经网络进行训练,以使得预测中间表示代码与局部中间表示代码较相似,通过多轮训练得到代码推荐模型。
这里,通过利用与第一代码相似的预设数量个目标函数代码,对第一待训练神经网络进行训练,得到代码推荐模型,该代码推荐模型与第一代码较匹配,即代码推荐模型能够较精准的确定第一代码的意图,为第一代码确定目标参考代码,提高了代码推荐的精度。
一种可选实施方式中,在所述目标参考代码为利用代码转换模型得到时,所述方法还包括:
针对每个所述目标函数代码,将所述第一函数代码块和所述第二函数代码块对应的局部中间表示代码,输入至第二待训练神经网络,生成预测代码块;
基于各个所述目标函数代码分别对应的所述预测代码块和所述第二函数代码块,对所述第二待训练神经网络进行训练,得到代码转换模型。
在目标参考代码为利用代码转换模型得到时,还可以利用预设数量个目标函数代码,训练得到代码转换模型。
实施时,针对每个目标函数代码,将目标函数代码中多个函数代码块划分为第一函数代码块和第二函数代码块之后,可以将第一函数代码块和第二函数代码块对应的局部中间表示代码,输入至第二待训练神经网络,生成预测代码块。其中,第二待训练神经网络的网络结构可以根据需要进行设置,比如第二待训练神经网络可以为循环神经网络。
基于各个目标函数代码分别对应的预测代码块和第二函数代码块,对第二待训练神经网络进行训练,以使得预测代码块与第二函数代码块相似,通过多轮训练得到代码转换模型。
这里,通过利用与第一代码相似的预设数量个目标函数代码,对第二待训练神经网络进行训练,得到代码转换模型,该代码转换模型能够较精准的实现代码转换,即实现将中间表示代码转化为与第一代码的代码类型匹配的代码,提高了基于目标参考代码对应的中间表示代码生成目标参考代码的精准度。
结合图3对本公开提出的代码推荐方法的过程进行示例性说明,此处以利用代码转换模型确定目标参考代码为例进行说明。参见图4所示,该方法包括:
S401:获取经过代码编辑器输入的第一代码。
S402:对第一代码进行符号执行分析,得到第一代码对应的至少一组多项式;对至少一组多项式进行特征提取,生成第一代码对应的多项式特征数据。
S403:对第一代码进行特征提取,得到的函数特征数据。
S404:对多项式特征数据和函数特征数据进行向量化处理,生成第一代码对应的第一特征向量。
图3中的函数片段即为第一代码,对函数片段进行符号执行分析,得到多项式;对多项式进行特征提取,生成多项式特征数据,该多项式特征数据可以作为多项式模型。同时,对函数片段进行特征提取(即代码建模),得到函数模型(即函数特征数据)。将多项式模型和函数模型合并,并对合并后的模型进行向量化处理,得到函数向量(即第一代码的第一特征向量)。
S405:基于第一代码对应的第一特征向量、和代码库中各个候选函数代码分别对应的第二特征向量,确定各个候选函数代码分别与第一代码之间的向量距离。
S406:基于向量距离,对各个候选函数代码进行排序;并根据排序结果,从各个候选函数代码中确定与第一代码匹配的预设数量个目标函数代码。
目标函数代码即为与第一代码相似的函数代码。
S407:生成目标函数代码对应的样本中间表示代码、和第一代码对应的中间表示代码。
S408:利用目标函数代码和样本中间表示代码,对第一待训练神经网络和第二待训练神经网络进行训练,得到代码推荐模型和代码转换模型。
比如图3中的LSTM_1为代码推荐模型,LSTM_2为代码转换模型。
S409:将第一代码对应的中间表示代码输入至代码推荐模型,预测得到第一代码相关的目标参考代码对应的中间表示代码。
S410:基于目标参考代码对应的中间表示代码和代码转换模型,生成与第一代码的代码类型匹配的目标参考代码。
图3中的Token1可以视作为第一代码对应的中间表示代码。一种方式中,将Token1输入至代码推荐模型LSTM_1,得到Token1对应的至少一条中间表示语句Token2,将Token2输入至代码转换模型LSTM_2,得到该Token2对应的局部推荐代码Token2”;以及将Token2输入至代码推荐模型LSTM_1,得到下一次的至少一条中间表示语句Token3,重复上述步骤,直至得到的至少一条中间表示语句中存在截止语句,基于得到的中间表示语句Token2、…、TokenX,生成目标中间表示代码;以及基于局部推荐代码Token2”、…、局部推荐代码TokenX”,得到目标参考代码。
另一种方式中,将Token1输入至代码推荐模型LSTM_1,得到Token1对应的至少一条中间表示语句Token2,将Token2输入至代码推荐模型LSTM_1,得到Token2对应的至少一条中间表示语句Token3,重复上述步骤,直至得到的至少一条中间表示语句中存在截止语句,基于得到的中间表示语句Token2、…、TokenX,生成目标中间表示代码。
再将第一代码和目标中间表示代码中的各个中间表示语句Token2、…、TokenX分别输入至代码转换模型,得到各个局部推荐代码,即得到Token2对应的局部推荐代码Token2”、Token3对应的局部推荐代码Token3”、…、TokenX对应的局部推荐代码TokenX”。并基于局部推荐代码Token2”、…、局部推荐代码TokenX”,得到目标参考代码。
本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
基于同一发明构思,本公开实施例中还提供了与代码推荐方法对应的代码推荐装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述代码推荐方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
参照图5所示,为本公开实施例提供的一种代码推荐装置的架构示意图,所述装置包括:获取模块501、第一生成模块502、第二生成模块503、第三生成模块504;其中,
获取模块501,用于获取经过代码编辑器输入的第一代码;
第一生成模块502,用于基于所述第一代码,生成所述第一代码对应的中间表示代码;
第二生成模块503,用于调用训练的代码推荐模型,所述代码推荐模型采用神经网络结构,以待预测代码的中间表示代码为输入,以该待预测代码相关联的参考代码对应的中间表示代码作为输出,通过所述代码推荐模型基于所述第一代码对应的中间表示代码预测得到所述第一代码相关的目标参考代码对应的中间表示代码;
第三生成模块504,用于基于所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码,所述目标参考代码用于作为进行后续代码编写的参考代码进行代码推荐。
一种可选的实施方式中,所述目标参考代码对应的中间表示代码由至少一条中间表示语句构成,所述第二生成模块503,在通过所述代码推荐模型基于所述第一代码对应的中间表示代码预测得到所述第一代码相关的目标参考代码对应的中间表示代码时,用于:
将所述第一代码对应的中间表示代码作为当前输入数据,输入至所述代码推荐模型,得到至少一条中间表示语句;
将所述至少一条中间表示语句作为新的当前输入数据,返回至输入至所述代码推荐模型,得到至少一条中间表示语句的步骤,直至得到的至少一条中间表示语句中存在截止语句;
基于得到的中间表示语句,得到所述第一代码相关的目标参考代码对应的中间表示代码。
一种可选的实施方式中,所述第三生成模块504,在基于所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码时,用于:
调用训练得到的代码转换模型,以所述第一代码和所述目标参考代码对应的中间表示代码为输入,以与所述第一代码的代码类型相关的参考代码为输出,通过所述代码转换模型基于所述第一代码和所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码;或者
基于所述第一代码的代码类型、与所述中间表示代码的代码类型之间的代码映射关系,以及所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码。
一种可选的实施方式中,在所述获取经过代码编辑器输入的第一代码之后,还包括:训练模块505,用于:
确定所述第一代码对应的第一特征向量;
基于所述第一代码对应的第一特征向量、和代码库中各个候选函数代码分别对应的第二特征向量,确定与所述第一代码匹配的预设数量个目标函数代码;
基于所述预设数量个目标函数代码,对第一待训练神经网络进行训练,得到所述代码推荐模型。
一种可选的实施方式中,所述训练模块505,在确定所述第一代码对应的第一特征向量时,用于:
对所述第一代码进行符号执行分析,得到所述第一代码对应的至少一组多项式;
对所述至少一组多项式进行特征提取,生成所述第一代码对应的多项式特征数据;
利用所述多项式特征数据,和/或,对所述第一代码进行特征提取得到的函数特征数据,生成所述第一代码对应的第一特征向量。
一种可选的实施方式中,所述训练模块505,在基于所述预设数量个目标函数代码,对第一待训练神经网络进行训练,得到所述代码推荐模型时,用于:
生成每个所述目标函数代码对应的样本中间表示代码;其中,所述目标函数代码包括多个函数代码块,所述样本中间表示代码包括每个所述函数代码块对应的局部中间表示代码;
针对每个所述目标函数代码,将所述目标函数代码中多个函数代码块划分为第一函数代码块和第二函数代码块;将所述第一函数代码块对应的局部中间表示代码输入至第一待训练神经网络,生成预测中间表示代码;
基于各个所述目标函数代码分别对应的所述预测中间表示代码和所述第二函数代码块的局部中间表示代码,对所述第一待训练神经网络进行训练,得到代码推荐模型。
一种可选的实施方式中,在所述目标参考代码为利用代码转换模型得到时,所述训练模块505,还用于:
针对每个所述目标函数代码,将所述第一函数代码块和所述第二函数代码块对应的局部中间表示代码,输入至第二待训练神经网络,生成预测代码块;
基于各个所述目标函数代码分别对应的所述预测代码块和所述第二函数代码块,对所述第二待训练神经网络进行训练,得到代码转换模型。
一种可选的实施方式中,在所述获取经过代码编辑器输入的第一代码之后,所述装置还包括:检测模块506,用于:
在所述第一代码的代码类型属于编译类代码时,检测所述第一代码是否可编译;
若不可编译,则对所述第一代码进行调整,得到可编译的调整后第一代码;
所述基于所述第一代码,生成所述第一代码对应的中间表示代码,包括:
基于所述调整后第一代码,生成所述调整后第一代码对应的中间表示代码。
关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
基于同一技术构思,本公开实施例还提供了一种计算机设备。参照图6所示,为本公开实施例提供的计算机设备600的结构示意图,包括处理器601、存储器602、和总线603。其中,存储器602用于存储执行指令,包括内存6021和外部存储器6022;这里的内存6021也称内存储器,用于暂时存放处理器601中的运算数据,以及与硬盘等外部存储器6022交换的数据,处理器601通过内存6021与外部存储器6022进行数据交换,当计算机设备600运行时,处理器601与存储器602之间通过总线603通信,使得处理器601在执行以下指令:
获取经过代码编辑器输入的第一代码;
基于所述第一代码,生成所述第一代码对应的中间表示代码;
调用训练的代码推荐模型,所述代码推荐模型采用神经网络结构,以待预测代码的中间表示代码为输入,以该待预测代码相关联的参考代码对应的中间表示代码作为输出,通过所述代码推荐模型基于所述第一代码对应的中间表示代码预测得到所述第一代码相关的目标参考代码对应的中间表示代码;
基于所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码,所述目标参考代码用于作为进行后续代码编写的参考代码进行代码推荐。
一种可能的设计中,处理器601执行的指令中,所述目标参考代码对应的中间表示代码由至少一条中间表示语句构成,所述通过所述代码推荐模型基于所述第一代码对应的中间表示代码预测得到所述第一代码相关的目标参考代码对应的中间表示代码,包括:
将所述第一代码对应的中间表示代码作为当前输入数据,输入至所述代码推荐模型,得到至少一条中间表示语句;
将所述至少一条中间表示语句作为新的当前输入数据,返回至输入至所述代码推荐模型,得到至少一条中间表示语句的步骤,直至得到的至少一条中间表示语句中存在截止语句;
基于得到的中间表示语句,得到所述第一代码相关的目标参考代码对应的中间表示代码。
一种可能的设计中,处理器601执行的指令中,所述基于所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码,包括:
调用训练得到的代码转换模型,以所述第一代码和所述目标参考代码对应的中间表示代码为输入,以与所述第一代码的代码类型相关的参考代码为输出,通过所述代码转换模型基于所述第一代码和所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码;或者
基于所述第一代码的代码类型、与所述中间表示代码的代码类型之间的代码映射关系,以及所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码。
一种可能的设计中,处理器601执行的指令中,在所述获取经过代码编辑器输入的第一代码之后,还包括:
确定所述第一代码对应的第一特征向量;
基于所述第一代码对应的第一特征向量、和代码库中各个候选函数代码分别对应的第二特征向量,确定与所述第一代码匹配的预设数量个目标函数代码;
基于所述预设数量个目标函数代码,对第一待训练神经网络进行训练,得到所述代码推荐模型。
一种可能的设计中,处理器601执行的指令中,所述确定所述第一代码对应的第一特征向量,包括:
对所述第一代码进行符号执行分析,得到所述第一代码对应的至少一组多项式;
对所述至少一组多项式进行特征提取,生成所述第一代码对应的多项式特征数据;
利用所述多项式特征数据,和/或,对所述第一代码进行特征提取得到的函数特征数据,生成所述第一代码对应的第一特征向量。
一种可能的设计中,处理器601执行的指令中,所述基于所述预设数量个目标函数代码,对第一待训练神经网络进行训练,得到所述代码推荐模型,包括:
生成每个所述目标函数代码对应的样本中间表示代码;其中,所述目标函数代码包括多个函数代码块,所述样本中间表示代码包括每个所述函数代码块对应的局部中间表示代码;
针对每个所述目标函数代码,将所述目标函数代码中多个函数代码块划分为第一函数代码块和第二函数代码块;将所述第一函数代码块对应的局部中间表示代码输入至第一待训练神经网络,生成预测中间表示代码;
基于各个所述目标函数代码分别对应的所述预测中间表示代码和所述第二函数代码块的局部中间表示代码,对所述第一待训练神经网络进行训练,得到代码推荐模型。
一种可能的设计中,处理器601执行的指令中,在所述目标参考代码为利用代码转换模型得到时,所述方法还包括:
针对每个所述目标函数代码,将所述第一函数代码块和所述第二函数代码块对应的局部中间表示代码,输入至第二待训练神经网络,生成预测代码块;
基于各个所述目标函数代码分别对应的所述预测代码块和所述第二函数代码块,对所述第二待训练神经网络进行训练,得到代码转换模型。
一种可能的设计中,处理器601执行的指令中,在所述获取经过代码编辑器输入的第一代码之后,所述方法还包括:
在所述第一代码的代码类型属于编译类代码时,检测所述第一代码是否可编译;
若不可编译,则对所述第一代码进行调整,得到可编译的调整后第一代码;
基于所述第一代码,生成所述第一代码对应的中间表示代码,包括:
基于所述调整后第一代码,生成所述调整后第一代码对应的中间表示代码。
本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的代码推荐方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
本公开实施例还提供一种计算机程序产品,该计算机产品承载有程序代码,所述程序代码包括的指令可用于执行上述方法实施例中所述的代码推荐方法的步骤,具体可参见上述方法实施例,在此不再赘述。
其中,上述计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software Development Kit,SDK)等等。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。
Claims (11)
1.一种代码推荐方法,其特征在于,包括:
获取经过代码编辑器输入的第一代码;
基于所述第一代码,生成所述第一代码对应的中间表示代码;
调用训练的代码推荐模型,所述代码推荐模型采用神经网络结构,以待预测代码的中间表示代码为输入,以该待预测代码相关联的参考代码对应的中间表示代码作为输出,通过所述代码推荐模型基于所述第一代码对应的中间表示代码预测得到所述第一代码相关的目标参考代码对应的中间表示代码;
基于所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码,所述目标参考代码用于作为进行后续代码编写的参考代码进行代码推荐。
2.根据权利要求1所述的方法,其特征在于,所述目标参考代码对应的中间表示代码由至少一条中间表示语句构成,所述通过所述代码推荐模型基于所述第一代码对应的中间表示代码预测得到所述第一代码相关的目标参考代码对应的中间表示代码,包括:
将所述第一代码对应的中间表示代码作为当前输入数据,输入至所述代码推荐模型,得到至少一条中间表示语句;
将所述至少一条中间表示语句作为新的当前输入数据,返回至输入至所述代码推荐模型,得到至少一条中间表示语句的步骤,直至得到的至少一条中间表示语句中存在截止语句;
基于得到的中间表示语句,得到所述第一代码相关的目标参考代码对应的中间表示代码。
3.根据权利要求1所述的方法,其特征在于,所述基于所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码,包括:
调用训练得到的代码转换模型,以所述第一代码和所述目标参考代码对应的中间表示代码为输入,以与所述第一代码的代码类型相关的参考代码为输出,通过所述代码转换模型基于所述第一代码和所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码;或者
基于所述第一代码的代码类型、与所述中间表示代码的代码类型之间的代码映射关系,以及所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码。
4.根据权利要求1-3任一所述的方法,其特征在于,在所述获取经过代码编辑器输入的第一代码之后,还包括:
确定所述第一代码对应的第一特征向量;
基于所述第一代码对应的第一特征向量、和代码库中各个候选函数代码分别对应的第二特征向量,确定与所述第一代码匹配的预设数量个目标函数代码;
基于所述预设数量个目标函数代码,对第一待训练神经网络进行训练,得到所述代码推荐模型。
5.根据权利要求4所述的方法,其特征在于,所述确定所述第一代码对应的第一特征向量,包括:
对所述第一代码进行符号执行分析,得到所述第一代码对应的至少一组多项式;
对所述至少一组多项式进行特征提取,生成所述第一代码对应的多项式特征数据;
利用所述多项式特征数据,和/或,对所述第一代码进行特征提取得到的函数特征数据,生成所述第一代码对应的第一特征向量。
6.根据权利要求4所述的方法,其特征在于,所述基于所述预设数量个目标函数代码,对第一待训练神经网络进行训练,得到所述代码推荐模型,包括:
生成每个所述目标函数代码对应的样本中间表示代码;其中,所述目标函数代码包括多个函数代码块,所述样本中间表示代码包括每个所述函数代码块对应的局部中间表示代码;
针对每个所述目标函数代码,将所述目标函数代码中多个函数代码块划分为第一函数代码块和第二函数代码块;将所述第一函数代码块对应的局部中间表示代码输入至第一待训练神经网络,生成预测中间表示代码;
基于各个所述目标函数代码分别对应的所述预测中间表示代码和所述第二函数代码块的局部中间表示代码,对所述第一待训练神经网络进行训练,得到代码推荐模型。
7.根据权利要求6所述的方法,其特征在于,在所述目标参考代码为利用代码转换模型得到时,所述方法还包括:
针对每个所述目标函数代码,将所述第一函数代码块和所述第二函数代码块对应的局部中间表示代码,输入至第二待训练神经网络,生成预测代码块;
基于各个所述目标函数代码分别对应的所述预测代码块和所述第二函数代码块,对所述第二待训练神经网络进行训练,得到代码转换模型。
8.根据权利要求1所述的方法,其特征在于,在所述获取经过代码编辑器输入的第一代码之后,所述方法还包括:
在所述第一代码的代码类型属于编译类代码时,检测所述第一代码是否可编译;
若不可编译,则对所述第一代码进行调整,得到可编译的调整后第一代码;
所述基于所述第一代码,生成所述第一代码对应的中间表示代码,包括:
基于所述调整后第一代码,生成所述调整后第一代码对应的中间表示代码。
9.一种代码推荐装置,其特征在于,包括:
获取模块,用于获取经过代码编辑器输入的第一代码;
第一生成模块,用于基于所述第一代码,生成所述第一代码对应的中间表示代码;
第二生成模块,用于调用训练的代码推荐模型,所述代码推荐模型采用神经网络结构,以待预测代码的中间表示代码为输入,以该待预测代码相关联的参考代码对应的中间表示代码作为输出,通过所述代码推荐模型基于所述第一代码对应的中间表示代码预测得到所述第一代码相关的目标参考代码对应的中间表示代码;
第三生成模块,用于基于所述目标参考代码对应的中间表示代码,生成与所述第一代码的代码类型匹配的目标参考代码,所述目标参考代码用于作为进行后续代码编写的参考代码进行代码推荐。
10.一种计算机设备,其特征在于,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当计算机设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行如权利要求1至8任一项所述的代码推荐方法的步骤。
11.一种计算机可读存储介质,其特征在于,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行如权利要求1至8任一项所述的代码推荐方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211500911.1A CN116166236A (zh) | 2022-11-28 | 2022-11-28 | 代码推荐方法、装置、计算机设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211500911.1A CN116166236A (zh) | 2022-11-28 | 2022-11-28 | 代码推荐方法、装置、计算机设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116166236A true CN116166236A (zh) | 2023-05-26 |
Family
ID=86413885
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211500911.1A Pending CN116166236A (zh) | 2022-11-28 | 2022-11-28 | 代码推荐方法、装置、计算机设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116166236A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116700727A (zh) * | 2023-06-21 | 2023-09-05 | 广州洋葱时尚集团有限公司 | 一种跨平台的数据处理方法及系统 |
CN116719520A (zh) * | 2023-08-07 | 2023-09-08 | 支付宝(杭州)信息技术有限公司 | 代码生成方法及装置 |
-
2022
- 2022-11-28 CN CN202211500911.1A patent/CN116166236A/zh active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116700727A (zh) * | 2023-06-21 | 2023-09-05 | 广州洋葱时尚集团有限公司 | 一种跨平台的数据处理方法及系统 |
CN116700727B (zh) * | 2023-06-21 | 2024-02-13 | 广州洋葱时尚集团有限公司 | 一种跨平台的数据处理方法及系统 |
CN116719520A (zh) * | 2023-08-07 | 2023-09-08 | 支付宝(杭州)信息技术有限公司 | 代码生成方法及装置 |
CN116719520B (zh) * | 2023-08-07 | 2023-11-17 | 支付宝(杭州)信息技术有限公司 | 代码生成方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5610812A (en) | Contextual tagger utilizing deterministic finite state transducer | |
CN116166236A (zh) | 代码推荐方法、装置、计算机设备及存储介质 | |
CN110502227B (zh) | 代码补全的方法及装置、存储介质、电子设备 | |
CN111104335B (zh) | 一种基于多层次分析的c语言缺陷检测方法及装置 | |
Harris et al. | Glast: Learning formal grammars to translate natural language specifications into hardware assertions | |
CN108062474B (zh) | 文件的检测方法及装置 | |
Liu et al. | Modeling programs hierarchically with stack-augmented LSTM | |
KR102519138B1 (ko) | 번역문 품질 예측 모델 학습 장치 및 방법 | |
Chen et al. | Generative API usage code recommendation with parameter concretization | |
CN108563561B (zh) | 一种程序隐性约束提取方法及系统 | |
CN113094252B (zh) | 测试用例生成方法、装置、计算机设备及存储介质 | |
JP2008299723A (ja) | プログラム検証方法、プログラム検証装置 | |
US9405652B2 (en) | Regular expression support in instrumentation languages using kernel-mode executable code | |
CN115066674A (zh) | 使用源代码元素的数值数组表示来评估源代码的方法 | |
KR102546424B1 (ko) | 학습용 데이터 생성 장치, 소스 코드 오류 분석 장치 및 방법 | |
Zhou et al. | Effective approaches to combining lexical and syntactical information for code summarization | |
CN111381828A (zh) | 生成代码文件的语法树的方法、装置及电子设备 | |
CN116595967A (zh) | 一种基于文本的自然语言规则编写方法及相关装置 | |
US11907656B2 (en) | Machine based expansion of contractions in text in digital media | |
CN114090017B (zh) | 编程语言的解析方法及装置、非易失性存储介质 | |
Teufel et al. | C2 compiler concepts | |
CN110968500A (zh) | 一种测试用例的执行方法及装置 | |
CN115145575A (zh) | 一种高级语言的解析方法、设备和计算机可读存储介质 | |
CN111381827A (zh) | 生成代码文件的语法树的方法、装置及电子设备 | |
CN111381814A (zh) | 生成代码文件的语法树的方法、装置及电子设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |