メタプログラミングてなんぞ

前回のエントリ(http://d.hatena.ne.jp/clmind/20090326/1238082037)でMooseはClass::MOPのラッパーで理解するにはメタプログラミングについて理解しないといけなさそう。なんてことを書いたかと思いますが、モダンPerl入門を読んでいるとmetaclassとかMooseX::AttributeHelpersだとかなんだかこの辺に絡みそうなのがポロポロ出てきたので調べてみました。

メタプログラグとは?

wikipedia曰く(wikipedia メタプログラミング)

メタプログラミング (metaprogramming) とはプログラミング技法の一種で、ロジックを直接コーディングするのではなく、
あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法、またその高位ロジックを定義
する方法のこと。主に対象言語に埋め込まれたマクロ言語によって行われる。

日本語でok。まあ明確な定義があるとも思えないしこういうのを噛み砕いて述べるのは難しいんでしょうね。基本的にここからは誤解を恐れず(まあそもそも自分も良くわかってないし)極力シンプルで投げやりな書き方で述べていこうと思います。まずはイメージが大事。

wikipediaの説明を読むと要するにたぶんメタプログラミングっていうのは

  • プログラムを生成するプログラミング
  • ネイティブに実装されているのではなく、その言語を用いてプログラマがプログラムを生成するプログラムを作る事ができる

といったものみたいですね。こう書いてもまだわかるよーなわからんよーなですが、プログラム内で動的にコードを生成するって感じですかね。evalとか使うんでしょうか。
ということで具体例ないかなと思って調べたら下記のようなのがみつかりました。

http://itpro.nikkeibp.co.jp/article/COLUMN/20070604/273453/

アクセサメソッドを動的に生成する例ですね。なるほど。さらにこんな記述が

ここで重要なことは,このattr_accessorはこのような機能を実現する文法ではなく,Moduleクラスが提供する単なるメソッドであり,
その気になれば同じような働きをするメソッドを自分で定義できる,ということです。

ここが上記で書いた「ネイティブに実装されいるのではなく〜」の下りの部分ですね。と考えるとRuby on Railsなんかはその恩恵を受けてる最たるものの一つな希ガスruby自体の設計思想もこの辺を意識してる部分が大きいのではないでしょうか。なんとなくだけど。

さらにこのメタプログラミングを実現するために必要なのが

だそうです。

ここも乱暴な書き方をしてしまうと、

  • メタクラスはクラス(インスタンス)の情報を保持するクラス (先のエントリで書いたインスタンス名とかを保持しているクラス)
  • MOPはメタクラスを通してオブジェクトを操作するためのAPI (オブジェクトの情報を取り出したりとかオブジェクトに対する変更を行うメソッド)

という所でしょうか。

まあ雰囲気は掴めたかな。結局書いてみたりしないといくら調べてもぼやっと感が拭えないですけど。