导语
在非黑即白的静态编译语言和动态脚本语言的分类方法中,java的立场显得很尴尬。首先java是静态强类型语言,所以java源代码是需要编译的。但是javac编译后的产出物并不是和传统的编译语言一样的可以在特定OS上无依赖运行机器码。而是一种介于java源码和硬件机器码之间且运行需要依赖JVM抽象层的中间格式,也就是本文讨论的中心:jvm字节码。注意用词,字节码是属于JVM的,是面向JVM的字节码。
JVM生态分为如下3个部分:java原生语法和与之配套的源码编译器,jvm字节码规范,jvm实现规范。字节码是一套协议或者中间抽象层,是被编译器和虚拟机共同遵守的协议。编译器将源码解析处理成规范的字节码,jvm读取字节码文件magic,装载解析字节码。jvm语言生态如此蓬勃:kotlin,groovy等,都是因为有了字节码这层抽象。不管你定义什么样或现代或简洁的新的语言语法,只要你能配套的实现与之相关的编译器,能够将源码处理成规范的字节码,那么你就能在jvm上运行。字节码的来源对于jvm来说是透明的,jvm才不知道你是java还是kotlin编译来的呢。它只对字节码规范和jvm规范负责。
综上,JVM生态中,无论是上层语言语法层次,还是底层JVM装载运行层次,都只用分别对JVM字节码规范负责。JVM字节码规范的重要性不言而喻。这也是本文讨论的重点。注意:JVM语言百花齐放的本质原因就是因为JVM没有和Java的语言语法特性绑定,而是和中间字节码绑定,这应该是每一个java开发同学的常识