自动代码优化技术
Automatic Code Optimization Techniques
我正在从事一个将自定义语言自动转换为 Java 的项目,并被要求在转换过程中对代码进行一些基本优化。例如,自定义代码可能类似于:
if someFunction(a, b) > x:
do something
else:
return someFunction(a, b) + y
在这个例子中,someFunction 被多次调用相同的输入,所以通过缓存 someFunction() 的值并且只调用它一次可以获得额外的性能。因此,上述代码的 "optimized" 版本可能类似于:
var1 = someFunction(a, b)
if var1 > x:
do something
else:
return var1 + y
目前,这是在转换过程中手动完成的。我 运行 一个将自定义语言中的代码转换为 Java 的程序,然后手动检查转换后的代码以查看可以优化的内容。我想自动化优化过程,因为这些问题一次又一次地出现。用自定义语言编写代码的人不想担心这些事情,所以我不能要求他们只确保他们给我的代码已经优化。
有哪些教程、论文等详细说明了现代编译器是如何完成这些事情的?我不想重新发明轮子太多。提前致谢。
编辑 1:
可以假设函数是纯的
这称为 Common subexpression elimination。
通常情况下,这几乎需要您实现一个完整的编译器才能进行数据流分析。 Dragon Book,“6.1.2 The Value-Number Method for Constructing DAG's”中给出了一种算法(至少对于本地 CSE)。
我正在从事一个将自定义语言自动转换为 Java 的项目,并被要求在转换过程中对代码进行一些基本优化。例如,自定义代码可能类似于:
if someFunction(a, b) > x:
do something
else:
return someFunction(a, b) + y
在这个例子中,someFunction 被多次调用相同的输入,所以通过缓存 someFunction() 的值并且只调用它一次可以获得额外的性能。因此,上述代码的 "optimized" 版本可能类似于:
var1 = someFunction(a, b)
if var1 > x:
do something
else:
return var1 + y
目前,这是在转换过程中手动完成的。我 运行 一个将自定义语言中的代码转换为 Java 的程序,然后手动检查转换后的代码以查看可以优化的内容。我想自动化优化过程,因为这些问题一次又一次地出现。用自定义语言编写代码的人不想担心这些事情,所以我不能要求他们只确保他们给我的代码已经优化。
有哪些教程、论文等详细说明了现代编译器是如何完成这些事情的?我不想重新发明轮子太多。提前致谢。
编辑 1:
可以假设函数是纯的
这称为 Common subexpression elimination。
通常情况下,这几乎需要您实现一个完整的编译器才能进行数据流分析。 Dragon Book,“6.1.2 The Value-Number Method for Constructing DAG's”中给出了一种算法(至少对于本地 CSE)。