1

有人知道从.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编译器是如何工作的。

4

2 回答 2

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 编译器集合的其他部分。
    • 大多数人不会将 GNU Compiler Collection 限制为 C 编译器。
    • 通常,它们也生成 C++ 和 Java(通常是 Objective C)编译器。
    • 您还需要标准 C++ 库支持。
    • 通常,C编译器使用平台提供的C库。
于 2011-03-05T03:18:08.600 回答
1

您对 C 编译器是用 C 编写的感到惊讶吗?C 专家在编写编译器时会使用什么其他语言?

明显的先有鸡还是先有蛋的问题只发生过一次,很久以前,当时根本没有可用的编译器。然后有人不得不用汇编写一个(在别人用机器代码写了第一个汇编之后:-)

于 2011-03-05T12:18:06.447 回答