![thumb_buildcompile_01](/placeholder.png)
プログラム開発で使うビルドとコンパイルの違いとは
![img_buildcompile_01](/placeholder.png)
エンジニアなら誰もが使う言葉に「ビルド」と「コンパイル」がありますが、混同しやすい言葉ですので、正しく理解しておきましょう。
用語は分からなくても、決められた手順通りに行っていれば良いという考え方もありますが、エンジニアとしては、用語の意味と中身を理解した上で用いることが大事です。
この記事では、開発現場で用いられている「ビルド」と「コンパイル」の違い、さらには関連する「デプロイ」「リンク」「デバッグ」についても解説していきます。
ビルド(Build)とはコンパイルのこと?
![img_buildcompile_02](/placeholder.png)
コンピューターはマシン語によって動作します。マシン語は0と1の組み合わせからなり、コンピューターが理解し、指示通りに実行できる命令コードです。
私たちが作成したプログラム(ソースコード)はコンパイル(翻訳)によってマシン語からなるオブジェクトコードが生成され、オブジェクトコードから作られた実行ファイル(Windowsではexeファイルとも呼ばれる)を起動することでプログラムが動くと習いました。
ところが、たとえばJavaの統合開発環境(IDE:Integrated Development Environment)のeclipseでは、実行ファイルの作成はコンパイルではなく、ビルドを使います。eclipseではコンパイルとリンクはビルドで自動で行われます。
そのため、ビルドとコンパイルは混同しがちですが、両者は異なる概念です。
![](/placeholder.png)
IDE(Integrated Development Environment)とは
初めに、ビルドと密接な関係にある「IDE」について解説します。IDEは(Integrated Development Environment)の略称で、統合開発環境と訳されています。
IDEは言わば、ソフトウェア開発を行う上で必要なツールやソフトウェアを一つにまとめ、統一された操作画面から操作が行えるようにしたソフトウェアパッケージのことです。
IDEは一般的には、コードエディタ・コンパイラ・リンカ・デバッグツール・テストツール・バージョン管理ツールなどから構成されています。よく知られたものとしては、Microsoftの「Visual Studio Code」やAppleの「Xcode」、オープンソースの「Eclipse」などがあります。
【参考】:Documentation for Visual Studio Code 【参考】:Xcode |Apple 【参考】:Eclipse Downloads | The Eclipse Foundation
ビルド(Build)の意味と役割
ビルドは、英語のBuildであり、建てることを意味します。ソフトウェアの世界では、ソースコードから実行ファイル作成までの一連の流れをビルドと称します。
作成したプログラムのソースコード(Source code)に問題がないかをチェックした上で、実行可能ファイル(オブジェクトコード)に変換(コンパイル)します。
続いてリンカ(Linker)によって、他のオブジェクトコード、外部ライブラリーファイルをリンク(連結)させ、ソースコードから実行可能形式のファイルを生成するまでが範囲です。
ビルドはコンパイルと似ていますが、コンパイルも包含している、ソフトウェア開発における一連のプロセス(工程)であり、そのプロセスは自動化されているケースが多く見られます。
コンパイル(compile)とは
コンパイル(compile)とは、人が認識できるソースコード(プログラム)を実際にコンピューターが理解できる機械語形式のプログラムに変換する作業のことをいいます。
そのコンパイル作業を行ってくれるプログラムをコンパイラ(compiler)といいます。コンパイル作業でオブジェクトコード(オブジェクトファイル)が作られますが、まだこの状態ではプログラムとして実行はできません。リンクという工程が必要です。
リンク(link)とは
コンパイラによって作りだされたオブジェクトコード(binary code)で書かれたオブジェクトファイル(object file)に対し、複数のオブジェクトファイルや外部ライブラリ(library)を結合するのがリンク(link)という作業です。
このリンク処理を行うのリンカ(Linker)というプログラムです。このリンクを行って初めて実行ファイルが作られ、プログラムとして動かすことができます。コンパイルやリンクは1つずつ手動で行えますが、多くの場合はIDEと呼ばれる統合開発環境が自動で行ってくれます。
またリンクにはプログラムを動かすときにリンクさせる(くっ付ける)動的リンク(dynamic link)と、実行ファイルを作るときにリンクさせる静的リンク(static link)とがあります。Javaは実行時にすべての参照関係が確定するためリンクは発生しません。
Javaは実行時に「dynamic link」によって名前で相手を呼び出し、相手が見つからなければエラーとなって処理が停止します。
![](/placeholder.png)
ビルドとデプロイ(deploy)の違い
ソースコードからビルドを経て実行ファイルが作成されますが、この実行ファイルを実行可能な環境(サーバー環境など)に配置をして、実行できるようにする事を「デプロイ」といいます。言わば、ソフトウェア開発の最終セッティングと言えます。
通常、デプロイはサーバーなどを停止させてから行いますが、サーバーが稼働中にアプリの入れ替えを行う手法として「ホットデプロイ」(Hot deploy)という方式があり、主流になりつつあります。これにより、24時間365日のサービス提供が可能となっているのです。
ビルドとメイク(make)の違い
ビルドと関連してメイク(make)という用語があります。プログラムのビルド作業を自動化するツールをメイクと呼びます。メイクではコンパイルやリンク、インストールなどのルールを記述したメイクファイル (Makefile) に従って、ビルド作業を自動的に行う仕組みになっています。
ビルドの流れ
![img_buildcompile_03](/placeholder.png)
続いて、ビルドの流れについて見てみましょう。ビルドの処理は『(ソースコード)→【静的テスト】→【バグ修正】→【プリプロセッサ】→【コンパイラ】→(オブジェクトファイル)→【リンカ】→(実行ファイル)』という流れになっています。それでは、ビルドのそれぞれのプロセスについて見ていきましょう。
静的解析(静的テスト)
ビルドでは最初にソースコードをもとに静的解析(静的テスト)を行います。静的解析では、文法の誤り、構文ミスを検出します。静的解析はバグ(不具合)を見つけるための処理です。
静的解析にはソースコードを作成者以外の人がレビューするという形で、目視でチェックする場合と、静的解析ツールを利用する場合があります。静的解析ツールはEsclipsやVisual Studio CodeなどのIDEに、プラグインツールとして存在しています。
今は静的解析ツールが整っていますので、ツールを利用した解析が主流になっています。他に、静的解析に対して動的解析があります。動的解析はプログラムを実際に動かしてチェックするテストの方式です。
![](/placeholder.png)
バグ修正
静的解析を行って、ソースコード中に文法や構文のミスが発見された際には通知が行われます。そのため、次のステップに移る前に処理は一旦そこで終わり、ソースコードの修正を行います。修正できたことを確認したら、コンパイルのための前処理となる、プリプロセッサ(preprocessor)による処理に進みます。
プリプロセッサ(preprocessor)
ソースコードの解析で誤りがチェックされ、間違いが正された後に「プリプロセッサ」(preprocessor)でコンパイルを行う前の前処理(preprocess)を行います。
「プリプロセッサ」による処理内容としては、ヘッダーファイルの読み込み、マクロの展開、定数の数値への置き換え、コンパイルに不要なコメント部の削除など、整形処理が行われます。これらは適切なコンパイルが行われるための前処理と言えます。C言語ではプリプロセッサを利用しますが、他の言語では不要です。
コンパイラ(compiler)
プリプロセッサによる前処理が終了したら、「コンパイラ」を利用してコンパイルを行います。この結果、人が書いたソースコードが、コンピューターが読める機械語(オブジェクトコード)に翻訳され、オブジェクトファイルが生成されます。
ちなみに実行する前に、一括してコンパイルが必要な言語は「コンパイラ言語」と呼び、Java、C、C++、Goなどが該当します。「コンパイラ言語」に対し、コードを実行する際に1行ずつコンパイルする言語を「インタプリタ言語」といい、Ruby、Python、JavaScript、PHPなどがあります。
![](/placeholder.png)
![](/placeholder.png)
![](/placeholder.png)
![](/placeholder.png)
リンカ(Linker)
コンパイラによるコンパイルが済んだら、最後に「リンカ(Linker)」を通して、オブジェクトファイルや外部ライブラリーの「リンク」処理が行われます。このリンクによって、別々に存在していたオブジェクトファイルやライブラリーファイルが1つになって、実行ファイルが形成されます。
システム開発に関する用語は説明できるレベルまで理解しておこう
![img_buildcompile_04](/placeholder.png)
この記事では、システム開発でよく登場してくる「ビルド」と「コンパイル」の説明を交えて、さまざまな関連用語と、それぞれの役割、関係、ビルドの実際の流れについて紹介しました。
特にエンジニアは用語をロジカルに説明できるよう、実務において理解しておくことが求められます。システム開発に関する用語を理解して、実務に活かしましょう。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから