[Summary] ビルドとコンパイルとメイク

文系の出身でして、、、全く下記のことを理解できていなかったのでこちらの記事を書くことによって自分の理解を整理したいと思いました。
乱文ですが、ぜひお付き合いいただけますと幸甚です。

## コンパイルってよく聞くけど、使ってるけど、あんまりわかりません。
[IT用語辞典参照](http://e-words.jp/w/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB.html)
> コンパイルとは、プログラミング言語で書かれたコンピュータプログラム(ソースコード)を解析し、コンピュータが直接実行可能な形式のプログラム(オブジェクトコード)に変換すること。そのためのソフトウェアをコンパイラ(compiler)という。
...<中略>...
オブジェクトファイルにはオブジェクトコードだけでなく、リンカが実行ファイルやライブラリを作成するときに使用するリロケーション情報、プログラム内のシンボル情報、デバッグ情報などが含まれる。

## object codeって何ですか？
[wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)
> オブジェクトファイル (object file) またはオブジェクトコード (object code) とは、コンパイラがソースコードを処理した結果生成される、コード生成の結果であるバイナリコードを含む中間的なデータ表現のファイルである。

リンカってなんだ。。。 -> 下部の #リンクって何でしょうか？？を参照ください。

## ビルドって何ですか？
from [ビルドとは, wikipedia](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%AB%E3%83%89_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2))
>
ソースコードファイルを独立したソフトウェア生成物に変換するコンピュータ上で実行されるプロセス、またはその結果を指す。ビルドにおいて最も重要なのはコンパイルプロセスであり、ソースコードファイルを実行ファイルに変換する。 
....<中略>....
プログラムはソースファイルをコンパイルし<font color="Red">**リンク**</font>することで、実行ファイルとなる。ソースファイルが1つしかないなら、それらの作業をコマンドラインから実行するのも簡単だが、ソースファイルが多数存在するプロジェクトでは、正しい順序とオプションで手作業するのは至難の業である。

