メタプログラミング

メタプログラミング (metaprogramming) とはプログラミング技法の一種で、ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法、またその高位ロジックを定義する方法のこと。主に対象言語に埋め込まれたマクロ言語によって行われる。

概要 
代表的なメタプログラミングの例はLISPのマクロである。LISPではデータ、コードが全てS式で表現されるが、マクロによりS式が言語処理系に解釈される前に別なS式へと変換することができる。これにより例えば、
 (defstruct point (x 0) (y 0))
という記述から
 構造体定義 point型
 コンストラクタ make-point (省略時の初期値は0, 0)
 アクセサ point-x point-y
 複製 copy-point
 述語 point-p
が自動的に生成される。

これがメタプログラミングと呼ばれるのは、「自動生成が言語組み込みの機能ではなくLISPのマクロによって記述されており、必要なら同様の機構をプログラマが定義できる」ためである。これは事実上言語文法の拡張に等しく、非常に強力なプログラム能力を得ることになる。反面、マクロは本来の文法を逸脱した字句の置き換えであるため、コードが「記述どおりでない」動作を行うことを意味している。そのため一般に必要でないメタプログラミングは避けられるべきとされる。

たとえば、文字列を整形して出力するformat関数
 (format t "hello,world")
を用いた例を紹介する。LispのS式がLispフォームになるためには、「S式の最初の要素は(関数、マクロ、特殊フォーム)のいずれかではならない。」しかし、
 (defmacro backwards (expr) (reverse expr))
を定義すると、以下のように書ける:
 (backwards ("hello,world" t format))
このことは、Lispのマクロが、上のかぎ括弧「」で括った言語仕様を変更し、独自の文法を作り上げたとも考えられる。しかし、この文法は、通常のLispにおいて期待されるような構成をしていない「記述どおりでない動作を行うプログラム」の一例であり、コードの可読性を損なう恐れのある不必要なメタプログラミングである。

メタプログラミングの他の例としてはC++における「テンプレートメタプログラミング」などが挙げられる。

脚注

関連項目 
 Common Lisp
 Scheme
 LISP
 REBOL
 クワイン (プログラミング)
 部分評価
 ドメイン固有言語 - メタプログラミングにより構築することもできる。

めたふろくらみんく
めたふろくらみんく