苦しんで覚えるC言語

コンパイラは翻訳ソフト


全ては機械語


前の節では、プログラムを動作させる、とあっさり言っていましたが、
ここでは、そのことについて、より詳しく説明することにします。

そもそも、皆さんが先ほど記述したプログラムは、普通の文字列に過ぎません。
あなたも、コンピュータは2進数で動いていると聞いたことがあると思いますが、
2進数で動いているコンピュータが、何故文字列を認識して動くのでしょうか。

本来、コンピュータにとって、理解出来るのは2進数で書かれた命令だけです。
2進数で書かれた命令・・・・、いわゆる、マシン語(機械語)と言うやつです。
機械語のイメージ
000101001101010100101010
000101010101010010110100
101010001010101101010110
000101001010101001001101
000101001010101000000101
これはデタラメに0と1を並べただけですが、イメージはこれで間違いありません。
古今東西、どんなコンピュータであれ、この形の命令しか認識出来ません。

目次に戻る

プログラミング言語の登場


コンピュータが理解出来るのはマシン語(機械語)のみです。
実際、コンピュータ黎明期には、この様なプログラムが使われていたのです。
トグル式スイッチをパチンパチンとさせながら、膨大な数の0と1を入力していました。

しかし、いくらなんでもこれでは気が遠くなりそうです。
そこで、まず考えられたのは、数字の桁を縮めることです。
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
これが、いわゆる16進数と言う表現方法です。
2進数4桁分を16進数では1桁で表現出来るので、短くなります。
そして、この数字1つ1つを記号化したアセンブラも考えられました。
アセンブラ
MOV  AH,BH
ADD  AX,70
JPN  AF,01
この記号化によって、プログラミングはずいぶん効率的になりましたが、
まだまだ、普通の人が取り扱うにはわかりにくい記号であることに変わりありません。
これを大きく変えた、世界初のプログラミング言語が、FORTRANです。
FORTRAN(フォートラン)
 DO 10 I=1,10000
  READ *,X
  IF (X,GT,MAX)MAX=X
10 CONTINUE
ここまでくると、かなり英文や数式に近くなり、普通の人でも勉強すれば理解出来ます。
C言語も、これら人間の言葉に近い言語、高級言語の1つに数えられています。
高級言語
人間にわかりやすく書くことが出来るプログラミング言語。
これに対して、マシン語やアセンブリを低級言語と呼ぶ。

目次に戻る

C言語翻訳ソフト


高級言語は、人間が考えた言語なので、コンピュータには理解出来ません。
これをコンピュータに理解させるためには、翻訳が必要です。
英語を日本語に翻訳するのと基本的に同じことです。

この作業、もちろん人間が手作業で行うことも可能なのですが、
それでは、結局マシン語でプログラミングしているのと大差ありません。
その為、翻訳を行わせるためのソフトが存在しています。

翻訳方法は主に2種類ありますが、C言語の場合、全部を一気に翻訳する方法を使います。
同時翻訳
C言語以外の言語の中には、同時翻訳を行うタイプもあります。
それらはインタプリタと呼ばれており、
柔軟な構成が出来ますが、速度が低速なのが欠点です。
C言語インタプリタ
C言語にもインタプリタ式の環境があります。
プログラムを一つ一つ確認しながら実行でき、
バグ修正には大変便利なのですが、
C言語最大の利点である速度が犠牲になるため、
実用的な目的で使用されることはありません。
この翻訳をコンパイル、翻訳を行うソフトをコンパイラと呼んでいます。
既にコンパイラの入手や使い方は説明しましたが、このソフトはそのために必要なのです。
コンパイラ
C言語で書かれた文字列ファイルを、マシン語に翻訳するソフト。
このコンパイラは、実際には3段階の仕組みで動作しています。

まず、始めにプリプロセッサというソフトにより、文字列の調整が行われます。
空白や改行の結合、記号の置き換えなどを行いプログラムを解析しやすくします。
また、後述する#define疑似命令などもここで処理されています。

次に、コンパイラによってコンパイルされるのですが、この時に最適化が行われます。
同じC言語のプログラムでも、翻訳の仕方によって動作時の速度が違ってくるため、
コンパイラは、より高速になるように翻訳を行っています。
最適化
より高速に動作するように工夫してマシン語に翻訳する機能。
最後に、この翻訳した機械語プログラムが、リンカというソフトによって結合されます。
リンカで結合することを、リンクと呼びます。
リンクされることで、マシン語のデータが、実行可能ファイルになります。
コンパイルの流れ
C言語のプログラム、ソースコード
     V
プリプロセス(文字列の調整)
     V
コンパイル(翻訳)
     V
リンク(結合)
     V
実行可能なソフトウェア、実行可能ファイル

※プリプロセス、コンパイル、リンクをまとめてコンパイルと呼ぶことがある。
 また、実行可能ファイルを作成することまでまとめてビルドと呼ぶことがある。
実行可能ファイル(要するにEXEファイル)となったファイルは、
アプリケーションとして実行することができます。

これら一連の作業は、現在では完全に自動化されているので、
我々は普段は特に意識せずとも、ボタンを押すだけで動作可能なソフトが作られます。

目次に戻る