メタプログラミング

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動

メタプログラミング(Metaprogramming)とは、自身または外部のコンピュータプログラムを、通常のデータと同様に操作できる機能を持たせたプログラミング技術と定義されている。メタプログラミングは既存のプログラムを読み取り、解析し、修正し、拡張させるといった機能性を持っており、それを元にした新たなプログラムを生成することもできる[1]。実行中の自分自身に対するプログラム自己修正も可能である[2]。この技術はプログラマに対して、最小のコード量による最大の問題解決策を提供するものであり、そのプログラムに再コンパイルの必要がない高度に柔軟な拡張性を与えて、新仕様にも容易に対応できる効率的な保守性を持たせるものである[3]

メタプログラミングは、ランタイム式とコンパイル式に二分されるが、前者よりも後者が重視されるようになっている。よく使われているメタプログラミングの機能としては、型イントロスペクション英語版リフレクションテンプレートが挙げられる[4]。この技術のパイオニアはLISPであり、1970年代から注目を集めるようになって、特に人工知能アプリケーション分野では重視されている。

概要[編集]

代表的なメタプログラミングの例は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")

を用いた例[5]を紹介する。LispのS式がLispフォームになるためには、「S式の最初の要素は(関数、マクロ、特殊フォーム)のいずれかではならない。」しかし、

(defmacro backwards (expr) (reverse expr))

を定義すると、以下のように書ける:

(backwards ("hello,world" t format))

このことは、Lispのマクロが、上のかぎ括弧「」で括った言語仕様を変更し、独自の文法を作り上げたとも考えられる。しかし、この文法は、通常のLispにおいて期待されるような構成をしていない「記述どおりでない動作を行うプログラム」の一例であり、コードの可読性を損なう恐れのある不必要なメタプログラミングである。

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

脚注[編集]

  1. ^ Czarnecki, Krzysztof; Eisenecker, Ulrich W. (2000). Generative Programming. ISBN 0-201-30977-7 
  2. ^ Harald Sondergaard. “Course on Program Analysis and Transformation”. 2014年9月18日閲覧。
  3. ^ The Art of Metaprogrmming in Java”. New Circle. 2014年1月28日閲覧。
  4. ^ Programming Concepts: Type Introspection and Reflection”. The Societa. 2014年9月14日閲覧。
  5. ^ Peter Siebel: Practical Common Lisp 第三章の8から引用

関連項目[編集]