CN108595165A - 一种基于代码中间表示的代码补全方法、装置及存储介质 - Google Patents
一种基于代码中间表示的代码补全方法、装置及存储介质 Download PDFInfo
- Publication number
- CN108595165A CN108595165A CN201810380083.XA CN201810380083A CN108595165A CN 108595165 A CN108595165 A CN 108595165A CN 201810380083 A CN201810380083 A CN 201810380083A CN 108595165 A CN108595165 A CN 108595165A
- Authority
- CN
- China
- Prior art keywords
- code
- context
- expression
- completion
- centre
- 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
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/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- 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
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
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
技术领域
本发明实施例涉及软件分析及机器学习领域,尤其涉及一种基于代码中间表示的代码补全方法、装置及存储介质。
背景技术
代码自动补全经过最近几年的发展,已经被广泛应用于提高软件开发效率的辅助技术,已经被主流IDE例如eclipse,IntelliJ集成,目前业界普遍根据被补全的内容将代码补全技术分成两类:1)补全一个API;2)补全任意一个token。国内外学者已提出许多代码补全的方法及技术并开发出相应的代码补全工具。具体来说如下:
1)补全一个API:这种技术使用机器学习中的分类技术,在上下文信息中提取出特征,将API看做类别,进行分类训练,最后推理出正确的API,这种技术的优点是精度高,一般可以利用大量的上下文信息,缺点是被推理的内容仅仅局限于API,无法适配到推理任意代码。
2)补全任意一个token:这种技术使用语言模型,将任意的token当成分类标签,能够推理出任意的代码token(单词)。这种技术的优点是能够推理任意代码,缺点是由于分类标签太多,精度很低,同时,由于一段代码经常由成百上千的token组成,目前的主流语言模型(RNN/LSTM)最多就能够处理10-15个token序列,根本无法处理代码中成百上千长度的token序列。
基于上述情况,如何找到一种能够精确推理任意种类及长度的代码的方法,就成为业界亟待解决的问题。
发明内容
针对现有技术存在的上述问题,本发明实施例提供了一种基于代码中间表示的代码补全方法、装置及存储介质。
一方面,本发明实施例提供了一种基于代码中间表示的代码补全方法,包括:将代码库中的现有代码解析得到第一中间表达,并采用所述第一中间表达训练语言模型获取有效语言模型;将待推理的上下文转换成第二中间表达,采用搜索算法对所述第二中间表达进行搜索得到上下文;将所述上下文输入所述有效语言模型进行推理得到代码片段,对所述代码片段进行拟合得到补全代码。
另一方面,本发明实施例提供了一种主动交互装置及一种非暂态可读存储介质。所述一种主动交互装置包括:至少一个处理器;以及与所述处理器通信连接的至少一个存储器,其中:所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行所述一种基于代码中间表示的代码补全方法。所述一种非暂态可读存储介质存储程序指令,用于执行所述一种基于代码中间表示的代码补全方法。
本发明实施例提供了一种基于代码中间表示的代码补全方法、装置及存储介质,通过将源代码库中的代码及待推理的上下文采用中间表示,使用源代码库中代码的中间表示训练语言模型,同时对待推理的上下文采用搜索算法寻找具有相应近似度的上下文,然后输入训练好的语言模型并进行拟合得到补全代码,可以在保证精确性的前提下,能够精确推理任意种类及长度的代码,有效提高研发人员的代码开发效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明第一实施例中基于代码中间表示的代码补全方法的整体流程图;
图2是本发明实施例中中间表达式示意图;
图3是本发明实施例的硬件装置工作示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供了一种基于代码中间表示的代码补全方法、装置及存储介质。参见图1,图1是本发明第一实施例中基于代码中间表示的代码补全方法的整体流程图,包括:
S101:将代码库中的现有代码解析得到第一中间表达,包括:
将所述现有代码转换成语法树,遍历所述语法树,将语法树中同一层叶子节点与父节点合并得到合并后节点;从所述合并后节点中抽取与所述合并后节点的子节点不重复的信息形成token,所述token即为所述第一中间表达,并采用所述第一中间表达训练语言模型获取有效语言模型。
优选地,在另一实施例中,首先从开源代码库中获取源代码(可以是JAVA),将源代码转换成抽象语法树(AST),后序遍历抽象语法树,将语法树中,同一层的叶子节点,还有它的父节点合并,合并成一个节点。在这个合并后的节点中,抽取出与其子节点不重复的信息,形成一个token,迭代重复上述过程,直至整个抽象语法树(AST)只剩下一个根节点。生成过程中,依次生成的token序列作为代码的中间表示(IR)。
上述算法中,加号(+)特指字符串拼接。
S102:将待推理的上下文转换成第二中间表达,采用搜索算法对所述第二中间表达进行搜索得到上下文,包括:
采用模糊搜索算法对所述第二中间表达进行搜索(在另一实施例中,可以根据所述第二中间表达,在代码库中进行启发式搜索),搜索出具有不同特征的上下文,得到与所述第二中间表达式具有相应相似度的代码。
其中,在另一实施例中,上述第一中间表达或第二中间表达的排列顺序与程序执行顺序一致。
优选地,在又一实施例中,所述待推理的上下文,包括:用户已经编写完成的代码。
其中,上述S101及S102的执行不具有先后顺序,在另一实施例中,可以在S102执行完毕后再执行S101。
S103:将所述上下文输入所述有效语言模型进行推理得到代码片段(在另一实施例中,所述代码片段按照所述有效语言模型计算出来的概率及所述上下文的相关性进行排序),对所述代码片段进行拟合得到补全代码(在又一实施例中,所述对所述代码片段进行拟合得到补全代码,包括:
过滤掉所述代码片段中与编程环境不相关的代码得到过滤后代码片段,将所述过滤后代码片段替换成与编程环境相关的变量及函数得到所述补全代码)。
优选地,在另一实施例中,所述将所述上下文输入所述有效语言模型进行推理得到代码片段,包括:当用户已经写了一部分代码之后,将已写部分当成上下文转换成IR,使用语言模型标准计算公式,计算在当前的上下文的情景下,最有可能出现的token。公式如下:
预测代码步骤1:token=arg_maxtoken{P(token|context)},P(token|context)指的是,在给定context的情况下和紧接着context的token的情况下,语言模型计算出来的概率。
我们不仅仅预测一个token,而是连续预测大量的token序列,我们通过将刚刚预测出的token追加至context的末尾,形成新的context:
预测代码步骤2:contextnew=context+token,这里加号(+)指的是字符串拼接。
预测代码步骤3:将预测代码步骤1中的context替换成contextnew,跳转至预测步骤1,开始循环,最终能够生成一个token序列。其中,若将公式arg_maxtoken{P(token|context)}变成arg_second_maxtoken{P(token|context)},也就是每一次不取某一个context下概率最大的那个token,取概率次大的那个token,通过这种方式,又能生成出一个不同的token序列。如此通过这种方式,预测出大量可能的token序列。利用新的将这些序列组合成用户可读的代码。
优选地,在另一实施例中,对所述代码片段进行拟合得到补全代码,包括:对于预测出来的大量token序列,使用全排列的方式组合这些token,然后对组合后的所有token序列,使用动态编译技术(eclipseJDT),验证这些token组合的合理程度,保留下合理的,转换成Java代码,推荐给用户。具体算法如下:
参见图2,图2是本发明实施例中中间表达式示意图,包括:
源代码201及转化后的中间表达202。由图中可见,转化后的中间表达202仅摘取了源代码201中的部分信息,明显简化了源代码201的容量及复杂性。
参见图3,图3是本发明实施例的硬件装置工作示意图,所述硬件装置包括:一种基于代码中间表示的代码补全装置301、处理器302及存储介质303。
基于代码中间表示的代码补全装置301:所述一种基于代码中间表示的代码补全装置301实现所述一种基于代码中间表示的代码补全方法。
处理器302:所述处理器302加载并执行所述存储介质303中的指令及数据用于实现所述的一种基于代码中间表示的代码补全方法。
存储介质303:所述存储介质303存储指令及数据;所述存储介质303用于实现所述的一种基于代码中间表示的代码补全方法。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机装置(可以是个人计算机,服务器,或者网络装置等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (10)
1.一种基于代码中间表示的代码补全方法,其特征在于,包括:
将代码库中的现有代码解析得到第一中间表达,并采用所述第一中间表达训练语言模型获取有效语言模型;
将待推理的上下文转换成第二中间表达,采用搜索算法对所述第二中间表达进行搜索得到上下文;
将所述上下文输入所述有效语言模型进行推理得到代码片段,对所述代码片段进行拟合得到补全代码。
2.根据权利要求1所述的方法,其特征在于,所述第一中间表达或第二中间表达的排列顺序与程序执行顺序一致。
3.根据权利要求1所述的方法,其特征在于,所述将代码库中的现有代码解析得到第一中间表达,包括:
将所述现有代码转换成语法树,遍历所述语法树,将语法树中同一层叶子节点与父节点合并得到合并后节点;
从所述合并后节点中抽取与所述合并后节点的子节点不重复的信息形成token,所述token即为所述第一中间表达。
4.根据权利要求1所述的方法,其特征在于,所述采用搜索算法对所述第二中间表达进行搜索得到上下文,包括:
采用模糊搜索算法对所述第二中间表达进行搜索,得到与所述第二中间表达式具有相应相似度的代码。
5.根据权利要求4所述的方法,其特征在于,所述采用模糊搜索算法对所述第二中间表达进行搜索,包括:
根据所述第二中间表达,在代码库中进行启发式搜索。
6.根据权利要求1所述的方法,其特征在于,所述代码片段按照所述有效语言模型计算出来的概率及所述上下文的相关性进行排序。
7.根据权利要求1所述的方法,其特征在于,所述待推理的上下文,包括:
用户已经编写完成的代码。
8.根据权利要求1所述的方法,其特征在于,所述对所述代码片段进行拟合得到补全代码,包括:
过滤掉所述代码片段中与编程环境不相关的代码得到过滤后代码片段,将所述过滤后代码片段替换成与编程环境相关的变量及函数得到所述补全代码。
9.一种主动交互装置,其特征在于,包括:
至少一个处理器;以及
与所述处理器通信连接的至少一个存储器,其中:
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如权利要求1至8任一权利要求所述的方法。
10.一种非暂态可读存储介质,其特征在于,所述非暂态可读存储介质存储程序指令,所述程序指令用于执行如权利要求1至8任一权利要求所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810380083.XA CN108595165A (zh) | 2018-04-25 | 2018-04-25 | 一种基于代码中间表示的代码补全方法、装置及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810380083.XA CN108595165A (zh) | 2018-04-25 | 2018-04-25 | 一种基于代码中间表示的代码补全方法、装置及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN108595165A true CN108595165A (zh) | 2018-09-28 |
Family
ID=63609284
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810380083.XA Pending CN108595165A (zh) | 2018-04-25 | 2018-04-25 | 一种基于代码中间表示的代码补全方法、装置及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108595165A (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109582352A (zh) * | 2018-10-19 | 2019-04-05 | 北京硅心科技有限公司 | 一种基于双ast序列的代码补全方法及系统 |
CN109614103A (zh) * | 2018-10-19 | 2019-04-12 | 北京硅心科技有限公司 | 一种基于字符的代码补全方法及系统 |
CN111966817A (zh) * | 2020-07-24 | 2020-11-20 | 复旦大学 | 基于深度学习及代码上下文结构和文本信息的api推荐方法 |
WO2021008287A1 (zh) * | 2019-07-15 | 2021-01-21 | 腾讯科技(深圳)有限公司 | 字符推荐方法、装置、计算机设备及存储介质 |
CN113064586A (zh) * | 2021-05-12 | 2021-07-02 | 南京大学 | 一种基于抽象语法树增广图模型的代码补全方法 |
CN114895908A (zh) * | 2022-05-17 | 2022-08-12 | 北京志凌海纳科技有限公司 | 基于Web应用表达式的实现方法及系统、设备和存储介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102999318A (zh) * | 2011-09-08 | 2013-03-27 | 国际商业机器公司 | 辅助编程的方法及装置 |
-
2018
- 2018-04-25 CN CN201810380083.XA patent/CN108595165A/zh active Pending
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102999318A (zh) * | 2011-09-08 | 2013-03-27 | 国际商业机器公司 | 辅助编程的方法及装置 |
Non-Patent Citations (1)
Title |
---|
YIXIAO YANG ET AL.: "A Language Model for Statements of Software Code", 《2017 32ND IEEE/ACM INTERNATIONAL CONFERENCE ON AUTOMATED SOFTWARE ENGINEERING (ASE)》 * |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109582352A (zh) * | 2018-10-19 | 2019-04-05 | 北京硅心科技有限公司 | 一种基于双ast序列的代码补全方法及系统 |
CN109614103A (zh) * | 2018-10-19 | 2019-04-12 | 北京硅心科技有限公司 | 一种基于字符的代码补全方法及系统 |
WO2021008287A1 (zh) * | 2019-07-15 | 2021-01-21 | 腾讯科技(深圳)有限公司 | 字符推荐方法、装置、计算机设备及存储介质 |
US11537213B2 (en) | 2019-07-15 | 2022-12-27 | Tencent Technology (Shenzhen) Company Limited | Character recommending method and apparatus, and computer device and storage medium |
CN111966817A (zh) * | 2020-07-24 | 2020-11-20 | 复旦大学 | 基于深度学习及代码上下文结构和文本信息的api推荐方法 |
CN111966817B (zh) * | 2020-07-24 | 2022-05-20 | 复旦大学 | 基于深度学习及代码上下文结构和文本信息的api推荐方法 |
CN113064586A (zh) * | 2021-05-12 | 2021-07-02 | 南京大学 | 一种基于抽象语法树增广图模型的代码补全方法 |
CN113064586B (zh) * | 2021-05-12 | 2022-04-22 | 南京大学 | 一种基于抽象语法树增广图模型的代码补全方法 |
CN114895908A (zh) * | 2022-05-17 | 2022-08-12 | 北京志凌海纳科技有限公司 | 基于Web应用表达式的实现方法及系统、设备和存储介质 |
CN114895908B (zh) * | 2022-05-17 | 2023-02-28 | 北京志凌海纳科技有限公司 | 基于Web应用表达式的实现方法及系统、设备和存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108595165A (zh) | 一种基于代码中间表示的代码补全方法、装置及存储介质 | |
Husain et al. | Codesearchnet challenge: Evaluating the state of semantic code search | |
Dohare et al. | Text summarization using abstract meaning representation | |
CN106055549A (zh) | 利用加速器的概念分析操作 | |
CN108280064A (zh) | 分词、词性标注、实体识别及句法分析的联合处理方法 | |
US8239349B2 (en) | Extracting data | |
CN110750240A (zh) | 一种基于序列到序列模型的代码片段推荐方法 | |
US11551151B2 (en) | Automatically generating a pipeline of a new machine learning project from pipelines of existing machine learning projects stored in a corpus | |
EP3968244A1 (en) | Automatically curating existing machine learning projects into a corpus adaptable for use in new machine learning projects | |
CN108388561A (zh) | 神经网络机器翻译方法和装置 | |
US9336195B2 (en) | Method and system for dictionary noise removal | |
JP2013196680A (ja) | 共学習に基づく概念認識方法および概念認識装置 | |
CN106227719A (zh) | 中文分词歧义消除方法和系统 | |
Ohashi et al. | Convolutional neural network for classification of source codes | |
CN103049490A (zh) | 知识网络节点间属性生成系统及生成方法 | |
CN110222737A (zh) | 一种基于长短时记忆网络的搜索引擎用户满意度评估方法 | |
Latiffi et al. | Flower pollination algorithm for feature selection in tweets sentiment analysis | |
CN111881264A (zh) | 一种开放领域问答任务中长文本检索的方法和电子设备 | |
EP4254279A1 (en) | Machine learning pipeline augmented with explanation | |
CN116882402A (zh) | 基于多任务的电力营销小样本命名实体识别方法 | |
EP3965024A1 (en) | Automatically labeling functional blocks in pipelines of existing machine learning projects in a corpus adaptable for use in new machine learning projects | |
CN105893363A (zh) | 一种获取知识点的相关知识点的方法及系统 | |
CN115495085A (zh) | 一种基于深度学习细粒度代码模板的生成方法及装置 | |
CN108830302A (zh) | 一种图像分类方法、训练方法、分类预测方法及相关装置 | |
Fenogenova et al. | Russian superglue 1.1: Revising the lessons not learned by russian nlp models |
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 | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20180928 |
|
RJ01 | Rejection of invention patent application after publication |