预处理器和编译器之间的边界究竟在哪里? 根据各种来源(例如,如果我记得正确的话),“C类”是用预处理器技术实现的(输出然后被馈送给C编译器),而C++总是用编译器实现(在刚开始的时候恰好吐出C)。这似乎引起了一些混乱,所以我想知道:

预处理器和编译器之间的边界究竟在哪里? 根据各种来源(例如,如果我记得正确的话),“C类”是用预处理器技术实现的(输出然后被馈送给C编译器),而C++总是用编译器实现(在刚开始的时候恰好吐出C)。这似乎引起了一些混乱,所以我想知道:,c++,compiler-construction,preprocessor,terminology,C++,Compiler Construction,Preprocessor,Terminology,预处理器和编译器之间的边界究竟在哪里?你什么时候把实现一种语言的软件称为“预处理器”,什么时候把它称为“编译器” 顺便问一下,“编译语言”是一个固定的术语吗?如果是,它到底意味着什么?预处理器输出的语言是输入语言的子集 编译器输出的语言(通常)与输入的语言非常不同。这是一个有趣的问题。我不知道一个明确的答案,但如果迫于压力,我会这么说: 预处理器不解析代码,而是扫描并扩展嵌入的模式 编译器实际上是通过构建AST(抽象语法树)来解析代码,然后将其转换为另一种语言 从简化的、个人的角度来看: 我认为

预处理器和编译器之间的边界究竟在哪里?你什么时候把实现一种语言的软件称为“预处理器”,什么时候把它称为“编译器”


顺便问一下,“编译语言”是一个固定的术语吗?如果是,它到底意味着什么?

预处理器输出的语言是输入语言的子集


编译器输出的语言(通常)与输入的语言非常不同。

这是一个有趣的问题。我不知道一个明确的答案,但如果迫于压力,我会这么说:

预处理器不解析代码,而是扫描并扩展嵌入的模式

编译器实际上是通过构建AST(抽象语法树)来解析代码,然后将其转换为另一种语言


从简化的、个人的角度来看:

我认为预处理器是任何形式的文本操作,它没有底层语言的概念(即语义或构造),因此只依赖于它自己的一组规则来执行它的职责。


当规则和规则应用于正在处理的内容时,编译器启动(是的,它使“我的”预处理器成为编译器,但为什么不是:p),这包括符号和词法检查,以及包含的从x(文本)到y(二进制/中间形式)的转换。正如我的一位教授所说:“这是一个具有输入、处理和输出的系统。”

C/C++编译器关心类型正确性,而预处理器只是扩展符号

编译器由几个进程(组件)组成。预处理器只是其中之一,也是相对最简单的一个

在维基百科的文章中:

除最小的编译器外,所有编译器都有两个以上的阶段。然而, 这些阶段通常被视为前端或前端的一部分 后端。这两个端点的交汇点是开放的 辩论

前端通常被认为是语法正确的地方 语义处理会发生,同时翻译到较低的层次 表示级别(高于源代码)

中间端通常是 旨在对源代码以外的表单执行优化 或机器代码。此源代码/机器代码独立性是 旨在使通用优化能够在版本之间共享 支持不同语言和目标处理器的编译器

后端从中间获取输出。它可能表现得更好 针对特定对象的分析、转换和优化 电脑。然后,它为特定处理器和操作系统生成代码。”

预处理只是前端工作的一小部分

第一个C++编译器,它是在现有的C编译器工具集前面附加附加程序,不是因为它的设计好,而是因为时间和资源有限。 现在,我认为这种非本地C++编译器在商业领域中还不存在。


我敢说这是不可能的。

答案很简单。 预处理器将文本作为输入,并将文本作为输出。例如旧的unix命令m4、cpp(C预处理器),以及诸如roff、nroff和troff之类的unix程序,它们用于(现在仍然是)格式化手册页(unix命令“man”)或格式化用于打印或排版的文本。 预处理器非常简单,它们对所处理的“文本语言”一无所知。换句话说,它们通常处理自然语言。C预处理器除了名称之外,例如,只识别#define、#include、#ifdef、#ifndef、#else等。如果使用#define宏,它会尝试“扩展”“宏在任何地方都能找到它。但这不需要是C或C++程序文本,它也可以是一本用意大利语或希腊文写的小说。 交叉编译成不同语言的编译器通常称为翻译器。因此,C++中的C++代码的老cAdvor编译器是一个C++翻译程序。 历史上使用预处理器和后来的翻译器是因为旧机器的内存不足,无法在一个程序中完成所有操作,而是由专门的程序从一个磁盘到另一个磁盘来完成。 典型的C程序可以从各种来源编译。构建过程将由make管理。在我们的时代,C预处理器通常直接构建到C/C++编译器中。典型的make-run将调用*.c文件上的CPP,并将输出写入不同的目录,从那里,c编译器CC将直接将其编译为机器代码,或者更常见的是将汇编代码作为文本输出。注意:c编译器只检查语法,它并不真正关心类型安全等。然后,汇编程序将获取该汇编程序代码并输出一个*.o文件,该文件稍后可与其他*.o文件和*.lib文件链接到一个可执行程序中。o您可能有一个make规则,它不会调用C编译器,而是lint命令,即C语言分析器,它正在查找典型的错误和错误(C编译器会忽略这些错误)。
在wikipedia(或您使用man的终端机器)上查找lint、nroff、troff、m4等是非常有趣的;动态语言编译器呢?@delnan:你是说脚本解释器吗?它们不是编译器,是吗?不是,编译器。编译器只是一个从一种编程语言转换到另一种编程语言的程序(或者,如果你想成为一个特殊的编译器,也可以是一个特殊的编译器)