基盤ソフトウェア 5/8

前回…Intel x86(Pentium?, Core?)の仮想機械をx86上で実現

このプロジェクターの中にはPowerPCが入っているのではないか
x86は高いし発熱が大きいので
だから安価な?PowerPCを使う

今回…仮想機械を任意のハードウェア上で実現
例 x86VMPowerPC上の実現

AMDx86の命令セットが使える
裁判になったりするけどどっちにしてもアメリカの会社なので政府はなにも言わない
でも日本の例えば富士通とかが同じことをやれても実際にやると
大貿易摩擦になるのでやらない
というのはみんなが言っている
S**Yの人もMSソフトを使わないと問題になるので使わざるを得ないと言っている

  • -
今日はJavaの仮想機械をやります JavaVMを例えばx86上で実現 Javaのプログラムはコンパイルするとx86の命令とかそういうのになるんじゃなくて Java bytecodeという架空の機械語になる そしてこれをこれ用の仮想機械で実行する なぜJava bytecodeなのか 色々なマシンで動く x86の規格は複雑すぎる securityに対応した機械語が欲しかった # 黒板はローテクなところは好きだけど手が荒れるのは嫌い # 機械が動かないのはもっと嫌い Javaが生まれたのは96年頃 もともとは組み込み用 当時流行り始めていたインターネットのブラウザ上で 絵を動かすとかインタラクティヴなことをやるものとしてブレイクした 当時は唯一な方法だったので… 今はあまり多くなくて大抵はFlash 中身は仮想機械なので結局同じようなものだけれど オーサリンツールが充実している あと最近はJavaScript ブラウザで動かす ともかく インターネットで使われるのだから好き放題できたらまずい そういう背景があったのでセキュリティに配慮することは重要 突き詰めて考えると 他のやり方はいっぱいあった 例として JavaScriptコンパイルしないで ソースプログラムをBrowserで直接実行 こういうアプローチもあり得る しかし直接実行すると遅い こういうデメリットは確かにあるが そんなに大きなデメリットではない インタプリタVMは似たようなもの 機械語の方がコンピュータにとって読み取りやすいくらい そんな違いしかない 実際今はJavaScriptがよく使われている でも当時はみんな遅いと思っていた 他にもいろいろなメリットがあって コンパイラはプログラムの間違いをチェックするという役目もある JavaScriptは実行してみないとちゃんと動くかどうかわからない コンパイルするとエラーがたくさんでると嫌だなあと思うかもしれないけど 実行する前にエラーをみつけてくれてありがたい コンピュータサイエンスの進歩の賜物 いろいろあるけど結局、 単にSmalltalkの真似とかなんとなく流行りとか偶然が重なって こういうふうになった
  • -
今のJavaはかなり違うけれど 生まれた時はかなり純粋な仮想機械だった インタプリタVM while(命令はまだある){ 次の命令=次のメモリの内容; case ビットパターン: 足し算実行 case 〜 掛け算実行 : : } 機械語命令か、式や分か、の違い 当時のJavaVMもこういうふうに作っていた 普通の機械語はregister machine Javaの機械語はstack machine load <メモリ番地>, r3 レジスタマシン load <別のメモリ番地>, r4 レジスタマシン add r3, r4, r5 いかにメモリを効率よく使って早くすぐかが コンパイラ制作者の腕の見せ所 スタックマシンにはregisterはない(JavaVMは実際にはレジスタがあるけど…) スタックをつくる 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倍遅いとかいう人が結構いたのに