在了解java程序的运行机制之前,首先来了解一下什么是编译型语言和解释型语言。
我们都知道,任何高级程序语言编写的程序最终都要翻译成计算机能唯一接受和执行的机器语言,也就是二进制码。 因为翻译方式的不同,分为了编译型语言和解释性语言。两种方式只是翻译时间的不同。编译型语言在程序执行之前,有一个称为编译的过程,将程序翻译成机器语言文件。只需要翻译一次,以后要运行直接使用翻译结果,如exe文件,编译型语言的程序执行效率较高,像C/C++都是编译型语言,但是因为编译生成的是特定平台的机器码,所以可移植性差。而解释型语言不同,它没有编译这个过程,它有一个解释的过程,程序执行通过解释器将程序逐行地翻译成机器语言,程序在执行时才翻译,因此解释性语言每执行一次都要翻译一次,效率较低,像Python/JavaScript等都是解释型语言,可以方便移植到其他平台,但是是以牺牲程序运行效率为代价的。
Java是一门特殊的高级语言,它具有编译和解释两种语言的特征,因为Java程序执行时,要经过编译和解释两个步骤,而正是这种特殊实现了Java语言的平台无关性。
Java程序通过编译,并不生成机器码,首先生成一种与平台无关的字节码,这个过程就是A.java文件通过编译生成了A,class文件,这些字节码不是可执行的,必须使用java解释器来解释执行,这个解释器叫做Java虚拟机,即JVM(Java Virtual Machine)。
如下图所示:
JVM是Java程序实现跨平台的关键,Java编译器编译Java程序,生成与平台无关的字节码,这些字节码不面向任何平台,只面向JVM。不同平台的JVM是不同的,只要为不同的平台实现了相应的JVM,那么相同的字节码就可以在不同的平台上运行,这就实现了Java语言的跨平台。