Javaソースコードが実行されるまでの流れについて調べた
Javaでいうコンパイルという動作は、C言語とRubyのそれと、どのように違うのか調べた。
OSやハードウェア依存のJavaプラットフォームで、ソースコードのコンパイルと実行が行われる。コンパイルされたJavaソースコードはバイトコード(中間言語)で書かれたJavaのプログラムに翻訳される。このプログラムは、全てのJavaプラットフォーム環境で同一に動く。Javaプラットフォームは、大きく分けて実行環境および開発環境を含む。
Javaプラットフォームは様々なプログラムから構成される。実行に必要な仮想マシン、開発に必要な標準ライブラリセット、コンパイラ等を梱包する。これらを個々のマシンのOSやハードウェアにあわせて構築することを「Javaプラットフォームを構築する」という。これにより、バイトコード(中間言語)で書かれたJavaプログラムが、全てのJavaプラットフォーム環境で同じ動作をするようになっている。これをプラットフォーム非依存といい、Javaの目標の一つとなっている。Javaの思想が生まれる以前の、多くのプログラミング言語は、プラットフォーム(CPU)に依存したネイティブなコードにコンパイルすることを前提として、設計されていた。
Javaソースコードが、コンパイルされて、実行されるまでの流れ
- Javaコンパイラが、Javaソースコードを、Javaバイトコードに翻訳する。
- JavaバイトコードをJREで実行すると、実行直前にJITコンパイラ(Just In Timeコンパイラ)が、Javaバイトコードを対象CPUの機械語(ネイティブなプロセッサ命令)に翻訳する。
- JITコンパイラはJava仮想マシン上で動く。プログラム実行中はメモリ上にネイティブコードをキャッシュする。
また、多くのJavaバイトコードはJava仮想計算機規定(The Java Virtual Machine Specification)が規定する形式に準拠する。
OSやハードウェア依存の実行環境を構築する。
Cコンパイラで、C言語で書かれたソースコードを、アセンブリソースに翻訳する。アセンブリソースに書かれているのは、mov(move=データをコピー)やadd(addition=加算)などのニーモニックである。
ニーモニックはマシン語の個々の数値が表す命令に、英単語を短くしたようなニックネームを付けたものを指す。
データの入出力を行うニーモニック命令
ニーモニック | 意味 | 機能 |
LD | LoaD | メモリーからCPUへデータを読み込む |
ST | STore | CPUからメモリーにデータを書き出す |
LAD | Load ADdress | CPUのレジスタに値を設定する |
PUSH | PUSH | スタックにデータを書き出す |
POP | POP | スタックからデータを読み込む |
SVC | SuperVisor Call | I/Oとの入出力を行う |
引用( 1週間で学ぶIT基礎の基礎 - 【5分で覚えるIT基礎の基礎】だれでも一度はアセンブラを学んでおこう! 第2回:ITpro )
アセンブラが、アセンブリ言語で書かれたアセンブリソースを機械語プログラムに翻訳する。
機械語は16進数の数値の羅列で構成された、コンピューターのCPUで直接実行される一連の命令。
Rubyの処理系はインタプリタの実装が多いため、インタプリタ言語と呼ばれることがあるが、言語がインタプリタ言語かコンパイル言語かという定義は排他的にひとつに決まるものではない。実装による。また、MRI1.9以降の実装はコンパイラを持つ。
1行ずつ解釈しても、コンパイラがクラスやモジュールごとにバイトコードに翻訳して実行しても、最終的にはCPUが実行しているのは機械語である。
Rubyの公式な実装には以下の2つがある。
- MRI(Matz' Ruby Implementation): C言語で実装されたRubyの公式処理系。
- YARV (Yet Another Ruby VM) : 笹田耕一氏が開発するRuby言語処理系。2007年12月25日にYARVが正式に組み込まれたMRI1.9がリリースされた。
1.8系まではソースコードを抽象構文木(AST: Abstract Syntax Tree)に変換し、そのツリー構造をたどりながら処理を実行していた。1.9系では 、ASTに変換し、さらにそれをコンパイラがバイトコード(数字列)に翻訳してから、仮想マシン上で実行している。
正直、これだけだとRubyが具体的にどのように実行されるのか分からなかったので、本を読むことにした。
外国人が書いたものを、日本語に訳しているのが少し切ないけど、(国産の言語だから)まつもとさんとささださんの付録があるから、きっと公認ではあるのでしょう:)