最近在学习c第一课就讲了一个我认为很重要的知识,那就是C语言的编译原理,他和JAVA还是有很多区别的:
C语言的编译过程
预处理(Preprocessing):
- 预处理器处理源代码中的指令,如
#include
、#define
等。- 生成一个纯文本的
.i
文件,包含展开后的宏和包含的头文件。编译(Compilation):
- 编译器将预处理后的源代码转换成汇编代码。
- 生成一个
.s
文件,包含对应的汇编代码。汇编(Assembly):
- 汇编器将汇编代码转换成机器码(目标代码)。
- 生成一个
.o
文件或.obj
文件,这些是二进制目标文件。链接(Linking):
- 链接器将多个目标文件和库文件结合在一起,生成一个可执行文件。
- 生成最终的可执行文件,如
.exe
文件(在 Windows 上)或无扩展名的可执行文件(在 Unix/Linux 上)。Java 语言的编译过程
编译(Compilation):
- Java 编译器(
javac
)将 Java 源代码文件(.java
文件)编译成字节码文件(.class
文件)。- 每个
.java
文件对应一个或多个.class
文件。加载(Loading):
- Java 虚拟机(JVM)通过类加载器(Class Loader)加载
.class
文件。- 类加载器负责将字节码文件加载到内存中。
字节码验证(Bytecode Verification):
- JVM 验证字节码的正确性和安全性,确保字节码不进行非法操作。
解释与执行(Interpretation and Execution):
- JVM 解释字节码并执行。
- 为了提高性能,现代 JVM 使用即时编译(Just-In-Time Compilation, JIT),将热点代码编译成机器码以提高执行速度。
总结:
- C 语言:经过预处理、编译、汇编和链接四个阶段,最终生成可执行文件。生成的代码是直接与操作系统和硬件打交道的机器码。
- Java 语言:经过编译阶段生成字节码文件,字节码文件在 JVM 上运行。JVM 解释字节码并可以进行即时编译,提高执行效率。