多年以前,分析过编译过程,并写了一篇博客,现在对编译过程有了更广阔的认识,记录在此
- 编译过程 中的 链接与 编译
编译过程分为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等指令集。输出: 输出是将这些客户机指令翻译(编译)为宿主机机器指令,以便在不同架构之间进行硬件级的仿真。
- 几种常见的程序编译及加载运行方式