可自举构建(Bootstrappable Builds)
他们的Linux引导流程始于一个仅512字节的二进制种子。这个种子包含的可能是你能想象的最简编译器:它接收十六进制数字,输出对应的原始字节。以下是用该编译器编译的"源代码"片段示例
31 C0 # xor ax, ax
8E D8 # mov ds, ax
8E C0 # mov es, ax
8E D0 # mov ss, ax
BC 00 77 # mov sp, 0x7700
FC # cld ; clear direction flag
88 16 15 7C # mov [boot_drive], dl
这个编译器先编译出一个极简的操作系统、一个简陋的shell,以及一个略微高级些的编译器。随后,新生成的编译器又会编译出更高级的编译器。如此迭代数次后,最终得到的产物已初具汇编代码的雏形。
DEFINE cmp_ebx,edx 39D3
DEFINE je 0F84
DEFINE sub_ebx, 81EB
:loop_options
cmp_ebx,edx # Check if we are done
je %loop_options_done # We are done
sub_ebx, %2 # --options
他们先使用汇编代码构建出一个极简的C语言子集。接着用这个子集编译出稍高级的C编译器,迭代几次后就能编译TinyCC。此后便能逐步引导出yacc、基础coreutils、Bash、autotools,最终抵达GCC和Linux的完整生态。
整个过程可以从这里查阅: https://github.com/fosslinux/live-bootstrap/blob/master/parts.rst
目前Rust在这条引导链中出现得极晚。开发者依赖mrustc(用C++编写的Rust替代实现)来编译rustc 1.56版本,再基于此编译现代Rust代码。问题在于:当C++被引入引导链时,整个引导过程已接近尾声。这意味着在C++出现前的任何阶段,你都无缘使用Rust。
如果能有一个直接从C语言引导的Rust编译器就太理想了——确切地说,是一个仅依赖TinyCC和QBE、且不预设任何系统工具的Rust编译器。以QBE作为编译后端,使用TinyCC实现rust编译前端,最终的目标是让这个rust编译前端能够直接编译官方版本的rustc/cargo。
本文发表于 0001-01-01,最后修改于 0001-01-01。
本站永久域名「 jiavvc.top 」,也可搜索「 极客油画 」找到我。

