netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2003-06-11 古い日記からの変換データ ▲
_ javadoc ▲
Javadoc2HTML は,HTML2WinHelp を使ってやってみたが,どうも日本語 javadoc 中に正しい HTML でない(あるいは怪しいコード列が存在している)らしい.hhc.exe がエラーを出してしまうので,あきらめ.しかも,生成途中の .chm にしても約40MB程度あったので,JDK に対する HTMLHelp は無意味な存在っぽい.Google が使える場所なら Google のほうが軽量だ.ということで,このネタはお蔵入りさせておくことにする.
_ javadoc ▲
Javadoc2htmlhelp を作ろうとすると,HTML Help の中でインデクスとして何を含めるかが悩ましい.クラス名だけだと手抜だろうか.でも,HTML を parse したくはないし,Java ソースの doc コメントを parse するのも面倒なのでクラス名だけインデクシングしておいてあとは全文検索で使うことを前提にしてみよう.
適当に find や grep を使ってファイルを列挙するだけのスクリプトでいけるだろうか?
_ JBoss ▲
JBoss AOP のドキュメントに目を通す.XML で pointcut などのコンフィギュレーションを書くらしい.しかも Dynamic AOP でいきますとか,JSR 175 (C#などの持つ属性宣言機能,JDK 1.5で実装予定)に相当する機能も加わってるぞ,とか主張している.
JBoss を使ってる人が身近にいないのですごいのかどうか良く分からないが,XML でアスペクトのコンフィギュレーションを書くというのはちょっと良さそうに聞こえる.
まあ,言語(あるいはフレームワーク)が作れるのは当然で,問題はその上で何をするか,それに加えてアスペクトによってもたらされる複雑さをどうするか,ということになってくるのだろうけれど.
_ 論文 ▲
ちょっと名前が気になって H. Masuhara, G. Kiczales, C. Dutchyn:"A Compilation and Optimization Model for Aspect-Oriented Programs", Proceedings of Compiler Construction (CC2003)を見てみた.
Pointcut などの定義を関数型言語 (CLOS?) で書いてるのだが,partial evaluation して static に決定できたらstatic に埋め込んで,評価結果に if が残ったらguard つきの dynamic advice を埋め込むらしい.関数型言語がそれらしく使われているのは,初めて見たような気がする.
_ 論文 ▲
暇つぶしに SPA2003 に出ていた佐藤 芳樹,千葉 滋: ``Dynamic AOP とその実装手法について''を読んでみる.5ページのショートペーパーで具体的なことはほとんど書いてないのだが,JPDA の HotSwap (クラスファイルの再ロード)機構を使って動的 weaving を実装したらしい.しかも,パフォーマンス的に問題ない場所はブレークポイントでプログラムを実行し,ボトルネックだけを weave するという渋い方式.
それにしても,動的 weaving ってデバッグするの大変なんじゃなかろうか.ほとんどのデバッガ(およびプログラマ)は,実行時にプログラムが置き換えられることは想定していないと思うのだが…….自律コンピューティングの人たちはもう考えてるのかな?
2004-06-11 古い日記からの変換データ ▲
_ 炊飯ジャー ▲
煮物も作れる炊飯ジャーというヘッドラインに惹かれて見てみた.http://nikkeibp.jp/wcs/leaf/CID/onair/jp/mech/313078
煮物作ってるとご飯が炊けないと思うのだけど.
_ [論文] 動的スライス+プログラムの逆実行 ▲
ICSE 2004 Technical Papers, Slicing より.
Tankut Akgul, Vincent J. Mooney III, and Santosh Pande:A Fast Assembly Level Reverse Execution Method via Dynamic Slicing.Proceedings of ICSE 2004, pp.522-531.
Reverse Execution (逆実行) というのは,プログラムを前の状態に戻すように実行していく手法.普通にやると,途中で捨てられていく情報を保存しておかないといけないので,激しくメモリを消費する.そこで,動的スライスを使って,注目してる部分に関連したところだけが回復すればいい,と割り切った手法.
命令の逆転についても,全部の状態を保存していくのではなく,命令列に対して逆命令列を生成する方法を用いるので,各時点でのレジスタ値を保存する方法よりは経済的になっている.
逆実行がどのくらい役立つかは Agrawal か誰かが研究してたような気がする.特定の値だけ復帰させて,もう一度そこだけ細かく実行して,とかできると,かなり面白いデバッグ作業は展開できる気はする.一度ブレークポイントで止めて「システムの状態を保存」とか指示するのと,後から「戻ってみよう」というのとで,どのくらい開発効率が違うのかは分からないが.
_ [論文] 動的スライス用の実行履歴圧縮 ▲
ICSE 2004 Technical Papers, Slicing より.
Tao Wang, Abhik Roychoudhury:Using Compressed Bytecode Traces for Slicing Java Programs.Proceedings of ICSE 2004, pp.512-521.
Java バイトコードの実行履歴を,RLESe とかいう文から文法を構成するタイプのアルゴリズムで圧縮して,圧縮した状態でも実はそのままスライス計算ができますよーという論文.
動的スライスはコストさえ何とかすれば使える,というふうにみんな考えているのだろうか.静的スライスに比べて研究が活発な気がする.
_ [論文] 動的スライスのメモリ節約 ▲
ICSE 2004 Technical Papers, Slicing より.
Xiangyu Zhang, Rajiv Gupta, Youtao Zhang:Efficient Forward Computation of Dynamic SlicingUsing Reduced Ordered Binary Decision Diagrams.Proceedings of ICSE 2004, pp.502-511.
動的スライスの Forward Computation (1ステップ進むごとに,その時点でのスライスを計算して蓄積していく手法)を使うとき,メモリ消費量を抑える方法の提案.
Binary Decision Diagrams は各ノードが0と1のエッジ(2本だけ)を持っていて末端ノードが0または1でラベル付けされている.で,プログラムスライスはスライスに含まれるIDの集合なので,開始頂点から,IDを表現する2進数(0110とか)で表現されるパスをたどっていくと,末端が0か1かでそのIDがスライスに含まれているかいないか分かる.
で,この論文では,reduced-ordered BDD という,途中のノードをできるだけ共有・省略した状態にすることで各スライスの中身を共有して,全体のデータ量を減らしている.すべてのスライスを合計すると200GB相当のデータになるところが400MB程度で収まるとか.
加えて,スライス基点情報の圧縮とかも何かやっているらしい.(これは去年のICSEで発表されたものっぽい)
プログラムの実行時間については,一番大きい材料(67000LOCくらい)で5時間くらい.一度計算してしまえば好きなだけ動的スライスを取得できるのでおいしいといえるか?
個人的には,ちょっと修正→再実行→スライス計算みたいなやり方で使いたいのであまりうれしくないのだが,空間コスト的には非実用ではなくなった分についてはすごい.CPUがさらに高速化すれば本気で実用になってしまうかも?
2005-06-11 ▲
_ [OUCC] TOEIC ▲
受験する人がちらほらいるようなので,団体受験とか使えるのかと思って公式サイトをチェックしてみた.10人以上からで申し込めるが,公開テストでの団体申し込みは別に安価にもならないし,会場が一緒になるとも限らないみたい.
_ [論文] アサーションの式に出る未定義の値の処理 ▲
Yoonsiki Cheon, Gary T. Leavens: A Contextual Interpretation of Undefinedness for Runtime Assertion Checking.
Proceedings of Sixth International Symposium on Automated and Analysis-Driven Debugging (AADEBUG 2005), to appear.
JMLなどで書いたアサーションの式評価の途中で例外が起きたりすると,式の結果が未定義の値になる.そのときに,assertionの式全体がfalseとなってプログラムが停止するように,undefined の項に true/false の値を適切に割り付ける方法を提案している.
何もない場所ならとりあえず false を割り付ければよいが,その項が negation の中で登場していたら true を割り付けるといったように,その項がどのようなコンテキストで登場したかという情報から処理を行う.
_ [論文] 設計・実装レベルの表明の扱いの統一 ▲
Jing Zhang, Jeff Gray and Yuehua Lin: A Model-Driven Approach to Enforce Crosscutting Assertion Checking.
Proceedings of Workshop on Modeling and Analysis of Concerns in Software (MACS 2005), May 2005.
assertionをモデル記述や実装コードに埋め込むようなコード変換の利用を提案している.著者らのサイトを見た限りでは,似たようなクラス階層がシステムにいくつか含まれているとき,pre/post condition をそれらにまとめて埋め込めることが重要だろうと考えているように見えた.
_ [論文] ラッパーオブジェクトによるアサーションのチェック ▲
Roy Patrick Tan, Stephen H. Edwards: An Assertion Checking Wrapper Design for Java.
Proceedings of SAVCBS 2003.
アサーションのチェックを行う処理だけをラッパーオブジェクトとして生成し,インスタンス生成を,ラッパーオブジェクトへの呼び出しに置き換える.Class Loader レベルなどでこの処理を行えば,コンポーネント側のクラスを変更する必要がない.
主な利点は,再コンパイルが不要になること,アサーションのバイナリの再配布が容易になること,実行時にアサーションの有効・無効が選択できるようになること.アスペクトの織り込みをロード時にしましょうという話と似ている.
2006-06-11 ▲
_ [Java] dW のコード品質測定の記事 ▲
コード品質を追求する: ソフトウェア設計者にとってのコード品質というのが出ていた.
遠心性結合(Ce)と求心性結合(Ca)って,最初何のことか分からなかったが,そのパッケージが持つ依存関係の fan-out と fan-in の数らしい.fan-out が多いほど不安定になるから, Ce / (Ca + Ce) で不安定性を計測する.
一方で,パッケージ内の抽象クラスの割合が「抽象度」となる.パッケージの抽象度と不安定性のバランスは,抽象度+不安定性 = 1 の直線からの距離で判断できるらしい.
本当にバランスが良いか悪いかは分からないが,一般的に,抽象クラスほど安定しているはずだし,直観にはわりと合致する基準な気がする.パッケージ単位の結合度は,計算しようと思えば import 文を grep するだけでもかなり近似値が出せると思うので,使いやすいメトリクスだといえそう.
誰からも使われないパッケージは不安定性1となるのが,ふと「別に依存パッケージが少ないんだから気にせずどんどん変更できる」という意味かなとも思ってしまった.本文の解説によると,依存するばかりだと変更の波及を受けやすいから不安定という普通の定義らしい.