C99とC11

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

先日、営業と話しているときに話題に上がったC99とC11について少しだけ書いてみたいと思います。
ここでいうC99とC11というのは、プログラミング言語のC(いわゆるC言語)のバージョンのことです。

多くの入門書などで扱っているのは、基本的にはC90またはC89です。
C99やC11はそれより新しいバージョンで、それぞれ、2nd Editionと3rd Editionにあたります。

Cのあとに続く数字は、規格ができた年の末尾二桁を表します。
つまり、C90といえば1990年版であり、C99といえば1999年版、C11は2011年版ということになります。

ちなみに、C90とC89の中身はまったく同じです。
C90は国際規格であるISO/IEC 9899 : 1990のことであり、C89はアメリカの国内規格であるANSI X3.159-1989なのですが、文書の体裁を除けば同一の内容になっています。
日本国内では、JIS X3010-1993がこれに相当します。

その後、1995年には、Amendment1が発行されました。
主に文字や文字列の国際化に関するライブラリが追加されたもので、C95とも呼ばれています。

そして、1999年に2nd EditionであるC99が登場しました。
C99では、数学関係のライブラリが多数追加されたほか、C++やGCCの機能を一部取り込みました。
コンピュータの進歩に伴って、C90の制約事項が大幅に緩和されている点も見逃せません。

最新版は2011年に発行された3rd Editionで、これがC11にあたります。
C11は、UTF-8、UTF-16、UTF-32のエンコーディング方式が標準仕様として盛り込まれたほか、境界調整やマルチスレッドなどの機能が(省略可能ですが)盛り込まれました。
また、C99では必須だった可変長配列や複素数型が省略可能になったりもしています。

通常、プログラミング言語のバージョンが上がれば、どんどん仕様が追加される方向に進みます。
そのため、古いバージョンで書かれたソースコードは新しいバージョンのコンパイラでも使えるのが普通です。
けれども、C11では、以前のバージョンでは必須だった仕様を省略可能にしたり、セキュリティ上問題があったライブラリ関数を廃止したりしているため、互換性が失われています。

というわけで、このブログでは技術的な話題を取り上げることはやめておくつもりだったのですが、今回はちょっと技術的だったかもしれません。
実際には、Cの歴史に関するウンチクのようなものです。