ScholarGate
助手

元编程与宏

元编程将程序视为数据,其他程序可以生成、检查或转换这些数据,而宏则在编译时提供受控的语法抽象。

用 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

什么使宏系统具有卫生性?
一个卫生的宏系统通过在扩展过程中系统地重命名绑定变量,确保宏引入的标识符不会无意中捕获或遮蔽调用站点的标识符,反之亦然。
元编程与普通函数有何不同?
普通函数操作运行时值,而元编程操作程序表示,生成或转换代码,通常在编译时进行,在任何运行时值存在之前。

Methods for this concept

Related concepts