つまり、[@yizumi1012xxx](https://qiita.com/yizumi1012xxx)の言葉を借りると
>*.cpp ファイルなどテキスト形式で書かれたプログラムソースを中間ファイル*.objに変換すること。この時点で概ね機械語に翻訳されている。
と言うことです。

## リンクって何でしょうか？？
先ほどのwikipediaの本文中に出てきた、**リンク**と言う言葉を調べてみました。
[リンケージエディタ](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%B3%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF)wikipedia
>リンケージエディタ（リンカ(linker)、連係編集プログラムとも）とは機械語のプログラムの断片を結合し実行可能なプログラムを作成するプログラムのことである。例として、C言語では、ソースファイルをコンパイルするとオブジェクトファイルが生成される。それに他のオブジェクトファイルやライブラリを結合して1つのプログラムが完成する。この結合（リンク）の際リンケージエディタが使われる。
![Screen Shot 2018-03-31 at 12.03.31.png](https://qiita-image-store.s3.amazonaws.com/0/240801/3b97806d-99dc-1ef4-a8cc-c1b8466a9e03.png)

リンクとは、リンケージエディタの作業中に行う、プログラム間を結合する作業の名称であると言えます。
また、リンクには二種類ありました。

1. 静的リンク(身体の中に武器を埋め込むイメージ)
2. 動的リンク(剣とか盾を装備するイメージ)

ではここからもうちょっと深く突っ込んでみましょう！
そのために以下の二つのサイトを拝見しました。

1. [Hitachi, Ltd.: 静的なリンクと動的なリンク](http://itdoc.hitachi.co.jp/manuals/3000/30003D0800/GD080284.HTM#ID00661)
2. [「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典: 動的リンク](http://wa3.i-3-i.info/word14692.html), [静的リンク](http://wa3.i-3-i.info/word14693.html)

## 静的/動的リンクって？
>
静的リンク（スタティックリンク）：作るときにくっつける
動的リンク（ダイナミックリンク）：動かすときにくっつける
スタティックリンクライブラリ：作るときにくっつける部品ファイル
ダイナミックリンクライブラリ（DLL）：動かすときにくっつける部品ファイル

よって違いは、プログラムを動かす時にくっつけるのか、作る段階でくっつけてしまうのかであると理解しました。

また各々の長所と短所については

**静的なリンクの長所と短所**
静的にリンクすると，主プログラムがメモリにロードされるのと同時に，呼び出し先プログラムもロードされます。そのため，プロセス起動時にはロード時間が掛かりますが，CALL文でほかのプログラムを呼び出すとき，すでにメモリ上にプログラムがロードされているので，高速に呼び出せます。

**静的にリンクした方がよいケース**
同じプログラムを何度も呼び出すようなプログラム構造の場合は，静的にリンクした方がプログラムの実行性能が良くなります。

**動的なリンクの長所と短所**
動的にリンクすると，主プログラムがメモリにロードされても，副プログラムはロードされないため，プロセス起動時のロード時間が静的リンクより高速になります。また，プログラムが消費するメモリ空間が少なくて済みます。しかし，CALL文の実行時に，呼び出し先プログラムのロードと検索処理が実行されるため，CALL文の処理時間は遅くなります。

**動的にリンクした方がよいケース**
処理の流れによって呼ばれないことがある副プログラムがある場合は，動的にリンクした方がプログラムの実行性能が良くなります。

と言う感じになってます！

ただ、開発を進めていく時に、変更をしたコードと、してないコードが混在している状況となるかと思います、そんな中でコンパイルをする時に、全部を毎回コンパイルをしていたら時間が勿体無いですよね。
この問題を解決する手段として<font color="Red">**make**</font>のようなスクリプト言語が登場しました。それにより、コンパイルやリンクを正しい順序で行うスクリプトを書くことができます。

## makeってなんだ？。。。
知らないことが多いのは当然ですが、、こうも多いとなかなか楽しくなってきました。
[wikipedia](https://ja.wikipedia.org/wiki/Make)
> make（メイク）は、プログラムのビルド作業を自動化するツール。コンパイル、リンク、インストール等のルールを記述したテキストファイル (makefile) に従って、これらの作業を自動的に行う。
...<中略>...
複雑に関連し合ったファイルの依存関係を解決するのがmakeの長所である。例えば、A というファイルを処理して B というファイルを生成するとき、makeはそれぞれのファイルの更新時刻（タイムスタンプ）を参照し、A が B よりも新しいときには作業を行うが、B が A より新しければ作業は不要と見なして何もしない。ファイル数が増え、依存関係が複雑になっても、makeはmakefileの記述を頼りに必要最低限の作業だけを自動で行う。Autotoolsという別のツールを使う事でmakefileの自動生成が可能である。

makeの実装として下記がある。
1. GNU make - GNUプロジェクトによる実装。
2. Schily make - ポータブルで拡張可能なmake。
3. BSD make - BSDの実装。
4. Microsoft Program Maintenance Utility (make, nmake) - マイクロソフトの実装。makeは極めて初期の処理系にのみ付属。

まだ突っ込んでみます。。。

## GNU make
[GNU Operating System](https://www.gnu.org/software/make/)
> GNU Make is a tool which controls the generation of executables and other non-source files of a program from the program's source files.
Make gets its knowledge of how to build your program from a file called the makefile, which lists each of the non-source files and how to compute it from other files. When you write a program, you should write a makefile for it, so that it is possible to use Make to build and install the program.

makefileに書いてあることに従って、依存関係や更新順序共々含めて、ビルドを行ってくれますよ！と言うことだと理解しました。
でも、、、GNUって何？と思ってしまったのでここで再度突っ込みます。

## GNU Project
[wikipedia](https://ja.wikipedia.org/wiki/GNU%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88)
> GNUプロジェクト（グヌープロジェクト、[ɡnuː] ( 音声ファイル)[3]）とはフリーソフトウェアマス・コラボレーションプロジェクトであり、1983年9月27日にMITのリチャード・ストールマンにより発表された。このプロジェクトの狙いは、ユーザーが自由にソフトウェアを実行し、（コピーや配布により）共有し、研究し、そして修正するための権利に基づいたソフトウェアを開発し提供することにより、ユーザーにそのような自由な権利を与えた上でコンピュータやコンピューティングデバイスの制御をユーザーに与えることにある。GNUのソフトウェアはこれらの自由な権利を（そのライセンスによって）法的に保障しているため、フリーソフトウェアである。なおフリーソフトウェアの「フリー」という言葉は常に自由な権利を指し示すために必要なため使われている。

ごちそうさまでした。

## Schily make
[Sourceforge](https://sourceforge.net/projects/schilytools/)
[プロジェクトページ](http://schilytools.sourceforge.net/index.php)
> The "Schily" Tool Box is a set of tools written or managed by Jörg Schilling. It includes programs like: cdrecord, cdda2wav, readcd, mkisofs, smake, bsh, btcflash, calc, calltree, change, compare, count, devdump, hdump, isodebug, isodump, isoinfo, isovfy, label, mt, od, p, POSIX patch, sccs, scgcheck, scpio, sdd, sfind, sformat, smake, Bourne sh, star, star_sym, suntar, gnutar, tartest, termcap, and ved.

ごちそうさまでした。

## BSD make
[**こちらの方**](https://qiita.com/jj1bdx/items/53a076dfdb921ec8465a)がBSD make　と GNU makeの違いについて書かれていました！
理解するまではまだまだ時間がかかりでした。

## Microsoft Program Maintenance Utility (make, nmake)
[what is nmake??](http://www.scmgalaxy.com/tutorials/make-for-windows-nmake/)
> nmake is the “make” program for Visual Studio.

他の説明http://objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/nmake/basic.html

要するに、windows用のmakeである  と言う理解をしました。

## 最後に
長くなってしまいましてすいませんでした。
書いただけではダメで、使ってみないといけませんね。。
そこまで理解を深めていけるように努めます。

## すごい綺麗なまとめ！
http://sandragon.hatenablog.com/entry/2013/08/11/193936
https://qiita.com/yizumi1012xxx/items/cc1fb7b21ead4d20dcef

## 文字に色絵をつける Markdown記法の記事
文字の装飾等に関してはこちらの方の記事を拝見し学ばせていただきました！
ありがとうございました。
https://qiita.com/twipg/items/d8043cd4681a2780c160