元编程与宏
元编程将程序视为数据,其他程序可以生成、检查或转换这些数据,而宏则在编译时提供受控的语法抽象。
用 PaperMind 寻找选题即将推出Find papers & topics
Tools & resources
Learn & explore
视频即将推出
Definition
元编程是编写生成、分析或转换其他程序(或自身)的程序;宏是一种元编程工具,在编译之前或期间将源代码语法重写为扩展代码。
Scope
本主题涵盖程序操作程序的技术:词法和语法宏、卫生宏扩展、编译时代码生成、多阶段编程、反射和模板系统。它探讨了这些机制如何在保持正确性的同时扩展语言的语法和抽象,尤其是在变量捕获和绑定方面。
Core questions
- 语法抽象如何在不发生不安全名称捕获的情况下扩展语言?
- 编译时元编程与运行时反射有何区别?
- 多阶段编程如何将程序生成与执行分离?
- 元编程何时能改善抽象,何时会损害可读性和工具支持?
Key theories
- 卫生宏扩展
- Kohlbecker及其同事引入了卫生宏,它在扩展过程中自动重命名绑定变量,从而使宏生成的代码不会意外捕获或被使用站点的名称捕获。
- 多阶段编程
- Taha和Sheard通过显式注解形式化了分阶段计算,对跨不同评估阶段生成和运行代码进行了类型化描述。
- 模板元编程
- Sheard和Peyton Jones将类型化的编译时元编程添加到Haskell中,允许程序在编译时构建和拼接抽象语法。
Clinical relevance
宏和元编程使库作者能够创建领域特定抽象、消除样板代码并进行编译时专业化以提高性能。卫生性和阶段纪律是使这些强大功能足够安全以供日常使用的原因。
History
宏起源于早期的Lisp和汇编语言,但非卫生的Lisp宏容易发生意外的变量捕获。Kohlbecker于1986年提出的卫生扩展解决了这个问题,影响了Scheme的语法规则。随后的工作形式化了多阶段编程(MetaML),并将类型化的编译时元编程引入了Haskell、Scala和Rust等语言。
Debates
- 宏的强大功能与可理解性
- 语言设计者权衡了不受限制的语法抽象的表达能力与它给读者、调试器和工具带来的困难,从而推动了卫生和有纪律的宏系统。
Key figures
- Eugene Kohlbecker
- Matthias Felleisen
- Walid Taha
- Tim Sheard
- Simon Peyton Jones
Related topics
Seminal works
- kohlbecker1986
- taha2000
- sheard2002
- abelson1996
Frequently asked questions
- 什么使宏系统具有卫生性?
- 一个卫生的宏系统通过在扩展过程中系统地重命名绑定变量,确保宏引入的标识符不会无意中捕获或遮蔽调用站点的标识符,反之亦然。
- 元编程与普通函数有何不同?
- 普通函数操作运行时值,而元编程操作程序表示,生成或转换代码,通常在编译时进行,在任何运行时值存在之前。