コンパイラ版とインタプリタ版の違い

f:id:skrb:20080317231829p:image:right:small

なんかずいぶん久しぶりの更新。

先週、丸山先生レクチャーシリーズJavaFX の講演をしました。もちろん、プレゼンツールは JavaFX で作成。

今まで作ったプレゼンツールを全面的に書き換え。せっかくなので、コンパイラ版で作ってみました。

ところが、もうつまずきっぱなし。文法が分からない、API が分からない、動かないの三重苦。もう大変でしたよ。

API が分からない部分は、ソース見ればどうにかなるのでいいのですが、文法が分からないはかなり困った。エラーメッセージもよく分からないんだなぁ。

だもんで、本当にやりたかったことの半分も作れませんでした。まだ、正体不明のバグもあるし... このバグがまた、常に起こるとは限らないのです。もう、いやになっちゃう orz

いちおう、プレゼンはちゃんとできたからよかったのですが、アニメーションなどかなりはしょってしまいました。次はもうちょっとちゃんとやります。

というわけで、プレゼンツールを作っているときに気がついた、コンパイラ版とインタプリタ版の違いをまとめておこうと思います。

ちなみに OpenJFX の wiki である Planet JFX にも OpenJFX-compiler のページがあります。そして、コンパイラ版とインタプリタ版の違いを列挙したページ もあるんだけど、これがまた全然足りない。書くんだったら、もっとちゃんと書いてよ!!

function と operation

インタプリター版では関数には 2 種類あったんです。知ってました?

単純なことを行う function と、複雑なことをする operation。function は制御構造も書けないし、他のオブジェクトに対してメッセージパッシングもできない、という役に立たないやつだったわけです。

なんで、function なんてもの作ったのかよく分からないんだけど、たぶんメソッドコールをする手法が異なっていたんでしょう。function はインライン展開してたのかもしれない。

役に立たないやつだなぁと思っていたら、なんとコンパイラ版では function が急浮上。浮上しすぎて、operation を蹴落としてしまったんですよ。ビックリですね。

ということで、コンパイラ版では operation がなくなって、function に統一されました。よかった、よかった。

アトリビュートの初期化

クラスを定義するときに、アトリビュートの初期化を行うことができます。

インタープリター版では次のように書いていたんです。

class Name {
    attribute first:String;
    attribute last:String;
}

attribute Name.first = "ゆういち";
attribute Name.last = "さくらば";

C++ みたいにクラスの宣言と初期化が別々だったんです。個人的にはいやだなぁこれ、って思っていたわけですよ。だって、見にくいじゃないですか。

でも、これで慣れちゃったら、これはこれでいいかと思うようになったんです。

そんなこんなで、この表記で書いていたら、なんとこれが変わってしまうというじゃありませんか。

結局、コンパイラ版では Java 的な記述法に戻ってしまったのです。

class Name {
    attribute first:String = "ゆういち";
    attribute last:String = "さくらば";
}

まったく、やっと慣れてきたと思ったのに... だったら、はじめからこうしておいてくれればいいのに。ブツブツブツ......

function の定義

これもアトリビュートの初期化と同じ。

インタプリター版では

class Name {
    attribute first:String;
    attribute last:String;

    function toString(): String;
}

attribute Name.first = "ゆういち";
attribute Name.last = "さくらば";

function Name.toString(): String {
    return "[{first} {last}]"
}

のように、宣言と定義が別々の場所だったわけ。

ちなみに文字列中に出てくる {} は変数の展開だよ。

これも、Java 見たいに宣言と定義が一緒になってしまいました。

class Name {
    attribute first:String = "ゆういち";
    attribute last:String = "さくらば";

    function toString(): String {
        return "[{first} {last}]"
    }
}


まぁ、Java みたいっていえばそうなんだけどね。

この変更は、どうやらコンパイラを作りやすいからという理由らしいのです。うーん、そういう理由でいいのかぁ。

長くなったので、今日はここまで。