このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

AspectJの感想

AspectJを少しだけいじってみて; これ、おもしろーい!

AspectJは、Javaの機能を拡張するツールとみるよりは、「新しい言語なんだ」と捉えたほうが適切なようです(って、開発者は最初から新言語のつもりだろうが)。つまり、Java言語とjavacコンパイラを使う代わりに、AspectJ言語とajcコンパイラを使うプログラミングに乗り換える感じです。そしてAspectJ言語は、Java言語をサブセットとして含みます。

JavaAspectJの関係を、CとC++の関係のようなもんだと思ってもいいでしょう(不正確な比喩ですが)。Cは使うがC++は嫌いな人がいるように、AspectJはイヤでJavaだけ使うのもひとつの見識です。が、JavaではやりにくいことがAspectJでは容易になる例があるのは確かです。

ajcコンパイラの使い勝手で気に入らないのは、事実上、分割コンパイルができないことです。例えば、メソッド呼び出しをつかまえるcall(* Foo.bar(..))ポイントカットによるアドバイス(追加実行用コード)があると、Foo.barの呼び出し側に織り込み処理(バイトコード加工)が必要なので、Foo.bar呼び出しを含むすべてのソースファイルをコンパイラに渡さなければなりません。

これは、アドバイスがもともとクラス横断的に分配されるコード断片なのでショウガナイのですが、再コンパイル対象が判断しにくかったり、再コンパイル忘れが起きて面白くありません。

この問題は、本来ならばリンカー/ローダがやるようなことをコンパイラがやっているからで、load-time weavingで改善されそうです。さらには、run-time weavingまでサポートされれば、動的に特性・能力のアタッチができるので、進化的システムには便利です(そこまでいくのは随分先のことでしょうが)。

現状でも実用になってますが、動的アスペクトまで含めたアスペクト概念を十全にサポートするには、コンパイラ、リンカー/ローダ、実行環境がアスペクトを意識した作りになってないとダメのような印象を受けました。もちろん、現時点で出来ることは色々ありますから、いいんですけどね。