← 前一天目录后一天 →

每日科普 · 2026-11-07 周六

考研 408 × 求职面试

知识点 · 编译原理 · 进阶

编译器的自举(Bootstrapping)技术

编译器的自举(Bootstrapping)是指用某语言 L 的编译器来编译 L 语言自身的编译器源码,从而生成新版本编译器。它不是“无中生有”的循环依赖,因为开始必须有一个可运行的“种子编译器”,可能由其他语言或早期版本实现。典型过程分三步:1. 用种子编译器编译用 L 重写的新编译器源码,得到第一代编译器 C1;2. 用 C1 再编译同一份源码,得到第二代 C2;3. 比较 C1 与 C2 的功能或产物,若一致则说明自举稳定。自举的意义在于检验语言与编译器的成熟度,减少对宿主语言的依赖,并便于移植:把种子编译器和源码带到新平台,先产出本机版本,再用它编译自身。注意,自举成功不等于编译器完全不依赖任何已有可执行程序,初始种子仍是必要条件。

每日一题 · 编译原理

编译器的自举(Bootstrapping)技术

简述编译器自举的典型三步,并解释为什么它不构成循环依赖。

解析

先用种子编译器编译新编译器源码得 C1;再用 C1 编译同一源码得 C2;比较 C1/C2 功能或产物是否一致。关键是有初始种子编译器,自举是在已有可运行编译器基础上逐步替换和验证,不是从无到有。易错点:误认为不需要种子、把自举等同交叉编译。

面试小贴士 · 编译原理

编译器的自举(Bootstrapping)技术

常问:什么是自举?为什么要自举?如何移植?答:种子→C1→C2→比较验证;可减少宿主依赖、便于移植。易错:说完全无依赖、忽略种子、混淆自举与交叉编译。

代码实现 · C

代码示例

#include <stdio.h>
#include <string.h>

// 概念模拟:同一份自举源码应产出同一编译器名
const char *compile(const char *self, const char *src) {
    (void)self;
    (void)src;
    return "L-compiler";
}

int main(void) {
    const char *seed = "seed";
    const char *bootstrap_src = "compiler.c";
    const char *stage1 = compile(seed, bootstrap_src);   // 旧编译器编译新源码
    const char *stage2 = compile(stage1, bootstrap_src); // 新编译器编译自身源码
    puts(stage1);
    puts(stage2);
    if (strcmp(stage1, stage2) == 0)
        puts("自举成功:两代产物一致");
    else
        puts("自举失败");
    return 0;
}
← 前一天目录后一天 →