Java の場合、機械語命令の代りに、仮想機械(virtual machine)語であるところの bytecodeというものを使います。 で、CPU や OS を選ばず、同じプログラムがどこでも走ると言われています。 だから、Windows 端末でもサーバマシンでもどこでも同じプログラムが動き、 ネットワーク世界に向いているなんて言われたりしたわけです。
とりあえずは C 言語を振り返りましょう。
じゃあ、Java の方はどうなっているかというと、
で、いわゆるオブジェクトファイルに相当するクラスファイルは、機種非依存です。 標準API(Application Programming Interface)といわれるライブラリもOSによらず統一されています。 というわけで、プログラムをどこに持っていっても動く(write once, run everywhere)と言うわけです。
とはいっても、最終的にプログラムを実行するためにはCPUが機械語で動いているわけです。 誰がその任にあたっているかというと、VM 君です。 VM のつくりには大きく 2 種類あります。解釈(interpritive)実行と JIT(Just-In-Time) Compilerによる 実行です。 とってもおおざっぱにいうと、 解釈実行というのは、各bytecode命令に相当するルーチンを準備しておいて、 bytecode 命令を取り出しては、各ルーチンを実行するという感じです。 一方で、JIT Compiler というのは、bytecode 命令列を機械語に変換してしまってから 実行しようというものです。 なぜ JIT(Just-In-Time) というかというと、プログラムが実行される都度、その場で compile をおこなう からです。 JIT コンパイラによっては、変換に要する時間を短縮するため、 良く使いそうなところだけコンパイルするという技術をつかうものも多いです。 さらに賢い JIT の場合、一度走らせてプログラムの実行の傾向を調べておいてから、 その情報を元に最適化(実行効率をあげるためのチューニング)をおこなうものもあります。
皆さんがつかっている VM がどんなものか知りたければ、
kamada@cygwin% java -version java version "1.3.0_02" Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0_02) Java HotSpot(TM) Client VM (build 1.3.0_02, mixed mode)とやることで、HotSpot Engine といわれる JIT つき VM が起動していることがわかります。 ついでに、クラスファイルの中身を知りたい場合は、以下のようにすることで、 中身を知ることもできます。
kamada@cygwin% javap -c Hello Compiled from Hello.java ....続きはこちら
2001.9.25/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp