色々な規格

このエントリーをはてなブックマークに追加

今回はUnix + C言語の世界を取り巻く規格について紹介していきます。
多少固い話になりますが、この世界では避けて通る事が出来ない話題です。
真面目に解説すると本を数冊書けるぐらい深い話ですので、あまり詳しくは紹介できませんが最低限の知識は頭に入れておいてください。

Unix上で関わる規格

まずは代表的な規格の一覧です。もちろんこれ以外にもあるのですが...

規格名説明
ANSI/ISO CISO及びANSIが定めたC言語の規格。C89、C99などがある。OSに依存しない。
POSIX各種Unix系OSで共通のAPIを決めた規格
SUSUNIXを正式に名乗る為に必要な規格
SVRSystem V Releaseの略で、バージョン4であるSVR4.xが主流。Unixの2大系統の1つ
BSDSVRと並んでUnixの2大系統の1つ。

C言語の規格やOSの規格が混ざっていますが、これらはお互いに密接に結びついている為一度に紹介しました。
規格の範囲では、ANSI/ISO C < POSIX < SUS、の順で規格が大きくなります。SUSはPOSIXを含み、POSIXはANSI/ISO Cを含みます。

SVR、BSDはUnix系OSの系統であり、文化の違いでもあります。これらは関数レベルでも違いがありますがLinuxをはじめとした最近のUnix系OSは両方をサポートしています。
私たちプログラマが直接これらを意識するのは、manの"準拠"(英語では"CONFORMING TO")セクションでしょう。
ここを見れば、ある関数が準拠している規格で汎用性があるかが判断できます。


ANSI/ISO C

K&R、C89、C99等のC言語そのものの規格です。これらは環境に依存せず大抵の条件下で動作します。
ISOとANSIが共同で規格を決めています。日本ではこれらの規格をJIS(日本工業規格)が翻訳したバージョンの規格があります。
これらの規格書は購入することができます。JISからX3010で検索すれば出てきます。現在で14,280円だそうです。
ちなみに、C++など他の言語の規格もあります。興味のある方は読んでみるのも良いでしょう。

C言語のバイブルでしょう。C言語プログラマならば一度は読むべき本でしょう。


POSIX

Portable Operating System Interfaceの略で、各種Unix系OSで共通のAPIを決めて移植性の高いアプリケーションを開発できる事を目的として決められました。
ここで言うAPIはカーネル(OS)が提供するC言語の関数ですが、それ以外にもプロセス、スレッドやファイルシステムからエディタまで、様々な分野に及びます。
これにより、1つのプログラムが色々なUNIX系OSで修正なしに動くようになりました。POSIXが出来る以前はユーザがプログラムを修正するのは珍しくなかったようです。
LinuxはPOSIXにほぼ準拠していますがPOSIXを取得はしていません。理由はPOSIXを取得する為には膨大な時間とお金がかかるからです。
コスト面の他にもLinuxはオープンソースで開発が続けられているので、現実のユーザに合わせると何かの規格に縛られると開発し辛いからだとも言われています。


SUS

Single UNIX Specificationの略で、正式なUNIX(注:すべて大文字)を名乗る為に守る必要がある規格です。
当然POSIXよりも厳しい規格で、Linuxもちろん、BSDも準拠していません。Mac OS Xは10.5以降から準拠しています。UNIXを個人で欲しいなら今はMacを選択するのが良いでしょう。


SVR(SysV)とBSD

WikiPedia:UNIX戦争と呼ばれていた時代の歴史が作り出したUnix系OSの2つのバージョンです。
これら2つのOSはそれぞれ文化が違い、例えばメモリをコピーする関数にも違いがありSVR系はmemcpy(3)をBSD系はbcopy(3)を作り出しました。
他にはシグナルの動作の違い等様々な違いを生みだしますが、現在はこれらの争いは過去の物となり大体のOSでSVR、BSDの両方の違いを吸収するように実装されています。


まとめ

いくつか有名な規格を紹介しました。必要以上に気にすることはありませんが、これらの規格の上に現在の開発しやすい環境があります。
機会があればWikiPediaのいくつかの記事等を見てUnixの歴史を知るのも楽しいかもしれません。