AOJS (Aspect-Oriented JavaScript) の論文を読んで
2011/04/24(日) 25:56 Javascript親記事へこのエントリーをはてなブックマークに追加

AOJS:JavaScriptのためのアスペクト指向プログラ ミング・フレームワーク
http://www.washi.cs.waseda.ac.jp/ja/SSR2009/AOJS2.0-submitte...
という論文を見つけたので読んでみたメモ。

1 はじめに

複数のモジュール間に同様の処理が出現する事がある。
ログ出力やセッション処理などがこれに該当し、モジュールの独立性を低下させてしまう、
これらの処理の庫雄を横断的関心事と呼ぶ

2 AOJS の概要

アスペクト指向プログラミング(AOP)では
横断的関心事をあたらなモジュール=アスペクトとして記述して、後から合成処理を行う事でプログラム全体を得る。

2. 1 構成

合成にはリバースプロキシを使って、間にプロキシを挟んで行う。
プロキシサーバでアスペクト織り込み済JavaScript プログラムの検証にはJSLintを使い、構文エラーが出ていたら元のプログラム(?)が送信される.

XMLファイルにファイル構造やアスペクトを部分を記述したものを作る。
<?xml  version="1.0"  ?>
<aspectsetting>
<initializeFile>init.js</initializeFile>
<var  varname="/fib_gen_1/ret">
<before><![CDATA[window.alert(__name__  +  "@before:  "  +  __beforeval__  +  "<br  />");]]></before>
<after><![CDATA[window.alert(__name__  +  "@after:  "  +  __afterval__  +  "<br  />"):]]></after>
</var>
<var  varname="/y">
<before><![CDATA[document.write(__name__  +  "@before:  "  +  __beforeval__  +  "<br  />");]]></before>
<after><![CDATA[document.write(__name__  +  "@after:  "  +  __afterval__  +  "<br  />");]]></after>
</var>
<function  functionname="/fib_gen_2"  pointcut="call">
<before><![CDATA[var  beg  =  (new  Date()).getTime();]]></before>
<after><![CDATA[var  end  =  (new  Date()).getTime();
sendLog(  __retvalue__  +  ",  "  +  (end  -  beg)  +  "ms");]]></after>
</function>
</aspectsetting>
before,after,aroundというジョイポイントが指定できて、これらで前後に処理を挟む事ができる。
before,afterはそのまま前後に処理を挟める。
aroundは本来の処理を__proceed__に格納して、本来の処理の代わりにaroundで指定したものを実行する。

2. 8 制限

2. 8. 1 無名関数
無名関数で実行されているとfunction functionnameで関数名を指定できないので使えない
2. 8. 3 曖昧なコーディング
ブラウザ間で異なる記述が通る事があるが、そこは厳格に変換する必要がある。
2. 8. 4 インクルード順序の考慮
依存関係のため順序が重要になる。
しかし,AOJS はJavaScript ファイル単
体での織り込み処理を行うため,クライアント上での関数定義の上書きを考慮できない.
ただし,クライアント上で織り込み処理を行う既存アスペクト処理系を組み合わせて用いることでこの問題を解決できる.
要はライブラリを併用するみたいな感じ。

3 評価

Javaで書かれたアスペクト織り込み処理を、プロキシを織り込みPerlで実装した。
JavaではJavaCCでJavaScriptの解析を行った。

3. 1 アスペクトの完全分離記述

ログ関数がJavaScriptと完全に分離されている事が確認できた。

3. 2 横断的関心事の実装および変更にかかるコスト

いっぱい織り込むとファイル大きくならない?
*でワイルドカードでまとめて関数を指定すれば、一カ所に織り込みコードがまとまるので効率がいい(要は逐次的に処理してるのかな?
アスペクトはアスペクトファイル(XML)のみに記述するため変更時にそれをいじればいいだけになる。

3. 3 織り込み処理効率

prototype.js様はJSLintでエラーはくようなコードだったので一部修正した。
prototype.jsは2517行あり、織り込み処理に20.6秒 もかかっていた。織り込みずみのをキャッシュすればまだ使えるかもしれない(デバッグ大変そうだな…

関連研究

アスペクト部分はあくまでJavaScriptになるため、コードはJavaScriptの仕様の範疇で実現可能である。
id 属性やname属性などをジョインポイントして使うなどもっといろいろな活用法がありそうだ。
watch/unwatchなどフックがかけやすいものがあるともっとおもしろい。

アスペクト指向プログラミングフレームワークでは既存のHTMLやJavaScriptなどを変更せずに追加記述ができる。
AOJSでは通信に介在するプロキシとしてアスペクト織り込みを実現しているため、中間処理がある分だけ性能自体は低下する
AjaxScope という,JavaScript コードについてオンザフライ式にプロキシによってAST 上でコード埋め込みを可能とする仕組みを持ったものも存在する。(Thread.jsとかも同じような感じかな)

おわり

,アスペクトを完全に分離記述可能なJavaScript アスペクト指向プログラミング・フレームワークAOJS についての話だった。,AOJS によるアスペクトの完全なモジュール化と分離を確認、またジョインポイントに織り込むことで詳細なログ記録をしやすくした。性能自体は低下するがキャッシュプロキシを設置すれば初回以外は問題ない。

感想

読んでて思い出したのはやはりbefore,after,aroundというキーワードから連想されるTomblooパッチ。後から好きな処理追加したり、元々の処理を切り替えたりできる仕組みはやはりおもしろい。(これアスペクトという概念だったのか)
プロキシで実現するのはまあありな感じもするけど、今なら多分CoffeeScriptのようにトランスコードするものを手元で動かせた方が受けはいいかもしれない。

名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/0113/tb/