C语言编译过程再解析

多年以前,分析过编译过程,并写了一篇博客,现在对编译过程有了更广阔的认识,记录在此

  • 编译过程 中的 链接与 编译
编译过程分为
	1. 预处理
	2. 编译
	3. 汇编
	4. 链接

其中有 2个过程比较特殊,
	1. 编译
	2. 链接

对于C程序来说,链接分为
	提前链接(静态链接)
		对应下图第1行
	运行时链接(动态链接)
		对应下图第2行
对于C程序来说,编译分为
	普通编译
		.c -> 与host同架构的.o
	交叉编译
		.c -> 与host不同架构的.o
	提前编译(AoT) // Ahead-of-Time Compilation // 这里的编译也可叫做 翻译
		与host不同架构的.elf(中的指令) -> 与host同架构的.elf(中的指令)
		对应下图第6行
	运行时编译(JIT) // Just in time Compilation // 这里的编译也可以叫做 翻译
		与host不同架构的指令 -> 与host同架构的指令
		对应下图第5
  • 解释运行 与 JIT编译运行的区别
解释运行和JIT编译运行(类似qemuJIT编译+host直接运行)的区别
	以 下面和下图 为例
		bash 对 shell脚本的解释运行 // 下图第3行
		qemu 的 JIT  // 下图第5行
		

虽然两者都涉及代码的执行,但其输入和输出确实有很大差异。
1.Bash对Shell脚本的解释运行:
	输入: 输入是Shell脚本文件,包含一系列命令和操作。
	输出: 输出是执行命令后的结果,可能是文本输出、系统状态更改等。

2.QEMU的JIT(即时编译):
	输入: 输入是客户机指令,例如ARM、x86等指令集。
	输出: 输出是将这些客户机指令翻译(编译)为宿主机机器指令,以便在不同架构之间进行硬件级的仿真。
  • jvm 的 JIT 和 qemu的JIT
1. JVM中的JIT(Java虚拟机的即时编译器):
	输入: Java虚拟机的JIT编译器接收Java字节码作为输入。Java源代码经过编译器编译成字节码,JIT编译器在运行时将这些字节码转换为特定平台的本地机器码。
	输出: JIT编译器的输出是特定平台的本地机器码,它是对Java字节码的即时编译结果。这些机器码被直接执行以运行Java程序。

2.QEMU中的JIT(QEMU的动态二进制转换器):
	输入: QEMU的JIT编译器接收客户机指令,例如ARM、x86等指令集,作为输入。QEMU在模拟不同体系结构时会将客户机指令翻译成宿主机机器指令。
	输出: JIT编译器的输出是宿主机机器指令,这些指令是对客户机指令的翻译结果。它们被用于在不同架构之间进行硬件级的仿真。
	虽然两者都涉及到将一种形式的代码转换为另一种形式的代码,但输入和输出有所不同,因为JVM的JIT编译器针对Java字节码进行处理,而QEMU的JIT编译器处理不同体系结构的指令集。
  • 几种常见的编译及加载运行方式

C语言编译过程再解析_第1张图片

你可能感兴趣的:(simulation,posix)