TL;DR
プログラムを書くプログラム、つまりプログラムを操作するプログラムを書く技法。マクロやテンプレートなどで実現する。
なぜ必要か
Wikipedia によると、メタプログラミングは目的に沿って使えば強力な手段になる。言語に組み込まれていない自動生成の仕組みを、プログラマ自身が定義できる。
仕組み
Wikipedia は、次のような手法を挙げている。
- Lisp のマクロ: 言語処理系が解釈する前に、S 式を別の S 式に変換する
- C++ のテンプレートメタプログラミング
- JavaScript の
new Functionによる、文字列からの関数の生成
Effective Rust によると、Rust のマクロもメタプログラミングの一種で、プログラム内で同じ目的を果たすコード片を 1 つにまとめて扱う。
例
Wikipedia によると、Lisp の defstruct は 1 つの記述から、構造体の定義、コンストラクタ、アクセサ、複製関数、述語を自動で生成する。
コード生成なしでモック処理を実現!ovechkin-dm/mockioで学ぶメタプログラミングでは、Go でコード生成を使わずにモックを実現する例が紹介されている。
注意点
Wikipedia によると、メタプログラミングは破壊的で致命的な結果を引き起こすことがある。マクロは任意の字句を置き換えられるので、展開後のコードが言語の文法から外れることもある。必要のないメタプログラミングは避ける。