2011年02月01日

C言語の歴史(2)

前回はC言語がプログラミング言語の発展の中のどういう位置にあるのかを見てきました。
今回はC言語自体がどのように発展してきたのかを見ます。

・K&R 1973年 ブライアン・カーニハン+デニス・リッチー@AT&Tベル研究所

UNIXの開発時にOSの記述に便利なようにB言語を発展させて開発された。

が、UNIXが様々なプラットフォームに移植される時あるいは他のOS向けに処理系が発展するにつれ方言が多くなってしまいその後規格化されるようになり今ではほとんど使われていない。

でも、今でもこの形式の定義ができてしまったのでちょっとびっくり。

#include

int main(argc,argv)
int argc;
char *argv[];
{
printf("Hello K&R\n");
}


石田晴久先生訳の「プログラミング言語C」の第1版を持っていたはずなんですが、どっかいっちゃって見つかりません。ので、詳細は省略。

・ANSI C(C89) 1989年規格制定

石田晴久先生訳の「プログラミング言語C」の第2版改訂訳からANSI Cでの変更点のうち興味深いものを列挙しておきます。ただし一部の機能は一部の処理系では実装済みだったものを規格に取り入れたようです。


 関数プロトタイプ
 キーワード追加:void/enum/const/volatile/signed
 プリプロセッサでの文字列生成 #,文字列結合 ##
 文字列の連結
 void *型の導入/enum型の導入
 定数の接尾子、L/U/F
 limits.h, float.hあるいはsizeofでの処理系間互換性
 など


void *はK&Rでなかったんですねえ。charが1バイト前提だったってことでしょうか。

・ISO(C90) 1990年→1993年 JIS X3010-1993

ANSIは米国国内規格なので国際標準化機関のISOで内容は同じ。さらに日本工業規格にも1993年になりました。

・ISO(C95) 1995年 Amadment1

C90への追加として制定されました。主な追加は以下です。

 ワイド文字列サポート

・ISO(C99) 1999年←2003年 JIS X3010:2003

その後の発展をふまえてC++の利便性なども取り入れられた新しい規格が制定され、その後日本の規格にもなりました。wikipediaから主な変更点を追加します。


インライン関数
ファイルスコープでない変数宣言がブロックの先頭になければならないという制限の撤廃
いくつかの新しいデータ型。long long int、拡張整数型, 明示的な真偽型、複素数型 など
BCPLやC++のような、//から始まる一行コメント
snprintfのような新しいライブラリ関数
stdbool.hやinttypes.hなどの新しいヘッダファイル
型総称的な数学関数 (tgmath.h)
IEEE 浮動小数のより進んだサポート
指示初期化子
可変引数マクロのサポート
最適化のための restrict 修飾子


やはり一部の処理系では先行的に導入されています。一行コメントなどは早くから各社取り入れていましたね。

神戸大学の森先生がまとめられているこのページがとてもわかりやすいです。


ANSI-CとC99とGCCの拡張文法


C99は正式に規格が決まるまでC9xと呼ばれていました。ISO規格の番号は規格制定年が入るので正式決定までは規格の番号がはっきりしなかったからということでしょうね。

C1x

新しい規格制定の動きもあります。生のCを規格の違いがでるほど使うことは最近ないのですが、ここで導入されたことはC++やObjective-Cにも反映されることになるのでしょうか?

■実装

実際に違いを確認するのはgccではC89,C99の規格準拠性を確認するオプションがあります。
もちろん過去に書かれたソースコードでもコンパイルできるようにする下位互換のためです。
http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Standards.html#Standards

gcc
-ansi/-std=c89
-std=iso9899:1990
-std=iso9899:199409
-std=c99/c9x/iso9899:1999/iso9899:199x

エラーを確認するためには以下のオプションと併用する必要があります。
-pedomtic

バージョンを検地するための新しいプリプロセッサ定義も定められています。

__STDC_VERSION__


#if __STDC_VERSION__ >= 199901L
/* "inline" is a keyword */
#else
# define inline /* nothing */
#endif



タグ:C言語
posted by 永遠製作所 at 20:23| 東京 ☀| Comment(0) | TrackBack(0) | 雑学 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/183671497
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック