機械猫の日記

2010-06-20 オブジェクト指向入門

だいぶ前に、id:koichikさんから「バートランドメイヤーのオブジェクト指向入門も読まずにブログ書いてるのか!」と怒られて、慌てて読んだことがある。

怒られきっかけで読んだけど、確かに名著だと思った。もち歩くと筋トレにもなるし。


今僕の後輩がやっぱり「オブジェクト指向入門も読まずに」ブログを書いている。

そこで、過去自分を都合よく忘れて、後輩にどかんと雷を落とし、さんざん偉そうに説教たれたあとで、よししょうがない一緒に読書会でもやるかということになった。

今日1〜3章(約80ページ)までやってみたが、4時間もかかった。いや、新人レベルの人たち相手に4時間は逆に飛ばしすぎたかもしれない。マクド空気読まずに読書会やったが、となりの関係のない人が僕らの勢いにおののきコーヒーをこぼした(というか、単にきもい集団への恐れ、あるいは威嚇かも)。

まぁ、オブジェクト指向入門の1,2章は単なる前ふりなので、やっぱり3章までやる必要あるしなぁ。


読書会の大半は、読書会メンバーの理解の怪しいところ、本の記述微妙なところをつっこみ、解説をしていたのだが、なかには興味深い会話もあった。


読書会メンバーがいった。

「3章読んでも、ふーんって感じなんですよね。モジュール性を良くしましょう、ああそうですね、って感じで」

僕「どういうことや?」

メンバー「例えば、情報隠蔽とかってJavaで言えばprivateでしょ?それをなんかこんな偉そうに・・・」

僕「どあほー!!」

と、ここでその理解の浅さに雷を落とした。


しかし、面白いなと感じたのは、メンバーがいう感想も分からなくはないということだ。

まず、オブジェクト指向入門の本の記述はもってまわっている感があり、初めて読んだ人には真意は伝わりにくいとは感じる。しかし、メンバー場合、そういうのがポイントじゃない。つまりは、受けて側に理解できるだけの素養がないのだ。あるいは読み込みが足りない。こういう場合はどうなるのだろう?この言語ではどう実現されているのだろう?自分言語デザインするとなったら、この原則はどうするだろう?とかそういう自分なりの意見まで掘り下げられていない。

新人レベルなので、しょうがないのだが、雷発言であることもまた、しょうがない。

そういう人のために読書会をやっているのだから、ある意味非常に真っ当な会話やったと思う。本の内容と彼らの理解の間の橋渡しができるのは、読書会ならではの良さだ。そういう刺激を与えてくれるこの本はまた、すばらしいと思う。

名著とは、みんなで読んで議論する本をいうのかもしれない。


さて、次回も3章ずつやることにしたが、どうなることか。

がぶちょがぶちょ 2010/07/04 21:13 『雷を落とす』『どあほー!!』・・・言ってるときの気持ちよさそうな顔が目に浮かびますw 読書会というより、教えたがり屋さんの独演会っすね!

kikainekokikaineko 2010/07/05 00:45 そうですね。後輩に伝えるのは楽しいです。それが彼らの身になればいいなと思っています。

>顔が目に浮かびます
あれ、お知り合いの方でしょうか?

がぶちょがぶちょ 2010/07/06 00:06 コードや仕事の進め方を『はいぱぁ上から目線』でご批評いただいたと某所で伺いましたがw 皆さん苦笑w

kikainekokikaineko 2010/07/06 00:19 とすると、同じ会社か関係する方でしょうか?

トラックバック - http://d.hatena.ne.jp/kikaineko/20100620

2010-03-27 阪大油そばを再現したい

[]阪大油そばを再現したい

僕は食べたことないけど、阪大食堂にある油そば定食がめっちゃ美味しいらしい。

いや、正しくは、美味しかったそうだ。

というのも、いまや阪大食堂では油そばが食べれない。

ういういきさつかはよく知らんけど、メニューから外されてしまっている。


この油そば、結構人気があったようで、友人の何人かがしきりに

「久しぶりにカンシタの油そば、食べたいわー」

を連呼する。ちなみにカンシタとは、阪大図書館下にある食堂名前

で、もう無いらしいでっというと

「えー、ほんまに!?ショックやわー」

を、これまた連呼する。


ネット検索しても、無くなったのを惜しむ声がちらほら見つかる。

うーむ、そんなに旨いのか。

というか、そもそも油そばという食い物自体そんなに食ったこと無いから、よくわからん


油そば出す中華の店もあるけど、カンシタのは別格なんや」

「どんなんなん?」

「太めの麺に、ラー油かなんかを混ぜとるだけなんやけど。めっっっちゃ旨いねん!!」


友人等の話を聞いてると、めっさ食べたくなってきた。

カンシタで食べるのが無理やったら、自分で作ってでも食べたい!

っというわけで、カンシタで働いてるおばちゃんに聞いてみた。


「すいません。油そば無いんですか?」

「ああ、昔あったやつでしょ?今はもうないのよねー」

レシピとか分かりませんかね」

「ちょっと待ってくださいね」


すると奥から正社員っぽい人が現れて色々教えてくれた。

整理すると


・数年前に油そばはメニューから外れた

・業者から、麺とタレを卸してもらっていたので、食堂ではレシピは分からない

・また、数年前に発注システムを入れ替えたため、業者の名前がすぐには分からない

・昔からいた責任者がその時(僕が聞いた時)は不在やったため、やっぱりすぐには分からない


そこで、カンシタ食堂の方々にご無理をいって

その昔の方が業者の名前や、商品名などを知っていれば、教えてくださいとお願いしてしまった。

ありがたいことに快諾してくれて、今は連絡待ち。いやーカンシタ食堂の人、親切やわぁ

てか、その対応してくれた人も、「私も食べたくなりました!」ってw



というわけで、カンシタ食堂から連絡待ちですが

結局分からなかった場合、自力で探してみようかな。

阪大油そばを卸してる業者なんてそんなに多くないよね。たぶん・・・

商品売ってるかどうかも、分からんのが不安


てかまぁ、再現できても、当時の油そば食べてないので、よくわからんけどw


友人らいわく

探偵ナイトスクープに出したほうがええんちゃう?」

まぁ、そうかもw

poooopoooo 2010/04/25 09:08 スターをつける実験をしましたー。

kikainekokikaineko 2010/04/25 10:16 な、なんでここでやる・・・

トラックバック - http://d.hatena.ne.jp/kikaineko/20100327

2010-01-18 ゼロから学ぶ電磁気学

[]ゼロから学ぶ電磁気学

恩師である西野先生の「ゼロから学ぶ電磁気学」を読みました。

ゼロから学ぶ電磁気学 (ゼロから学ぶシリーズ)

ゼロから学ぶ電磁気学 (ゼロから学ぶシリーズ)

前に読んだ解析力学が僕にはあんまりだったので、あまり期待せずに読みましたが

いやいや、これは非常に面白かったです!!


西野先生の持ち前のギャグは控えめになっていますが、内容が良かったです。


電磁気勉強ってともすれば、数式展開に追われてしまい本質が見えないことが多々あります。

かくいう僕もマックスウェル方程式意味が分かったのは4年の院試勉強でした。

(つまり講義受けたときは理解できなかったということ・・・)

また、電磁気教科書といえば砂川先生が最も良いのかもしれませんが、砂川先生のはぶっちゃけ言ってちょっと難しい。

最初からベクトル解析のオンパレードやし、展開も速いし。。。

もはや物理ドロップアウトした僕にはキツイ(いや、学生時代も大変やった・・・)


ところが、西野先生のは数式展開よりも、物理解釈物理的直感に重点を置いてかかれているため(と、感じる)

非常に読みやすいし、理解しやすかったです。西野先生物理解釈を語らせると非常に上手く伝える人やなーと思います。


また、特に面白かったのは、電磁気歴史順になぞることによって、各時代の装置(例えば、ボルタ電池だとか)が何故重要であったかを知ることができる点です。

各時代の装置を振り返ることによって、そこから、物理は「観測して、説明する学問」なのだということを実感させられます。


この感覚は、当たり前のようで、実は当たり前じゃない。



例えば、電磁気研究静電気から始まりましたが、これを研究しようとすれば静電気の量をどうにかしてコントロールできないといけない。

でないと、いい加減な実験結果ばかりになってしまい、実験結果をどのように解析してよいか分からないからです。

じゃぁ、どうやって静電気の量をコントロールできるのか?

ちょっと考えてみても、それが難しい問題だということが分かるかと思います。

しかし、物理の先人たちはその問題を克服し、制御してきたのです!そしてそれが即ち装置重要性でもあったわけです。すばらしい。


こんなちょっとした感動も、この本は伝えてくれます。


毎度のことながら、この本を読んですぐに電磁気をマスターしたとはいえないだろうし

テストの問題を解けるようにもならないかもしれません。

でも、計算できる以外の重要なことを得られる一冊やと思います。

はやみはやみ 2010/07/07 20:29 「数式展開よりも、物理的解釈、物理的直感」、非常によくわかる。
高校の3年の夏まで、教科書を読んでもさっぱり頭に入らなかったのが、
「橋元淳一郎の物理橋元流解法の大原則」を読んでイメージが湧くと、
何が書かれているのか、多少わかるようになった。

西野先生、まだあの形式のまま日記を書かれてることに驚いた。
ぶれないね!

kikainekokikaineko 2010/07/08 02:35 形式かわってないけど、ほんまに一行日記になってもうたのがちょっと残念。
前は、一行日記から本文へリンクがあったのになぁ

トラックバック - http://d.hatena.ne.jp/kikaineko/20100118

2010-01-03 自動生成、DSL、計算モデル(結論なし)

[]

SIプロジェクトにいると自動生成ツールというものが、よくもてはやされる。

かく言う僕も多くのプロジェクト自動生成ツールを使い・作ってきた。やれ、エクセルからJavaソースを生成だ!やれ、UMLからソースを生成だ!などなど。


正直なところ、自動生成ツールというのは、なんとも中途半端な存在やと思う(そもそも定義あいまいだ。エクセルからソース自動生成で、ソースからバイトコードはなんで自動生成とは言われないのか?)。

本当なら、自動生成なんてせずに、エクセルからJavaソースなんか吐かずに、エクセルを置けばシステムが動けばいいのだ。

例えばeclipseコンパイラーがコンパイルの瞬間にエクセルパースしにいき、バイトコード等に自動変換してくれるなら、すくなくとも開発中は『エクセルを置けば動く』を実現できる。ところが、実際にはそういうカスタマイズは難しいし、コンパイル時間がいかほどになるのか分からない。まぁ現段階では、将来そういうことができるかもしれないね、レベルの話。(でも、その将来は1年後かもしれないのだが)

とりあえず、まだまだ自動生成は残るだろう。



そこで思うのだが、自動生成とは何故必要になるんだろうか?

結局のところ、以下の点を克服したいからなんやろうと思う。つまり


ドキュメント定義されている情報量 << ソースコード記述される情報量


なんじゃなかろうか。

ドキュメント定義されている情報量」とは、つまりこれが要件定義書であり、仕様設計書になるのだ。しかし、それをソースコード表現したときには、かなりの情報量を付加しなくてはいけない。

ある部分、これはしょうがない。まず、要件定義書仕様設計書には暗黙知的な「明示化しなくても分かるよね」という情報が存在してしまう。例えばそれは、システムドメイン知識であったり、いわゆる常識と呼ばれるようなものだったりだ。(この画面は生年月日を入れてもらいましょう。というとき、紀元前からの年代入力を許すようなことは『常識として』無い)


また、言語が要求する情報量も多い。例えば、Javaでは絶対にクラスを作らなくてはいけない。だから、これらをまとめると

ソースコード情報量 = ドキュメント定義されている情報量
           + 暗黙知として潜む情報量
           + 言語が要求する情報量

となる。この下2つをなんとかしたいというのが、自動生成の目的だ。

ただし、「暗黙知として潜む情報量」を扱う自動生成ツールはあまり多くは無い・・・と、思う。

多くのユーザに向けた自動生成ツールが成功しにくいのは、結局この2つの情報を上手く扱えないからだろう。

だから、いまだ多くのプロジェクトで、プロジェクト独自の自動生成ツールが作られるのだ。


ところで、自動生成とは別にDSLによってこれらを解決しようという流れもある。

DSLとはドメイン特化言語、ざっくり言えば「そのシステム専用の言語」ということだ。システム専用なんだから、言語が要求する情報量も非常に少なくできるし、暗黙知も扱いやすいだろう。(また、フレームワーク対処するというのも伝統的な手法として存在する)

