编译器优化:Java字节码

Giu*_*ela 13 java compiler-construction optimization bytecode

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

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

Sea*_*wen 19

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

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

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

我相信您可以进一步查看源代码以了解它们的实现方式.

  • 在Java中,编译"真的"在运行时发生:这就是JIT在JVM中所做的事情.javac编译器只是字节码转换器的源,需要为给定的源发出某些字节码.所以Proguard在Java生态系统中做了JIT所做的一部分,而不是javac做的事情. (6认同)
  • 七年过去了,标准 Java 工具是否能够进行这些优化? (2认同)