C如何自我托管?

时间:2011-03-05 02:55:53

标签: c self-hosting

任何人都知道从.c源代码到最终可执行文件.exe的完整操作链?

我已经下载了gcc的源代码,发现其c-parser.y也是用c编写的:

extdef:
    fndef
    | datadef
    | ASM_KEYWORD '(' expr ')' ';'
        { STRIP_NOPS ($3);
          if ((TREE_CODE ($3) == ADDR_EXPR
               && TREE_CODE (TREE_OPERAND ($3, 0)) == STRING_CST)
              || TREE_CODE ($3) == STRING_CST)
            assemble_asm ($3);
          else
            error ("argument of `asm' is not a constant string"); }
    | extension extdef
        { pedantic = $<itype>1; }
    ;

所以谁知道c自我托管的完整故事?

更新

我知道如何编写一些脚本编译器,其中大多数都依赖于c编译器。

所以我现在问c编译器是如何工作的。

2 个答案:

答案 0 :(得分:6)

GCC有一个多阶段的过程,但是从一个有效的C编译器开始(可能是也可能不是GCC的另一个版本)。

  1. 使用其他C编译器创建GCC的第一个版本 - GNU C编译器。
    • 这为您提供了新版GCC的工作副本(假设旧编译器是可维护的)。
    • 然而,除了不可信的事故之外,GCC不会产生(新版本)GCC的编译器。
  2. 使用第一版GCC创建第二版GCC。
    • GCC的第二个版本(显然)是GCC将生成的代码。这是基准版本。
    • 但是,尚未证明这是稳定的。
  3. 使用第二版GCC创建第三版GCC。
    • 第二版GCC应为第三版GCC产生相同的输出。
  4. 确保GCC的第二个和第三个版本相同。
    • 在某些平台上,目标文件包含编译时间;显然,编译时间必须折扣编译时间的差异。
    • 假设第二个和第三个版本“相同”,那么我们知道GCC可以通过自己的源代码生成自己。
    • 现在可以安全地使用新版本的GCC来构建各种运行时库,以及该系列中的其他编译器。
  5. 使用新的C编译器构建GNU Compiler Collection的其他部分。
    • 大多数人不会将GNU编译器集合限制为仅仅是C编译器。
    • 通常,他们也会生成C ++和Java(通常是Objective C)编译器。
    • 您也需要标准C ++库支持。
    • 通常,C编译器使用平台提供的C库。

答案 1 :(得分:1)

你很惊讶C编译器是用C编写的吗? C专家在编写编译器时会使用哪种其他语言?

明显的鸡蛋问题只发生过一次,很久以前,根本没有没有编译器。然后有人必须在汇编中写一个(在别人用机器码编写第一个汇编程序之后: - )