前回の記事「メタって何?」
プログラミングを始めてから出くわした "メタ" についての用語まとめ(リンク集)です。
こちらも誤りや不足等あればご指摘いただけると幸いです。
メタ言語
とりあえずWiki。
メタ言語(メタげんご、英 Metalanguage)とはある言語について何らかの記述をするための言語である。Wiki
例えばプログラムがコンパイルされる時、その過程でプログラムは「パーザ」と呼ばれる構文解析器にかけられます。この時、パーザが参照する構文の定義に使用されている言語をメタ言語と呼びます。(goo:パーサとコンパイラの違いって?)
ここで私が混乱したのは、高級言語
という言葉との違い。
これは文法が機械に近いか人間に近いかという話で、メタ言語とは全く別です。
言語の高級/低級についてはこちらが分かりやすかったです。
メタプログラミング
メタプログラミングとはプログラムを操作するプログラムを作成することを意味します。メタプログラミングは他のプログラムを生成するプログラムであるというのが共通の認識となっていますが、メタプログラミングの実例はそれだけに限られません。自身の読み取り、分析、変換、あるいは変更を行うよう意図されているプログラムはすべて、メタプログラミングの例です。IBM
各言語によってどんなメタプログラムが書けるかは異なるようです。
簡単な例を2つほど紹介します。
・ pythonの __metaclass__
「クラスを生成するクラス」 を定義することができる。
言い換えると、メタクラスとは「クラスをインスタンス化できるクラス」です。
親クラスを作成して承継するのと何が違うのか。
親クラスを作成して承継するのは、親となるクラスを一部変更したインスタンスを作成したいとき、またはあるクラス間で共通させたいものを一箇所で定義したいときなどです。この際、どのクラスもデフォルトの type
というメタクラスのインスタンスとして生成されます。
メタクラスを定義するということは、このクラス生成の仕様を書き換えるということです。
クラスでそのクラスのインスタンスを定義するように、メタクラスではそのメタクラスのインスタンス(= クラス)を定義しています。
Pythonのクラスアトリビュートとメタクラスの話
Python の メタプログラミング (metaclass, メタクラス) を理解する
・ rubyの eval
引数に与えられた文字列を関数として実行する関数。
文字列から関数を生成して評価する関数とも言えます。
例えば、eval('10 + 20')
と実行すると 30
が返ってきます。
これは非常に簡単な例ですが、evalを使用することでプログラムによって動的にインスタンス変数が生成できたり、動的に関数を生成できたりします。
メタデータ
データについてのデータ。コンピューターのファイルなどについて、そのデータの作成者、作成日時、属性を記録したものをいう。(デジタル大辞泉)
例えば、デジタルカメラで写真を取った際についてくる 撮影日時・ISO・絞り値・フラッシュの有無などなど の情報がメタデータ。文書でも音源でも大体なにかしらのメタデータが付随しています。
おまけ
メタフィクション ≒ メタ発言, メタ表現
私はアニメの話をあまりしないので、最近になってこの言葉を知りました...。
厳密にはメタ発言はメタフィクションと同義ではないのですが、そこから派生したものと思われます。(知らんけど)
メタフィクション(Metafiction)とは、フィクションについてのフィクション、小説というジャンル自体に言及・批評するような小説のこと。それが作り話であるということを意図的に(しばしば自己言及的に)読者に気付かせることで、虚構と現実の関係について問題を提示する。Wiki
この手法として、作中の登場人物が作者と対話したり、読者に話しかけてきたり、作者が登場人物として作中に入り込んでしまったりというものがあります。漫画やアニメでも、キャラクターが意図的にコマからはみ出ようとしたり、来週も見てくださいね〜!的発言をしていたり といったシーンを見たことがあると思います。
作者のオチャメくらいにしか思っていませんでしたが、虚構と現実の関係についての問題を提起されていたのですね。。。ふむふむ