「コンパイラ、リンカ、ローダ」といった言葉。
これらは、プログラムがCPUで実行されるまでに出てくる仕組みで、「開発ツール」なんて呼ばれています。
ちょっと壮大なタイトルにしてますが、大きく3ステップでプログラムはコンピュータで実行されます。
今回はこの「プログラムが実行されるまでの流れ」に関して分かり易く解説します!
プログラムが実行されるまで
人間とコンピュータは使う言語が違います。
ということは、人間が書いたプログラムを翻訳する仕組みが必要になってきますよね。
そして、プログラムが理解できる言語に翻訳したら、それをコンピュータに読んでもらって、実行してもらう必要があります。
この一連の流れに出てくる仕組みが、「コンパイラ」、「リンカ」、「ローダ」です。
下の図のイメージですが、次からそれぞれの仕組みを見ていきましょう!
ソースコードとオブジェクトコードの違い
人間がプログラムのソースコードを書く時は、プログラミング言語のお作法に従います。
そのお作法はプログラミング言語によって違いますが、通常は英数字を使って命令を書いていきます。
その英数字で書かれたソースコードをコンピュータはそのまま読めますでしょうか?答えはNoです。
なぜならコンピュータは「0」と「1」の数字しか理解することができないからです。
もっと言うと、「電気が流れたか流れていないか」、で最終的には物理的に判断します。
ということは、人間が「0」と「1」を使ってコンピュータのための命令を書けば良いじゃないか?という話にもなりそうですが、それはスーパーマンでもない限り無理です。
そのために人間がプログラミング言語で書いた「ソースコード」をコンピュータが理解できる「0」と「1」の羅列になっている「オブジェクトコード」に変換してあげる仕組みがあります。
この仕組みのことを「コンパイラ」と呼びますので、次はコンパイラの話に行きましょう。
ちなみにオブジェクトコードはコンピュータが理解できる「機械語」の命令を並べたものになります。コンピュータにとってのプログラミング言語が機械語にあたるイメージですね。
コンパイラの役割
コンパイラは人間がプログラミング言語で書いた「ソースコード」をコンピュータが読める「オブジェクトコード」へ翻訳(変換)するためのツールとなります。
コンパイラが実行する処理を細かく見てみると、5つの処理を行っていることが分かります。
コンパイラの処理手順
- 字句解析:ソースコードに書かれているプログラムコードを字句(トークン)単位に分解して、間違いが無いかチェックする
- 構文解析:字句解析で分解したトークンをプログラム言語の構文規則に従って解析し、プログラムの文法が間違っていないかチェックする。
- 意味解析:プログラムの手書きに矛盾が無いかチェックする
- 最適化:計算の順序などを改善して、効率的なより良いプログラムコードの再編成を検討する
- コード生成:オブジェクトコードのプログラム(目的プログラム)を作る
もう一つ需要な点として、コンパイラの4番目の最適化手法には、二つのアプローチがあります。
コンパイラの二つの最適手法
- コードサイズから見た最適化:生成されるオブジェクトコードのサイズが小さくなる
- 実行速度から見た最適化:実行の処理の時間が短くなる
リンカとロードモジュール
先ほどのコンパイラで生成されたオブジェクトコードは、コンピュータが理解できる「0」、「1」の形式になっていますが、実はこのままでは未だ実行できないのです。
オブジェクトコードを実行するには他のオブジェクトコードやライブラリと言われる予め用意されている「関数や共通モジュール」なども一つにまとめられている必要があります。
これらのものを全て「つなぎあわせる」作業をリンク(連携編集)と呼び、リンクのためのツールが「リンカ」となります。
そして、リンカによって、一つにまとめらて、いよいよコンピュータで実行できる形式になったプログラムを「ロードモジュール」と呼びます。
因みに上図にあるように、あらかじめリンカを使ってロードモジュールを作っておく手法を静的リンクと呼びます。
一方、この時点ではまだリンクをしておかずに、プログラムの実行時に、メモリ上の共有ライブラリやシステムライブラリをロードしてリンクする手法もあります。これを動的リンクと呼びます。
動的リンクのメリットはこの時に用いるライブラリが複数のプログラムから共通で利用することができるため、主記憶装置(メモリ)の利用効率が良くなることですね。
最後にロードモジュールを主記憶装置(メモリ)に読み込ませる作業のことをロードと呼び、この作業を行うプログラムが「ローダ」となります。
まとめ
今回は「プログラムが実行されるまで」に関して解説してきました。
プログラムが実行されるまでのまとめ
- 人間が書いたソースコードはオブジェクトコード、ロードモジュールに変換されてコンピュータで処理される
- コンパイラはソースコードをオブジェクトコードに変換する
- リンカはオブジェクトコードとライブラリからロードモジュールに変換する
- ローダがロードモジュールをメモリに格納する
人間とコンピュータは言語が違うので、当然必要な処理ですが、結構大変な処理ですね。
でも、この苦労があって素晴らしいアプリケーションが動くのですね。
CPUの命令実行の動作に関しても以下記事を書いてますので、合わせて読んでみてください。
以上です!