|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
编程范型（按语言比较（英语：）） |
| --- |
|  |
| 指令式 | 
* 过程式
* 块结构
* 例外处理
* 结构化
* 模块化

 |
|  |
| 函数式 | 
* 头等函数
* 纯函数式
* 隐式
* 模式匹配
* 推导式

 |
|  |
| 面向对象 | 
* 基于类
* 基于原型
* 契约式
* 面向方面
* 面向代理

 |
|  |
| 数据流程 | 
* 同步式
* 响应式
	+ 函数式响应式
* 串流处理
* 基于流程

 |
|  |
| 宣告式 | 
* 逻辑式
	+ 回答集
* 约束式
* 数据查询
* 框架本体

 |
|  |
|  | 
* 协程
* 演员模型
* 通信顺序进程
* future/promise
* 分叉会合
* 整体同步
* 映射归约

 |
|  |
| 其他 | 
* 递归
* 阵列式
* 多态
	+ 运算符重载
	+ 泛型
	+ 多分派
* 面向堆栈
* 非确定性
* 数据驱动
* 事件驱动
* 自动机
* 可微分
* 概率式

 |

 |

**元編程**（英語：Metaprogramming），又譯**超編程**，是指某类计算机程序的编写，这类计算机程序编写或者操纵其它程序（或者自身）作为它们的資料，或者在编译时完成部分本应在运行时完成的工作。多数情况下，与手工编写全部代码相比，程序员可以获得更高的工作效率，或者给与程序更大的灵活度去处理新的情形而无需重新编译。

编写元程序的语言称之为元语言。被操纵的程序的语言称之为「目标语言」。一门编程语言同时也是自身的元语言的能力称之为「反射」或者「自反」。

反射是促进元编程的一种很有价值的语言特性。把编程语言自身作为一級資料類型（如LISP、Forth或Rebol）也很有用。支持泛型编程的语言也使用元编程能力。

元编程通常通过两种方式实现。一种是通过应用程序编程接口（APIs）将运行时引擎的内部信息暴露于编程代码。另一种是动态执行包含编程命令的字符串表达式。因此，"程序能够编写程序"。虽然两种方式都能用于同一种语言，但大多数语言趋向于偏向其中一种。

示例
--

这是一个简单的使用bash脚本编写的元程序示例，同时也是一个生成式编程的例子：

```
#!/bin/bash
# metaprogram
echo '#!/bin/bash' >program
for ((I=1; I<=992; I++)) do
 echo "echo $I" >>program
done
chmod +x program

```

这个脚本（或程序）生成了一个新的993行的程序来打印输出数字1至992。这只是一个怎样用代码来编写更多代码的示例；但并不是打印一串数字最有效的方法。尽管如此，一个程序员可以在几分钟内编写和执行这个元程序，却生成了近1000行的代码。

不是所有的元编程都需要产生式编程。如果一个程序可以在运行时改变或者可以使用增量编译（如Lisp、Forth、Perl、Python、REBOL、Smalltalk、Ruby、PHP、Tcl、Lua、Groovy、Frink（英语：）和JavaScript），那么就可以在不实际生成源代码的情况下使用这种技术实现元编程。

最常见的元编程工具是编译器，它可以将程序员使用高级语言编写的相对短小的程序转换为等价的汇编语言或者机器语言程序。这是最基础的编程工具，在大多数情况下，直接编写机器语言程序是不太现实的。

编译器能够将一种语言转换为另一种，而其它元编程系统则允许以编程方式操纵一种语言。宏系统即是这样一种简单的系统。在Microsoft Office©的程序中，宏可以记录一些特定的按键组合，并重新执行。另一方面，这些可执行代码可以通过点击宏选择界面的"编辑"按钮获得。

LISP恐怕是具备元编程能力的典范语言，不仅因为它在历史上优先发展，更由于它的元编程的简洁与强大。在Lisp元编程中，准引用操作符（通常是一个逗号）引入的代码是在程序定义时而不是运行时被赋值。元编程语言因此等价于主编程语言，并且在需要的时候，已经存在的Lisp例程还可以直接重用于元编程。

在程序中嵌入直接处理程序数据的解释器即可实现这一目的。现在已经有一些用于常用高级语言的实现，例如RemObject为Object Pascal编写的Pascal Script。

另一个很常用的元编程例子是lex和yacc，这两个工具用来生成词法分析器和语法分析器。Yacc通常用作编译器的编译器，生成能够将高级语言转换为机器语言的工具。

自产生程式是一种源代码等于输出的特殊的元程序。面向语言的程序设计是一种强烈关注元编程的编程风格，通过领域特定语言来实现。

宏用于产生式编程
--------

IBM System/360及其衍生物拥有强大的汇编宏工具，通常用于生成完整的程序或者程序片段（比如针对不同操作系统）。CICS事务处理系统也提供了汇编宏，可以生成用于预处理阶段的COBOL语句。

元编程实现
-----

* ASF+SDF元环境
* DMS软件再造工具包
* 意图编程
* Joose（JavaScript）
* Moose (Perl)
* Nemerle
* Stratego/XT
* Template Haskell

外部链接
----

* Code generation Vs Metaprogramming （页面存档备份，存于）
* The Art of Enterprise Metaprogramming
* c2.com Wiki: Metaprogramming article （页面存档备份，存于）
* "Solenoid": The first metaprogramming framework for eXist-db （页面存档备份，存于）

|  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
编程语言类别（維基數據所列：） |
| --- |
|  |
| 范型 | 
* 指令式
* 过程式
* 函数式
* 逻辑式
* 基于类
* 面向对象
* 基于原型
* 基于对象
* 面向方面
* 数据流程
* 同步式
* 动态
* 脚本
* 元编程
* 宏
* 反射式
* 事件驱动
* 并发
* 基于演员
* 管道
* 阵列
* 串接
* 面向堆栈
* 宣告式
* 模板
* 可扩展（英语：）
* 基于规则
* 领域特定
* 多重范型
* 触控（英语：）

 |
|  |
| 编程语言层次 | 
* 机器
* 汇编
* 编译
* 解释
* 低级
* 高级
* 极高级

 |
|  |
| 有关 | 
* 世代
* 非英语基础（英语：）
* 可视化

 |

 |

|  |  |  |  |  |
| --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
後設 |
| --- |
|  |
| 基础领域与方法 | 
* 或統合分析
* （英语：）或元類別
	+
* 後設認知
	+ （英语：）
	+ （英语：）
* （英语：）
* （英语：）
* 或詮釋資料
* （英语：）
* 
* 後設作品
* 
* 
* 
* 
* 元語言或後設語言
	+ （英语：）
* 超材料
* 
* （英语：）
* 或後設模型
	+ （英语：）
* 元现代主义
* （英语：）
* 
* +
* 或超编程、後設编程
* （英语：）或超最佳化、後設最佳化
* （英语：）
* （英语：）
* + 
	+ 
	+ （英语：）
	+ （英语：）
	+ 形上學
		- （英语：）
* （英语：）
* 或複合族群
* （英语：）
* （英语：）或
* 
* 元搜索
* （英语：）
* 
* 
* （英语：）
* 元宇宙或後設宇宙、超感空間

 |

 |