『メタプログラミング.NET』を読んだ

メタプログラミングと聞くと、LISPRubyJavaScript といったスクリプト言語を思い浮かべる人が多いと思う。 でも、メタプログラミングスクリプト言語の専売特許というわけではない。C# のような静的型付けの言語でも可能だということを、本書は示している。 T4 を使えばソースコードを生成できるし、式や Reflection.Emit で動的にメソッドを作成して実行することも可能。 ビルド後にアセンブリを書き換えて、横断的な処理を追加することだってできる。そのためのツールは提供されている。Roslyn を使い、動的にソースコードの文字列をコンパイルして実行できるところまできていて、RubyJavaScript で行うメタプログラミングにかなり近づいた。

ただ、2013年の本なので、今となっては参考程度にとどめておいたほうがいい内容もまぁまぁある。 DLR で出てくる IronPythonIronRuby といった Iron 言語は、自分の観測範囲で名前を聞かなくなって久しい。Boo も。 Spring.NET は、本家である Java の Spring の進化についていけず、置きざりにされてしまった感が拭えない。

自分は社内向けにライブラリを書いたりする仕事が多いので、T4 でソースコードを生成したり、式で動的にメソッドを作成して実行したりするコードは書いてきた。 CodeDom は大昔に少し使っていたが、ソースコード生成どまりで、動的にアセンブリを作成して実行するまではやってない。 それに T4 使うようになって出番なし。 Reflection.Emit や Cecil を使って IL を書くのは、まだ本格的にやってない。 IL までいくと、いよいよ黒魔術だ。 ただ、黒魔術に手を染めたいと思い始めた。 C#ラムダ式を書いてデバッグ実行し、式木の構造を調べるのはよくやるが、 IL でも似たアプローチができるのは目から鱗だったので。 確かに、書いたコードがどんな IL に変換されるのか、ILSpy を使えば簡単に調べることができる。 この TIPS は本書で1番の収穫かもしれない。

本書は .NET の黒魔術書と言ってもよさそうだ。

メタプログラミング.NET (アスキー書籍)

メタプログラミング.NET (アスキー書籍)