一.先上一张图,回顾一下计算机中CPU与内存的关系:
粗浅的来说一个程序从开发到运行,你手里写好的代码交给计算机以后,经历了以下变化:
源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器(Linker) → 可执行程序 (executables)
下面以java程序为例,大篇幅介绍请看JAVA运行原理 这里只呈现图片
(1)Java源代码(.java)经过java前端编译器(Sun的javac或Eclipse JDT的ECJ)编译之后,并没有直接转化为机器码,而是转化成一种中间格式,成为字节码(.class)。
如果你不明白什么是前端编译器请看JAVA编译器分类详解
(2)字节码经过JVM转化成特定CPU架构的机器码。也正是因为这一中间物,java才有所谓的跨平台。在windows平台上编译好的字节码,copy到linux平台后,经过为linux而设计的Java虚拟机解释后即可执行。跨平台这一特征,是通过字节码和JVM来实现的。
下面说说字节码变成机器码的编译过程:
- 预处理,就是把代码里引入的其他代码,插入到这段代码中,形成一个代码文件。
- 编译,就是把代码转化为汇编指令的过程,汇编指令只是CPU相关的,也就是说C代码和python代码,代码逻辑如果相同,编译完的结果其实是一样的。
- 汇编,就是把汇编指令转为机器码的过程,机器码可以被CPU直接执行。
- 链接,就是将一段我们需要的已经编译好的其他库,与我们的汇编结果连起来,这样才是最终程序完整的形式,操作系统才可以运行。不同操作系统编译好的其他库形式不同,而且链接的方式也不同,得到最终程序的形式也不同,所以编译好的程序只能在特定的操作系统下运行。
(3)操作系统将可执行文件加载到内存中。
(4)CPU开始执行内存中相应的指令。