宏处理程序是指把源程序中的宏指令或宏语句扩展成等价的、预先定义的指令序列或语句序列的处理系统。1
简述宏处理程序考虑源文件与汇编程序考虑源文件是大不相同的。对于汇编程序来说。源文件是一系列控制行、指令行和命令行;对于宏处理程序而言,源文件则是一长串字符。
在汇编代码之前必须先完成源文件的全部宏处理。由于宏处理与代码汇编无关,因此必须把宏处理时间和汇编时间区分开,在宏处理时间,汇编语言的符号、标号、事先定义的汇编程序符号和EQU符号以及定位计数器都是未知的。宏处理程序、识别不出汇编语言的格式。同样,在汇编时也不知道宏程序的任何信息。
宏处理程序扫描源文件,寻找宏调用。宏调用实际上是请求宏处理程序来再定义一个用户定义宏或者用宏处理所定义的值来替换一个内部宏或用户定义宏。
宏的定义值或回送值就是替换宏调用的文本。有些宏的回送值是零串(即不含字符的字符串),换言之,当调用这些宏时,会把调用从输入文件中移开,汇编程序根本不会感觉到它的存在,这对于条件汇编是非常有用的。
因此,在遇到宏调用时,宏处理程序把该宏调用展开成它的回送值。然后把宏的回送值送给汇编程序并继续执行宏处理程序,把不属于宏调用部分的全部字符都送到汇编程序中去。2
基本概念宏指令或宏语句实际上是按规定格式书写的某一源程序段的缩写。它们通常是用户根据自己的特定需要,采用程序设计语言所提供的指令或语句来定义,称之为宏定义,其中应给出宏的名字、格式、参数和等价的指令序列或语句序列。
对于常用的宏指令或宏语句亦可由系统预先定义,供用户直接引用。当用户在程序中要使用宏指令或宏语句功能时,只要按宏定义的格式,给出宏的名字及其相应的参数即可,这称之为宏调用。
当宏处理程序将源程序中出现的宏调用扩展成等价的宏指令序列或宏语句序列时,称之为宏扩展。
建立宏处理程序后,用户可以方便地定义和使用自己所需的宏指令或宏语句。这不仅能简化应用程序的编写,而且有助于软件人员研究和移植有关的软件。例如,利用宏指令或宏语句设计虚拟机,研究新的语言,以及生成带有变化成分的软件等。1
实现方法宏处理程序通常采用两遍算法实现:第一遍收集宏定义的信息;第二遍对源程序中的宏调用实施宏扩展。在第一遍扫描中,遇到宏定义时,应把名字、格式、参数等信息以及随后的等价的指令序列或语句序列记录到宏定义表中。对于源程序中宏定义以外的部分,将不加改变地复写到目标程序区中。第二遍扫描第一遍所产生的中问结果程序。遇到宏调用时,则将宏定义表中相应的等价指令序列或语句序列复写到目标程序区中。复写过程中,要用宏调用中的实在参数替换宏定义中的形式参数。如果限制每个宏调用只能调用前面已定义的宏指令或宏语句,那么这种宏处理程序的实现算法可合并成一遍算法来完成。
功能较强的宏处理程序还可增加嵌套宏定义、嵌套宏调用或条件宏处理等功能。如果宏定义中含有另外的宏定义,则称为嵌套宏定义。如果宏定义A中出现宏调用,那么在扩展A的宏调用过程中,又要进一步转去扩展其他的宏调用,这种情况称为嵌套宏调用。如果宏处理程序能根据宏调用中的特殊参数,有选择地把宏调用扩展成不同的指令序列或语句序列,则称为条件宏处理。1
本词条内容贡献者为:
王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所