人类用计算机处理文本主要是依赖宏语言以及一些专用的文本编辑器。事实上,早期的文本编辑器只提供基本的文本编辑功能,然后借助宏语言进行功能扩展。结果人类很快就发现,基于宏扩展的编辑器,功能越复杂,它的行为就越诡异。于是,文本编辑器的扩展语言很快就被换成了当时的一种通用的动态类型的函数式编程语言——Lisp。实际上,这就是 Emacs 的前世与今生。
研究编程语言设计的人,所追求的目标是,怎样定义一套文法,使之既能使之对人类简单又友好,且能准确无误的转译为另一种语言。在专业做编程语言设计的人看来,宏语言是最弱的语言,因为它几乎没有什么类型可言。类型越强的语言,往往越便于程序分析。要是有兴趣一起交流学习c/c++的小伙伴可以加群:941636044,里面有大神会给予解答,也会有许多的资源可以供大家学习分享,欢迎大家前来一起学习进步!
从宏处理器的角度来看,宏语言中只有两种类型:文本与宏。宏展开的结果是文本,但宏本身也是文本,二者的界限往往不是那么明显。在 M4 中,往往要借助引号来区分宏与普通文本,而引号本身又有可能是文本。类型如此贫弱,因此很容易在宏定义时引入一些并不显而易见的错误,而这些错误无法被其他程序检测。另外,用宏语言编写的复杂程序一旦在运行时出现问题,就很难准确定位问题所在,因为错误是在宏展开的结果中发现的,发现错误的时候,很难快速确定它是哪个宏的展开结果。
虽然 Dennis Ritchie 是 M4 的设计者之一,但是他并没有将 M4 作为 C 语言的宏处理器,而是为 C 语言设计了一种更为轻巧、简单的宏处理机制,显然这是有意而为之。
Eric Raymonad 在《Unix 编程艺术》一书中