メタプログラミングとマクロ
メタプログラミングは、プログラムを他のプログラムが生成、検査、または変換できるデータとして扱い、マクロはコンパイル時に制御された構文抽象化を提供するものです。
PaperMindでテーマを探す近日公開Find papers & topics
Tools & resources
Learn & explore
動画近日公開
Definition
メタプログラミングとは、他のプログラム(またはそれ自身)を生成、分析、または変換するプログラムを作成することであり、マクロとは、コンパイル前またはコンパイル中にソース構文を展開されたコードに書き換えるメタプログラミング機能です。
Scope
このトピックでは、プログラムがプログラムを操作する技術について扱います。具体的には、字句的および構文的マクロ、衛生的マクロ展開、コンパイル時コード生成、多段階プログラミング、リフレクション、およびテンプレートシステムです。これらのメカニズムが、特に変数捕捉とバインディングに関して、正当性を維持しながら言語の構文と抽象化をどのように拡張するかについて考察します。
Core questions
- 構文抽象化は、安全でない名前捕捉なしに言語をどのように拡張できるのでしょうか?
- コンパイル時メタプログラミングと実行時リフレクションの違いは何でしょうか?
- 多段階プログラミングは、プログラム生成と実行をどのように分離するのでしょうか?
- メタプログラミングは、いつ抽象化を向上させ、いつ可読性やツールを損なうのでしょうか?
Key theories
- 衛生的マクロ展開
- Kohlbeckerらは衛生的マクロを導入しました。これは、展開中に束縛変数を自動的に名前変更することで、マクロによって生成されたコードが使用サイトの名前を意図せず捕捉したり、捕捉されたりしないようにするものです。
- 多段階プログラミング
- TahaとSheardは、明示的なアノテーションを用いて段階的計算を形式化し、異なる評価段階にわたるコードの生成と実行について型付きの説明を与えました。
- テンプレートメタプログラミング
- SheardとPeyton JonesはHaskellに型付きコンパイル時メタプログラミングを追加し、プログラムがコンパイル時に抽象構文を構築およびスプライスできるようにしました。
Clinical relevance
マクロとメタプログラミングにより、ライブラリの作成者はドメイン固有の抽象化を作成し、定型コードを排除し、パフォーマンスのためにコンパイル時特殊化を実行できます。衛生とステージングの規律は、これらの強力な機能を日常的に安全に使用できるようにするものです。
History
マクロは初期のLispやアセンブリにまで遡りますが、非衛生的なLispマクロは意図しない変数捕捉の傾向がありました。Kohlbeckerによる1986年の衛生的展開がこれを解決し、Schemeのsyntax-rulesに影響を与えました。その後の研究では、多段階プログラミング(MetaML)が形式化され、Haskell、Scala、Rustなどの言語に型付きコンパイル時メタプログラミングが導入されました。
Debates
- マクロの能力と理解しやすさ
- 言語設計者は、無制限の構文抽象化が持つ表現力と、それが読者、デバッガー、およびツールにもたらす困難さを比較検討し、衛生的なマクロシステムと規律あるマクロシステムの必要性を促しています。
Key figures
- Eugene Kohlbecker
- Matthias Felleisen
- Walid Taha
- Tim Sheard
- Simon Peyton Jones
Related topics
Seminal works
- kohlbecker1986
- taha2000
- sheard2002
- abelson1996
Frequently asked questions
- マクロシステムを衛生的にするものは何ですか?
- 衛生的マクロシステムは、展開中に束縛変数を体系的に名前変更することにより、マクロによって導入された識別子が呼び出しサイトの識別子を意図せず捕捉したり隠蔽したりしないこと、またその逆も保証します。
- メタプログラミングは通常の関数とどう違うのですか?
- 通常の関数は実行時値に対して動作しますが、メタプログラミングはプログラム表現に対して動作し、多くの場合、実行時値が存在する前に、コンパイル時にコードを生成または変換します。