很少有人将c++和java编译放在一起比较,确实,两者差异太大,几乎没有什么共性。但还是想对比看看。
1. C++编译过程
C++编译过程分为编译和链接两个过程,编译对应图中的大括号括起的部分,其余则为链接过程。
1.1 编译过程
编译过程又分为两个阶段:编译和汇编
- 编译:编译是读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码。源文件的编译过程包含两个主要阶段:
- 编译预处理
- 编译优化
- 汇编:汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。
1.2 链接过程
链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。
根据开发人员指定的同库函数的链接方式的不同,链接处理可分为两种:
- 静态链接:静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。静态链接的最大缺点是生成的可执行文件太大,需要更多的系统资源,在装入内存时也会消耗更多的时间。
- 动态链接:相对于静态链接而言,要等到程序运行时再将组成程序的目标文件进行链接的过程(当系统多次使用同一个目标文件时,只需要加载一次即可,节省内存空间)。
- 加载时链接(多数使用加载时链接)
- 运行时链接(每个调用都有系统开销,运行慢,用得少)
2. java编译过程
2.1 java编译过程
Java代码编译是由Java源码编译器来完成,也就是Java代码到JVM字节码(.class文件)的过程。 流程图如下所示
2.2 java执行过程
既然提了java编译过程,不得不提下java执行过程。
Java字节码的执行是由JVM执行引擎来完成,流程图如下所示