Hatena::ブログ(Diary)

yvsu pron. yas このページをアンテナに追加 RSSフィード

2009-02-08

メタプログラミングの光と影

メタプログラミングとはソースコードを生成するプログラミングのことです。メタプログラミングによって生成したソースコードは、eval関数で実行することができます。

メタプログラミングとは - Perl入門?サンプルコードによるPerl入門?

メタプログラミングとは、ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法、またその高位ロジック定義する方法のこと。

メタプログラミング - Wikipedia

だから、eval関数は、手段であり、メタプログラミングそのものではない。これは弾さんが指摘してますね。

evalだけがメタプログラミングの技法ではないし、またevalはその威力ゆえ最後の選択肢とすべきだ。

404 Blog Not Found:perl,javascript and more - evalは最後の武器

弾さんのパフォーマンスの指摘に対して、miyagawaさんが、「必ずしもevalが遅いとは限らない」と指摘してますね。

メタプログラミングとevalのベンチマーク - Bulknews::Subtech - subtech


これは、evalに限らず、「メタプログラミングは、パフォーマンスボトルネックになることもあるが、適切な方法をとれば、問題になることはない」ということをいっているんだと思います。これは、私の感覚にかなり近い。


私は、結構メタプログラミングを駆使するほうです。例えば、S2Daoで次のようなインターフェースのメソッドがあったとします。

public Employee findById(Long id);

これをみると、S2Daoは、戻り値オブジェクト(Listではない)なので、1件データを返すんだなと判断します。また、引数idなので、where句にid = ?で検索したいんだなと判断します。

これが、メタプログラミングS2Daoでは、AOPを使って、メタデータからメソッドの実装ロジックを生成しています。


メタプログラミングは、強力です。高位ロジックによって、ソースコード自動生成するので、生産性が高い。でも、デメリットもあります。何だと思いますか。


高位ロジックが、高度であればあるほど、最終的に何が起こるのかが、わからなくなってしまうことです。黒魔術的といいましょうか。

だから、メタプログラミングは、結果が予想できる範囲にとどめておいたほうが良い。強力なため、乱用は厳禁ということです。


Rails以降、メタプログラミングは、Convention over Configuration(以降CoC)として、はやりました。CoCは強力です。でも、使いすぎるとわけがわからなくなる。このことは、念頭に入れておいたほうが良い。

yusukeyusuke 2009/02/08 23:28 S2Daoはアノテーションに近くて「宣言型プログラミング」という気がしていました。想定されるルールが明確だからです。「メタプログラミング」っていうとDSL的な気がして、もうすこし自由度が高いような。あぁ、でも、両方あると言われれば、確かに間ぐらいかも...。
ひがさんは「宣言型プログラミング」と「メタプログラミング」って使い分けしたりしています?あえてS2Daoを「メタプログラミング」と呼ぶ理由というか。

melleomelleo 2009/02/14 00:22 実行時型情報を使って動的に振る舞いを変える系のメタプログラミングは使いどころを間違えると性能で泣きますね。ORMapperをdynamic proxyなんかで実現しちゃう場合なんかが典型的ですね。

でも、C#のEmitのようにコードを生成するパターンは性能が良くなるので多用してます。構文解析プログラムを生成するのはよい使い方だと思います。他には、JITコンパイラのような実行時最適化もよい使い方ですね。特に、実行時にしか分からない情報を使った部分計算や、特定ドメインの知識を使った最適化は面白いです。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証