コラム13.  :ANSI-C

「ANSI C」の、ANSIって?

C言語を語るとき、枕詞のように出てくる言葉が、ANSIという言葉です。標準的なC言語の仕様のことを、よく「ANSI C」などと言ったりしますが、そもそもこのANSIとは何なのでしょうか。ANSIとは、 「American National Standards Institute」の略で、日本語では、米国国家規格協会・米国規格協会・米国標準協会などと訳されます。これは、アメリカ合衆国における工業規格の標準化を行う機関です。

日本の機関に例えるのなら、日本における日本工業標準調査会(JISC)のようなもので、日本におけるJIS規格のようなものが、アメリカのANSI規格だと思えばいいでしょう。

しかし、その世界への影響力は、JISCの比ではありません。ANSIで標準化された規格がそのまま世界的に利用されるケースや、ISO(International Organization for Standardization:国際標準化機構)/IEC(International Electrotechnical Commission:国際電気標準会議)の標準となることも多く、様々な分野で世界的な影響力を持っています。

K&RからANSI-Cへ

C言語は1989年、このANSIによって言語仕様の規格化が行われ、これは「ANSI-C」あるいは「C89」と呼ばれています。Cには当初明確な言語仕様が無く、Dennis RitchieとBrian Kernighanが著したいわゆる「K&R本」を基に多くの処理系の実装が行われていましたが、そののち、このANSI規格が標準となりました。そのため、K&R本もANSI-Cに合わせて改訂され、第2版が出版されました。

C言語の仕様はこの後、10年間変化しませんでした。これはこの時作られたANSI-Cが完成度の高いものだったということが言えるでしょう。

その後、このANSI-Cは世界標準となり、その後,1990年にISO(国際標準化機構)がANSI-CをISO C90規格として制定し,1995年に小規模な改訂が行われてISO C95規格に…といった形で標準化されてきました。

JISとC言語

このように国際規格となったANSI-Cですが、日本でこのC言語の標準規格を管理・公開しているのが、JISCです。JISの規格番号は、JISX3010で、ISO/IEC 9899:1999,Programminglanguages―C 及び ISO/IEC 9899 Technical Corrigendum 1:2001 を基礎として制定されています。

現在、この企画は、ホームページ上で公開されており、だれでも簡単に閲覧することが可能です。C言語の規格書として日本語で書かれたものは、おそらくこれが唯一のものなのではないでしょうか。

独自に拡張されるC言語

このように、ANSIによって標準規格がさだれられているC言語ですが、実際に利用されているC言語のコンパイラは、この標準規格と全く同じかというと必ずしもそうではありません。たとえばGCC(GNU C Compiler)はISO C99に対応していますが、独自に拡張されている部分があります。

さらに、マイクロソフトのVisualC++コンパイラも、ANSI規格以外の機能を多数用意しています。これらの機能はC/C++ のMicrosoft拡張機能として知られています。マイクロソフトでは、こういった拡張機能の仕様を、ホームページで公開しています。

更には、アップル社も、ブロック(Blocks)などのように、独自にC/C++/Objective-C言語の拡張を行い、ラムダ式風の構文を用いてクロージャを作成する機能を提供しています。

C言語でプログラミングする際のマナー

このように、C言語は様々な事情をもとに、独自に拡張や機能追加がなされています。なので、標準であるはずのC言語でプログラムを作ったにもかかわらず、Aというコンパイラではコンパイルでき、Bというコンパイラではできない…という可能性もあります。

そのため、C言語でプログラムを作成する場合、特定のOSや処理系に依存しないクロスプラットフォーム開発をししなくてはならない場面が少なからずありますが、そういった場合、こういったC言語のコンパイラごとの違いに留意し、なるべく標準規格に準じたプログラミングをするように心がける必要があります。