Cプログラミング入門

第1回Chapter 1 C言語の概要(1)

C言語とは

C言語は、高級言語のような可読性(プログラムの読みやすさ)や移植性(異なるOS上でも動作すること)の高さを維持しながら、アセンブラのように小回りが効くという優れたプログラミング言語です。また、C言語はif、forやwhileなどの制御文を用い、基本的にはgoto文を使用しない、構造化プログラミング言語のひとつでもあります。

一般に、どのような言語を使ってプログラムを記述する場合でも、それを最終的に実行するのはそのコンピュータ内のCPUです。CPUが実行できるのはCPUの命令コード(機械語)のみです。CPUの命令コードは2進数のデータの羅列であるため、これを人間が直接プログラムするのは非常に困難であり、通常、そのようなことはしません。

アセンブラ(アセンブリ言語)は、ニーモニックと呼ばれるCPUの命令コードとほぼ1対1に対応する文字列を使ってプログラムする方法で、これなら人間が直接プログラムすることが可能です。しかし、アセンブラはCPUのレジスタを操作する命令など、細かいレベルの操作まですべて記述しなければならないため、プログラムの意図として実際にやりたいこととアセンブラ上の命令との間にかなりの隔たりがあり、アセンブラのプログラムを人間が読んで内容を理解するのは困難です。また、言語自体がCPUの命令コードに依存しているため、CPUの種類ごとにアセンブラが存在し、あるCPUのアセンブラで記述したプログラムはそのCPUでしか動きません。これらの意味からアセンブラは低級言語と呼ばれます。

これに対して、人間がわかりやすい変数を用いたり、if文などの制御文を使ったりできるのがFORTRAN、BASIC、COBOLなどの高級言語です。高級言語では、アセンブラとは違ってCPUの命令コードには依存しない形でプログラムを記述することができ、プログラムの記述内容を読んでそのプログラムの意図を理解することが容易です。ところが高級言語では、アセンブラでは可能だったメモリの直接アクセスなどの低レベルの操作ができません。したがって高級言語では、科学技術計算や事務処理計算などはできても、OSのようなシステムそのものをプログラムすることはできません。

C言語は、高級言語と低級言語の両方の特徴を持った言語と考えられます。C言語は、もともとUNIX自体を記述するための言語として開発された言語であり、高級言語のようにわかりやすくプログラムできると同時に、低級言語のようにメモリの直接アクセスなどの低レベルの操作もでき、OSのカーネルやデバイスドライバといったハードウェアに密接なプログラムも記述することが可能です。そういう意味では、C言語はCPUに依存しない汎用アセンブラであると言ってもよいでしょう。

コンパイラ型言語とインタープリタ型言語

一般に高級言語は、コンパイラ型言語とインタープリタ型言語に分けることができます。コンパイラ型言語としてはC、C++、FORTRAN、Pascal、COBOLなどがあり、インタープリタ型言語としては、BASICやシェルスクリプト、Perlなどがあります。Javaは「バイトコード」と呼ばれる中間コードにコンパイルしたあと実行時にはインタープリタを使用するため、コンパイラ型言語とインタープリタ型言語の中間に位置すると考えられます(図1.1⁠⁠。

ただし、C言語のソースを実行できるようなインタープリタや、BASICをコンパイルできるコンパイラも存在するため、この分類は必ずしも絶対的なものではありません。

図1.1 コンパイラ型言語とインタープリタ型言語の分類
図1.1 コンパイラ型言語とインタープリタ型言語の分類
表1.1 コンパイラ型言語とインタープリタ型言語の比較
 コンパイラ型言語インタープリタ型言語
実行速度高速低速
コンパイル必要不要
実行バイナリファイルあるない
インタプリタ不要実行時に必要

コンパイラ型言語

コンパイラ型言語では、プログラムを記述したソースファイルを、CPUが直接実行可能な実行バイナリファイルに変換することによってプログラムを実行します。ソースファイルを実行バイナリファイルに変換することを[コンパイル]と言い、コンパイルを行うプログラムのことを[コンパイラ]と呼びます。C言語のコンパイラなら[Cコンパイラ]と呼びます。

ソースファイルを実行バイナリファイルに変換するという意味においてはコンパイラ型言語はアセンブラにも似ています。しかし、コンパイラ型言語はアセンブラとは違って、その変換処理は1対1の単純なものではありません。一般にコンパイラには、なるべく無駄のない、最適なCPUの命令コードに変換できるような高い性能が求められます。

コンパイラ型言語は、インタープリタを使わずに実行バイナリファイルを直接実行できるため、プログラムを高速に実行することができます。また、いったん実行バイナリファイルができてしまえば、そのプログラムがもともとC言語で書かれていたのかアセンブラで書かれていたのかということは関係なくなります。プログラムの実行には実行バイナリファイルのみが必要で、ソースファイルは実行時には必要ありません。このためソースを公開したくないプログラムでは、プログラムの開発者はコンパイル済みの実行バイナリファイルのみを配布することができます。

図1.2 コンパイラ型言語
図1.2 コンパイラ型言語

インタープリタ型言語

インタープリタ型言語は、ソースファイルをインタープリタを通して直接実行するという方式の言語です。インタープリタ型言語では実行バイナリファイルは作成されず、⁠インタープリタ]と呼ばれるプログラムがソースファイルを解釈しながらプログラムを実行します。インタープリタによるソースファイルの解釈は実行時に逐次に行われるため、プログラムの実行はコンパイラ型言語よりも遅くなってしまいます。また、インタープリタ型言語で書かれたプログラムを実行するには、そのソースファイルだけでなく常にインタープリタが必要ということになります。

その一方でインタープリタ型言語には、コンパイラ型言語とは違って[ソースファイルを修正してもコンパイルの作業は必要ない]という特長があります。ソースファイルの修正を頻繁に行う場合や、プログラムの実行速度が多少遅くても問題にならない場合は、インタープリタ型言語の方が適しているとも言えます。

おすすめ記事

記事・ニュース一覧