【Java】ソースコードから実行するまでの流れ

# ソースコードから実行されるまでの流れ

1. ソースコードの作成
2. コンパイル
3. 実行

簡単に言うとこんな手順です:smile:
初心者の私には簡単に言われてもさっぱりでした:thinking: 
コンパイルとはなんぞや・・・？？？という感じです:sweat_smile: 

少しずつどんなものかを説明したいと思います:smile:
おそらくこのような感じではないかと思うのですが
認識違い等あればご指摘ください:smile:

## 1. ソースコードの作成 → ２. コンパイル
ソースコードはおわかりの方が多いのではないでしょうか？
私達が作成する下記のようなプログラムのことです:smile:

```例.java
public class Main {
	public static void main(String[] args) {
		System.out.println("hello, world!");
	}
}
```

さて、このプログラム。
せっかく私達が端正こめてコード作成しても、残念ながらパソコンくんはこのままでは理解ができません:rolling_eyes:

日本語のわからない海外の人に日本語で話しても海外の人は理解できませんよね:sweat_smile: 

![english_kaiwa_bad_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/598bb3cf-e815-0bcb-9b73-0d6a58e5eb9b.png)

ではどうすればいいのかというと・・・擬人化すればイメージがつかみやすいかと思います:smile:

お互いの言葉がわかるひとにあいだに入ってもらって通訳してもらえばいいですよね:laughing: 

その通訳に相当するのがコンパイルです:laughing: 

* interprit:（会話の場で）通訳する（動詞）
* interpriter: 通訳者（名詞）
* compile:（事前に）翻訳する（動詞） 
* compiler: 翻訳者（名詞）

![おじさんわらう.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/86893798-ae96-4975-8653-50df261c4bba.png)

このコンパイルは**人が書いたソースコードを機械の言葉に翻訳してくれる**という特徴を持っています。

:bulb:**コンパイル特徴**:bulb: 
:sunny: ソースファイルをクラスファイルに変換する
:sunny: 変換したクラスファイルにはバイトコードと呼ばれるものが入っている。
:sunny: コンパイルはコンパイラというソフトを使って上記作業をする。
:sunny: コンパイラはソースコードの文法チェックもする

ソースファイルをクラスファイルに変換するというのは、
ファイル名.java　→　ファイル名.class
に拡張子を変換するということです。

拡張子というのは
メモなら .txt
Wordなら .docx
Excelなら .xlsx
PDFなら .pdf
など、ファイル名のあとに記載されているヤツです。

話を戻しますね:smile:

そしてクラスファイルに変換したもののなかにバイトコードと呼ばれるものが入っているのですが、この**バイトコードというのは ０ と １ が複雑にならんだもの**です。
つまり私達がつくったソースコードが０と１で形成されたものに変換されてしまうのです。

|ファイル名    |ソースファイル|クラスファイル|
|-----------|--------|----|
|ファイルの中身|ソースコード|バイトコード|

ソースファイルをクラスファイルに変更するということはファイルの拡張子を修正すればいいの？:thinking: 

とも思いますが、おそらくエラーになります。

どうするのかというと コンパイラ というソフトを使います。
コンパイル に コンパイラ ・・・ややこしい:sweat_smile: 

さて、このコンパイラ。
私達が作成したソースコードの文法チェックもしてくれます。

ねぇ、英語のつづり間違ってるんじゃない？
ねぇ、カッコがたりないんじゃない？

などチェックしてくれます。
ちなみにこれらを修正するまでコンパイルしてくれません。
ずーっと差し戻されます:sweat_smile: 

## ２. コンパイル → ３. 実行
機械の言葉に翻訳してもらったし、いよいよプログラム実行だー！:fist:
と思ってしまいますが、ちょっと待ったー！:hand_splayed:です。

じつはこのままだとまだ動作しないのです。
機械の言葉に変換したんだから実行できるんじゃないの！？！？と思います。
少なくとも私は思っていました:sweat_smile: 

ソースコードに比べたら実行できる姿ではあるものの実行はできないのです。

またまた擬人化して考えると、さきほど翻訳をしてくれたコンパイルおじちゃん。
翻訳してくれたのはいいけど方言がきつすぎて相手にはイマイチ伝わっていませんでした・・・みたいな感じかな:sweat_smile: 

![おじさんてへぺろ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/4c09ea41-15e4-2711-6bdf-9e43cb1ab17b.png)

そうなるとこのコンパイルおじちゃんの方言を標準語に通訳してくれる人が必要です。
それが・・・

![おんなわらう.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/a88d7d1f-7cf3-e6e8-f32c-88d6b441162e.png)

インタプリタさんです:smile:

:bulb:**インタプリタ特徴**:bulb: 
:sunny: バイトコードの変換と実行を依頼
:sunny: JVM というしくみをもつ

コンパイルおじちゃんが翻訳してくれたバイトコードをインタプリタさんがマシンコードと呼ばれる機械語に変換します。

この翻訳したマシンコードをＣＰＵに送って処理を実行してもらいます。
（CPUとはパソコンの脳みそ部分でマシンコードを理解して命令を実行したり計算したりする働きをもちます）

**JVM というのはバイトコードを少しずつ読み込みながらCPUに命令を実行してもらいます。**

たとえば

```例.
ここはどこですか？
駅にはどのようにいけばいいですか？
駅までどのくらい時間がかかりますか？
```

という質問を投げかけたとします。
すると・・・

ここはどこですか？
↓
翻訳
↓
ニューヨークです

駅にはどのようにいけばいいですか？
↓
翻訳
↓
次の角を左にまがって、そのまま真っすぐです

駅までどのくらい時間がかかりますか？
↓
翻訳
↓
１０分くらいです。

イメージとしては同時通訳に近い感じですかね？？
相手の話を全部聞いてから翻訳するのではなく、
話を聞きつつ通訳していくような。

このような流れでJavaのプログラムは実行されていきます:smile:

ちなみにこのインタプリタさんもコンパイラと一緒でソフトウェアの１つです。
なのでコンパイラとインタプリタをインストールしないと Java は使えないということです。

＊補足＊
1クラス完結のファイルに限り、Java１１からコンパイルなしで実行できるようです:smile:
コメントくださりありがとうございます！！