なぜJavaはOSに依存しないのか


<目次>
・「 OS に依存する」とは

◆ 「 OS に依存する」とは

 OS によって動作が異なる(動くか動かないか含め)ということを指します。「 Java がOS に依存しない」とは、どの OS でも同じく正常に動作する、ということです。

では Java はどのような特徴により依存しないようになっているのでしょうか?
依存しないための条件として、以下3つが挙げられます。

① OSがその言語をサポートしていること
② その言語で行いたい処理を、各OS上でサポートされている範囲内で書くことができ、期待通りの動作が行えること
③ その言語で書いたプログラムのコンパイル結果がOS独自に定義されており、各OS上で再コンパイルしないで動作させることができること

【 2021-08-29 追記(訂正)】

Java では JVM(Java仮想マシン)と呼ばれる仮想マシン(ソフトウェア)が、各OSの違いを吸収するという役割を果たしています。

Java で作成されたプログラムは、実行前にコンパイラと呼ばれる言語プロセッサがソースファイル(.java)からコンピュータが実行できる「クラスファイル(.class)」を生成します。
そのソースコードはコンピュータが理解できる「バイトコード(0と1の羅列)」に変換されています。
後述しますが、そのバイトコードが対象のOSで実行可能な形式のコードである「マシンコード」に変換されて実行されます。(ソースコードに対してネイティブコードとも呼ばれます)

ソースコードを実行可能なファイルへコンパイルする必要があるプログラミング言語をコンパイラ型言語といい、C言語やJavaが代表的なものですが、
C言語の場合はC言語用のコンパイラが「WindowsであればWindows用の機械語」へ、「LinuxであればLinux用の機械語」へそれぞれOSに合わせてコンパイルします。
これはコンパイラがいずれかのプラットフォームに依存している状態です。

対してJavaでは、各OSに用に作られたJVMがOSに合わせたマシンコードに変換し、最後に変換された命令をOSが命令を実行するようになっています。
この仕組みによって異なるOSの環境下であっても、その環境ごとに合わせてソースファイルを作成することなく実行することができます。

JVMは後述するJREの中にあり、APIとセットになっています。

・JRE ( Java Runtime Environment )

Javaで作成されたプログラムを実行するために必要なソフトウェアです。
Java実行環境やJavaランタイムなどとも呼ばれます。
Java で作成されたアプリケーションは JVM 上で実行されますが、実際には JRE を各 OS にインストールすることで Java アプリケーションが実行できる環境が構築できます。
JRE は対応する Java SE のバージョンに合わせて、バージョン番号(JRE8や13など)が付けられます。後述するJDKに含まれます。

・JDK ( Java (SE) Development Kit )

 Javaで開発・実行するための総合的なプログラムセットです。Javaア開発環境とも呼ばれます。
JREに加えてプログラムをコンパイルするためのプログラムやデバックするためのプログラムなどが含まれます。JREと同じく、対応する Java SE のバージョンに合わせて、バージョン番号(JDK8や13など)が付けられます。

ちなみにJava SEはStandard Edition、つまりJavaの基本機能をまとめたものです。これを基にしてサーバーサイドの機能を追加したものをJava EE ( Enterprise Edition ) と呼びます。

参考文献
この記事は以下の情報を参考に執筆いたしました。
-Let'sプログラミング ” Java SEとJDK、JRE、JVMの違いに関する解説 ”
https://www.javadrive.jp/start/install/index5.html
-SAMRAI ENGINEER Blog ” 【Java入門】JVMとは?わかりやすく解説! ”(2017-03-23)
https://www.sejuku.net/blog/19871
-Tech Teacher Blog ” JVMって何?これからJavaを始める人でも分かるように解説します! ”(2020-06-29)
https://www.tech-teacher.jp/blog/java-jvm/
-SAMRAI ENGINEER Blog ” JavaのJREとは?JDKとの違いやインストール方法まで解説 ”(2019-05-29)
https://www.sejuku.net/blog/63551
-SAMRAI ENGINEER Blog ” 【Java入門】SEとEEの違いは?JRE・JDKとは?を初心者向けに解説 ”(2019-07-03)
https://www.sejuku.net/blog/12902