- - PR -
神は無駄をしたもうか?
«前のページへ
1|2|3
| 投稿者 | 投稿内容 | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2002-12-27 15:06
CLRにおいてはcallvirtで単純なvirtualもinterfaceも扱います。ちょっと調べてみましたが、1.0 RTMのCLRでは、callvirtがinterface型に対して呼ばれると、型が持っているinterfaceオフセットテーブルを参照してinterfaceオフセットを手に入れ、さらにメソッドオフセットをプラスして呼び出すようになっているようです。単純なvirtualの場合は、型に対してメソッドテーブルのオフセットを計算するだけです。callvirtへの引数でメソッド名、シグネチャ、型が渡される(というのはちょっと語弊があるが)ので、命令は1つで済まされています。
しません。CLRもJVMと同じ実装単一インターフェイス多重です。ただし、Eiffel.NETはコンパイラががんばって多重実装継承をサポートしているようですが。
メソッドポインタを使ってメソッドを呼び出す命令です。
まったくサポートできないとはいえないことはEiffelが証明しているようです。また、様々な言語のサポートが「最大の」売りというわけでもありません。やはり誤解されていますね。 #こないだInsider.NETの掲示板で売りの一部を書きましたけど、そこにはわざと複数言語サポートはあげませんでした。
多言語開発を誤解されているようですが、1つのプロジェクトを複数言語で開発するだけが多言語開発ではありません。プラットフォーム(GCやらセキュリティやら)の恩恵を受けつつ、そのとき最適な言語で開発ができれば、生産性の向上に寄与することに議論の余地はないでしょう。JavaもC#も汎用多目的言語ですが万能言語ではありません。
アンマネージコードをCLR上で実行することはできません。たぶん誤解されていると思います。 | ||||||||||||||||||||
|
投稿日時: 2002-12-27 15:37
>しません。CLRもJVMと同じ実装単一インターフェイス多重です。
以下略. ....聞けば聞くほど呆れるほどにJavaそっくり. ネイティブメソッドにしろ,JavaVMにしろ,名前が違うだけ. ほとんど周知の事実だし予想もしてましたが,よもやこれほどとは.(^^; 流石はJavaの猿真似,出来の悪いレプリカと言われるだけのことはありますねー. >>商業的に見ればいつの時代も、少数の精鋭を相手にするより >> 大多数の愚か者を相手にした方が儲かるんです。 #「商品には次々と違うラベルを貼れ.」とかね.(^^) | ||||||||||||||||||||
|
投稿日時: 2002-12-27 15:50
このページ、面白いですね。参考になりました。
やっと、分かりました。Java VM の実装言語の違いに由来していました。 普通の人は、C や C++ で Java VM を作りますが、 僕は JavaScript (Dynamic HTML) で作っています。 ( http://orto.jp/ にて公開中。 でも、Sun と契約していないので、Java"風"VM です。) JavaScript だと、連想配列からの取出しが「相対的には」非常に速く、 連想配列を積極的に利用することが高速化へとつながります。 すると、 callMethod = callObject.classObj.methodMap[methodSignature]; callClass = callMethod.classObj; みたく、愚直に取り出した方が速いです。 よかった〜。ということは、僕の実装方法は間違っていなそう。 | ||||||||||||||||||||
|
投稿日時: 2003-01-04 07:48
興味深く読ませていただきました。
JavaScriptでJVMを実装ですか。すばらしい。 私も、通常のメソッド呼び出しとインターフェースのメソッド呼び出しは本質的 にかわらないと思います。メソッドテーブルを使う実装であれば、メソッドシグ ネチャーをもとに関数(へのポインタ)を検索するだけなので、違いはなさそう ですね。 今のまま(つまりinvokevirtualとinvokeinterfaceを同じとみなす)で実装を進 めて、問題があれば初めて分けることを考えればよいのではないでしょうか。 それから、どなたかが、インターフェースは多重継承ができるからなんたらかん たらとおっしゃっていたように思いますが、この場合は多重継承は関係ないので はないでしょうか。なぜなら、多重継承に見えるけど、実際には単一継承だから。
そうかなー。 そのインスタンスのクラスが何かを判定するのは、invokeinterfaceだけでなく、 invokevirtualでも必要ではないでしょうか。
これも関係ないような・・・。 連想配列(つまりハッシュですね)を使おうと使わまいと、「invokevirtualと invokeinterfaceで同じ処理を行う」というアルゴリズムは変わらないわけです よね? 連想配列を使わなくても、invokeinterfaceのときの処理がinvokevirtualと比べ て増えた/減ったということはなさそうなんですが。 | ||||||||||||||||||||
|
投稿日時: 2003-01-04 12:43
ありがとうございます!
実装は、Mauve ( http://sources.redhat.com/mauve/ ) を 使ってチェックしているのですが、今のところは問題は発生していないです。 ただ、不正なクラスファイルに対する処理はテストしていないので、 テストは甘いです。
実際にプログラムを書いてテストしていないので、まったく自信がないのですが、 たぶん、きっとたぶん、invokevirtual の場合は、method signature の ハッシュ値を計算しなくても、関数呼び出しができるのではないでしょうか。 だけど、invokeinterface はハッシュ値を計算しないといけないとか??? う〜む、自信ない。 JavaScript では、文字列のハッシュ値を計算するのにかかる時間は、 変数から値を取り出すのにかかる時間よりも何倍も速いので (^^; invokevirtual でもハッシュを使っています。 | ||||||||||||||||||||
«前のページへ
1|2|3
