这意味着通过javac编译器产生的字节码并没有比你写的代码好很多。例如,如果你写一个包含一个不变量的循环,javac编译器并不会移除这个不变量。程序员常常使用其他语言的编译器来清除那些代码异味。不幸的是,javac不能做这些。更重要的是,javac编译器不会执行简单的优化,比如循环展开,代数化简,复杂运算简化等。为了获取这些好处和其他简单的优化,程序员需要在Java源码级别来做这些,而不是依赖于javac编译器。这里有很多技术你可以用来让javac编译器产生更快,更小的字节码。不幸的是,为了获取这些好处,在Java编译器执行它们之前,你必须实现它们。
javac编译器也支持-g和-g:none的可选项。-g选项告诉编译器产生所有的调试信息。g:none选项告诉编译器不产生调试信息。使用-g:none选项编译可能产生最小的类文件。
因此,当试着产生最小的类文件时可以使用该选项。
六、Java调试器
我见过的一个非常有用的Java编辑器的特性就是和C或C++调试器类似的反编译视图。反编译Java代码可能会暴露字节码,就像反编译C或C++代码会暴露汇编代码。除了这个特性外,另一个比较有用的特性可能是通过字节码进行单步调试的能力,一次执行一个操作码。
这种级别的功能允许程序员看到一手的,通过Java编译器产生的字节码,同时也能在调试期间通过它进行单步执行。程序员获取产生和执行的代码信息越多,就越有机会避免出错。调试器的类型特性鼓励程序员去查看,理解生成的字节码。
七、总结
这篇文章为你展示一个Java字节码到的综述和理解。任何语言的最好的程序员理解高级语言转换的在执行前的中间形式。对于Java,中间形式就是字节码。理解它,知道它如何工作,更重要的是,针对特别的源码,Java编译器会产生什么样的字节码,这可能会写出最快,最小的代码。
注:本篇文章翻译自Java bytecode: Understanding bytecode makes you a better programmer
翻译的惨不忍睹,各位见谅,如有其他翻译本文的,还请提供下链接,参考下。