- PR -

神は無駄をしたもうか?

投稿者投稿内容
NothingButXMLInfoSet
大ベテラン
会議室デビュー日: 2002/07/16
投稿数: 116
投稿日時: 2002-12-27 15:06
CLRにおいてはcallvirtで単純なvirtualもinterfaceも扱います。ちょっと調べてみましたが、1.0 RTMのCLRでは、callvirtがinterface型に対して呼ばれると、型が持っているinterfaceオフセットテーブルを参照してinterfaceオフセットを手に入れ、さらにメソッドオフセットをプラスして呼び出すようになっているようです。単純なvirtualの場合は、型に対してメソッドテーブルのオフセットを計算するだけです。callvirtへの引数でメソッド名、シグネチャ、型が渡される(というのはちょっと語弊があるが)ので、命令は1つで済まされています。

引用:

悪夢を統べるものさんの書き込み (2002-12-27 11:49) より:
たとえば,VC++.NETがどの程度C++であるかは把握してませんが,なまじC++と言っているくらいだから,ひょっとして多重継承をサポートしていたりはしませんか?


しません。CLRもJVMと同じ実装単一インターフェイス多重です。ただし、Eiffel.NETはコンパイラががんばって多重実装継承をサポートしているようですが。

引用:

#calliは一体なんでしょう?


メソッドポインタを使ってメソッドを呼び出す命令です。

引用:

逆に単一継承専用だと多重継承は全くサポートできないので「様々な言語のサポート」を最大の売りにしている.NETとしては問題が多いでしょう.


まったくサポートできないとはいえないことはEiffelが証明しているようです。また、様々な言語のサポートが「最大の」売りというわけでもありません。やはり誤解されていますね。
#こないだInsider.NETの掲示板で売りの一部を書きましたけど、そこにはわざと複数言語サポートはあげませんでした。

引用:

#ちなみに,JavaVMもかならずしもJava言語専用ではない.多言語プログラミングなんてのをやる人がほとんどいないだけで.


多言語開発を誤解されているようですが、1つのプロジェクトを複数言語で開発するだけが多言語開発ではありません。プラットフォーム(GCやらセキュリティやら)の恩恵を受けつつ、そのとき最適な言語で開発ができれば、生産性の向上に寄与することに議論の余地はないでしょう。JavaもC#も汎用多目的言語ですが万能言語ではありません。

引用:

ネイティブメソッド(.NET用語では多分「アンマネージドコード」)については,いずれにせよVM上で実行するメリットがほとんど無い.


アンマネージコードをCLR上で実行することはできません。たぶん誤解されていると思います。
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2002-12-27 15:37
>しません。CLRもJVMと同じ実装単一インターフェイス多重です。
以下略.

....聞けば聞くほど呆れるほどにJavaそっくり.
ネイティブメソッドにしろ,JavaVMにしろ,名前が違うだけ.
ほとんど周知の事実だし予想もしてましたが,よもやこれほどとは.(^^;

流石はJavaの猿真似,出来の悪いレプリカと言われるだけのことはありますねー.

>>商業的に見ればいつの時代も、少数の精鋭を相手にするより
>> 大多数の愚か者を相手にした方が儲かるんです。
#「商品には次々と違うラベルを貼れ.」とかね.(^^)
yu
ベテラン
会議室デビュー日: 2002/09/29
投稿数: 58
お住まい・勤務地: 東京
投稿日時: 2002-12-27 15:50
引用:

悪夢を統べるものさんの書き込み (2002-12-27 11:49) より:
>invokevirtual と invokeinterface をまとめて実装してしまったことが、
>本当に正しいのか、不安なので、ぜひ教えていただけないでしょうか。
うーん.これで分からないということは,多分説明するのはかなり
手間がかかると思います.次のページとかを参考にしてはいかがでしょうか.
http://www.netgene.co.jp/java/docs/javaPressVol17.html#5.3


このページ、面白いですね。参考になりました。

引用:

メソッドディスパッチに必要な「インスタンスのクラス(動的なクラス/型)」
の判定です.

静的な型だけでは実行時の動的な型が判定できず,そのままではメソッド
呼出し毎に毎回instanceofに相当する処理が必要になります.が,そんな
真似をしているとパフォーマンスが出ませんからね.通常はもっと静的に
(コンパイル時ではないので「半静的に」という感じ)実行するメソッドを
判定します.


やっと、分かりました。Java VM の実装言語の違いに由来していました。

普通の人は、C や C++ で Java VM を作りますが、
僕は JavaScript (Dynamic HTML) で作っています。
http://orto.jp/ にて公開中。
 でも、Sun と契約していないので、Java"風"VM です。)

