Java跨平台性
PS : 本文乃学习整理参考而来
前言:Java优秀的跨平台性,和其语言特性紧密相连;
首先得说程序设计语言的分类,分为:编译型语言、解释型语言。
程序设计语言分类描述:程序执行时的基本表示是①实际计算机上的机器语言还是②解释器解释才能得到的机器语言(虚拟机的机器语言),可以由此将程序设计语言分为①编编译型语言和②解释型语言。
由于计算机只认识机器语言(二进制),所以高级语言(如C、C++、Java、Python、VBScript、JS等)都不能被计算机直接执行,必须经过有效翻译。如:编译和解释都是将高语言翻译成机器语言的方式,而区别是翻译的时间不同,由编译型语言写的程序在执行之前,先经过编译过程,把程序编译成机器语言文件,当运行时直接执行,因此只需进行一次翻译。而解释型语言写的程序不需要编译,直到程序运行时才进行动态翻译后执行。
以下对几个名词进行解释:
编译型语言:源程序经过编译、汇编和连接得到输出目标代码,然后由计算机执行目标代码(机器指令)。代表语言:C 、C++。
解释型语言:由可以理解源代码的解释程序(解释器)执行,解释器的任务是将源代码(中间代码)解释成可执行的机器指令。 代码执行时逐一解释成可执行的机器指令。 代表语言:Ruby、VBScript、JS,以及大多动态语言都是解释型的。
编译器:把源程序编译成机器语言,这样运行时计算机可以直接以机器语言来运行程序,执行效率高。
解释器:只在程序执行时,才一条条解释成机器语言给计算机执行,理论速度相对慢。
总结:
不同操作系统通过编译生成的字节码文件的格式不同,所以大多数编译型语言(如C语言)在Windows上编译后的文件,在Linux上出于该原因,无法执行,跨平台性受到限制。而解释型语言通过解释器(软件解释器)将中间代码动态解释成可以执行的机器指令。这就是编译型语言不如解释型语言跨平台性好的原因所在。
而Java较为特殊,Java需要编译,但是没有直接编译成机器语言,而是编译成为.class的字节码文件。然后通过Jvm的解释器进行解释执行。在Windows系统上运行,则通Windows上的Jvm进行解释,而在Linux系统上,则通过Linux上的Jvm解释执行。所以Java跨平台,需要保证有相匹配的Jvm,如果没有,则不能进行跨平台。
网上对于Java是属于编译型还是解释型语言热议比较多。如果在Java初期,Java的确是一种解释型语言,但随着JDK1.1中引入了即时编译器(JIT)技术,Java在特定条件下同样可以进行编译执行。这时候再笼统的说“解释执行”,对整个Java来说就是没有意义的概念。所以也有认为Java是一种“半编译,半解释”的语言。
PS:Go语言初识:一种编译型语言,但是不仅有C、C++般的执行效率,还有优秀的跨平台性,得益于Go语言编译器可以编译生成不同操作系统的机器码。