メタプログラミングとは? わかりやすく解説

Weblio 辞書 > 同じ種類の言葉 > 情報 > コンピュータ > プログラミング > メタプログラミングの意味・解説 

メタプログラミング

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/01/13 02:08 UTC 版)

メタプログラミング (英語: metaprogramming) [注釈 1]とはプログラミング技法の一種で、一般に「プログラムを記述するプログラム」を書くこと、またはそのプログラムを指す[1]。対象言語に埋め込まれたマクロ言語によって行われることもある。

概要

一般に、スクリプト言語はメタプログラミングが得意だとされている。コンパイル型言語は実行前にソースコード一括で変換するという特性上、翻訳と実行を繰り返すスクリプト言語よりも実行時の割り込みや変換の自由度が低い[2]

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

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

(defmacro backwards (expr) (reverse expr))

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

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

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

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

危険性

ただ、メタプログラミングが強力な手段である以上、それに伴う危険性も理解しておかねばならない。

次はJavaScriptにおけるメタプログラミングの例である。

const add = new Function(..."xy", "return x + y");

add(2, 3); // => 5

この例では、文字列から関数addを生成したうえで、その関数を利用して計算を行っている[注釈 2]

ただ、このような野放図な使い方をすると、Functionコンストラクタに与える引数を打ち間違えただけで破壊的かつ致命的な結果を引き起こす場合がある。

そこでJavaScriptでは、「既存の機能を拡張する」ことに注力した、

  • Proxy
  • Reflect

というオブジェクトを提供している[4]。このように、目的ありきの手段として使用することにより、危険性を最小限にまで抑えながら強みを最大化することができる。

脚注

出典

  1. ^ あんどうやすし 2020, p. 343.
  2. ^ あんどうやすし 2020, pp. 343–344.
  3. ^ Seibel, Peter (2005年4月11日). “Practical Common Lisp”. Internet Archive. p. 95. 2023年12月11日閲覧。
  4. ^ あんどうやすし 2020, p. 345-346.

註釈

  1. ^ "meta-"は「高次」、「超」を表す接頭辞。
  2. ^ ただの例であって、推奨されない書き方である点に十分に留意

参考文献

  • あんどうやすし「メタプログラミングを学ぶ」『ハンズオンJavaScript』(初版)オライリー・ジャパン、東京、2020年11月13日。ISBN 978-4-87311-922-9 

関連項目


メタプログラミング

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/10/02 16:40 UTC 版)

Nemerle」の記事における「メタプログラミング」の解説

Nemerleマクロ機能は、コンパイル中にプログラム中のコード生成解析編集可能にする。マクロ通常のメソッド呼び出しとして使えるほか、構文定義して用いることもできるNemerle多く構文(if、for、foreachwhileusingなど)はマクロによって定義されている。 "if" マクロの例: macro @if (cond, e1, e2)syntax ("if", "(", cond, ")", e1, Optional (";"), "else", e2){ /* <[ ]> はコードクォートであり、Nemerleコンパイラ中身構文木変換して提供するC# における式木に似ているところがある。 */ <[ match ($cond : bool) { | true => $e1 | _ => $e2 } ]>}// コード中でマクロを使う:def max = if (a > b) a else b;// コンパイル中に上のコードは下のように展開される:def max = match (a > b){ | true => a | _ => b}

※この「メタプログラミング」の解説は、「Nemerle」の解説の一部です。
「メタプログラミング」を含む「Nemerle」の記事については、「Nemerle」の概要を参照ください。

ウィキペディア小見出し辞書の「メタプログラミング」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



メタプログラミングと同じ種類の言葉


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「メタプログラミング」の関連用語

メタプログラミングのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



メタプログラミングのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのメタプログラミング (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、WikipediaのNemerle (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS