Java超|JavaはなぜどのOSでも動くのか

Javaは、ひとつの型をさまざまな戦場で放てる言語。共通のクラスファイルとJava実行環境が、OSの違いを越えてプログラムを動かす。

Javaの大きな魅力のひとつは、作成したプログラムをさまざまなOSで動かしやすいことです。

Javaを学び始めると、まずはコードを書く、保存する、コンパイルする、実行する、という基本の流れを覚えていきます。ここまで学ぶだけでも、自分の手でJavaプログラムを動かせるようになり、大きな一歩になります。

けれども、Javaのすごさはそれだけではありません。

Javaには、作成したプログラムを異なる環境でも使いやすいという、とても大きな特徴があります。この記事では、具体的なプログラムとして Sample1.java を使いながら、JavaがなぜWindows、UNIX、macOSなどの異なるOSでも動きやすいのかを整理していきます。

普通、プログラムは作成したOSや実行する環境の影響を強く受けます。

Windows向けに作ったプログラムを、そのままUNIXで動かすのは簡単ではないことがあります。反対に、UNIX向けに作ったプログラムを、そのままWindowsで動かすのも難しい場合があります。

しかしJavaでは、コンパイルして作られたクラスファイルがあれば、WindowsでもUNIXでもmacOSでも、Java実行環境がある場所で同じように実行しやすい仕組みになっています。

ドラゴンボール風にたとえるなら、Javaのクラスファイルは、どの修行場でも使いやすい 共通の技の型 のような存在です。

Javaのしくみドラゴンボール風のたとえ
ソースファイル技の型を書いた巻物
コンパイル型を実戦用に鍛える作業
クラスファイルどの修行場でも使いやすい共通の技
Java実行環境各地域にある技を発動する舞台
OSWindows道場、UNIX道場、macOS道場などの異なる戦場

Javaでは、OSごとにまったく別の完成品を作るのではなく、まず共通のクラスファイルを作ります。

そして、各OSに用意されたJava実行環境が、そのクラスファイルを読み取って実行します。

このしくみがあるから、Javaは異なるOSでも動かしやすい言語として知られています。

Javaプログラムはほかの環境でも使える

Javaプログラムの基本手順は、次の流れです。

手順内容
1テキストエディタなどでコードを書く
2ソースファイルとして保存する
3javacでコンパイルする
4クラスファイルが作られる
5javaで実行する

ここで特に注目したいのが、コンパイルして作成される クラスファイル です。

Javaでは、このクラスファイルがあれば、WindowsでもUNIXでもmacOSでも、Javaの実行環境が用意されている場所で同じように実行しやすくなります。

つまり、Javaでは作成したプログラムを、ある特定のOSだけのものにしなくてよいのです。

環境実行の考え方
WindowsWindows用のJava実行環境がクラスファイルを動かす
UNIXUNIX用のJava実行環境がクラスファイルを動かす
macOSmacOS用のJava実行環境がクラスファイルを動かす

ドラゴンボール風に言えば、Javaのクラスファイルは、各地の道場で使える共通の型です。

Windows道場でも、UNIX道場でも、macOS道場でも、そこにJavaの実行環境という発動装置があれば、同じ型を使って技を出せます。

これはJavaの大きな強みです。

開発する場所と実行する場所が違っていても、クラスファイルを中心にしてプログラムを動かしやすくなります。

図:Javaが異なるOSでも動く全体像

この図が示していること

この図では、Sample1.java をコンパイルして作成された Sample1.class が、Windows、UNIX、macOSで利用しやすい流れを表しています。

Javaでは、OSごとに別々の完成品を作るのではなく、まず共通のクラスファイルを作ります。

そして、各OSにはそれぞれのJava実行環境があり、そのJava実行環境が同じ Sample1.class を読み取って実行します。

このしくみが、Javaが異なるOSでも動きやすい理由です。

なぜJavaはどのOSでも動きやすいのか

Javaが異なるOSでも動きやすい理由は、コンパイルの結果として作られるものにあります。

Javaでは、ソースファイルをコンパイルすると、Windows専用の実行ファイルやUNIX専用の実行ファイルが直接作られるわけではありません。

作られるのは クラスファイル です。

このクラスファイルの中には、バイトコード と呼ばれる特別な形式のコードが入っています。

用語意味
ソースファイル人が書いたJavaコード
コンパイルソースファイルを変換する作業
クラスファイルコンパイル後に作られるファイル
バイトコードクラスファイルの中に入っている共通形式のコード
Java実行環境バイトコードを読み取って実行する仕組み

バイトコードは、特定のOS専用の完成品ではありません。

そのため、各OSに用意されたJava実行環境がバイトコードを読み取ることで、異なるOSでも同じクラスファイルを実行しやすくなります。

Javaの流れを整理すると、次のようになります。

段階内容
1Javaのソースファイルを書く
2javacでコンパイルする
3クラスファイルが作成される
4各OS上のjavaがクラスファイルを実行する

このしくみを見ると、JavaはOSごとに別々の完成品を作るのではなく、まず共通のクラスファイルを作り、それを各OSのJava実行環境で動かす仕組みだと分かります。

ドラゴンボール風にたとえるなら、Javaのバイトコードは、どの道場でも解釈できる共通の技の書式です。

道場ごとに床の材質や広さは違っても、その道場に合った師範が型を読み取り、技として発動させるようなイメージです。

クラスファイルの役割

Javaを理解するうえで、クラスファイルはとても大切です。

クラスファイルは、ソースファイルをコンパイルした結果として作られるファイルです。拡張子は .class です。

この記事では、具体的な例示プログラムとして Sample1.java のみを使います。

ファイル名:Sample1.java

class Sample1
{
    public static void main(String[] args)
    {
        // 最初の修行メッセージを表示する
        System.out.println("Java修行の第一歩です。");
    }
}

このファイルをコンパイルすると、Sample1.class が作成されます。

javac Sample1.java
ファイル役割
Sample1.java人が書いた元のJavaコード
Sample1.classコンパイル後に作られるバイトコード入りのファイル

Sample1.java は、人が読んだり編集したりするためのファイルです。

一方、Sample1.class は、Javaの実行環境が読み取って実行するためのファイルです。

ドラゴンボール風にたとえるなら、Sample1.java は技の型を書いた巻物です。

そして Sample1.class は、修行によって実戦で使える形になった技です。

Javaのファイルドラゴンボール風のイメージ
Sample1.java技の型を書いた巻物
javac Sample1.java型を鍛える修行
Sample1.class実戦で使える形になった技

この Sample1.class があることで、WindowsでもUNIXでもmacOSでも、Java実行環境が整っていれば同じプログラムを実行しやすくなります。

ほかの言語ではどうなるのか

Javaの特徴を理解するには、ほかの多くのプログラミング言語と比べると分かりやすくなります。

多くの言語では、コンパイルすると、そのOS向けの実行可能なプログラムが作られます。

Windows向けに作った実行ファイルは、そのままUNIXで動かせないことがよくあります。反対に、UNIX向けに作った実行ファイルも、そのままWindowsで使えないことがあります。

つまり、OSごとに別々の実行ファイルを作り直す必要がある場合が多いのです。

項目Javaほかの多くの言語
コンパイル後にできるものクラスファイルOSごとの実行可能プログラム
WindowsとUNIXでの扱い同じクラスファイルを使いやすいOSごとに作り直すことが多い
実行の土台各OSのJava実行環境OSごとの実行形式
移植しやすさ高い環境依存になりやすい

ドラゴンボール風に言えば、ほかの多くの言語では、Windows道場用の技、UNIX道場用の技、macOS道場用の技をそれぞれ作るイメージです。

一方、Javaでは、共通の技であるクラスファイルを作り、それぞれの道場にあるJava実行環境がその技を発動します。

この違いが、Javaの大きな強みです。

図:Javaとほかの言語の違い

この図が示していること

この図では、Javaとほかの多くの言語の違いを整理しています。

Javaでは、Sample1.class という共通のクラスファイルを作り、各OSのJava実行環境がそれを読み取って実行します。

