この記事のタイトルを目にしたとき、一通り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度、大きなバージョンアップが2度ありました。2021年7月現在の最新規格は2018年に制定されたISO/IEC 9899:2018です。以下に、主なバージョンを挙げてみます。

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)
標準規格の最初のメジャーバージョンアップ。言語仕様に対する拡張のほか、数学関数を中心にライブラリ機能も多数追加されている。
ISO/IEC 9899:2011 (通称 C11)
標準規格の2度目のメジャーバージョンアップ。言語仕様に対する拡張のほか、標準でマルチスレッドに対応するなど、さまざまな機能が追加されました。また、C99までの一部の仕様が廃止またはオプションになっています。
ISO/IEC 9899:2018 (通称 C17またはC18)
実質的にはC11の正誤表であり、新たに追加された機能はありませんが、__STDC_VERSION__の値が更新されています。2018年に制定されましたが、C17と呼ばれることの方が多いようです。

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

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

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

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

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

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

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

このように、実行環境の違いによって、C言語は大きく2種類に分類されます。これら2種類の環境の違いは別の機会に解説することにします。