一.先上一张图,回顾一下计算机中CPU与内存的关系: 

java 执行流程 类 java程序执行流程图_编译器

 

粗浅的来说一个程序从开发到运行,你手里写好的代码交给计算机以后,经历了以下变化:

源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器(Linker) → 可执行程序 (executables)

下面以java程序为例,大篇幅介绍请看

java 执行流程 类 java程序执行流程图_字节码_02

JAVA运行原理   这里只呈现图片

 

 

java 执行流程 类 java程序执行流程图_字节码_03

  (1)Java源代码(.java)经过java前端编译器(Sun的javac或Eclipse JDT的ECJ)编译之后,并没有直接转化为机器码,而是转化成一种中间格式,成为字节码(.class)。

      如果你不明白什么是前端编译器请看

java 执行流程 类 java程序执行流程图_字节码_02

JAVA编译器分类详解

(2)字节码经过JVM转化成特定CPU架构的机器码。也正是因为这一中间物,java才有所谓的跨平台。在windows平台上编译好的字节码,copy到linux平台后,经过为linux而设计的Java虚拟机解释后即可执行。跨平台这一特征,是通过字节码和JVM来实现的。

下面说说字节码变成机器码的编译过程: 

  1. 预处理,就是把代码里引入的其他代码,插入到这段代码中,形成一个代码文件。
  2. 编译,就是把代码转化为汇编指令的过程,汇编指令只是CPU相关的,也就是说C代码和python代码,代码逻辑如果相同,编译完的结果其实是一样的。
  3. 汇编,就是把汇编指令转为机器码的过程,机器码可以被CPU直接执行。
  4. 链接,就是将一段我们需要的已经编译好的其他库,与我们的汇编结果连起来,这样才是最终程序完整的形式,操作系统才可以运行。不同操作系统编译好的其他库形式不同,而且链接的方式也不同,得到最终程序的形式也不同,所以编译好的程序只能在特定的操作系统下运行。 

java 执行流程 类 java程序执行流程图_java 执行流程 类_05

 

(3)操作系统将可执行文件加载到内存中。

(4)CPU开始执行内存中相应的指令。