【问题标题】:Automatic Code Optimization Techniques自动代码优化技术
【发布时间】:2017-02-18 22:29:41
【问题描述】:

我正在开展一个将自定义语言自动转换为 Java 的项目,并被要求在转换过程中对代码进行一些基本优化。例如,自定义代码可能有如下内容:

if someFunction(a, b) > x:
    do something
else:
    return someFunction(a, b) + y

在这种情况下,使用相同的输入多次调用 someFunction,因此可以通过缓存 someFunction() 的值并仅调用一次来获得额外的性能。因此,上述代码的“优化”版本可能类似于:

var1 = someFunction(a, b)

if var1 > x:
    do something
else:
    return var1 + y

目前,这是在转换过程中手动完成的。我运行一个程序将自定义语言的代码转换为 Java,然后手动检查转换后的代码以查看可以优化的内容。我想自动化优化过程,因为这些问题一次又一次地出现。用自定义语言编写代码的人不想担心这些事情,所以我不能要求他们只是确保他们给我的代码已经优化。

有哪些教程、论文等详细说明了现代编译器是如何完成这些事情的?我不想过多地重新发明轮子。提前致谢。

编辑 1:

可以假设函数是纯函数。

【问题讨论】:

  • 只有当您保证someFunction 总是为相同的输入返回相同的值时,此优化才会起作用;您对此有任何保证吗?
  • 你必须推断出你的函数是纯的(没有副作用)。做起来有多容易取决于你的语言。对于大部分函数式语言,纯度推理是微不足道的,否则你只能有非常保守的推理规则。细节还取决于您的中间表示。如果它是一个 SSA/ArraySSA(即,您已经消除了所有仅限本地的内存传输),您可以将一个函数标记为纯函数,前提是它不执行任何加载和存储并且只调用其他纯函数。
  • 可以假设函数是纯函数。
  • Java 编译器会做的优化没有任何意义。你真的知道它做了哪些优化吗?
  • 在这种情况下,它只是一个简单的公共子表达式消除。

标签: java optimization compilation compiler-construction compiler-optimization


【解决方案1】:

这被称为Common subexpression elimination

通常,这需要您实现一个完整的编译器才能进行数据流分析。 Dragon Book, "6.1.2 The Value-Number Method for Constructing DAG's" 中给出了一个算法(至少对于本地 CSE)。

【讨论】:

  • 这不是很常见的子表达式消除,因为函数调用可能有副作用,因此可能无法消除它。
  • 他说他要评估的函数是纯函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 2013-09-13
  • 2017-06-25
  • 1970-01-01
相关资源
最近更新 更多