読者です 読者をやめる 読者になる 読者になる

Javaソースコードが実行されるまでの流れについて調べた

Javaでいうコンパイルという動作は、C言語Rubyのそれと、どのように違うのか調べた。

 

Javaソースコードコンパイル

OSやハードウェア依存のJavaプラットフォームで、ソースコードコンパイルと実行が行われる。コンパイルされたJavaソースコードバイトコード(中間言語)で書かれたJavaのプログラムに翻訳される。このプログラムは、全てのJavaプラットフォーム環境で同一に動く。Javaプラットフォームは、大きく分けて実行環境および開発環境を含む。

Javaプラットフォームは様々なプログラムから構成される。実行に必要な仮想マシン、開発に必要な標準ライブラリセット、コンパイラ等を梱包する。これらを個々のマシンのOSやハードウェアにあわせて構築することを「Javaプラットフォームを構築する」という。これにより、バイトコード(中間言語)で書かれたJavaプログラムが、全てのJavaプラットフォーム環境で同じ動作をするようになっている。これをプラットフォーム非依存といい、Javaの目標の一つとなっている。Javaの思想が生まれる以前の、多くのプログラミング言語は、プラットフォーム(CPU)に依存したネイティブなコードにコンパイルすることを前提として、設計されていた。

 

Javaソースコードが、コンパイルされて、実行されるまでの流れ

  1. Javaコンパイラが、Javaソースコードを、Javaバイトコードに翻訳する。
  2. JavaバイトコードJREで実行すると、実行直前にJITコンパイラ(Just In Timeコンパイラ)が、Javaバイトコードを対象CPUの機械語(ネイティブなプロセッサ命令)に翻訳する。
  3. JITコンパイラJava仮想マシン上で動く。プログラム実行中はメモリ上にネイティブコードをキャッシュする。

また、多くのJavaバイトコードJava仮想計算機規定(The Java Virtual Machine Specification)が規定する形式に準拠する。

Java SE Specifications

 

 C言語コンパイル

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 )

 

アセンブラが、アセンブリ言語で書かれたアセンブリソースを機械語プログラムに翻訳する。

f:id:bambinya:20150415222213g:plain

機械語は16進数の数値の羅列で構成された、コンピューターのCPUで直接実行される一連の命令。

 

 

Rubyコンパイル

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が具体的にどのように実行されるのか分からなかったので、本を読むことにした。

www.amazon.co.jp

 

外国人が書いたものを、日本語に訳しているのが少し切ないけど、(国産の言語だから)まつもとさんとささださんの付録があるから、きっと公認ではあるのでしょう:)