C言語のバージョン

高木です。おはようございます。

これからC言語の入門記事を書いていくにあたって、最初に確認しておかなければならないことがあります。
それはC言語のバージョンです。
バージョンといってもコンパイラのバージョンではなく、Cという言語そのもの、もっと正確にいえば標準規格のバージョンのことです。

C言語のバージョンは大きく分けて3つあります。
具体的には、最初の標準規格であるC89またはC90、2nd EditionにあたるC99、3rd EditionにあたるC11です。
C89とC90は、それぞれアメリカ国内の標準規格と国際標準規格の違いで、形式的な体裁を除けば内容は同じです。

C89というのは、ANSI X3.159-1989のことであり、1989年に制定されました。
C90はISO/IEC 9899:1990のことであり、1990年に制定されました。
同様に、C99はISO/IEC 9899:1999で1999年に制定、C11はISO/IEC 9899:2011で2011年に制定されました。

実際にはこれ以外にも細かな正誤表が何度か出されていますが、それらについては一般のプログラマーが気にするようなものではありません。
重要なのは1995年に発行されたAmendment 1で、主にワイド文字に関連するライブラリが大幅に追加されたほか、言語仕様にも多少の変更が行われています。
このAmendment 1を含むC言語は、C95の通称で呼ばれています。

日本国内の標準規格であるJIS X3010が1997年に制定されましたが、その内容はC95でした。
また、1998年に最初の標準規格が制定されたC++が参照していたのもC95です。
実社会においても、(処理系の対応や開発現場の採用状況において)必ずしも普及が早かったとはいえないC99ではなく、長い間C95が使われてきたのが実情です。

C言語について解説を行うとき、その解説が一体どのバージョンを対象にしているのかを明確にすることは重要です。
ここをおろそかにしてしまうと、一体何の話をしているのかが不明瞭になってしまいます。

これから私が書こうとしているC言語の入門記事は、原則としてC11を対象にしようと考えています。
ただし、C11のうち、スレッド機能などは現在入手できる主要な処理系ではサポートされていないという現実があります。
この辺りの事情を踏まえ、怪しいものについては都度C言語のバージョンを明確にしながら解説を行いたいと考えています。

C言語のバージョンに加え、どの処理系を対象としているのかも重要な情報です。
しかし、基本は処理系によらない解説を行うべきであり、特定の処理系に限った解説を行う場合は、都度処理系を明らかにしながら解説する方針をとりたいと考えています。

C言語の難しさの大部分は移植性に関することだと私は考えています。
特定の処理系に限定して話をするのであれば、こんなに簡単なことはないでしょう。

処理系による互換性の問題というのは、C言言の専売特許ではありません。
たとえば、PHPなんかでも、そのバージョンの違いや動作プラットフォームの違いによって振る舞いがかなり変わってきます。
しかし、そうした細かいことには目をつぶっているのがPHPです。

C言語はそうした点に目をつぶりません。
結果として、C言語を難しいと感じる人が多発していることも事実でしょう。
しかし、C言語はそうした細かいことが重要な用途に使われる言語であり、致し方ないことだと思います。

さあ、これからC言語入門の連載が始まります。
対象とするのは原則としてC11です。
それを踏まえた上で、読んでいただければ幸いです。