JavaScript だと、連想配列からの取出しが「相対的には」非常に速く、
連想配列を積極的に利用することが高速化へとつながります。

すると、
callMethod = callObject.classObj.methodMap[methodSignature];
callClass = callMethod.classObj;
みたく、愚直に取り出した方が速いです。

よかった〜。ということは、僕の実装方法は間違っていなそう。
kwatch
会議室デビュー日: 2003/01/04
投稿数: 3
投稿日時: 2003-01-04 07:48
興味深く読ませていただきました。
JavaScriptでJVMを実装ですか。すばらしい。

私も、通常のメソッド呼び出しとインターフェースのメソッド呼び出しは本質的
にかわらないと思います。メソッドテーブルを使う実装であれば、メソッドシグ
ネチャーをもとに関数(へのポインタ)を検索するだけなので、違いはなさそう
ですね。
今のまま(つまりinvokevirtualとinvokeinterfaceを同じとみなす)で実装を進
めて、問題があれば初めて分けることを考えればよいのではないでしょうか。

それから、どなたかが、インターフェースは多重継承ができるからなんたらかん
たらとおっしゃっていたように思いますが、この場合は多重継承は関係ないので
はないでしょうか。なぜなら、多重継承に見えるけど、実際には単一継承だから。


引用:

invokeinterfaceは
そう簡単ではなく,すくなくとも単純な実装では条件分岐を外す
ことはできません.
....
>何の「条件分岐」が必要なのでしょうか?
メソッドディスパッチに必要な「インスタンスのクラス(動的なクラス/型)」
の判定です.



そうかなー。
そのインスタンスのクラスが何かを判定するのは、invokeinterfaceだけでなく、
invokevirtualでも必要ではないでしょうか。


引用:

やっと、分かりました。Java VM の実装言語の違いに由来していました。



これも関係ないような・・・。
連想配列(つまりハッシュですね)を使おうと使わまいと、「invokevirtualと
invokeinterfaceで同じ処理を行う」というアルゴリズムは変わらないわけです
よね?
連想配列を使わなくても、invokeinterfaceのときの処理がinvokevirtualと比べ
て増えた/減ったということはなさそうなんですが。
yu
ベテラン
会議室デビュー日: 2002/09/29
投稿数: 58
お住まい・勤務地: 東京
投稿日時: 2003-01-04 12:43
引用:

kwatchさんの書き込み (2003-01-04 07:48) より:
興味深く読ませていただきました。
JavaScriptでJVMを実装ですか。すばらしい。


ありがとうございます!

引用:

今のまま(つまりinvokevirtualとinvokeinterfaceを同じとみなす)で実装を進
めて、問題があれば初めて分けることを考えればよいのではないでしょうか。



実装は、Mauve ( http://sources.redhat.com/mauve/ ) を
使ってチェックしているのですが、今のところは問題は発生していないです。
ただ、不正なクラスファイルに対する処理はテストしていないので、
テストは甘いです。

引用:

連想配列(つまりハッシュですね)を使おうと使わまいと、「invokevirtualと
invokeinterfaceで同じ処理を行う」というアルゴリズムは変わらないわけです
よね?
連想配列を使わなくても、invokeinterfaceのときの処理がinvokevirtualと比べ
て増えた/減ったということはなさそうなんですが。


実際にプログラムを書いてテストしていないので、まったく自信がないのですが、
たぶん、きっとたぶん、invokevirtual の場合は、method signature の
ハッシュ値を計算しなくても、関数呼び出しができるのではないでしょうか。
だけど、invokeinterface はハッシュ値を計算しないといけないとか???
う〜む、自信ない。

JavaScript では、文字列のハッシュ値を計算するのにかかる時間は、
変数から値を取り出すのにかかる時間よりも何倍も速いので (^^;
invokevirtual でもハッシュを使っています。

スキルアップ/キャリアアップ(JOB@IT)