Java“编译⼀次,到处运⾏”
与其他语⾔相⽐,Java程序能够做到“编译⼀次,到处运⾏”,可见它的跨平台性⾮常强。但是java的这种跨平台到底是怎么⼀回事啊,在这之前我们先了解⼀下不能跨平台是怎么⼀回事。
如何阅读java源码C或者C++等⾼级语⾔,是贴近于⼈类可阅读的语⾔,⽐较接近于英语语法。但是计算机只识别0、1序列组成的机器指令。所以要把C 或者C++语⾔翻译成计算机能识别的0、1序列组成的机器指令。担任这种翻译⼯作的就是“编译程序”。问题在于,每⼀个平台上认识的0、1序列并不⼀样。某⼀个指令可能在Windows上可能是0101,但是在Linux下也许是1010,因此必须使⽤不能的编译程序为不同平台编译出可执⾏的机器码,在Windows上编译好的程序,不能直接拿到Linux等其他平台执⾏。也就是说⽤C或者C++语⾔编写的程序,⽆法达到“编译⼀次,到处运⾏”跨平台性的⽬的。
Java也是⼀种⾼级语⾔,要让计算机执⾏你撰写的Java程序,也得通过编译程序的编译。但是Java编译程序并不直接将Java源代码编译为相依于计算机平台的0、1序列,⽽是将其编译为字节码。
Java源代码的扩展名为.java,经过编译程序编译之后⽣成扩展名为.class的字节码。如果想要执⾏字节码⽂件,⽬标平台必须要安装JVM(java虚拟机),JVM会将字节码翻译为相依与平台的计算机指令,即:0、1序列。但是⼀定要记着:不能的平台要安装专属该平台的JVM。这就好⽐你讲中⽂(*.java),Java编译程序帮你翻译为英⽂(*.class),这份英⽂⽂件到各个国家之后,再由当地看得懂英⽂的⼈(JVM)翻译为当地语
⾔(机器指令)。
所以JVM担任的职责之⼀就是当地翻译员,将字节码⽂件翻译为当时平台看得懂的0、1序列,有了JVM,你的Java程序就达到了“编译⼀次到处运⾏”的跨平台⽬的。所以到这⾥。我们就知道了java程序跨平台性好的根本原因就是java虚拟机JVM存在的原因。
对JVM的重要认知就是:
对Java程序⽽⾔,只认识⼀种操作系统,这个系统就是JVM,字节码⽂件(扩展名为.class的⽂档)就是JVM的可执⾏⽂件。
Java程序理想上,并不理会真正执⾏哪个平台,只要知道如何执⾏于JVM就可以了,⾄于JVM实际上如何与底层平台沟通,那是JVM⾃⼰的事。由于JVM实际上相当于Java程序的操作系统,JVM就负责了Java程序的各种资源管理。
我们要记住两点:
1.      JVM就是Java程序的操作系统,JVM的可执⾏⽂件就是.class⽂件。
2.      Java虚拟机屏蔽了操作系统之间的差异,但是不同的系统使⽤的虚拟机不同。