多年以前,分析过编译过程,并写了一篇博客,现在对编译过程有了更广阔的认识,记录在此
- 编译过程 中的 链接与 编译
编译过程分为
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编译运行(JIT编译+直接运行)的区别
以 bash 对 shell脚本的解释运行 和 qemu 的 JIT 为例
虽然两者都涉及代码的执行,但其输入和输出确实有很大差异。
1.Bash对Shell脚本的解释运行:
输入: 输入是Shell脚本文件,包含一系列命令和操作。
输出: 输出是执行命令后的结果,可能是文本输出、系统状态更改等。
2.QEMU的JIT(即时编译):
输入: 输入是客户机指令,例如ARM、x86等指令集。
输出: 输出是将这些客户机指令翻译(编译)为宿主机机器指令,以便在不同架构之间进行硬件级的仿真。
- 几种常见的编译及加载运行方式