[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[b-free: 1085] Re: はじめまして
落合さん、こんにちは。リギーコーポレーションの片桐です。
|> JavaのVMはどうやって実装しているんですかね。やはりアセンブラなんで
|>しょうか。(↑こちらも低レベルはスタックマシンのようですが‥)
|
| http://rufus.w3.org/tools/Kaffe/)
|freeなJava VMであるkaffe0.92ではmachine.cで
|
|/* Misc stuff */
|Hjava_lang_Object* exceptionObject;
|
|void
|virtualMachine(methods* meth, slots* arg, slots* retval)
|{
(以下略)
貴重な情報ありがとうございます。
スタックポインタを局所変数に入れてるんですね。スレッド毎にこのVM関数
ぐるみで起動しているんだと思います。(たとえ割り込みでたった一つのバイト
コードを実行するのであっても‥)
でもこういうやりかたぐらいしかないでしょうね。仮想スタックを使う場合
には。
|とVMのレジスターにプログラムカウンターとスタックポインターを載せていますね。
|でもi386のレジスターのうち5つも割り当てていいんでしょうか?
ひょっとしたらregister効いているのは1本ぐらいかも知れませんね(^^;。
|P.S.おなじスタックベースのマシーンだったらJAVAのVMのうえでForth/Mindは
|走らないものでしょうか。
|各OSにVMは載っているし、多くの人がVMの高速化にかかわっているので、
|いったん載れば、移植性もスピードも上がると思うのですが。
知り合いの方がMindとJavaのことを研究されているので私も少しだけ教えて
もらっています。(以下は教えてもらった内容です)
Javaはプリミティブではスタックマシンなので、原理的にFORTHは乗せやすい
ようですし、現にVM上のFORTHが出ているようですが、そのすぐ上のレベルになる
と関数型言語になってしまうので、実際にスタックマシンとして使えるのは
とても下の部分だけになります。(たとえば、クラスライブラリなどはこの上に
構築されているため、プリミティブレイヤでは使えないようですね)
で、Mindの場合にはこのプリミティブレイヤの単語がとても多いんですね。少し
乱暴な話ですが、Javaのプリミティブワードの識別が8bitですんでいるのに比べて
MindのMコードは16bitであるということからもお分かりいただけるかと思いま
す。(すみません、あまり詳しくありませんので(^^;、ひょっとすると、Javaで
言う「プリミティブ」はさらに2層に別れるのかも知れません)
Java:
プリミティブ語は最低限にとどめ、あとはそれを呼び出す形で上位ワード
を定義している(クラスライブラリも)
FORTH:
Javaに近い
Mind:
多くのビッグワードをプリミティブとして実装している(たとえば、文字列
操作単語など)
これまた乱暴な見解なんですが、Javaが遅いというのは、オブジェクト指向だ
ったりVMの性能とかいうものではなく、プリミティブワードを押さえた結果なん
だと思います。これは良い悪いではなくて思想によるものなんでしょう。
元祖FORTHでは、たとえば配列メンバのアクセスは、配列先頭アドレスとインデッ
クスをもらったあと、掛け算と足し算することでアクセスするわけですが、この
部分の計算はFORTHレベルで記述するのが普通です。Mindではその計算もまたプリミ
ィティブで(MS-DOSではアセンブラ記述で)おこなっています。
というわけで、VMの・・正確にはプリミティブレイヤの上にMindを乗せること
は可能ではあるのですが、恐らく現在のようなCでカーネル書いたものに比べて
だいぶ遅くなるのではないかと思います。でもそれを承知でやるのも面白いよう
に思います。
もう一つのやりかたとしては、Javaの上位の機構・・リストクラス(コレクシ
ョンって言うんですか?)のデータ構造そのものをスタックとして使い、void *
みたいな(Javaで何て書くのか知りませんが・・)「何でも有り」のエレメント
をほうり込むという形でスタックマシンを実現する方法もあるかと思います。こ
いつはもっと遅くなるとは思いますけど、そのかわりクラスライブラリが使える
というメリットが有るようです。
では。
片桐 明 (株)リギーコーポレーション
killy@rigy.co.jp
NIFTY: PAG01434