预处理器和编译器之间的确切界限在哪里?何时称呼实现语言的软件为“预处理器”,何时称其为“编译器”?
顺便问一下,“编译语言”是一个已经确定的术语吗?如果是,它究竟意味着什么?
这是一个有趣的问题。我不知道一个确定的答案,但如果必须回答的话,我会说:
预处理器不解析代码,而是扫描嵌入式模式并扩展它们
编译器实际上通过构建抽象语法树(AST)来解析代码,然后将其转换为另一种语言。
预处理器输出的语言是输入语言的子集。
编译器输出的语言(通常)与输入语言非常不同(机器码)。
从一个简化、个人的角度来看:
我认为预处理器是任何形式的文本操作,它没有底层语言的概念(即:语义或构造),因此只依赖于自己的一套规则来执行其职责。
当规则和条例应用于被处理的内容时,编译器开始工作(是的,这使得“我的”预处理器成为了编译器,但为什么不呢:P),这包括语义和词法检查以及从x(文本)到y(二进制/中间形式)的转换。正如我的一位教授所说:“它是一个具有输入、处理和输出的系统。”
C/C++编译器关注类型正确性,而预处理器只是扩展符号。
编译器由多个进程(组件)组成。预处理器只是其中之一,相对来说是最简单的。
根据维基百科文章编译器进程划分:
除了最小的编译器外,大多数编译器都有两个以上的阶段。然而,这些阶段通常被视为前端或后端的一部分。这两个端点的交汇点是有争议的。
前端通常被认为是语法和语义处理的地方,以及将代码翻译成比源代码更低级别的表示。
中间层通常设计为在源代码或机器代码之外的形式上执行优化。这种源代码/机器代码的独立性旨在使通用优化能够在支持不同语言和目标处理器的编译器版本之间共享。
后端获取中间层的输出。它可能会执行更多的分析、转换和针对特定计算机的优化。然后,它会为特定的处理器和操作系统生成代码。
预处理只是前端工作的一小部分。
第一个C++编译器是通过在现有的C编译器工具集前面附加额外的进程来制作的,这不是因为它是好的设计,而是因为时间和资源有限。
如今,在商业领域中,我认为这样的非本地C++编译器无法生存。