最近では、DSLをお手軽に実現するために、言語DSLなんてものが出てきている。言語を最初から定義するのは大変なので、rubyだとかを使って、文法っぽいものを定義してしまいましょうって話。これはそこそこ上手くいっていると思っている。(ただし、エクセルから、DSLへの変換ツールなんてものはやっぱり存在してしまうのだが・・・)


ただし、正直いって、良いDSLを作るというのは難しい。そもそもDSLとしてどのような機能を持つべきか、何を提供しないでおくべきかの判断が難しいからだ。

抽象化をやりすぎると逆に可読性が悪くないか?」「この機能が使えないときはどうするべきか?」「この制限は厳しすぎるんじゃないか?」等など。

一番怖いのは、何か重要なことができなくなってしまうことだ。言語DSLなら、この恐怖は多少低い。いざとなれば元言語の機能を使えば良い。ただし、その場合、統一性は消えるかもしれない。

やはり、理想DSL内で完結したい。


では、DSLで完結するにはどうすればいいのか?それは残念ながら、いまだ解決していない問題だと思う。

汎用的な言語は、そのベース計算モデルが存在する。それはチューリングマシンであったり、λ計算であったりだ。これらの計算モデルは今のところ、すべてのアルゴリズム表現する能力があると信じられているので、この計算モデルに立つ上では、アルゴリズムとして表現できないものは、理論的には無い。

もちろん実際の言語は、純粋計算モデルだけを表現した言語ではあまりにも原始的過ぎて大変だから、いろいろな機能が付加されている。例えば、足し算のできない言語はほとんど無いだろうが、チューリングマシンも、λ計算も足し算という操作を直接持つわけではない。


つまり、汎用言語は純粋計算モデルより抽象度を上げることにより、便利になっている。が、それでも足りないのでDSLではさらに抽象度を上げて便利にしようとことだ。

しかし、どこまで抽象度をあげるべきか、よって立つ計算モデルが見いだされてはいない。

用言語はベースとなる計算モデル能力を制限することはないが、DSLでは制限してしまうかもしれない。(例えば関数という概念が消えたりだとか)


DSLに適した計算モデルというのはあるんだろうか?

もはや、これは数学ではないかもしれない。不可能な問題かもしれない。あるいは、そんなモデルが存在して、本当に役に立つのかも良く分からない。しかし、ちょっと興味あるところではある。新たな計算モデルが提示できれば、少なくとも学術的な興味として面白いかもしれない。(まぁ真面目には取り組まないけどw)



・・・って、あれ、自動生成の話のつもりが、DSL計算モデルなっちゃった

まぁいいや

トラックバック - http://d.hatena.ne.jp/kikaineko/20100103

2010-01-02 正月番組、特に、NHKおもしろい

正月番組面白いですね

世界一受けたい授業みてたら、ゴルビーでてくるし。ビートたけし日本のやつも良かった。ちなみにその裏でやってた「日本朝鮮半島」もそこそこ面白かった。


てか、NHKの「新春TV放談」めっさおもろい!千原ジュニア鈴木おさむ等が、「テレビ」というものに対してガチンコに「放談」してたのが面白かった。たとえば「TV最近、似たようなものが多くてつまらない」という視聴者意見に対して、「昔から似たようなのばっかりですよ」とばっさり斬り「二番煎じでいいじゃないですか。完全に同じなんてありえないんだから」「そこから何か新しいものが生まれればいいと思う」というようなことを真面目に語っていて、ああ、この人たちの本音のトークなんやなぁというのが伝わってきた。まさに放談!!

さらに、他局の番組などを冷静に分析できるのも実にNHKらしくて良かった。

んで、そのままNHK見てたら「タイムスクープハンター」とかってのが始まった。再放送らしいけど、これも凄い!!!めっさおもろい!タイムワープした要潤過去の庶民の暮らしなんかをスクープしていくという、つまりは歴史バラエティなんですが、いやーよくできてる。

これ、また始まらんかなぁ。DVD出てるようなんで、レンタルできんかったら買うかも。

NHKおもろいーー。


て、思ったら日テレで「日本のTV番組世界へ輸出」とかって番組やってるやん。これも面白そー!

トラックバック - http://d.hatena.ne.jp/kikaineko/20100102

2009-11-05 JavaにUnlessを作ってみる

[]JavaにUnlessを作ってみる

JastAddJのサンプルとして、Javaにunless文を追加してみましょう。

