Page 153 - 《软件学报》2021年第5期
P. 153
顾斌 等:程序智能合成技术研究进展 1377
机科学研究方面的最大投资.ExCAPE(expeditions in computer augmented program engineering)就是被该奖金资
助的一个项目,ExCAPE 旨在将编程从纯粹的手动任务转变为程序员和自动程序合成工具可以协作生成符合
其规范的软件.在 5 年(2012~2017 年)时间里,ExCAPE 在多方面取得了丰硕的成果 [21] ,其参研团队也成为程序合
成领域极具影响力的单位.该团队提出了 Syntax-Guided Synthesis 程序合成方法并建立了多种原型解算器,这项
工作有助于推进计算方法的最新技术,它促进了程序综合的新应用,例如量子计算机程序的自动优化;美国国防
部高级研究计划局(DARPA)2015 年发布了资源适应性软件系统(BRASS)项目招标书,该项目为建造使用寿命
长、存活性高、扩展性强的自适应软件系统寻求新的研究方法 [22] .BRASS 需要集成新的资源感知程序分析和
相关方法,以发现应用程序意图.这里需要用到程序转换和程序合成技术,保证系统的可信并提供验证,即面对
不断演变的底层生态系统,意图与代码的一致性得以保证;2019 年 7 月,DARPA 又发起了 IDAS(Intent defined
adaptive system)项目 [23] ,该项目于 2020 年 2 月正式启动,4 年内支持经费 6 500 万美元.IDAS 目标是研究软件工
程的新方法,快速实现代码生成,大大降低软件开发和维护成本.该项目包含 4 个技术领域:自动软件生成、问题
集生成、集成测试和评估、实验与转换.其中,自动软件生成为该项目的重点研究内容,通过研究用户意图及约
束的捕获、理解和表达方法,利用自动化手段生成软件,研究软件自动化的代码生成和演化技术,以快速应对软
件开发需求和运行环境的变化.
3 程序智能合成技术
程序合成问题自上世纪 60 年代初提出以来,一直是软件工程领域的重大挑战之一.最初的程序合成方法是
基于转换的程序合成(transformation-based synthesis),其核心是将一个高层的程序规约通过反复转换成较低层
的程序规约,最终生成目标程序代码 [24,25] .该方法自动生成的代码规模小,很长一段时间并没有进一步发展.20
世纪 60 年代,人们提出了许多基于演绎推理的程序合成方法,该方法的主要思想为:首先,使用定理证明器构造
程序规约的一个证明;然后,基于 Curry-Howard 同构关系,使用该证明来生成相应的程序代码.其中代表性工作
是 Manna 等人 [26,27] 提出的程序合成系统,它将数学定理的构造性证明与程序开发相联系,将程序规约转换为待
证明的命题,将命题证明过程视为程序开发步骤,证明成功即获得所需程序,从而完成基于一阶谓词演算的程序
规约到程序的自动生成.基于演绎的程序合成方法需要以完整的形式化规约为前提,这一前提的达成通常具有
较大的难度,因而这种方法很少被应用.随着人工智能等技术的发展,程序合成技术不断探索出新的技术途径.
与传统的程序合成方法不同,程序智能合成不再只是利用演绎和归纳进行合成,而是更多地利用机器学习等人
工智能技术,学习已有的大量代码知识,智能化地进行程序开发 [28,29] .
现有的程序智能合成技术还有诸多挑战需要攻克,其中需求规约的描述是亟需解决的难题:一方面,完整的
需求规约描述极其复杂,所花费的时间成本过高,不完整的需求规约又很难准确表达真实的用户意图;另一方
面,自然语言的需求规约描述具有二义性,很难被计算机理解.根据需求规约的不同描述方式,可分为基于输入
输出示例的程序合成方法、基于代码框架(语法)的程序合成方法、基于自然语言的程序合成方法.程序智能合
成技术主要使用的合成模型包括遗传算法模型、循环神经网络模型、递归神经网络模型、卷积神经网络模型、
Word2Vec 模型等.表 1 为现有程序智能合成技术的总结,后文会进行详细介绍.
Table 1 Summary of existing studies of intelligent program synthesis
表 1 程序智能合成现有工作的总结
需求规约表示方式 文献 合成模型 技术特点
Reed 等人 [30] 循环神经网络
Chengtao 等人 [31] 递归神经网络 利用深度学习方法
生成代码片段
Cai 等人 [32] 循环神经网络
基于输入输出 [33]
示例的程序合成 Devlin 等人 [34] 循环神经网络 利用深度学习方法
Emilio 等人 递归神经网络 实现 Excel 字符串转换
Balog 等人 [35] 编码器-解码器模型 利用深度学习与搜索技术生成代码片段
Becker 等人 [36] 遗传算法模型 利用遗传算法模型生成代码片段