はじめに
Javaに関することは一通り他人にちゃんと説明できる「つよつよJavaエンジニア」になるための第一歩の記事(そんなこと知らんがなって話ですよねすみません)
当たり前のことなんだけど、改めてOUTPUTして整理しやす
まず結論
OSに依存しない理由は「実行環境(JVM)にてバイトコードをOSに合わせた機械語に変換する」から
細かくみていこう
プログラミング言語は2種類に分かれる。
インタプリタ方式は、ソースコードを機械語に変換しつつ実行する。
コンパイラ方式は、ソースコードを事前に機械語に変換してから、一気に実行する。
違いは「事前に機械語に変換するかどうか」だ。
この2つ。事前に機械語に変換するかどうかで↓のような差が生まれる。
インタプリタ方式のBadなところが、コンパイラ方式では実現できている。
コンパイラ方式のBadなところが、インタプリタ方式では実現できている。
・
・
・
これは、インタプリタ方式とコンパイラ方式を融合すれば良いとこ取りできるのでは....!!
インタプリタ方式とコンパイラ方式を融合させたJavaとは?
↑の通り、コンパイラ方式の良いところとインタプリタ方式の良いところだけを吸収できた。
ややこしポイント1:Javaは2回コンパイルしている
機械語に変換するときも「コンパイル」と言うし、バイトコードに変換するときも「コンパイル」と言う。
Javaの開発現場で「コンパイル」といえば9割9分「javaファイルからclassファイルへの変換」のことを指して会話するが、当然Javaも機械語に変換されて実行されるので「Javaは2回コンパイルされている」と言えるのだ。
ややこしポイント2:JVM内には「インタプリタ」と「コンパイラ」の2つがあって、両方使われる。
①javaファイル → ②classファイル → ③機械語
JVM内では、②から③にかけて「インタプリタ方式」「コンパイラ方式」の両方で機械語への変換ができる。
「まとめて機械語にコンパイルしてから実行した方がこの処理は効率良いよね」みたいなものはコンパイラ方式を採用し、そうでない場合はインタプリタ方式で実行すると言う具合だ。
※自分用MEMO
インタプリタの何が良いかって、"実行時"にOSに合わせて機械語に変換するからOSに依存しないこと。なので「OSに依存したくないならインタプリタ1択か!」と思っていたが、Javaでは"実行時"に(JVMランタイム環境で)インタプリタとコンパイラの両方を使えるので、理解の仕方としては【JavaはJVMで実行される時に機械語に変換するから、OSに依存しない】としとこう。
ポイント整理
✔︎ 実行前にコンパイル(classファイルへの変換)をすることで、エラー検知して修正できる。
✔︎ 通常のコンパイル(機械語への変換)では、コンパイル時点で実行環境となるOSが確定してしまう(OSに依存してしまう)が、Javaではコンパイルの成果物をOSに依存しないもの(機械語ではなくclassファイル)にしているので「実行前に事前にコンパイルしているのにOSに依存していない!」となる。
✔︎ Javaでは実行環境で「バイトコード→機械語」のコンパイルを行うことができる。JITコンパイラ!