本发明属于数据编译,具体涉及一种模型训练方法、基于字节码的代码注释生成方法及装置。
背景技术:
1、大量研究表明,在项目开发过程中,开发人员在程序理解上需要花费大量的时间,代码注释是在代码间穿插的解释性文字,用以提供有关代码功能、逻辑、用法、变量、函数等方面的描述。高质量的代码注释可以帮助开发人员理解代码的意义并降低软件的维护成本,但大部分开发人员并不习惯编写代码注释,代码注释自动生成技术一定程度上能克服这种问题。
2、代码注释自动生成技术通过扫描一段代码,生成一段概要性描述以解释代码功能,这极大地便利了开发进程。目前主流的技术框架大多是构建深度学习模型,提取并学习源代码中的语义信息和结构信息,最终通过模型为代码生成注释。这些模型大部分由源代码驱动,以源代码或抽象语法树作为输入,技术保护和商业收入等原因,不是所有服务供应方都会公布项目的源代码,在闭源环境下这些由源代码驱动的技术难以发挥作用。
技术实现思路
1、基于此,本发明旨在提供一种模型训练方法、基于字节码的代码注释生成方法及装置,以字节码作为模型输入,摆脱已有工作只能用于开源环境的局限性,在无源代码场景下取得更好的性能。
2、第一方面,本发明提供一种模型训练方法,该方法训练得到的模型用于生成代码注释,包括第一编码器、第二编码器和解码器,方法包括:
3、获取字节码,根据字节码生成控制流程图;
4、对控制流程图序列化得到节点序列,节点序列表示控制流程图的图结构;
5、把字节码和节点序列分别输入第一编码器和第二编码器进行编码;
6、解码器根据第一编码器和第二编码器的输出,以及参考注释预测单词序列组成代码注释;
7、计算生成的代码注释与参考注释的误差,误差用于更新预测模型的参数,误差结果收敛时,训练完成输出用于生成代码注释的预测模型。
8、进一步地,对控制流程图序列化得到节点序列包括如下过程:
9、初始化根节点、节点序列和遍历节点集合;
10、遍历根节点的子节点,当前遍历的子节点不存在于遍历节点集合时,先把当前子节点加入遍历节点集合再采用sbt法递归遍历,存在时直接把子节点和遍历节点集合作为参数采用sbt法递归遍历,直至所有节点被遍历,输出节点序列。
11、进一步地,上述训练方法还包括:
12、对字节码序列化得到令牌序列;
13、对令牌序列和节点序列进行位置编码,分别得到令牌位置嵌入表示和节点位置嵌入表示;
14、对令牌序列和节点序列矩阵化,分别得到词嵌入表示和节点嵌入表示;
15、令牌位置嵌入表示和词嵌入表示组成词输入向量,作为第一编码器的输入,节点位置嵌入表示和节点嵌入表示组成节点输入向量,作为第二编码器的输入。
16、进一步地,第一编码器和第二编码器均为transformer结构。
17、进一步地,解码器为transformer结构。
18、第二方面,本发明提供一种基于字节码的代码注释生成方法,包括:
19、获取源代码对应的字节码;
20、根据字节码生成控制流程图;
21、对字节码和控制流程图序列化分别得到令牌序列和节点序列,节点序列表示控制流程图的图结构;
22、把令牌序列和节点序列输入经上述训练方法训练好的预测模型,生成代码提交注释。
23、进一步地,对控制流程图序列化得到节点序列的过程包括:
24、初始化根节点、节点序列和遍历节点集合;
25、遍历根节点的子节点,当前遍历的子节点不存在于遍历节点集合时,先把当前子节点加入遍历节点集合再采用sbt法递归遍历,存在时直接把子节点和遍历节点集合作为参数采用sbt法递归遍历,直至所有节点被遍历,输出节点序列。
26、第三方面,本发明提供一种模型训练装置,包括:
27、训练数据获取单元,用于获取字节码;
28、第一图生成单元,用于根据字节码生成控制流程图;
29、第一序列化单元,用于对控制流程图序列化得到节点序列,节点序列表示控制流程图的图结构;
30、训练单元,包括第一编码器、第二编码器和解码器,第一编码器和第二编码器分别用于对字节码和节点序列编码;解码器用于根据第一编码器和第二编码器的输出,以及参考注释预测单词序列组成代码注释;
31、模型优化单元,用于计算生成的代码注释与参考注释的误差,误差用于更新预测模型的参数,误差结果收敛时,训练完成输出用于生成代码注释的预测模型。
32、进一步地,第一序列化单元对控制流程图序列化得到节点序列的过程,还包括:
33、初始化根节点、节点序列和遍历节点集合;
34、遍历根节点的子节点,当前遍历的子节点不存在于遍历节点集合时,先把当前子节点加入遍历节点集合再采用sbt法递归遍历,存在时直接把子节点和遍历节点集合作为参数采用sbt法递归遍历,直至所有节点被遍历,输出节点序列。
35、进一步地,训练单元采用transformer结构。
36、第四方面,本发明提供一种代码注释生成装置,包括:
37、字节码获取单元,用于获取字节码;
38、第二图生成单元,用于根据字节码生成控制流程图;
39、第二序列化单元,用于对字节码和控制流程图序列化分别得到令牌序列和节点序列,节点序列表示控制流程图的图结构;
40、注释生成单元,其嵌入有利用第三方面的模型训练装置训练得到的预测模型,用于接收令牌序列和节点序列以生成代码注释。
41、第五方面,本发明提供一种电子设备,包括:存储器和处理器;
42、所述存储器,用于存储程序;
43、所述处理器,用于调用存储于所述存储器中的程序,以执行上述第一方面实施例和/或结合第一方面实施例的任一种可能的实施方式提供的模型训练方法,或,执行上述第二方面实施例提供的基于字节码的代码注释生成方法。
44、第六方面,本发明还提供一种可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时,实现上述第一方面实施例和/或结合第一方面实施例的任一种可能的实施方式提供的模型训练方法,或,执行上述第二方面实施例提供的基于字节码的代码注释生成方法。
45、与现有的代码生成技术相比,本发明具有如下优点:
46、本发明提出的用于生成代码注释的模型训练方法,使用字节码和控制流程图作为输入,模型从字节码学习语义信息,从控制流程图学习结构信息,为无源代码环境提供了一种生成代码注释的解决方案;建立了字节码和代码注释之间的连接,提高字节码的可读性;进一步的实施例中还提供了一种基于图的序列编码方式,把控制流程图序列化为节点序列,能够完整保留图的结构信息,模型在无源码场景下表现出更好的性能。
1.一种模型训练方法,其特征在于,所述方法训练得到的模型用于生成代码注释,包括第一编码器、第二编码器和解码器,所述方法包括:
2.根据权利要求1所述的模型训练方法,其特征在于,所述对控制流程图序列化得到节点序列包括如下过程:
3.根据权利要求1所述的模型训练方法,其特征在于,所述训练方法还包括:
4.根据权利要求1所述的模型训练方法,其特征在于,所述第一编码器和第二编码器均为transformer结构。
5.根据权利要求1或4所述的模型训练方法,其特征在于,所述解码器为transformer结构。
6.一种基于字节码的代码注释生成方法,其特征在于,包括:
7.根据权利要求6所述的基于字节码的代码注释生成方法,其特征在于,对所述控制流程图序列化得到节点序列的过程包括:
8.一种模型训练装置,其特征在于,包括:
9.根据权利要求8所述的模型训练装置,其特征在于,所述第一序列化单元对控制流程图序列化得到节点序列的过程,还包括:
10.根据权利要求8所述的模型训练装置,其特征在于,所述训练单元采用transformer结构。
11.一种代码注释生成装置,其特征在于,包括:
12.一种电子设备,其特征在于,包括:存储器和处理器;
13.一种可读存储介质,其特征在于,其上存储有计算机程序,所述计算机程序被处理器执行时,实现如权利要求1~5任一项所述的模型训练方法,或,执行如权利要求6~7任一项所述的基于字节码的代码注释生成方法。