「メタプログラミング」の版間の差分

削除された内容 追加された内容
編集の要約なし
rvv
タグ: 手動差し戻し
1行目:
'''メタプログラミング''' (metaprogramming) とは[[プログラミング (コンピュータ)|プログラミング]]技法の一種で、ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法、またその高位ロジックを定義する方法のこと。主に対象言語に埋め込まれた[[マクロ言語]]によって行われる。
[[ファイル:Atom classes.svg|代替文=|境界|右|フレームなし|215x215ピクセル]]
{{プログラミング・パラダイム}}
 
== 概要 ==
'''メタプログラミング'''(''Metaprogramming'')とは、自己反映性のプログラムロジックを操作して、コードまたはデータ定義情報の変容による再帰的なプログラムの自己修正と、帰納的なプログラムの自己検証を表現するためのプログラミング技法である。そのプログラムロジックは[[形而上学|形而上的]]要素になぞらえられて実装面では[[メタデータ]]と呼ばれる。プログラムの自己修正および自己検証はランタイム時とコンパイル時に大別される。ランタイム時メタの方はプログラム開始時の動作制約を越えた実行プロセスの最適化を目的にしており[[機械学習]]にも似た性質を持つ。コンパイル時メタの方は[[ソースコード]]の記述量削減と[[オブジェクトコード]]の最適化を目的にしている。ランタイム時メタの実装方式にはメタオブジェクトと[[リフレクション (情報工学)|リフレクティブプログラミング]]がある。コンパイル時メタの実装方式には[[マクロ (コンピュータ用語)|マクロ]]と[[テンプレートメタプログラミング]]がある。[[自動プログラミング]]、{{仮リンク|属性指向プログラミング|en|Attribute-oriented programming|label=}}、{{仮リンク|多段階プログラミング|en|Multi-stage programming|label=}}といったスタイルも存在する。メタプログラミングの原点は「[[LISP]]」であり[[人工知能]]研究とも関係性がある。
 
== LISPのメタプログラミング ==
代表的なメタプログラミングの例は[[LISP]]のマクロである。LISPではデータ、コードが全て[[S式]]で表現されるが、マクロによりS式が言語処理系に解釈される前に別なS式へと変換することができる。これにより例えば、
(defstruct point (x 0) (y 0))
25 ⟶ 22行目:
このことは、Lispのマクロが、'''上のかぎ括弧「」で括った言語仕様を変更し、独自の文法を作り上げた'''とも考えられる。しかし、この文法は、通常のLispにおいて期待されるような構成をしていない「記述どおりでない動作を行うプログラム」の一例であり、コードの可読性を損なう恐れのある不必要なメタプログラミングである。
 
== マクロ ==
 
== リフレクティブプログラミング ==
 
== テンプレートメタプログラミング ==
メタプログラミングの他の例としては[[C++]]における「[[テンプレートメタプログラミング]]」などが挙げられる。
 
== メタオブジェクト ==
 
== 代表的なメタプログラミング採用言語 ==
 
*[[LISP]]
*[[REBOL]]
* [[クワイン (プログラミング)]]
 
== 脚注 ==
<references/>
 
== 関連項目 ==
* [[Common Lisp]]
* [[ドメイン固有言語]] - メタプログラミングにより構築することもできる。
* [[Scheme]]
* [[LISP]]
* [[REBOL]]
==* LISPのメタ[[クワイン (プログラミング ==)]]
* [[部分評価]]
{{* [[ドメイン固有言語]] - メタプログラミング言語の関連項目}}により構築することもできる。
 
[[Category:プログラミング|めたふろくらみんく]]