当我们写完HelloWorld.java文件后,计算机怎么知道我们要干什么?那就需要说下编译了(可见文章:JIT编译),这里也简单补充点:
1.编程语言:
编程语言分为高级语言和低级语言:C、C++、Java等属于高级语言;机器语言和汇编语言属于低级语言。那和编译有什么关系呢?
简而言之,编译就是把程序员认识的高级语言转换成机器认识的低级语言的过程,可用命令javac进行编译;相对的,也会存在反编译,把机器看得懂的转成程序员看的懂的,理论上是把class文件转成java文件,但实际上是转成了我们可以看的懂的字节码,要想分析程序运行的背后原理,反编译必不可少。
2.编译
再来说下编译,编译可分为前端编译和后端编译,前者与语言有关,目标机器无关;后者与目标机器有关,语言无关。放在Java中,把.java文件编译成.class文件称为前端编译;把.class文件编译成机器语言称为后端编译。
前端编译成的.class文件中的字节码是一种中间代码,其有两点重要性质:易于生成;能轻松的翻译成目标机器上的语言。
后端编译,会将字节码解释成机器指令,为了提高性能和效率,引入了JIT技术,将“热点代码”翻译成机器指令,优化并缓存起来,以备下次使用。详见:JIT编译文章
3.反编译
我们对本地代码进行反编译,来体会一下它的用处。
我们有没有想过枚举类是个什么类?enum是什么意思?这时就需要反编译了:
反编译前:
反编译后:
经过反编译可知,enum类是一个被final修饰的class并继承了lang包下的Enum类,这样我们就知道它是怎么回事儿了。
再比如:
上面两张图是switch结构的两种数据类型,那有什么不一样呢?看是看不出来的,反编译后就知道了:
通过反编译可知,整型的直接比较数值;char类型的比较ascii码,会转成int型,那问题来了,String类型呢?通过反编译将会知道,String类型是通过equals()和hashCode()方法来实现。所以,Switch只支持一种数据类型,那就是整型,其他数据类型都会进行转换。
4.Java 10的本地变量类型推断
3月21日 Java 10发布,简单说一下其本地变量类型的推断。
反编译后得到:
两张图一对比就一目了然,它是个什么样子了。现在都慢慢的换上Java 8了,所以10就先了解这些吧。我们下期再见!
参考资料:http://www.hollischuang.com/