宏处理器和预处理器有什么区别?
宏处理器
许多汇编语言都支持“宏”功能,其中宏语句将在转换为机器程序之前转换为一系列汇编语言语句,并可能包含其他宏语句。因此,宏功能是一种文本替换功能。
为了说明宏的实用性,可以考虑一种情况,即机器没有单个机器或汇编语言语句可以将一个内存地址的内容加到另一个内存地址上,例如假设的汇编指令 ADD X, Y。相反,假设机器有 LOAD 指令,它将数据从内存移动到寄存器,ADD 指令,它将内存地址的内容加到寄存器的内容上,以及 STORE 指令,它将数据从寄存器移动到内存。
通过使用这些指令,可以使用宏定义创建一个“双地址加法”指令,如下所示:
MACRO ADD2 X, Y LOAD Y ADD X STORE Y ENDMACRO
第一条语句将名称 ADD2 赋予宏并定义其虚拟参数(称为形式参数)X 和 Y。
接下来的三条语句定义了宏,即它们给出了宏的翻译。可以假设机器只有一个寄存器,因此无需考虑 LOAD 和 STORE 指令引用的寄存器是什么。可以使用 ADD2 作为普通的汇编语言操作码。
预处理器
预处理器是一个在源程序传递给编译器之前处理源程序的程序。它在称为预处理器命令行或指令的控制下运行。预处理器指令位于主线之前的源代码中。预处理器为编译器提供输入。它可以执行以下功能:
**宏处理** - 预处理器可以允许用户定义宏,这些宏是更高级结构的简写。
**文件包含** - 预处理器可以将头文件包含到程序 LEX 中。例如,C 预处理器在处理包含此语句的文件时,会生成文件 <global.h> 的内容以恢复语句 #include<global.h>。
**合理预处理器** - 这些处理器通过额外的当前控制流和数据结构设施来增强早期语言。例如,这样的预处理器可以为用户提供内置宏,用于构造 while 语句或 if 语句,而编程语言本身并不存在这些语句。
**语言扩展** - 这些处理器试图向语言中插入功能。例如,语言 SQL 是一个安装在 C 中的数据库查询语言。以 # 开头的语句被预处理器视为独立于 C 的数据库访问语句,并被转换为实现数据库访问的例程中的过程调用。