【问题标题】:Want a clean explanation for GCC preprocessors想要 GCC 预处理器的清晰解释
【发布时间】:2013-07-27 11:53:36
【问题描述】:

读到这个document的时候,在它的最后,有一句话:

从历史上看,包括 C++ 和 Fortran 在内的许多语言的编译器都被实现为“预处理器”,它发出另一种高级语言,例如 C。

对预处理器一无所知,有什么文档吗?这是否意味着所有这些语言都将被翻译成C源代码?

【问题讨论】:

  • 是的,就是这个意思(假设“C 代码”是指 C 源代码)。
  • 是的,我刚刚更新了我的问题。谢谢。

标签: c++ c gcc preprocessor


【解决方案1】:

我认为使用术语源到源翻译器而不是“预处理器”会更好,这会使其含义模糊,但它不是使用它也没有错。

基本上,编译器是将源代码从高级编程语言翻译成低级语言(例如汇编语言或机器代码)的计算机程序。但是问题中的文档说:

从历史上看,许多语言的编译器,包括 C++ 和 Fortran, 已实现为“预处理器”,它发出另一个高电平 C等语言。

根据这个描述,可以说早先,编译器被实现作为源到源的翻译器。翻译器也是预处理器的一种形式,但它不同于程序中使用的预处理器。

翻译器是一种计算机程序,可以翻译编写的程序 将给定的编程语言转换为功能等效的程序 使用不同的语言。

现在,程序中使用的预处理器,让我们举个例子:

#include <stdio.h>// a PREPROCESSOR directive

预处理器是一个程序,它在处理源文件之前 主要编译发生,(类似于翻译器)但不同之处在于 HERE 它处理名称以#开头的指令

这里#include 是一个指令。该指令使预处理器将stdio.h 文件的内容添加到您的 程序。这是一个典型的预处理器动作:在源代码中添加或替换文本 在编译之前。

【讨论】:

  • 看完这里的所有答案,现在我得到了两点:1.这里的预处理器是指源到源的翻译器2.GCC今天不用这种方式,直接生成机器码
  • @DeanChen 是的!你去吧:)
  • 不错!你在哪里找到这个细节的?链接可以吗?
  • @GrijeshChauhan 谢谢!!实际上只有编译器和翻译器定义取自 en.wikipedia.org/wiki/Compiler" .. 其他一切都是我写的:)
【解决方案2】:

有些语言是通过让编译器生成 C 代码来实现的,然后由 C 编译器编译。值得注意的例子包括:

  • 早期的 C++(以及之前的 C 类)—cfront 从 C++ 代码生成 C 代码。一旦 C++ 支持异常(阅读 Stroustrup The Design and Evolution of C++ 了解更多信息),它就不再实用了,但并非所有 C++ 编译器都使用该技术(事实上,除了 cfront 之外,我不知道有任何其他编译器做到了)。
  • Yacc 被编译为 C 代码。 Bison 可以编译为 C 或 C++ 代码。
  • Lex 被编译为 C 代码。我相信 Flex 可以编译为 C 或 C++ 代码。
  • Informix ESQL/C 将嵌入式 SQL 转换为纯 C。
  • Informix 4GL 将 I4GL 源代码转换为 ESQL/C,然后使用 ESQL/C 编译器创建 C 代码(并使用 C 编译器创建目标代码和可执行文件),因此它具有多阶段编译器(我m 简化一点)。

【讨论】:

    【解决方案3】:

    短语“预处理器”现在具有完全不同的含义,在这里使用会令人困惑。但是,是的,这意味着一些编译器将其源代码发布到另一种语言。

    它应该被称为source to source compiler。其中一个例子是Cfront(由 Bjarne Stroustrup 本人设计),它将 C++ 转换为 C。

    有关 C++ 中“预处理器”一词的正常含义,请参阅here

    【讨论】:

    • 不知道把 Dart 做的事情叫做“预编译”是否合理;这意味着 Javascript 本身是编译的。当然,大多数 Javascript 实现都编译到某些虚拟机或其他虚拟机上,有些甚至具有生成某些机器代码的 JIT。不过,它似乎在扩展含义。此外,您两次省略了“预处理器”中的“ce”。
    • @rici 谢谢,我从答案中删除了 Dart 示例,因为它与问题无关(关于 gcc)。更正了错字。
    • 文档中描述的“预处理器”与您为 . 这种预处理器不应与 C 预处理器混淆,后者是 C、C++、Objective-C 和 Objective-C++ 语言的一个组成部分。
    • 我认为“预处理器”只是一个隐喻(我不知道该怎么称呼它),这意味着其他编译器产生另一种高级语言,如 C ,不像 gcc 编译器产生机器代码直接。
    • @PHIfounder 也许我说得不够清楚。这正是我的意思。最后一个链接仅供参考,不要混淆“预处理器”一词的正常含义。
    【解决方案4】:

    没有。不必要。许多 C++ 编译器,如 GCC 文档所述,(但不是 gcc/g++)产生 C 代码输出。他们为什么这样做呢?因此,他们可以搭载 C 编译器可以编译到的所有后端可执行代码(X86、AMD 等)。通过将 C 作为目标代码,他们可以在后端节省大量低端编码。此类编译器包括原始的 Cfront 和 Comeau C/C++。

    【讨论】:

    • g++ 当然不会产生 C 代码输出,clang (编译 C++)也不会。我不相信 MS Visual C++ 支持 - 它几乎不支持 C。那么您所说的这些大多数 C++ 编译器是什么?
    • Cfront 做到了。我认为 g++ 曾经这样做过,也许现在不会了。
    • 你想错了。而 Cfront 只是“大多数 C++ 编译器”,当时它是唯一的。
    • g++ 从来没有。 cfront 是 c++ 概念的快速证明,长期以来被遗弃,几乎没有资格被称为“如果不是全部的话”。
    • Comeau C/C++ 曾经/现在是另一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2011-04-24
    • 1970-01-01
    相关资源
    最近更新 更多