元編程(英語:Metaprogramming),又譯超編程,是指某類計算機程序的編寫,這類計算機程序編寫或者操縱其它程序(或者自身)作為它們的資料,或者在編譯時完成部分本應在運行時完成的工作。多數情況下,與手工編寫全部代碼相比,程序員可以獲得更高的工作效率,或者給與程序更大的靈活度去處理新的情形而無需重新編譯。

編寫元程序的語言稱之為元語言。被操縱的程序的語言稱之為「目標語言」。一門編程語言同時也是自身的元語言的能力稱之為「反射」或者「自反」。

反射是促進元編程的一種很有價值的語言特性。把編程語言自身作為一級資料類型(如LISPForthRebol)也很有用。支持泛型編程的語言也使用元編程能力。

元編程通常通過兩種方式實現。一種是通過應用程序編程接口(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行的代碼。

不是所有的元編程都需要產生式編程。如果一個程序可以在運行時改變或者可以使用增量編譯(如LispForthPerlPythonREBOLSmalltalkRubyPHPTclLuaGroovyFrink英語Frink (programming language)JavaScript),那麼就可以在不實際生成源代碼的情況下使用這種技術實現元編程。

最常見的元編程工具是編譯器,它可以將程序員使用高級語言編寫的相對短小的程序轉換為等價的匯編語言或者機器語言程序。這是最基礎的編程工具,在大多數情況下,直接編寫機器語言程序是不太現實的。

編譯器能夠將一種語言轉換為另一種,而其它元編程系統則允許以編程方式操縱一種語言。系統即是這樣一種簡單的系統。在Microsoft Office©的程序中,宏可以記錄一些特定的按鍵組合,並重新執行。另一方面,這些可執行代碼可以通過點擊宏選擇界面的「編輯」按鈕獲得。

LISP恐怕是具備元編程能力的典範語言,不僅因為它在歷史上優先發展,更由於它的元編程的簡潔與強大。在Lisp元編程中,准引用操作符(通常是一個逗號)引入的代碼是在程序定義時而不是運行時被賦值。元編程語言因此等價於主編程語言,並且在需要的時候,已經存在的Lisp例程還可以直接重用於元編程。

在程序中嵌入直接處理程序數據的解釋器即可實現這一目的。現在已經有一些用於常用高級語言的實現,例如RemObject為Object Pascal編寫的Pascal Script

另一個很常用的元編程例子是lexyacc,這兩個工具用來生成詞法分析器語法分析器。Yacc通常用作編譯器的編譯器,生成能夠將高級語言轉換為機器語言的工具。

自產生程式是一種源代碼等於輸出的特殊的元程序。面向語言的程序設計是一種強烈關注元編程的編程風格,通過領域特定語言來實現。

宏用於產生式編程

編輯

IBM System/360及其衍生物擁有強大的匯編宏工具,通常用於生成完整的程序或者程序片段(比如針對不同操作系統)。CICS事務處理系統也提供了匯編宏,可以生成用於預處理階段的COBOL語句。

元編程實現

編輯

外部連結

編輯