unless文とは、rubyなどであるif文の逆、つまり条件がfalseのときに実行される文ですね。

こんな感じです。


unless(false){
  System.out.println("OK!");
}

これを実行して、OK!がでれば、unless文の成功です。

この拡張は非常に簡単なのでJastAddJの最初の理解としてはいいかと思います。

(Ifを拡張してUnlessを組み込みます)

*注意:昨日書いたインストール方法で環境準備をした場合、jragファイル、astファイルflexファイル、parserファイルは全て不要ですので、消してください。また、ASTパッケージなども再生成対象なので、消したほうがいいかもしれません)



ここでJastAddJの構成について見ておきましょう。

JastAddJは主に以下の部分からできています。(3、4は今、便宜上僕が勝手に呼んでいる呼称であって、正式にどういうのか知りません。。)


1.字句解析

2.構文解析

3.AST定義

4.属性定義


1の字句解析と2の構文解析JavaCCなどを使うこともできますが、JastAddJのお勧めはJFlexとbeaverらしいです。特に何がいいってのも僕には無いのでJFlexとbeaverを使うことにします。


3のAST定義というのは、ノードごとに継承関係を定義するためのものです。astファイルというものに定義します。

例えば、Unlessを追加するときに、Ifの拡張として定義したいので、「UnlessStmtはIfStmtの子クラスにしますよ」という定義をここでします。


4の属性定義は、どのノードにどのような属性計算を追加するのかを定義します。

これにはjragファイルやjaddファイルといったものに定義します。



では、いよいよJavaにUnlessを追加してみましょう。

次のコードで「OK!」と出れば成功です!


package tests;
public class Example {
  public static void main(String[] args) {
    unless(false){
    	System.out.println("OK!");
    }
  }
}

これをEclipse上で実行することも当然できませんし、そもそもunlessの部分に赤ぺけがでていると思います。

Unlessを追加するには、IfStmtを継承して、UnlessStmtを作ります。でも当然unlessに対応したバイトコードなどは無いので、コンパイル直前にunless文を通常のif文に変換したいと思います。

つまり、

unless( condition ){
  ...
}

これを

if( ! condition ){
  ...
}

という変換を行って、コンパイルすれば問題なく動くはずですね。


では、順番にやっていきます。まず字句定義を行いましょう。

Keyword.flexというファイルを作成して、そこに次のように書き込みます。

これはunlessというキーワード定義しているだけです。


<YYINITIAL> {
  "unless"  { return sym(Terminals.UNLESS); }
}

次に構文を定義します。これもunless.parserというファイルを作って

以下のように書いてください。


Stmt statement =
  unless_then_statement.u
  {: return u; :}
  ;
  
UnlessStmt unless_then_statement =
    UNLESS LPAREN expression.e RPAREN statement.s  
    {: return new UnlessStmt(e, s, new Opt()); :}
  ;

最初のStmt定義は、実は既に存在している(JastAddJが提供してくれている)Stmt定義に新たな定義を追加している部分です。

このような既存にマージする構文定義がないと読み込まれることがないので注意してください。

そして、その下のUnlessStmtが今回のメインになります。これは「Unlessキーワードの後に、(が来て、式があって、)が来る」

というようなことが定義されています。


そして、AST定義を行います。unless.astファイルを作成し、以下を書き込みます。

UnlessStmt : IfStmt;

これは、UnlessStmtっていうのは、IfStmtの子クラスですよーっと記述しているわけです。

このようにIfStmtを継承することによって、UnlessStmtは、IfStmtの機能を引き継げるので

煩わしい定義などが不要になるのです!!


そして、最後に属性定義します。ここで属性として「unless(cond) ⇒ if(!cond)」への変換の計算定義しましょう。

unless.jragというファイルを作成し、こう書いてください。


aspect Unless {
  public void UnlessStmt.transformation() {
    Expr co=getCondition();
	LogNotExpr not=new LogNotExpr(co);
	setCondition(not);
    flushCache();
  }
}

これはUnlessStmtにtransformation属性定義しています。

ここの計算は「unless(cond) ⇒ if(!cond)」そのものを実行しています。


ここまでで準備は終了です。

では、いよいよunlessを理解するコンパイラを生成しましょう!!

build.xmlを実行してください。問題なく生成されれば成功です!!


そして、この生成されたコンパイラを使って、さきほどのExample.javaコンパイルしてみましょう。

