gpt4 book ai didi

c - C如何 self 托管?

转载 作者:太空宇宙 更新时间:2023-11-04 00:41:46 26 4
gpt4 key购买 nike

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

最佳答案

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 编译器集合仅限于 C 编译器。
    • 通常,他们还生产 C++ 和 Java(通常还有 Objective C)编译器。
    • 您还需要标准 C++ 库的支持。
    • 通常,C编译器使用平台提供的C库。

关于c - C如何 self 托管?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5201319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com