3

在阅读这份文件的时候,在它的最后,有一句话:

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

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

4

4 回答 4

2

我认为使用术语 源到源翻译器而不是“预处理器”会更好,这使得它在含义上模棱两可,但使用它也没有任何错误。

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

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

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

翻译器是一种计算机程序,它将以给定编程语言编写的程序翻译成另一种语言的功能等效程序。

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

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

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

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

于 2013-07-27T06:34:01.333 回答
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 编译器创建目标代码和可执行文件),因此它有一个多阶段编译器(我正在简化一个少量)。
于 2013-07-27T06:51:45.837 回答
1

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

它应该被称为源到源编译器。其中一个例子是Cfront(由 Bjarne Stroustrup 自己设计),它将 C++ 转换为 C。

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

于 2013-07-27T05:05:08.577 回答
-1

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

于 2013-07-27T05:04:42.113 回答