Skip to main content

メタプログラミング

メタプログラミングとは、プログラムが自身の構造を読み取り、変更する能力、またはそのようなプログラムを作成するプロセスを指す。
これにはコードを動的に生成、分析、変更することが含まれる。
メタプログラミングは、コンパイル時(静的メタプログラミング)と実行時(動的メタプログラミング)の両方で行うことが可能。

コンパイル時メタプログラミング

コンパイル時メタプログラミングは、プログラムのコンパイルフェーズで行われ、プログラムのソースコードを操作します。このアプローチでは、マクロ、テンプレートメタプログラミング(C++のテンプレートなど)、コード生成ツールを使用して、コンパイル時にコードの一部を自動的に生成したり変更したりします。これにより、プログラムの柔軟性と再利用性が高まり、ボイラープレートの量が減少しますが、実行時にはすでにコンパイルされたコードが実行されるため、実行時にこれらの変更を動的に行うことはできません。

実行時メタプログラミング

実行時メタプログラミングは、プログラムが実行されている間に行われ、リフレクション(オブジェクトの型情報や構造にアクセスし、それを操作する能力)、プロキシ、デコレーターなどを利用しプログラムの挙動を動的に変更する。   JavaScriptのオブジェクトプロパティへの動的アクセス、Pythonの getattrsetattr 関数、JavaのリフレクションAPIなどがこのカテゴリに属す。   実行時メタプログラミングにより、プログラムはより動的で柔軟になりますが、パフォーマンスオーバーヘッドが発生する可能性がある。

同意ではないが関連はある

実行時メタプログラミングは、実行時にプログラムの構造を変更する能力を指すため、実行時にメタプログラミングを行うことは「実行時に行われるメタプログラミング」と同意です。しかし、メタプログラミング全般を「実行時にのみ行われる」と解釈するのは正確ではありません。メタプログラミングは、コンパイル時にも実行時にも行うことができるため、より広い概念です。したがって、メタプログラミングは実行時に行われることもありますが、それに限定されるわけではなく、プログラムのライフサイクルの異なる段階で利用される技術です。