当前位置: 首页 > 面试题库 >

编译器优化:Java字节码

楚皓君
2023-03-14
问题内容

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

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


问题答案:

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

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

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

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



 类似资料:
  • 问题内容: 假设我在C代码中有类似的内容。我知道您可以使用a 代替,以使编译器不对其进行编译,但是出于好奇,我问编译器是否也可以解决此问题。 我认为这对于Java编译器来说更为重要,因为它不支持。 问题答案: 在Java中,if内的代码甚至都不是已编译代码的一部分。它必须编译,但不会写入已编译的字节码。它实际上取决于编译器,但我不知道没有对它进行优化的编译器。规则在JLS中定义: 优化的编译器可能

  • 如果关闭了编译器优化(gcc-o0...),那么说'volatile'关键字没有区别是可以的吗? 我制作了一些示例“C”程序,并且仅当打开编译器优化时,才在生成的汇编代码中看到易失性和非易失性之间的区别,即((gcc-o1....)。

  • 问题内容: Java编译器(即javac)在生成字节码时不会执行任何优化。是真的吗 如果是这样,那么它可以实现为中间代码生成器以消除冗余并生成最佳代码吗? 问题答案: 如果有的话,只会做很少的优化。 关键是JIT编译器完成了大部分优化工作-如果它具有很多信息,则效果最佳,如果执行优化,其中的一些信息也可能会丢失。如果执行某种形式的循环展开,那么JIT很难以一般的方式自行完成-而且,由于它了解目标平

  • 问题内容: 我正在为Pascal的子集编写编译器。编译器为一台组装好的机器生成机器指令。我想为此机器语言编写一个窥孔优化器,但是我无法替换一些更复杂的模式。 窥孔优化器规格 我研究了几种编写窥孔优化器的方法,并且选择了后端方法: 每当要生成机器指令时,编码器都会调用函数。 检查猫眼优化表: 如果当前指令与模式的尾部匹配: 检查先前发出的说明是否匹配 如果所有指令都与该模式匹配,则应用优化,修改代码

  • 本文向大家介绍C/C++ 编译器优化介绍,包括了C/C++ 编译器优化介绍的使用技巧和注意事项,需要的朋友参考一下 0. gcc -o gcc -o 的优化仍然是机械的,想当然的。只有做到深入理解计算机系统,加深对编程语言的理解,才能写出最优化的代码。 Linux下gcc 优化级别的介绍  · gcc -o0 ⇒ 不提供任何优化;  · gcc -o1 ⇒ 最基本的优化,主要对代码的分支、表达式、

  • 不久前有人问了一个有趣的问题: 我决定证明使用Java8流API(确切地说是并行流)是可能的。以下是我的代码,它在非常罕见的情况下工作: 然后我想,也许是因为潜在的JIT编译器优化?因此,我尝试使用以下VM选项运行代码: 我禁用了JIT,成功案例的数量显著增加! 即时编译器如何优化并行流,以便优化可能会影响上述代码的执行?