目录
这篇日志把JVM中的中间语言转换总结一下,看看从中间语言转换成机器码的方式是怎样的。方法是程序最基本的单元,由指令的集合组成,在Java里就是字节码的组合,即对字节码的封装,JVM在进入一个Java方法后,将每一条字节码指令取出,逐条按顺序执行,例如基本四则运算,与或非,左移右移等,不过JVM的方法调用不像CPU执行原子指令那样,直接跳到对应的方法代码段,而是先把Java代码编译成中间语言-字节码,接着在程序运行过程中动态将字节码指令解释成机器指令,所以JVM最后执行的就是一堆机器指令,这样做的目的是实现兼容性,在一个平台上完成的代码,在另一个平台上依旧可以解释运行。
兼容性的实现方式,拿C来举例,C实现兼容性的方式是在不同的操作系统上面使用不同的编译器来编译,例如在Windows上通常用mingw,Linux上用gcc编译,gdb来调试,Windows上加锁操作调用的API是CreateMutex(),Linux是pthread_mutex_lock();Windows上创建信号量是CreateSemaphore(),Linux上是sem_init()。C语言这种方式实现的兼容性,靠的是在不同的操作系统环境下开发不同的编译器,编译器能够将同样的一段C程序编译成当前平台、操作系统匹配的机器指令,程序员如果想要开发兼容Windows和Linux的程序,必须熟练两套不同的API,总的来说,“成本”太高。
中间语言转换
像Java,C#这类的高级语言编写的程序,都是先被编译成中间语言,再由虚拟机解释运行,程序运行过程中实时将字节码指令集翻译成机器指令,这样做的好处是,无论你在Windows,Linux还是其他平台上,编写的Java程序源代码都会被编译成同样的中间语言-字节码指令集&