前の節では、プログラムを動作させる、とあっさり言っていましたが、
ここでは、そのことについて、より詳しく説明することにします。
そもそも、皆さんが先ほど記述したプログラムは、普通の文字列に過ぎません。
あなたも、コンピュータは2進数で動いていると聞いたことがあると思いますが、
2進数で動いているコンピュータが、何故文字列を認識して動くのでしょうか。
本来、コンピュータにとって、理解出来るのは2進数で書かれた命令だけです。
2進数で書かれた命令・・・・、いわゆる、マシン語(機械語)と言うやつです。
[ 機械語のイメージ ]これはデタラメに0と1を並べただけですが、イメージはこれで間違いありません。
000101001101010100101010
000101010101010010110100
101010001010101101010110
000101001010101001001101
000101001010101000000101
コンピュータが理解出来るのはマシン語(機械語)のみです。
しかし、いくらなんでもこれでは気が遠くなりそうです。
そこで、まず考えられたのは、数字の桁を縮めることです。
[ 16進数の機械語 ]これが、いわゆる16進数と言う表現方法です。
01 85 AD 7F 7C A4 FA 6B AD
06 F5 AB 74 7E DC 18 FA A4
01 7F A7 C5 D8 6B 4E A4 FA
[ アセンブラ ]この記号化によって、プログラミングはずいぶん効率的になりましたが、
MOV AH,BH
ADD AX,70
JPN AF,01
[ FORTRAN(フォートラン) ]ここまでくると、かなり英文や数式に近くなり、普通の人でも勉強すれば理解出来ます。
DO 10 I=1,10000
READ *,X
IF (X,GT,MAX)MAX=X
10 CONTINUE
[ 高級言語 ]
人間にわかりやすく書くことが出来るプログラミング言語。
これに対して、マシン語やアセンブリを低級言語と呼ぶ。
高級言語は、人間が考えた言語なので、コンピュータには理解出来ません。
これをコンピュータに理解させるためには、翻訳が必要です。
英語を日本語に翻訳するのと基本的に同じことです。
この作業、もちろん人間が手作業で行うことも可能なのですが、
それでは、結局マシン語でプログラミングしているのと大差ありません。
その為、翻訳を行わせるためのソフトが存在しています。
翻訳方法は主に2種類ありますが、C言語の場合、全部を一気に翻訳する方法を使います。
[ 同時翻訳 ]
C言語以外の言語の中には、同時翻訳を行うタイプもあります。
それらはインタプリタと呼ばれており、
柔軟な構成が出来ますが、速度が低速なのが欠点です。
この翻訳をコンパイル、翻訳を行うソフトをコンパイラと呼んでいます。
[ C言語インタプリタ ]
C言語にもインタプリタ式の環境があります。
プログラムを一つ一つ確認しながら実行でき、
バグ修正には大変便利なのですが、
C言語最大の利点である速度が犠牲になるため、
実用的な目的で使用されることはありません。
このコンパイラは、実際には3段階の仕組みで動作しています。
[ コンパイラ ]
C言語で書かれた文字列ファイルを、マシン語に翻訳するソフト。
まず、始めにプリプロセッサというソフトにより、文字列の調整が行われます。
空白や改行の結合、記号の置き換えなどを行いプログラムを解析しやすくします。
また、後述する#define疑似命令などもここで処理されています。
次に、コンパイラによってコンパイルされるのですが、この時に最適化が行われます。
同じC言語のプログラムでも、翻訳の仕方によって動作時の速度が違ってくるため、
コンパイラは、より高速になるように翻訳を行っています。
最後に、この翻訳した機械語プログラムが、リンカというソフトによって結合されます。
[ 最適化 ]
より高速に動作するように工夫してマシン語に翻訳する機能。
[ コンパイルの流れ ]実行可能ファイル(要するにEXEファイル)となったファイルは、
C言語のプログラム、ソースコード
V
プリプロセス(文字列の調整)
V
コンパイル(翻訳)
V
リンク(結合)
V
実行可能なソフトウェア、実行可能ファイル
※プリプロセス、コンパイル、リンクをまとめてコンパイルと呼ぶことがある。
また、実行可能ファイルを作成することまでまとめてビルドと呼ぶことがある。
これら一連の作業は、現在では完全に自動化されているので、
我々は普段は特に意識せずとも、ボタンを押すだけで動作可能なソフトが作られます。