从示例中学习句法程序变换
软件工程
2016-09-01 v1 机器学习
编程语言
摘要
诸如 Visual Studio 之类的 IDE 可以自动化常见的变换,例如重命名和提取方法重构。然而,扩展这些变换目录是复杂且耗时的。类似的现象出现在智能辅导系统中,教师必须编写繁琐的代码变换来描述“常见错误”,以修复学生对编程作业的类似提交。我们提出了 REFAZER,一种自动生成程序变换的技术。REFAZER 建立在这样一个观察之上:开发人员执行的代码编辑可以用作学习变换的示例。示例编辑可能共享相同的结构,但涉及不同的变量和子表达式,这些必须在变换中以正确的抽象级别进行泛化。为了学习变换,REFAZER 利用最先进的示例编程方法,使用以下关键组件:(a) 一种用于描述程序变换的新型领域特定语言 (DSL),(b) 用于在该 DSL 中合成变换的领域特定演绎算法,以及 (c) 用于对合成的变换进行排序的函数。我们在两个领域实例化并评估了 REFAZER。首先,给定学生用于修复错误编程作业提交的编辑示例,我们学习可以修复具有类似错误的其他学生提交的变换。在我们对 720 名学生完成的 4 个编程任务进行的评估中,我们的技术帮助修复了 87% 的学生的错误提交。在第二个领域,我们使用开发人员对同一项目应用的重复性编辑来合成一个程序变换,该变换将这些编辑应用于代码中的其他位置。在我们对来自 3 个 C# 开源项目的 59 个重复编辑场景进行的评估中,REFAZER 在 83% 的案例中学习到了预期的程序变换。
引用
@article{arxiv.1608.09000,
title = {Learning Syntactic Program Transformations from Examples},
author = {Reudismam Rolim and Gustavo Soares and Loris D'Antoni and Oleksandr Polozov and Sumit Gulwani and Rohit Gheyi and Ryo Suzuki and Bjoern Hartmann},
journal= {arXiv preprint arXiv:1608.09000},
year = {2016}
}