第1回 C言語とは

この記事のタイトルを目にしたとき、一通りC言語でプログラミングができる方を対象としているはずなのに、「いまさら『C言語とは』といった記事にどんな意味があるのか?」と思われたのではないでしょうか?退屈な話はパスして、さっさと次のページに進みたいかもしれませんが、そこをグッとこらえて、少しだけお付き合いください。

「C」という言語名の意味

C言語を一通り習得された方であれば、「C」というのが「Bの次」の意味であることはどこかで見聞きしたことがあるのではないでしょうか。確かに、C言語の系譜を見ていくと、C言語の前に「B言語」というのが見つかります。では、B言語の前に「A言語」というのがあったのでしょうか?

人によっては、A言語に相当するのはアセンブリ言語だと主張されるかもしれませんね。それでは、C言語の次は「D言語」なのでしょうか?確かにD言語というのも実在します。そして、D言語はC言語の次を狙っているようにも見えます。

しかし実際には、B言語の「B」というのは、さらにその前身にあたる「BCPL」の頭文字の「B」です。そして、「BCPL」という名前の中でBの次にあたるのが「C」なのです。ですから、Bの前というのは存在しませんし、Cの次は「P」ということになります。

C言語のバリエーション

C言語には多くの処理系*1が存在することは、Cプログラマならご存知かと思います。Windows向けの処理系もあればLinux向けの処理系もありますし、同じOS向けであっても数社からコンパイラが提供されています。多くの場合、それぞれの処理系ごとに独自の拡張が行われているため、さまざまな方言が生まれています。

しかし、ここで解説する「バリエーション」とは、そのような個々の処理系のことでもなければ、方言のことでもありません。C言語における標準語ともいえる標準規格にもバリエーションがあるのです。

C言語の標準規格は、1989年にアメリカのANSIで制定されて以来、何度かバージョンアップを行っています。また、同じ規格の中でも、取り扱いが異なる二つの実行環境が定義されています。つまり、歴史的変遷による縦軸のバリエーションと、実行環境の違いに横軸のバリエーションが存在するわけです。


*1 机上の理論であるC言語の規格を実現したもので、翻訳処理系と実行処理系で構成される。翻訳処理系はおおむねコンパイラを指し、実行処理はOSやハードウェアなどを指す。

歴史的変遷によるバリエーション

1989年にC言語の標準規格が制定されて以来、主として国際化対応のための補追が1度、大きなバージョンアップが1度ありました。現在の最新規格は、C言語第2版ということになります。以下に、主なバージョンを挙げてみます。

ANSI X3.159-1989 (通称 C89)
最初に制定された標準規格。いわゆるANSI-Cのこと。なお、ANSIはアメリカ国内の規格である。
ISO/IEC 9899:1990 (通称 C90)
C言語に関する最初の国際規格。内容的にはANSI-X3.159とまったく同じ。
ISO/IEC 9899/Amd.1:1995 (通称 Amd1またはC95)
主として、英語以外の言語に対応するためのライブラリ機能の追加。<wchar.h>や<wctype.h>はこのときに追加される。
ISO/IEC 9899:1999 (通称 C99)
標準規格の最初のメジャーバージョンアップ。言語仕様に対する拡張のほか、数学関数を中心にライブラリ機能も多数追加されている。

実際には、上記以外にも正誤表が何度か発行されていますが、それらについては特に気にすることはないでしょう。

重要なのは、まず第一に、自分が今扱っている処理系がどのバージョンに対応しているのかを把握することです。そして、移植性を考慮したコーディングを行うのであれば、どこまでを対象にするのかを明確にすることです。

実行環境によるバリエーション

C言語は、メインフレームから8ビットマイコンにいたるまで、実にさまざまな実行環境を対象にしています。これらを一括りにして扱うのは、どう考えても無理があります。そこで、ごく大雑把な分類ではありますが、プログラムの実行がオペレーティングシステム(OS)の支援を受けて行われるかどうかを目安に、以下の2種類に分類しています。

  • フリースタンディング環境
  • ホスト環境

フリースタンディング環境というのは、OSの支援なしでプログラムを実行させる環境で、組み込み機器の多くはこれに属します。ただし、μITRONのようなカーネルのみのOSの場合には、OSの支援を受けていてもフリースタンディング環境に分類する方が現実的です。

ホスト環境というのは、OSの支援のもとでプログラムを実行させる環境で、PCやワークステーションなどはこれに属します。C言語の入門書や解説書の大多数は、このホスト環境についてしか書かれています。

このように、実行環境の違いによって、C言語は大きく2種類に分類されます。これら2種類の環境の違いは、本サイト内の別記事で解説していますので、そちらを参考にしてください。C++の記事ではありますが、C言語についても解説しています。

一点補足するなら、C99で導入された複素数型は、フリースタンディング環境ではサポートしなくてもよいことになっているという点です。複素数型を使う状況というのは(特にフリースタンディング環境では)限られていますので、普段はそれほど気にする必要はないのかも知れませんが、一応、記憶の片隅にでも留めておくとよいでしょう。