[Dev101]#2 Hello World! 

# AGENDA
0. はじめに
1. git clone
2. いろいろな言語
3. C
4. C++
5. Java
6. Python
7. おまけ



# 0. はじめに
本記事は「プログラム開発ってじぇんじぇんイメージ沸かないよぉ～」って方向けの第一歩ハンズオンです。
これやったからって開発出来るようにはなりませんが、プログラム言語とかプログラム開発ってものに親近感持てるようになると良いなーと思っています。

なお、今回使用するソースコードは以下にあります。
Githubとかgitの説明は今後ぼちぼちやって行きますので、今回は「便利なソースコード入手コマンド」って感じで操作してください:sweat:

[Dev101-02-HelloWorld](http://github.com/Nagahisa/Dev101-02-HelloWorld)
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/b706abbe-00a5-c011-cf6c-fd30478c9585.png)


# 1. git clone
##(1)Play with Docker起動
まずは前回記事を参考にPlay with Docker環境を立ち上げましょう。
[[Dev101]#1 Play with Docker](https://qiita.com/nagahisa/items/d3e75c79ec5f19eba155)

[起動はこちらから](https://labs.play-with-docker.com)


##(2)git clone

以下のコマンドを入れて今回資料をgit cloneしてください

```shell:コマンド入力
git clone http://github.com/Nagahisa/Dev101-02-HelloWorld.git
cd Dev101-02-HelloWorld
tree .
```
![002.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/21d1efb7-08d1-32f1-d612-623865c2aa89.png)

ブラウザのGitHubサイトで見えているコンテンツをローカルにコピー(clone)出来ました。

# 2. いろいろな言語

**そのうちコンパイル言語とか中間言語の説明を書く予定**
時間がないので参考リンクでご勘弁を:sweat:

[Wiki:コンパイラ](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9, target="_blank")
[Wiki:バイトコード](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89, target="_blank")
[Wiki:スクリプト言語](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E8%A8%80%E8%AA%9E, target="_blank")


# 3. C

C言語はUNIXの歴史に深い関係がある言語です。
[Wiki:C言語](https://ja.wikipedia.org/wiki/C%E8%A8%80%E8%AA%9E, target="_blank")
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/a36cdffd-00ae-656a-be02-fe8923ca3d64.png)

ソースコードを見てみましょう。

```shell:コマンド入力
cat src/helloworld.c
```
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/e36777f5-e795-fcd1-25ea-4fa40bc3d06a.png)

もちろんブラウザでも見れます。
[helloworld.c](https://github.com/Nagahisa/Dev101-02-HelloWorld/blob/master/src/helloworld.c)

このソースコードをコンパイルして実行ファイルを作成し実行してみましょう。

```shell:コマンド入力
ls -l
cc -o hello-c src/helloworld.c
ls -l
file hello-c
./hello-c
```
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/20e40a33-96c1-0122-1947-cb1992ab5bd7.png)

コンパイラ(cc)の-oオプションで作成するファイル名 hello-c を指定していますが、-oオプションを指定しないとa.outというファイルが出来ます（試してみて下さい）。

# 4. C++

C++言語はC言語をオブジェクト指向開発用に拡張した言語です。
[Wiki:C++言語](https://ja.wikipedia.org/wiki/C%2B%2B, target="_blank")
![007.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/e7773ef6-eb9a-101d-8d3f-48121db6a30c.png)

C言語の上位互換なので先ほどのC言語プログラムもC++でコンパイルできます。
C++のソースコードを見てみましょう。

```shell:コマンド入力
cat src/helloworld.cpp
```
![008.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/1f4818ba-1053-63db-40ea-5e9127bc885e.png)

[helloworld.cpp](https://github.com/Nagahisa/Dev101-02-HelloWorld/blob/master/src/helloworld.cpp)

このソースコードをコンパイルして実行ファイルを作成し実行してみましょう。

```shell:コマンド入力
ls -l
c++ -o hello-cpp src/helloworld.cpp
ls -l
./hello-cpp
```
![009.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/b158b8ae-683d-51ee-268c-deddb19c4fdc.png)


# 5. Java

JavaはC/C++言語をベースにして、従来のソフトウェアが抱えていた移植性問題の解決をを目指して開発された言語です。
”write once, run anywhere”（一度書けばどこでも動く）というのがキャッチコピーでした。
[Wiki:Java](https://ja.wikipedia.org/wiki/Java, target="_blank")
![010.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/29e5379c-0d81-638a-1d08-aeb16740ec32.png)

"従来のソフトウェアが抱えていた移植性問題"ってのは、C/C++言語で書かれた実行モジュールは、特定のプラットフォームでしか動かないって問題です。
先ほどの "file hello-c"の表示を思い出してみましょう。
![011.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/41290fd0-45ff-4e81-b0b2-5a2328b0c033.png)

この実行モジュールは64ビットのx86環境でしか動きません（もっと他にも条件がありますが）。つまりこの実行モジュールをRaspberry PiのようなARM環境に持って行っても動かない訳です。
この問題を解決するためにJavaはJava仮想マシン(Java VM=JVN)というものを導入しました。
> Javaプログラムは特殊なバイトコードにコンパイルされて、これがJava仮想マシンと呼ばれるソフトウェア上で実行される。各プラットフォームに対応したJava仮想マシンがハードウェア間の差異を吸収し、環境に依存しないプログラム動作を実現する仕組みとなっている。"

早速 Java VMなど見てみましょう・・・と言いたいところですが、実はPlay-with-Docker環境にはJavaが入っていません :frowning2:
Javaをインストールすることも出来ますが、せっかくのDocker環境なので、Javaコンテナを使ってみましょう。

https://hub.docker.com/_/java

DockerイメージをPULLして

```shell:コマンド入力
docker pull java
```
![012.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/5402e607-588a-24a6-f089-4130b8ca4173.png)

コンテナのbashを対話起動

```shell:コマンド入力
docker run -v /root:/root -it java bash
cd /root
cd Dev101-02-HelloWorld/src
```
![013.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/126d23e2-128e-8174-89c9-2e76accd6a0a.png)

ソースコードはこんな感じです。
![014.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/12e58760-1bca-f279-9a4c-d5239eec2cb0.png)

[HelloWorld.java](https://github.com/Nagahisa/Dev101-02-HelloWorld/blob/master/src/HelloWorld.java)

バイトコード(classファイル)にコンパイルしてみます。

```shell:コマンド入力
ls -l
javac HelloWorld.java
ls -l
```
![015.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/12e3f287-f09a-068e-9009-f563f8f94b6d.png)

HelloWorld.classというバイトコードが出来ていますので、これをJava VMで実行します。

```shell:コマンド入力
java HelloWorld
```
![016.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/b85fa491-0445-87b4-1c1f-21e8bee30c86.png)

このバイトコード(HelloWorld.class)はMacやWindowsマシンでもJava VM上で動作します。

Java言語のために導入されたJVMですが、JVMで動作する別言語もたくさん出ています。
Ruby互換のJRubyやHadoop SPARKで使われるscalaなどが有名です。


# 6. Python
Pythonはスクリプト言語の一種で、言語仕様としてインデントを必須としているので、キレイなコードが書きやすいなどの特徴があります。Pythonにimport出来る科学計算系のモジュールが多数出ており、最近は機械学習用のグルー言語として人気があります。
[Wiki:Python](https://ja.wikipedia.org/wiki/Python, target="_blank")

![018.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/b4bf7e8f-67ef-2ea7-7a39-898ac28a7a44.png)

Pythonには2系と3系があって互換性がないので注意が必要です。

こちらはgit上にはソースコードを載せていませんので、以下のような helloworld.pyファイルを作成してみましょう。

```shell:コマンド入力
cat << EOF > helloworld.py
test="Hello Python World!"
print(test)
EOF
```
![019.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/23b5773a-3938-baae-9500-aa099107c46b.png)

このファイルをpythonコマンドの引き数に指定して実行します。
![020.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/34dede4f-f1fa-0e27-09c7-e5d431825329.png)

pythonコマンドにはREPL(対話型)機能があるので、そちらでも試せます。
![021.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/9055825c-355d-a982-1bf2-3bbd8f83ecf4.png)


# 7. おまけ
すこし新し目の言語も試してみましょう。個人的な趣味でGo言語を取り上げます。

Go言語はGoogleによって開発されたコンパイル言語です。
最近のマイクロサービス化の流れの中でAPIバックエンド開発などに使われ始めています(ex.マメルカリ)。
[Wiki:Go(プログラミング言語)](https://ja.wikipedia.org/wiki/Go_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E), target="_blank")
![017.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/b02e3d2d-5995-cc91-80f5-5f3141d96321.png)

```shell:コマンド入力
docker pull golang
docker run -v /root:/root -it golang bash
cd /root/Dev101-02-HelloWorld/src
```
![022.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/5570830d-77d7-c338-ca55-6ed24d68a088.png)

[helloworld.go](https://github.com/Nagahisa/Dev101-02-HelloWorld/blob/master/src/helloworld.go)

goコマンドには内部でコンパイルして実行してくれるrunと、実行モジュールを作成するbuildがあるので両方試してみます。
![023.PNG](http://qiita-image-store.s3.amazonaws.com/0/79389/e451a341-d070-55ad-836d-6f718b03bb28.png)

昔はCコンパイラ(GNU C)を導入するのに、ソースの展開・OS付属Cコンパイラでのビルド・ビルドで出来たGNU Cでの再ビルドなどで丸一日かかっていましたが、そのうちLinuxの yum/aptコマンドで簡単にバイナリ導入ができるようになりました。今ではDockerでサクッと各種言語が試せます。なんて素敵な時代なんだ！

色んな言葉で「こんにちは」を言うように、いろんな言語で「Hello World!」やってみるのも楽しいですよ。

Enjoy:bouquet: