操作程序的程序。
元程序是以程序为输入、以程序为输出的程序。
程序 → 元程序 → 程序
凡是对程序本身进行分析、变换、生成的程序,都是元程序。
| 形态 | 时机 | 示例 |
|---|---|---|
| 编译时 | 源码 → 源码 | 宏、模板、代码生成器 |
| 加载时 | 链接/加载阶段 | AOT 织入、linker script |
| 运行时 | 程序执行中 | 反射、动态代理、JIT |
普通程序操作数据,元程序操作程序。
普通程序: 数据 → 逻辑 → 数据
元程序: 程序 → 逻辑 → 程序
程序在元程序眼中,不过是另一种形态的数据。
- 宏系统 — 语法扩展,编译时展开(Lisp macro、Rust macro)
- 代码生成 — 从描述生成源码(protobuf compiler、parser generator)
- 反射 — 运行时检查与修改自身结构(Java reflection、Go reflect)
- 模板元编程 — 利用类型系统在编译时计算(C++ template)
- AOP — 横切关注点织入(AspectJ、Spring AOP)
- 程序综合 — 从规约自动生成程序(program synthesis)
元程本身也是程序,也可以被元程操作。这种自指性(self-referentiality)是元编程的核心魅力——也是复杂性的根源。