一方、ほかの多くの言語では、OSごとに別々の実行可能プログラムを作り直す必要がある場合があります。

この違いを見ると、Javaが異なるOSでも動かしやすい理由が分かりやすくなります。

Javaが強い理由

現在では、さまざまな環境のコンピュータがネットワークでつながって使われています。

開発者のパソコンはWindowsかもしれません。

実際に動かすサーバーはUNIX系かもしれません。

チームのメンバーごとに使っているOSが違うこともあります。

このような場面で、Javaの同じクラスファイルをさまざまな環境で使いやすい性質は、とても大きなメリットになります。

場面Javaのよさ
開発環境と実行環境のOSが違う同じクラスファイルを使いやすい
複数のOSが混在するチーム開発環境差の影響を減らしやすい
サーバー環境がUNIX系Windowsで学習・開発した内容をつなげやすい
ネットワーク上でさまざまな機器を使う共通の考え方で動かしやすい

Javaは、単にプログラムを書ける言語というだけではありません。

いろいろな環境で使いやすいように考えられた言語です。

ドラゴンボール風にたとえるなら、Javaは地域ごとに違う戦場でも同じ型を活かしやすい流派です。

それぞれの場所に合ったJava実行環境があれば、同じクラスファイルを使って技を放つことができます。

Javaの実行環境が大切になる

ここで大切なのは、クラスファイルさえあれば何もいらない、という意味ではないことです。

Javaプログラムを各OSで動かすには、そのOS上で動くJava実行環境が必要です。

つまり、次のような関係になります。

OS必要なもの
WindowsWindows上で動くJava実行環境
UNIXUNIX上で動くJava実行環境
macOSmacOS上で動くJava実行環境

クラスファイルは共通で使いやすいですが、それを実行するための土台は各OSに必要です。

必要なもの役割
クラスファイル実行したいプログラム本体
各OSのJava実行環境そのOS上でクラスファイルを動かす仕組み

ドラゴンボール風にたとえるなら、クラスファイルは共通の技です。

しかし、その技を発動するには、それぞれの道場に合った舞台装置が必要です。

Windows道場にはWindows用のJava実行環境。

UNIX道場にはUNIX用のJava実行環境。

macOS道場にはmacOS用のJava実行環境。

このように、実行するための土台はOSごとに用意します。

けれども、動かす対象であるクラスファイルは共通で使いやすい。

これがJavaの大きな特徴です。

Javaの学習でこの特徴を知っておく意味

Javaを学び始めたばかりのころは、コードの入力、コンパイル、実行に意識が向きやすいです。

もちろん、それはとても大切です。

ただし、Javaがなぜ広く使われてきたのかを理解するには、もう一歩進んで、クラスファイルの役割を知ることも大切です。

Javaが支持されてきた理由のひとつは、作成したクラスファイルを異なるOSでも活用しやすい点です。

この特徴を知っておくと、これまで学んできた次の流れが、単なる手順ではなく、Javaの大きな設計思想につながっていることが見えてきます。

学習した流れ意味
ソースファイルを書く人が分かる形で処理を書く
コンパイルする共通のクラスファイルへ変換する
クラスファイルができる異なるOSでも使いやすい実行用の形になる
javaで実行する各OSのJava実行環境が読み取って動かす

ドラゴンボール風に言えば、Java学習で身につけているのは、ただ1つの道場で使う技ではありません。

いろいろな道場で使える共通の型を作る考え方です。

この視点を持つと、javacでコンパイルする意味や、Sample1.classが作られる意味がさらに深く理解できます。

Javaのクラスファイルは橋渡し役

Javaでは、ソースファイルをそのまま各OS向けの実行ファイルに変換するのではありません。

まず、共通のクラスファイルを作ります。

このクラスファイルが、書いたJavaコードと、さまざまなOSとの間をつなぐ橋渡し役になります。

役割内容
Javaコードを書く人Java言語で処理を書く
javacソースファイルをクラスファイルへ変換する
クラスファイルOSの違いを越えて使いやすい共通の形
各OSのJava実行環境クラスファイルを読み取って実行する

ドラゴンボール風にたとえるなら、クラスファイルは各地の道場へ渡せる共通の奥義書です。

