MogLog

メモというか日記というか備忘録というか

ビルドとかコンパイルとかリンクとか

「ビルド」という言葉がどんな意味を指すのか、しっかりと理解していなかった。
コンパイルと何が違うのかもよくわかってなかったし、人に聞かれたら確実に答えらないと思った。
というわけで、調べてみた。

まずは定義から調べた。安定のe-words.jp様から拝借。


■ビルド(build)
ソースコードのコンパイルやライブラリのリンクなどを行い、最終的な実行可能ファイルを作成すること。また、そのような作業によって生成されたソフトウェアの版。


コンパイルとは意味が違うことがまず分かった。ビルドはコンパイルをして更に「リンク」という作業をするようだ。次にコンパイルの意味を再確認の意味も込めて調査。


■コンパイル(compile)
人間がプログラミング言語を用いて作成したソフトウェアの設計図(ソースコード)を、コンピュータ上で実行可能な形式(オブジェクトコード)に変換すること。..(中略)..。変換のみを一括して行い、生成したオブジェクトコードの実行は行わない。


これはもう見慣れた説明。普段書いている、ifとかforとかが含まれたソースコードを、コンピュータが実行できるように変換するんですよね。だけど「オブジェクトコード」という言葉は初耳だったので、オブジェクトコードの意味を調べる。


■オブジェクトコード(object code)
人間の書いたソースコードを、コンピュータが実行するのに適した形式に変換したコードのこと。変換は主にコンパイラによって行われ、人間には容易に読み取れないバイナリ形式のオブジェクトファイル(object file)として生成される。それ自体が直ちに実行可能なわけではなく、リンカなどを用いていくつかのオブジェクトファイルを特定の形式で連結することにより、最終的な実行可能ファイルやライブラリが生成される。


なるほど。コンパイルすることでオブジェクトコードが作られるけど、この状態ではまだ実行可能状態では無いようだ。あと「ビルド」について調べた時に出てきた「リンク」を行うっぽい「リンカ」って言葉が出てきた。調べてみる。


■リンカ(linker)
コンパイラによって変換されたオブジェクトコードに、必要なライブラリなどを付け加えて実行可能ファイルを生成するプログラム。最近はコンパイラにその機能が統合されていることが多い。
C言語などの高級言語では、プログラマの書いたソースコードコンパイラ機械語の集合であるオブジェクトコードに変換するが、単に変換しただけではコンピュータ上で実行できる形にはならない。リンカはオブジェクトファイルを解析して、参照している他のオブジェクトファイルやライブラリなどを探し出し、必要なものを結合して実行形式のファイルを作成する。...(以下略)


コンパイルすることで作られるオブジェクトコードに、リンクというライブラリを付け加える作業を行うことではじめてファイルが実行可能になることが分かった。そしてこれこそが「ビルド」だということが分かった。
「最近はコンパイラにその機能が統合されていることが多い」から、コンパイルとビルドがごっちゃになっていたのかも。
とりあえず「ビルド = コンパイル + リンク」というように覚えておけば良いと思った。


あと、調べている中でmakeとの違いについても書かれている記事があったのでついでに調べた。


メイクとはコンパイルの対象となるファイル、ビルドの対象となるファイルに関する情報を一ファイルとして保存しておき、これに基づいてコンパイル、ビルドを効率的に行なうシステム。
更新されたファイルがあればそれだけを対象にコンパイル、ビルドを実行するので、時間を無駄にすることがない。


この説明を見る限り、コンパイルやビルドの手順などを自身で定義して行うってだけ。ビルドやコンパイルと時に同義になるっぽい。


※参考
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q126988002
http://dqn.sakusakutto.jp/2011/09/linux.html
http://www.grapecity.com/tools/support/powernews/column/clang/003/page03.htm