JShell でプログラミングへの第一歩を始めよう！（JShell, REPL）

[（この記事は連載の一部です）](https://qiita.com/HrkPPOI/items/98707436c5bfea3c74e2)

この項目では、何がなんだか分からなりに、ひとまず **Java プログラムを実行** してみます。

これから私たちは Java プログラムを書いては動かし、書いては動かしして学んでいきます。
ゆくゆくは何千行何万行という巨大なプログラムを書くことになり、そのころには「プログラムとはこういうもの」というおおよそのイメージが付いているでしょう。

しかし学び始めたいまの時点では、「そもそもプログラムを動かすってなんやねん」という状態かと思います。そこでまずは、いくつか例を挙げながら「プログラムを動かすってなんやねん」に答えたいと思います。そして、もっとも簡単な方法として **JShell** でのプログラム実行をやってみます。

# はじめに

- 必要な前提知識
  - キーボード入力
  - ブラウザ操作
- これを読んで分かること
  - プログラムとは何か？
  - コンピュータ・プログラムとは何か？
  - Java とは何か？
  - Java プログラムはどのように動くのか？
  - REPL とは何か？
  - JShell とは何か？

# 体験編👋

まずは JShell で Java プログラミングへの第一歩を始めて見ましょう！

## 1. JShell にアクセス

https://tryjshell.org にアクセスして、適当な数値を入力してみましょう。

![num_input.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356995/ce65fcec-26b5-6db8-5c3f-8ba60f1e4cfa.gif)

## 2. 文字の入力

数値だけでなく文字も入力してみましょう。 `Error` は気にしなくて OK です。 `'a'` や `"abc"` なども試します。

![string_input.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356995/b44e6225-9556-128c-921c-99c33d45ca3e.gif)

## 3. JShell の終了

`/exit` と入力すると JShell が終了します。画面に `Goodbye` が表示されたら、ブラウザを閉じましょう。


![exit.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356995/9cf1d6d5-b9d7-e6c7-0426-593292051c16.gif)


# 理解編👌

ハンズオンではひとまず JShell で Java プログラムを実行してみました。でも、**JShell で Java プログラムを実行する** とはどういうことでしょうか。その疑問に答えるために、いくつか用語を理解していきましょう。

## 1. プログラム／コンピュータ・プログラム／ Java プログラム

![jshell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356995/f476362e-8568-2235-f169-eecbd10f3f56.png)

**プログラム** とは、一般的な用語で **やることが順番に並べてあるもの** です。コンピュータプログラム以外にも、例えば運動会のプログラムやコンサートのプログラムをイメージしてください。まずこれをして、次にあれをして……というのが書かれていますよね。

**コンピュータ・プログラム** とは、そこから一歩進んで **コンピュータにさせることを順番に並べたもの** です。そして **Java プログラム** とは **Java言語 で書かれたコンピュータ・プログラム** です。ここは、今後例がいくらでも出てきますから、「ふーん」という程度で OK です。

## 2. Java プログラムが動くまで

人間に何かを頼む場合、「やっといて」と言えばいい感じにやっておいてくれます。しかし、プログラミングの場合はそうはいきません。人間とコンピュータはなかなか分かり合えない存在なのです。では、人間とコンピュータが分かり合い、人間がやってほしいことをコンピュータにやってもらうためには、どんな手順が必要でしょうか。

### 2-1. ソースコード・実行コード・プロセス

![jshell-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356995/99fa33f8-febd-20a4-6bd6-953f72b1608f.png)


私たち人間が書くプログラムを **ソースコード** といいます。Java 言語では、ソースコードは `.java` という拡張子を持ちます。ソースコードは人間に読みやすい反面、コンピュータが直接読んで実行できません。


コンピュータがソースコードを読んで実行するためには、ソースコードをコンピュータの読めるコードに変換します。この変換のことを **コンパイル（compile）** といいます。また、コンパイルを行うアプリケーションのことを **コンパイラ（compiler）** といいます。コンパイルする人（er）というわけです。コンピュータが直接読み取ることのできるコードを **実行コード** といいます。

実行コードを読み込んで、コンピュータは人間のやって欲しい処理を実行することができます。たくさんの命令の書かれたファイルとしてのプログラムと対比して、いままさに実行しているプログラムのことを **プロセス** といいます。

### 2-2. 中間コード

![jshell-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356995/bb0f29fd-e9f7-f5bd-ad00-d469983cdd7c.png)


Java言語では、ソースコードをコンパイルすると、実行コードではなく **中間コード** が生成されます。なぜ **中間** なのかというと、実行時に更に変換されるためです。ソースコードと実行コードの中間なので、中間コードです。

Java プログラムは実行時、 **Java 実行環境（JRE: Java Runtime Environment）** によって解釈され、実行されます。 JRE が中間コードを読み取り、実行する環境ごとに命令を解釈して実行します。そのため、中間コードはひとつであっても、異なる実行環境でプロセスを起動できます。言い換えると、一度コンパイルしたコードは、異なる実行環境であっても（理論的には）そのまま動作します。この性質を指して、Java が出た当時はよく **Write Once, Run Anywhere（一度書いたコードが、あらゆる場所で実行できる）** と言われていました。

## 3. プログラムの実行方法

Java プログラムの実行方法にはいくつかあります。以下はその代表的な例です：

![jshell-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356995/9e35e177-8a37-a5b7-8800-40320c08004e.png)


まずはより一般的な **ソースコードをコンパイルしてから実行** を例に、プログラム実行の流れを確認しましょう。その後に、 **JShell を使った対話的な実行** についても説明します。

### 3-1. コンパイルしてから実行

コンパイルされたコードは、いくつかの方法で実行できます。以下は代表的な例です：

1. 実行可能ファイルをダブルクリックして実行する
1. サーバー上にプログラムを配置して実行し、Web ブラウザごしに利用する
1. `java` コマンドで実行する
1. 統合開発環境で実行する

これらを順番に見ていきましょう！

#### 3-1-1. ダブルクリックで実行

![jshell-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356995/58877c00-2a4b-87c0-1e4b-02066bb796e7.png)

１つ目が、 **実行可能ファイルをダブルクリックで動かす** 方法です。これはいまのみなさんにとって一番身近だと思います。

Windows でも Mac でも、ファイルをカチカチッとダブルクリックするとアプリが動きますよね。Java でもこれができます。しかし、このためにはいくつかの段階を経る必要があります。

しかしいま私たちがやりたいのは「プログラムを実行して目の前の作業に役立てる」ことではありません。そうではなくて、目的は **作業に役立つプログラムを作るための方法や仕組みを学ぶ** ことです。そうなると、プログラムをカチカチッとダブルクリックして実行できる必要はなく、むしろ変換が一手間です。そこでこの連載では、この方法で実行することはありません。

#### 3-1-2. サーバー上にプログラムを配置して、Web ブラウザごしに動かす

２つ目が、 **サーバー上にプログラムを配置して、Web ブラウザごしに動かす** 方法です。近い未来、みなさんにとって身近になるのがこれです。

多くの研修やスクールではここを目指してカリキュラムが組まれています。Web アプリはある程度の技術を網羅的に使用するため、「ひとまずこれをやっておこう！」の一式に含まれやすいからです。

そうはいっても、それはまだもうちょっと先の話です。この連載で目指すのは「プログラムを活用する」というよりは、原理原則を丁寧に一歩ずつ、かつ最短路で学ぶことです。連載後の次の目標として、この方法を考えると良いでしょう。

#### 3-1-3. java コマンドで実行する

３つ目が、 **java コマンドで実行する** 方法です。

コマンドプロンプト（or ターミナル）で  `java 何何` と実行したいファイルを指定します。これは、多くのスクールや研修、書籍でよく使われている実行方法です。しかし、エラーの発見が何かと難しく、「Java学習」という意味ではやや非効率なため、この連載では扱いません。

#### 3-1-4. 統合開発環境で実行する

４つ目が、 **統合開発環境上で実行する** 方法です。

統合開発環境（IDE Integrated Development Environment）とは、プログラムを開発するうえで必要な機能をひとまとめにしたものです。コンパイルや実行だけでなく、プログラムの誤りを分かりやすく表示したり、プログラムを１行ずつ実行したりできます。

この方法もまた、多くのスクールや研修、書籍でもっとも使われている実行方法です。この連載でも、後半はこの実行方法を用いる予定です。

### 3-2. JShell を使って対話的に実行する

![jshell-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356995/5984d04f-5b86-576a-c3f6-c2bb33945cbb.png)

５つ目が、 **JShell を使用して対話的に実行する** 方法です。

ここまで見てきた４つの方法は、ソースコードをコンパイルして中間コードに変換してから実行するものでした。しかし、この方法ではコンパイルを経ずにソースコードを実行します。この連載で最初に使うのがこの方法です。

「対話的」という言葉に身構えないでください。大丈夫、怖くありません。「対話的」の意味は後ほど詳しくしますが、要するに Java を 電卓のように、結果を目で見て確認しながら使うというものです。この **電卓のように、結果を目で見て確認しながら使う** 方法を、**REPL: Read Eval Print Loop** と言います。

## 4. REPL: Read Eval Print Loop とは

![jshell-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356995/3b466c93-ce5a-6e81-74a3-73bdecc7d408.png)

繰り返しになりますが、 **REPL: Read Eval Print Loop** とは、 **電卓のように、結果を目で見て確認しながらプログラミングをする方法** です。

日本語で補って言うと

1. Read : プログラムを機械が読み込み、
1. Eval : 評価（= 計算）して、
1. Print : 結果を出力する。
1. Loop : 1. ～ 3. の繰り返しによってプログラムを実行する

ということです。

例えば、30 と 50 の平均 を電卓で求める方法を考えてみます。以下のようにするのではないでしょうか。

![jshell-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356995/f2a34dc3-4091-8eae-4fb0-6a3f4fcc206d.png)


Read・Eval・Print が Loop していますね。これが REPL です。

## 5. JShell とは

![スクリーンショット 2020-11-21 185516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356995/afb56786-e314-7ad0-4b60-201517cd54ec.png)


JShell は、Java 言語を使った REPL ツールです。

いまは便利な世の中ですね、Webブラウザから JShell を利用できます。下記リンクから JShell を利用しましょう（ローカルに環境が用意されているかたはもちろんそちらを使ってください。なお、リンク先の安全性は検証していないので、心配なかたはローカルに環境を用意しましょう）。

https://tryjshell.org

JShell 内では Java プログラムが書けるほか、JShell を操作するコマンドも使用できます。取り急ぎ、以下の 2 つを理解しておきましょう：

| コマンド | 説明 |
| ---- | ---- |
| `/exit` | JShell を終了する |
| `/reset` | JShell を初期状態に戻す |

![jshell-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356995/6832ea0d-dd05-4cd4-b03c-2da27ec75cad.png)

自身のローカル環境に Java 環境のあるかたは、コマンドプロンプト（ or ターミナル）上で `jshell` と入力すれば JShell を実行できます。 JShell 実行中に `/exit` と入力すると JShell が終了し、コマンドプロンプトの操作に戻ります。 

![jshell-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356995/6cc1cd6e-e594-5e5d-2ae2-a5d9173f2731.png)

# 次回予告

今回は Java プログラムの門をくぐりました。次回からは JShell を使ったプログラミングの中身に入りたいと思います。プログラミングと言ってもやることは電卓と同じです。気構えずに楽しんで行いましょう！