このコンパイルを実行するには、次のクラスを使うと便利です。


import AST.*;

class JavaCompiler extends Frontend {
  public static void main(String args[]) {
	args=new String[]{"src/tests/Example.java"};
	  
    if(!compile(args))
      System.exit(1);
  }

  public static boolean compile(String args[]) {
    return new JavaCompiler().process(
        args,
        new BytecodeParser(),
        new JavaParser() {
          public CompilationUnit parse(java.io.InputStream is, String fileName) throws java.io.IOException, beaver.Parser.Exception {
            return new parser.JavaParser().parse(is, fileName);
          }
        }
    );
  }
  protected void processNoErrors(CompilationUnit unit) {
    unit.transformation();
    unit.generateClassfile();
  }

    protected void processErrors(java.util.Collection errors, CompilationUnit unit) {
      super.processErrors(errors, unit);
    }
}

で、これを実行すればExample.classが生成されます!!!


最後の大詰め、コンパイルされたクラスファイルを実行します!

この実行は残念ながらEclipseではできないので、コマンドプロンプトから実行します。


C:\***\src> java tests.Example

この結果「OK!」っと表示されれば成功です!!!



どうでしょうか。

Unlessを追加する程度なら、あっさりと追加できたのが伝わったでしょうか?

本格的に言語定義するなどはそれなりに大変ですが、この程度ならば非常に簡単にできてしまうのが凄いですね

トラックバック - http://d.hatena.ne.jp/kikaineko/20091105

2009-11-04 JastAddJ初めの一歩

[]インストール方法

インストールするためにまずはダウンロードしないといけないのですが

JasdAddJのサイト先ってちょっと分かりにくい。

JastAddというツールのサイトとJastAddJのサイトは異なっているので注意が必要です。

ちなみにここがどうやらメインサイトの模様。


http://jastadd.org/the-jastadd-extensible-java-compiler


で、ここからJastAddJをダウンロードするのですが、この場合2通りのやり方があります。


1. JastAddJをダウンロードして自分で整備する方法

2. サンプルをダウンロードして不必要なものを消す方法


1は、ちょっとめんどいっす。自分build.xmlを書くなら、これでもいいですが、僕は面倒なのでサンプルを落として不必要なものを消しています。

僕の場合、これを落としてみました。


http://jastadd.org/jastadd-tutorial-examples/non-null-types-for-java


これはヌルポの可能性を排除するためのJava拡張のサンプルですが、特に気にする必要はありませんw

とりあえずここからソースを落として、eclipseインポートします。

するとNonNullCheckerディレクトリソースディレクトリ)の中にbuild.xmlやjragファイルなどがいくつか入っています。このjragやastファイルがNonNullの拡張部分です。これらはとりあえず不要なのですが、ちょっと落としたソースが正しいかどうかを確認するために、動かしてみましょう。


JastAddJはつまるところコンパイラコンパイラーなので、2段階の実行になります。最初の一歩が、まずJastAddJから(jragやastなどを利用して)コンパイラーのソースコード自動生成することで、そして2歩目はその生成されたコンパイラーコードを動かして実際のコンパイル作業を行うというものです。

最初の一歩、コンパイラー生成のときに使うのがさっきついてきたbuild.xmlです。

さっそくこのbuild.xmlを実行してみてください!(注意:普通に動かしてもOutOfMemoryが発生します。Antの設定で-Xmx256Mを設定してください)

そうすると大量のソースが生成されるはずです。ASTパッケージなどが生成されます。


では、次にこのコンパイラーを動かしてみましょう。

ただし、testパッケージに赤ぺけが出ていると思いますが、これは無視してください。NonNullCheckerはJava拡張のため通常のJava構文とは異なるものが入っています。これがEclipseコンパイラに引っかかっているわけです。今回は、Eclipseコンパイルするわけではなく、JastAddJで生成したコンパイラコンパイルするので無視してください。

defaultパッケージの中にあるRunTests.javaを動かしてみましょう。

すると、testパッケージ以下にあるものをコンパイルしにいきます。(わざとエラーがでるサンプルになっているので、コンパイル途中でエラーがでて終了するはずです)

トラックバック - http://d.hatena.ne.jp/kikaineko/20091104

2009-10-22 JastAddJ凄い

[]JastAddJ凄い

