Page 156 - 《软件学报》2021年第5期
P. 156

1380                                     Journal of Software  软件学报 Vol.32, No.5,  May 2021

                 言描述与用户意图的一致性,使合成结果达到较高的准确率.因为数据库 SQL 语句相比于其他程序语言更加简
                 单,便于机器分析与学习,因此该方法获得了良好的合成效果.
                    此外,还有很多研究利用基于程序上下文信息建立代码自动补全或推荐模型.Luan 等人于 2017 年提出了代
                 码智能推荐模型 Aroma      [44] ,该模型利用语法树的信息找到在语法层面与输入代码类似的代码实例,自动将类似
                 的搜索结果聚合在一起,以生成代码建议.该方法考虑了代码结构化信息,支持 JavaScript,Python 等多种语言.
                 Aroma 根据代码上下文信息进行代码搜索和推荐,但是该方法仅能智能补全代码片段,无法生成完整可运行的
                 程序代码,且补全过程还需要开发人员确认.Chen 等人于 2019 年提出了一个名为 DeepAPIRec                     [45] 的 API 推荐模
                 型,可以根据代码上下文自动推荐 API 及使用参数.Hu 等人于 2019 年提出了一种代码补全模型 Deep-
                 AutoCoder [46] ,在方法调用补全和随机代码补全两种使用场景下优于其他方法.目前,基于代码上下文的程序合
                 成方法多用于 Token 预测、程序短句补全、API 调用推荐等方面,还无法直接生成可执行程序.
                 3.3   基于自然语言的程序合成方法
                    基于自然语言的程序合成方法是指针对自然语言描述的需求规约进行程序合成,由于自然语言具有二义
                 性,与程序语言间有较大鸿沟,因此该技术是程序合成领域的一项巨大挑战.目前,很多学者针对自然语言的理
                 解以及领域特定代码的自动合成开展了研究.基于自然语言的程序合成方法还无法生成复杂程序,仅可以生成
                 逻辑简单的程序(TFTTT 程序和 SQL 程序)或者生成 API 调用序列、程序的逻辑形式等.
                    2015 年,Quirk 等人提出一种利用神经网络模型从自然语言生成 If-This-Then-That(IFTTT)代码               [47] 的方法.
                 该方法将自然语言描述生成抽象语法树(abstract syntax tree,简称 AST),它首先将 AST 转换为代码 tokens 的序
                 列,并训练了一个神经翻译机模型,将自然语言描述翻译为程序代码.虽然 If-This-Then-That 的结构是有限的,许
                 多其他潜在的语法结构并没有被讨论,但该方法仍然具有很大的启发意义.2016 年,Liu 等人                         [48] 针对 IFTTT 程序
                 合成问题提出了一种引入注意力(attention)机制的神经网络结构,并对其进行端到端的训练,实现从自然语言文
                 本描述生成 If-Then 程序.与其他方法相比,可以显著降低程序预测的错误率.但训练数据的噪声仍会带来错误,
                 因此该方法仍需改进.
                    2016 年,Gu 等人在 Deep API 项目   [49] 中提出了智能化 API 检索方法,能够根据自然语言形式的任务需求,
                 生成 API 调用序列.该方法的合成模型采用 seq2seq,模型输入为特征向量,该特征向量由自然语言编码而成;模
                 型输出为相应的 API 调用序列.利用神经网络模型学习自然语言与 API 序列间的关联联系,模型训练好后,用于
                 生成相应的 API 调用序列.2018 年,该团队又提出一种利用基于深度学习进行代码检索的方法                          [50] ,该方法首先要
                 得到序列的编码信息,包括 token 序列、方法名序列以及 API 调用序列,然后将这 3 部分信息组合为代码的向量
                 表示,然后利用 RNN 得到自然语言语句向量表示,利用余弦相似度来衡量上述向量间的相似度,并以此建立自
                 然语句与代码片段的联系.上述方法通常只能生成与自然语言描述相关的 API 调用序列或代码片段,给程序员
                 的编程工作带来帮助.
                    2017 年,Zhong 等人提出了基于 Seq2SQL 的程序合成方法          [51] ,该方法采用基于策略的强化学习,使得自然语
                 言描述合成为相应的 SQL 语句.还有学者在此基础上加入深度学习技术和查询解析技术.该方法提高了合成准
                 确率,并利用巴克斯范式约束 SQL 语句的合成.
                    Manshadi 等人于 2012 年发表了通过群体智慧解决自然语言编程任务                 [52] .该方法首先由非专业人员来提供
                 大量的数据对,然后进行程序合成,生成相应的程序代码.通过群体智慧的方法,能更好地捕捉到自然语言所描
                 述的真实需求,从而生成更精确的程序.在特定领域进行了实验,可以完成简单的自然语言编程任务,错误率仅
                 为 4%.由于该方法依赖于传统计算和人工计算的结合,但人工计算的正确性无法保证,因此还无法应用到工程
                 实践中.
                    Dong 等人于 2016 年发表了应用 Encoder-Decoder 模型结合注意力机制(attention)进行程序合成的方法               [53] .
                 该方法合成模型的输入语句和输出逻辑形式都被视为序列,由不同的递归神经网络进行编码和解码.该方法采
                 用两种神经网络模型:递归神经网络和树形循环神经网络.递归神经网络完成自然语言的编码,循环神经网络完
                 成程序的生成.使用递归神经网络将输入语句编码成向量表示,并通过对编码向量的输出设置条件来生成它们
   151   152   153   154   155   156   157   158   159   160   161