从几个问题引入:
- “一次编写,到处运行”
- Java是解释执行的吗?
- 自动垃圾收集
Java语言跨平台的含义以及实现原理
“Write once, run anywhere”是Java的一句被广为人知的宣传语。但很多人其实会把这句话记错,不知道怎么回事就记成了“一次编译,到处运行”。以为编译好后,放到不同平台上都能运行,当然不是这样!前几天学C++的舍友和我讨论两种语言的区别,提到Java跨平台的问题。最开始我对所谓跨平台没有进行思考,脑海中有个大致的印象就是“一次编译,到处执行”,在和舍友讨论的过程中,我才意识到自己的这种所谓的大致印象是错误的。下面就先从Java语言跨平台的含义说起。
“Java语言具有跨平台的特性”,这句话并不是说Java程序编译好后,拿到其他平台上就可以直接运行。
考虑C/C++等语言,在编程过程中,有时候会需要调用一些和具体操作系统API,也就是说对于不同OS来说,具有相同功能的API可能并不相同,所以在将代码迁移到其他OS上时,往往需要对编写好的源代码进行修改。
而对Java语言来说,我们编写好的Java源代码经由javac编译成字节码(.class文件),然后经由JVM生成可以执行的目标机器代码。要运行Java程序同样需要安装Java环境(JRE/JDK),想想看,在选择下载哪个版本的JRE/JDK的时候是不是需要选择和自己OS对应的版本?JVM包含在JRE里面,也就是说针对不同的OS我们有不同版本的JVM。
不同平台运行不同的JVM,但JVM载入和执行同一种字节码。 大致可以推理出,Java语言在平台和程序之间建构了一个中间层(JVM),以实现语言和平台的解耦:
- 语言层面遵循一定的规范,和系统相关的API被Java语言包装起来,经由JVM生成对应的机器代码。
- 这个中间层接收一种平台无关的字节码,然后将其转换成不同平台对应的机器代码。
所以说 Java 语言的跨平台特性是 “.class”文件 和 JVM 共同造就的。
而“一次编译到处,到处执行”这句话是不对的,是 “一次编写,到处执行”。
编写好Java源代码后,我们就可以在不同的安装了Java语言运行环境的机器上编译-运行这个程序,而 不需要改动源代码本身。
(嗯,感觉自己写的好口水化 = =)