プログラムが「動く」とはどういうことか
コンピューターは、人間の言葉はもちろん、Javaのような「人間寄りの言語」もそのままでは理解できません。コンピューターが直接理解できるのは、0と1の並びで表される機械語だけです。
そこで、人が書いたプログラムを機械語に「翻訳」する工程が必要になります。この翻訳のやり方が言語によって異なり、Javaの大きな特徴はまさにこの翻訳の仕組みにあります。
Javaプログラムが動くまでの3ステップ
Hello.javaHello.classその場で変換して動かす
① ソースコード:人が書いた設計図
エンジニアがテキストエディタやIDE(開発ツール)で書く、人間が読めるプログラムの文章です。ファイル名の末尾は .java になります。第3章以降で実際に読んでいくのは、このソースコードです。
② コンパイル:中間言語への翻訳
コンパイルとは、ソースコードを機械寄りの形に翻訳する作業で、これを行うソフトをコンパイラと呼びます。Javaのコンパイラ(javac という名前です)は、ソースコードをバイトコードという形式に変換し、.class という末尾のファイルを作ります。
このときコンパイラは、文法の間違いや「存在しない部品を呼んでいる」といったミスを見つけてエラーを出します。つまりコンパイルは翻訳であると同時に、最初の検査でもあります。「コンパイルエラーが出ている」とエンジニアが言ったら、「書き方に不備があって翻訳が通らない状態」という意味です。
③ JVM:どこでも動かす通訳役
JVM(Java Virtual Machine、Java仮想マシン)は、バイトコードを受け取って実際に動かすソフトウェアです。Windows用のJVM、Mac用のJVM、Linux用のJVMがそれぞれ用意されていて、どのJVMも同じバイトコードを受け付けます。
だから、エンジニアがMacで作ったプログラムを、そのままLinuxのサーバーに置いて動かせるのです。これがJavaの有名なキャッチフレーズ「Write once, run anywhere(一度書けば、どこでも動く)」の正体です。
.class ファイル)「仮想マシン」という言葉について
JVMの「仮想マシン」は、「ソフトウェアで作られた、架空のコンピューター」という意味です。バイトコードは、この架空のコンピューター向けに書かれています。実在のコンピューターの違いは、この架空コンピューターの中で吸収されます。クラウドの「仮想サーバー」とは別の話なので、混同しないようにしましょう。
JDK・JRE・JVM:似た言葉の整理
Javaの話題では、JVMのほかに「JDK」「JRE」という言葉も出てきます。入れ子の関係になっていると考えると整理しやすいです。
「標準ライブラリ」という大きな財産
JDKには、JVMのほかに標準ライブラリと呼ばれる部品集が最初から入っています。ライブラリとは「よく使う機能をあらかじめ作っておいたもの」で、たとえば次のようなものです。
- 文字列の加工(大文字にする、区切る、置き換える)
- 日付と時刻の計算(月末を求める、営業日を数える)
- ファイルの読み書き、ネットワーク通信
- 並べ替え、集計、重複の除去などのデータ操作
- 精密な金額計算(
BigDecimal、第4章で登場)
第3章で見る System.out.println(画面に文字を出す命令)も、この標準ライブラリの一部です。エンジニアはこれらを組み合わせて業務の処理を組み立てます。
速いのか、遅いのか
「通訳が間にいるなら遅いのでは?」と思うかもしれません。たしかにJavaが登場した1990年代はそう言われていました。しかし現在のJVMにはJITコンパイラ(Just-In-Time、実行時コンパイラ)という仕組みがあり、何度も実行される部分を見つけてはその場で機械語に変換し、覚えておきます。その結果、長時間動き続けるサーバーのプログラムでは、他の言語と比べても遜色のない速度が出ます。
一方で、起動した直後はまだ「学習」が済んでいないため、立ち上がりに少し時間がかかります。「Javaのアプリは起動が遅い」と言われるのはこのためで、長く動かすサーバー用途では問題になりにくく、頻繁に起動・終了する用途では気になる、という性質があります。
メモリとガベージコレクション
JVMには、使い終わったメモリを自動で片付けるガベージコレクション(GC)という仕組みがあります。他のいくつかの言語ではプログラマーが手作業でメモリを片付ける必要があり、それを忘れるとメモリ不足で停止する事故が起きがちでした。Javaではこれが自動化されているため、業務システムの安定性に貢献しています。運用の場で「GCで一瞬止まる」「ヒープ(メモリ領域)を増やす」といった言葉が出てきたら、この仕組みの話です。
この章のまとめ
- Javaのプログラムは「ソースコード → コンパイル(バイトコードに翻訳) → JVMが実行」の3ステップで動く
- バイトコードはOSに依存せず、OSごとのJVMが通訳するので「一度書けば、どこでも動く」
- JDK(開発一式)⊃ JRE(実行環境)⊃ JVM(実行エンジン)。「Javaを入れる」はふつうJDKを入れること
- 標準ライブラリ、JITコンパイラ、ガベージコレクションが、Javaの生産性・速度・安定性を支えている
確認クイズ
この章の内容を3問で確かめましょう。選ぶとすぐに解説が表示されます。
Q1. Javaのプログラムが「一度書けば、どこでも動く」と言われる直接の理由はどれですか?
Q2. エンジニアが「コンパイルエラーが出ています」と言いました。どういう状態ですか?
Q3. JDK・JRE・JVMの関係として正しいものはどれですか?