【问题标题】:Compiler optimization: Java bytecode编译器优化:Java 字节码
【发布时间】:2009-11-05 11:41:22
【问题描述】:

我目前正在编写一个针对 Java 字节码翻译的玩具编译器。

我想知道在编写 .class 文件之前是否可以在发出的字节码中进行各种简单的窥视孔优化的某种目录,也许是摘要。我实际上知道一些具有此功能的库,但我想自己实现它。

【问题讨论】:

  • 大部分优化不是在 Java 编译器中完成,而是在运行时完成。您的目标性能结果还是没有运行时优化的性能结果?
  • 真正的目标是编译器学习。我想这让编译时的优化对我来说更有趣,所以我可以看到正在发生的事情并自己实现它,而不是把它留给另一个软件。

标签: java optimization compiler-construction bytecode


【解决方案1】:

你知道 Proguard 吗? http://proguard.sourceforge.net/

这是一个很棒的字节码优化器,它实现了很多优化。请参阅常见问题解答以获取列表:http://proguard.sourceforge.net/FAQ.html

  • 计算常量表达式。
  • 删除不必要的字段访问和方法 来电。
  • 删除不必要的分支。
  • 删除不必要的比较和 实例测试。
  • 删除未使用的代码 块。
  • 合并相同的代码块。
  • 减少变量分配。
  • 删除 只写字段和未使用的方法 参数。
  • 内联常量字段, 方法参数和返回值。
  • 内联方法很短或只有 调用一次。
  • 简化尾递归 来电。
  • 合并类和接口。
  • 将方法设为私有、静态和 尽可能最终。
  • 制作课程 尽可能静态和最终。
  • 替换具有单个 实施。
  • 执行超过 200 窥视孔优化,例如 将 ...*2 替换为 ...
  • 可选 删除日志记录代码。

我相信您可以进一步查看源代码以了解它们是如何实现的。

【讨论】:

  • 也许有 .NET 版本?
  • 合并类和接口:编译器如何知道它可以折叠类型层次结构?它只能确定私有接口。
  • 在 Java 中,编译“真的”发生在运行时:这就是 JIT 在 JVM 中所做的事情。 javac 编译器只是字节码转换器的一个源,并且需要为给定的源发出某些字节码。因此,Proguard 在 Java 生态系统中做了 JIT 的一部分,而不是 javac 的部分。
  • 7 年过去了,是否有任何标准 Java 工具进行过这些优化?
  • 是的,JIT。它一直如此,并且不断得到优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
相关资源
最近更新 更多