答えあわせ

  • クラスが無いのにどうやってプログラミングするのですか?

関数を使うとの解説があるが、まぁ70点。まぁ重箱の隅をつつくのは止めておこう。

  • VMがないのになぜ動くのですか

OSが直接実行できるネイティブコードにコンパイルされるからですとあるが、10点。OSは、ネイティブコードを実行させる機能を持っている訳がない。それはCPUの機能だ。

  • ネイティブコードには機種固有の処理が付加されるので 遅くなりませんか?

答えになっていません。0点。理論上同じ目的を持つプログラムを最適化なしで比較すれば、ネイティブコード(マシン語)が速いに決まっています。ネイティブコードがJavaバイトコードを解釈し、その機能を実行しているからです。Java信者がいう、「そんなに遅くないどころか速いことだってよくある」というのは負け犬の遠吠えです。Cなどの低級言語では記述がほとんど1対1でネイティブコードに置き換えられますが、Javaの様なポインタもなく、抽象化が優れている言語ではコンパイラの最適化が更によく働くため、結果的にJavaの方が優れた結果を出す場合があります。また、Javaは元々低速であったため、オプティマイズが盛んに行われたという背景もあります。更には、Cで抽象的な操作をしようとすると、自前でコードをガリガリ書かなければならないため、低品質なコードを生みやすい反面、(使いやすさも速度も)よく考えられた、上質なクラスが揃っているため、スキルがなくともある程度のコードを書けてしまうという事も原因です。

  • リモート・メソッドはどのように呼ぶのでしょうか?

つうか、バカですか。Javaが世界全部だと思っているのでしょうか。

  • クラスとは、マシン語においてどう実現されているのでしょうか。

C++の解説書(特にThe Annotated C++ Reference Manualとか)を読むことをお薦めします。これを知ればC++の多重継承の凄さと、そしてJavaのオブジェクトの凄さがそれぞれ判ります。

  • VMがないと動かない仮想コードのコンパイラに価値があるのでしょうか。

意味はあります。だからこそこれだけ広まったのです。一度コンパイルすれば、どの環境であっても動作する、その意義はCPUの性能の爆発的向上によって広がりました。Sparcで動いているものが、何も変更せずに携帯でも動くのです。PC-9801VX程度のCPUパワーの時代ではそんなバカな事には誰も目を向けなかったでしょう。

上にも書きましたが、一般論として遅くなります。がしかし、最適化がものすごく研究されているため、さほど遅さを感じません。また、最近はI/Oがかなりのボトルネックとなっており、仮想コードもそれを待てる程度に高速化されているため、純粋な計算のみを行うコードでない限り殆ど差は出ないでしょう。

  • ハードウェアドライバはJavaで書けますか。

一応無理ではないか、と言っておきます。しかしながらクルーソーが出来たようにエミュレーションも高い技術力をもってすればなんとかなってしまう場合が多いことも忘れてはならない。