C如何自我托管?

com*_*ler 1 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; }
    ;
Run Code Online (Sandbox Code Playgroud)

所以任何人都知道c的自托管的完整故事?

UPDATE

我知道如何编写一些脚本编译器,其中大部分都依赖于c编译器.

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

Jon*_*ler 6

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

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

  • 第一步甚至可以在不同的平台上,例如,您可以在x86上为ARM编译gcc - 称为交叉编译 (2认同)
  • @compiler"看来你不知道自我托管的意思是什么......例如,PHP编译器的自托管语言是C",呃,不,看来你不知道**自己**托管方式. (2认同)