前回…Intel x86(Pentium?, Core?)の仮想機械をx86上で実現
このプロジェクターの中にはPowerPCが入っているのではないか
x86は高いし発熱が大きいので
だから安価な?PowerPCを使う
今回…仮想機械を任意のハードウェア上で実現
例 x86のVMをPowerPC上の実現
AMDはx86の命令セットが使える
裁判になったりするけどどっちにしてもアメリカの会社なので政府はなにも言わない
でも日本の例えば富士通とかが同じことをやれても実際にやると
大貿易摩擦になるのでやらない
というのはみんなが言っている
S**Yの人もMSソフトを使わないと問題になるので使わざるを得ないと言っている
今日は
Javaの仮想機械をやります
Javaの
VMを例えば
x86上で実現
Javaのプログラムは
コンパイルすると
x86の命令とかそういうのになるんじゃなくて
Java bytecodeという架空の
機械語になる
そしてこれをこれ用の仮想機械で実行する
なぜ
Java bytecodeなのか
色々なマシンで動く
x86の規格は複雑すぎる
securityに対応した
機械語が欲しかった
# 黒板はローテクなところは好きだけど手が荒れるのは嫌い
# 機械が動かないのはもっと嫌い
Javaが生まれたのは96年頃
もともとは組み込み用
当時流行り始めていたインターネットのブラウザ上で
絵を動かすとかインタラクティヴなことをやるものとしてブレイクした
当時は唯一な方法だったので…
今はあまり多くなくて大抵は
Flash
中身は仮想機械なので結局同じようなものだけれど
オー
サリング
ツールが充実している
あと最近は
JavaScript ブラウザで動かす
ともかく
インターネットで使われるのだから好き放題できたらまずい
そういう背景があったのでセキュリティに配慮することは重要
突き詰めて考えると
他のやり方はいっぱいあった
例として
JavaScriptは
コンパイルしないで
ソー
スプログラムをBrowserで直接実行
こういうアプローチもあり得る
しかし直接実行すると遅い
こういうデメリットは確かにあるが
そんなに大きなデメリットではない
インタプリタと
VMは似たようなもの
機械語の方がコンピュータにとって読み取りやすいくらい
そんな違いしかない
実際今は
JavaScriptがよく使われている
でも当時はみんな遅いと思っていた
他にもいろいろなメリットがあって
コンパイラはプログラムの間違いをチェックするという役目もある
JavaScriptは実行してみないとちゃんと動くかどうかわからない
コンパイルするとエラーがたくさんでると嫌だなあと思うかもしれないけど
実行する前にエラーをみつけてくれてありがたい
コンピュータサイエンスの進歩の賜物
いろいろあるけど結局、
単に
Smalltalkの真似とかなんとなく流行りとか偶然が重なって
こういうふうになった
今の
Javaはかなり違うけれど
生まれた時はかなり純粋な仮想機械だった
インタプリタと
VM
while(命令はまだある){
次の命令=次のメモリの内容;
case ビットパターン:
足し算実行
case 〜
掛け算実行
:
:
}
機械語命令か、式や分か、の違い
当時の
Javaの
VMもこういうふうに作っていた
普通の
機械語はregister machine
Javaの
機械語はstack machine
load <メモリ番地>, r3
レジスタマシン
load <別のメモリ番地>, r4
レジスタマシン
add r3, r4, r5
いかにメモリを効率よく使って早くすぐかが
コンパイラ制作者の腕の見せ所
スタックマシンにはregisterはない(
Javaの
VMは実際には
レジスタがあるけど…)
スタックをつくる First-In First-OUT
スタックマシンのほうが
コンパイラを作りやすい
なんで
バイトコードと呼ぶようになったのか
命令長が8bitだから
レジスタマシンだともうちょっと長くなる傾向がある
RISCマシンは32ビット
レジスタマシンは1命令ごとに
レジスタを指定してやらないといけない
例えばaddは3つ指定
これに対してスタックマシンは
レジスタの番号を指定する必要がない
Javaがブレイクしたのはブラウザ上だったけれども
サーバからプログラムを送る必要がある
そういうことを考えた場合特に携帯電話では命令長が短い方がよい
…ということもあって
Javaがデザインされたのではないか
昔は転送も遅かったし
しかし実際は
Javaの
バイトコードもそんなに短くはなくて
gzipとかで圧縮すればもっと短くなる
実際
JavaScriptでも圧縮して送れば良い
実際のところ
他の
Javaのような
アーキテクチャもスタックマシンなので
軽い気持ちで設計したのではないかと想像
実際にシステムを作る際には無難なシステムを採る
特に仕事の場合は…
来週からの話をする
Javaは当初生まれた頃、第一世代は
インタプリタ
アニメーション言語としての地位は
Flashに取られてしまい、
サーバーサイトで使われるようになってきた
そうすると性能が大切
今では内部で
コンパイラして動くようになっている
bytecodeから本物の
機械語に
コンパイル
実際
JavaとCの実行速度はそんなに変わらない
実行直前に
コンパイルするオーバーヘッドはある
この授業で
JavaとCの実行速度を学生に聞いているけど
年々
Javaの分が良くなっている
昔は
Javaの方が1000倍遅いとか100倍遅いとかいう人が結構いたのに