代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。——《深入理解Java虚拟机》
程序语言分为机器语言、汇编语言和高级语言,历史的发展演变也是从机器语言到高级语言的过程。现在几乎没有程序员的工作是编写机器语言,都是使用高级语言如C、Java来编程。计算机只能识别和执行仅含0和1的机器语言,所以我们使用高级语言编写的程序必须经过编译器变成机器语言才能被处理器执行。程序从源代码到运行的三个阶段为:编码——编译——运行。
编译的过程(Compile)
编译就是使用编译器把高级语言变成计算机可以识别的二进制语言。
如上图所示, 在C语言中,对于代码printf(1+2)编译的过程为:
- 编译器将printf(1+2)翻译成与当前处理器一致的汇编指令(1~4),然后插入当前操作系统的系统调用(操作系统提供函数来显示代码的输出)。
- 通过汇编器将上面的汇编指令转换成适合本地处理器执行的本地机器码。
平台差异
操作系统+处理器 = 平台,目前最常用的平台是:windows+intel,叫wintel平台。其它平台还有AMD+LINUX,power PC+Mac Osx。随着处理器的变化,汇编指令也会跟着变化,如intel处理器中add指令在AMD中是addtion,在power PC中Math add。随着操作系统的改变,系统级别的调用也会发生改变。
显然,对于一个C程序来说,要想在不同的平台上运行我们的源程序,就必须为每个平台提供特定的编译器,或者购买一些独立于平台的编译器,将我们的源程序转换成本地机器码。但编译器价格昂贵,并且可能出现兼容性问题,此时Java出现了。
Java的跨平台性——字节码
Java编译器将.java文件编译成字节码(.class文件),class文件中的代码其是是一种中间代码,介于源程序与机器码之间,该字节码不能被除JVM外任何平台所理解,当JVM接收到字节码,它会识别出它所工作的平台,然后将字节码转换为原生的机器码。
代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。——《深入理解Java虚拟机》
总结: Java源文件经过编译成字节码文件(.java文件转换为.class文件), 如何在各大操作系统中运行? 要想成功在不同的操作系统中运行就需要将字节码解释为适合改操作系统的机器码, 这就需要用到解释器, 也就是jvm了, jvm将字节码文件解释为操作系统能够执行的二进制文件, 不同操作系统所适配的jvm是不一样的, 所以说"一次编译,到处运行"这句话其实是依托于jvm的,