その奥義書を、Windows道場の師範、UNIX道場の師範、macOS道場の師範が、それぞれの環境に合わせて発動してくれます。

この役割分担があるからこそ、Javaは異なるOSでも動かしやすい言語として強みを持っています。

図:クラスファイルの橋渡し役

この図が示していること

この図では、Sample1.class がJavaコードを書く人と複数のOSをつなぐ橋渡し役になっていることを表しています。

Javaでは、Sample1.java を直接OSごとの実行形式にするのではなく、まず共通の Sample1.class を作ります。

また、Windows、UNIX、macOSにはそれぞれのJava実行環境があり、その実行環境が同じクラスファイルを読み取って動かします。

Javaの強みは、クラスファイルとJava実行環境の役割分担にあります。

JavaでOSの違いを意識するときの注意点

Javaは異なるOSでも動かしやすい言語ですが、どんな場合でも完全に何も考えなくてよい、という意味ではありません。

Java実行環境が必要であることに加えて、プログラムの内容によってはOSごとの違いを意識する場面もあります。

たとえば、ファイルパスの書き方や文字コード、改行コード、外部コマンドの利用などは、環境によって違いが出ることがあります。

注意したい点内容
Java実行環境各OSに必要
ファイルパスWindowsとUNIXで区切り文字などが違うことがある
文字コード環境によって扱いに注意が必要な場合がある
外部コマンドOSごとに使える命令が違う
GUIや周辺機器環境依存の設定が必要になることがある

ただし、Javaの基本的な考え方として、共通のクラスファイルを各OSのJava実行環境が動かす、という仕組みは非常に強力です。

学習の初期段階では、まず次の理解を大切にしましょう。

押さえたいこと内容
Javaはソースファイルを直接動かすのではないコンパイルしてクラスファイルを作る
クラスファイルにはバイトコードが入っている共通形式として扱いやすい
各OSにはJava実行環境が必要OSごとのjavaがクラスファイルを実行する
同じクラスファイルを使いやすいJavaの大きな特徴

ドラゴンボール風に言えば、共通の型はどの道場でも使いやすいですが、道場ごとの床の広さや道具の置き方には少し注意する、というイメージです。

Javaの流れをもう一度つなげて見る

ここまで学んできたJavaの基本の流れは、次の通りです。

Sample1.java を作る
    ↓
javac Sample1.java でコンパイルする
    ↓
Sample1.class が作られる
    ↓
各OSの java で実行する

この流れを、WindowsとUNIXの両方で考えると、Javaの特徴が見えやすくなります。

段階WindowsUNIX
ソースファイルSample1.javaSample1.java
コンパイル後Sample1.classSample1.class
実行環境Windows上のjavaUNIX上のjava
実行命令java Sample1java Sample1

同じ Sample1.class を、各OSのJava実行環境が読み取って実行します。

このとき、開発者がOSごとにまったく別の完成品を作る必要が少なくなります。

これがJavaの魅力です。

Javaを学ぶうえで大切にしたい視点

Javaを学ぶときは、ただコードが動いたかどうかだけでなく、なぜそのコードがさまざまな環境で動かしやすいのかまで意識すると、理解が一段深くなります。

Sample1.java を書く。

javac Sample1.java でコンパイルする。

Sample1.class ができる。

java Sample1 で実行する。

この一連の流れは、単に学習用の手順ではありません。

Javaが異なるOSでも動かしやすい理由につながる大切な仕組みです。

ドラゴンボール風に言えば、Javaの学習は、ひとつの道場だけで使える技を覚えるのではなく、さまざまな戦場で通用する型を身につける修行です。

クラスファイルは、JavaコードとさまざまなOSをつなぐ橋渡し役です。

そして、各OSのJava実行環境が、そのクラスファイルを読み取り、実際にプログラムを動かします。

この仕組みを知っておくと、Javaの強みがよく見えてきます。

ソースファイル、コンパイル、クラスファイル、実行という基本の流れが、Javaの大きな魅力である「異なるOSでも動かしやすい」という特徴につながっているのです。