研究でJastAddJというツールを使うことにしたんですが

このツール凄すぎる。


JastAddJは、簡単にいうとJava言語拡張するためのツールで

AspectJコンパイラーの一つabc(AspectBench Compiler)もJastAddJで書かれてたりする(JastAddJで書き直されたんやっけ?)

AOPとかJava拡張言語研究分野では比較的有名なツール。

最近AspectJ拡張系の研究ならほとんどJastAddJを使っているんじゃなかろうか。


なので存在は以前から知ってたんやけど、僕も研究で使うことにしたので(流行にのるというのはやはり大事w)

勉強がてらに簡単なサンプル作ってみた

そしたら、凄い凄い。

久しぶりに感動した。


何が凄いって本当にあっさりとJava拡張できる。

本当に拡張したい部分だけを定義すればそれで終わる。

これは体感しないと分からないかもしれないけど、本当に凄い。

やっぱり以下の点が凄い部分やと思う


1. ASTに属性を付けることができて、直感的なAST操作が可能になる(属性文法?)

2. 本当に欲しい部分だけ定義すれば良い


1に関して

通常ASTは、ただのTreeなので、例えばIFの条件を操作したい場合

こんな感じになる。

Node node = getChild(0);
if(node.getType().equals("Condition")){
  System.out.println(node);
}

ところが、JastAddJではASTに好きな属性を付与することができるので


IfStmt ifStmt= ..;
System.out.println(ifStmt.getCondition());

と、書ける。

これは、IfStmtノードにConditionという属性が付与されているという状態。

とてつもなく直感的!


2に関して

JastAddJは既にJava用のパーサなどを用意してくれているので、そこに「何を追加/変更するのか」っというような部分的な定義が可能になっている。すげー便利。


そもそもJastAddJ自体がJastAddというベースのツールを利用している。

どういうことかというと、

JastAddJは実は内部的には2つの部分に分けられていて、Java1.4用機能とJava5用機能とに分けられている。

で、Java5用機能はjava1.4用機能を拡張する形で(つまりJastAddJ形式で)実装されている。だからJava5用機能は非常にあっさりと作られているのだ。



DSLなどが流行っている昨今、いつかこのツールもインダストリーに使われるんじゃないだろうか。

トラックバック - http://d.hatena.ne.jp/kikaineko/20091022

2009-10-19 A join point for loops in AspectJ

最近論文乱読してるので、メモ

(但し斜め読み)

A join point for loops in AspectJ

http://portal.acm.org/citation.cfm?id=1119655.1119666&coll=GUIDE&dl=GUIDE&CFID=56606755&CFTOKEN=19907864

タイトルの通り、ループに対するjoin pointを提供しましょうという論文

ループってのは、for、while。ちなみにbyte codeレベルAOPです。


モチベーションとしては、

ループ部分ってパフォーマンスで問題になりやすいけど、ループだけを並列化とかって難しいやんね。やから、ループをjoin pointにしたらAOPで並列できてハッピーやね!」

という話。


でも、単純にループというけど、ループを判別するのは難しくて、特にbeforeアドバイスは常に指定できるけど、afterアドバイスは常に指定できるわけじゃないという問題がある。

また、どのループを選択するのか?というのも問題で、これにはwithinとcflowとdflowを駆使して対応するよ!


っていう論文



うーん、ちょっとモチベーションが弱い気がするなぁ。後、確かにループをジョインポイントにするのは難しいのは分かったけど、なんというか言語デザインとしてちょっと弱い気がする。とかいってみたりー。

トラックバック - http://d.hatena.ne.jp/kikaineko/20091019

2009-09-21 信頼度成長曲線

ソフトウエア信頼度成長曲線、いわゆるバグ曲線ってどれくらいの意味があるんだろうか?

品質の指標として何か欲しいのは理解できるけど

だとしても、信頼度成長曲線は妥当なんだろうか。

よく指摘されるように横軸を何に取るかでどうとでもなりそうだし

てか、


・十分なテスト数を行うことは実質難しい

 →適用できるテスト数なのか分からない

・この曲線が「バグは偏在しやすい」という経験則を取り入れても成り立つのか分からない

・もし十分なテストを行ったとして、曲線が寝る必要があるのか?


という疑問がぬぐえない

トラックバック - http://d.hatena.ne.jp/kikaineko/20090921