极客油画

​​可自举构建(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 」,也可搜索「 极客油画 」找到我。


上一篇 « 下一篇 »

赞赏支持

请我吃鸡腿 =^_^=

i ysf

云闪付

i wechat

微信

推荐阅读

Big Image