为什么说Java一次编写,多处运行

程序的可移植性,本质上与实现它的编程语言无关。需要区分两个概念:编程语言和语言的实现。

编程语言

我们通常说的C/C++、Java、Python、JavaScript等编程语言,其实是指语法和语义上的一种规范。这种规范,定义了编写程序时必须要遵循的一种书写规则,只有符合规则才能被编译器正确识别和理解。

语言的实现

语言的实现,通常指的就是编译器了。对于同一种语言,不同的编译器可以有完全不同的实现方式。

以Python语言为例,就有很多种大相径庭的编译器实现。

  • CPython - 解释执行。
  • PyPy - JIT执行。
  • Jython - 把Python源码编译成Java字节码,然后再Java虚拟机里执行。

C/C++也是一样,有很多种不同的实现,不过目前主流的实现,全都是编译成二进制的机器码执行的。但是,其实网络上也有很多C/C++的解释器,就是直接把C/C++的源码解释执行的。

了解了编程语言和语言的实现后,再来说说程序的可移植性。

程序的可移植性

程序的可移植性,通俗来讲,就是你在一个环境上编写出来的代码,是不是能够很方便的把它放到另外一个环境上运行。这里的环境,包括软件环境和硬件环境。

  • 软件环境:通常指操作系统,以及程序所依赖的运行时环境,如系统支持库等。
  • 硬件环境:指程序运行的目标硬件,包括CPU、芯片组、外设等。

但从编程语言本身来说,理论上,任何高级编程语言都是可移植的,只不过实现可移植性的方式有所不同。

编写一次,到处编译

对于C/C++,目前几乎所有通用的实现都是直接把源码编成二进制目标代码。对于这种实现方式,要想进行移植,就必须要保证在不同的软件环境和硬件环境下,都要实现相应的编译器。比如要有Windows+x86的编译器、Linux+x86的编译器、Linux+ARM的编译器等等。也就是编写一次,到处编译。

所以,所谓的C/C++程序不能跨平台,是指被编译成二进制的可执行文件不能跨平台,而不是C/C++语言本身不能跨平台。

编译一次,到处运行

而Java则选择了不同的实现方式。Java典型的实现是,把Java源码编译成字节码,然后把字节码放到虚拟机中进行执行。
对这种方式,要实现可移植性,则必须要保证,在每种不同的软件环境和硬件环境中,都必须要实现相应的Java虚拟机。
比如要有Windows+x86的Java虚拟机,Linux+x86的Java虚拟机、Linux+ARM的Java虚拟机等。这些不同的虚拟机,都遵循相同的Java字节码的规范。因此,只要把Java源代码编译成标准的Java字节码,就可以在所有的这些虚拟机中运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值