第1回
なんでいまさら「C言語」なのか?――C言語よもやま話

C言語の生い立ち

さて、ここでC言語の生い立ちをざっと紹介しておきましょう。そのためには、Cの母体とも言えるOS・UNIXの誕生について紹介する必要があります。また、Cの先祖とも言えるAlgolという言語のことも紹介するべきでしょう。

UNIXの誕生

UNIXは、1969年にAT&Tベル研究所のK.トンプソンらが開発したミニコンピュータ用のOSです。それまでのコンピュータはいわゆる汎用機(メインフレーム)と呼ばれる大型機で、操作はとても面倒なものでした。

UNIXにはスクリーンエディタ、マルチユーザー・マルチタスク、分散処理ネットワークなどの新しい機能が盛り込まれ、コンピュータの使い方が大きく変わるきっかけとなりました。

さらに1973年、ゼロックス社・パロアルト研究所でアラン・ケイらがAltoというコンピュータを開発し、ワークステーションという『個人で使うコンピュータ』のカテゴリーが生まれると、研究機関ではネットワークで相互に接続されたUNIXの動くワークステーションが使われるようになりました。

Windowsへ Mac OSへ

その後UNIXの考え方は、パソコンにも受け継がれました。マイクロソフト社がIBM社のPC用に開発したOS・PC-DOS(MS-DOS)は、バージョン2以降、階層ディレクトリ構造、リダイレクト、パイプなどUNIXの考え方を取り入れました。

Apple社のMacintosh(Mac)に搭載されているMac OSも、Altoから始まるワークステーションのGUIを取り入れ、それがまたマイクロソフト社のWindowsにも影響を及ぼし……という一連の流れは、ご存知の方も多いでしょう ※12

現在のMac OSXは、カリフォルニア大学バークレー校で開発されたバークレー版UNIX──BSD(Berkeley Software Distribution)をベースとしています。

米国のケーブルテレビ・TNTが製作したテレビドラマ「バトル・オフ・シリコンバレー」(1999年、米、マーティン・バーク監督、原題は“PIRATES OF SILICON VALLEY”)に、両社の確執が描かれています。日本では、「ジョブスとゲイツ/シリコンバレーの青き炎」というタイトルで衛星放送のWOWWOWが放映しました。ビデオはワーナーホームビデオから販売されていますが、レンタルのみで一般市販はされていません。レンタルショップで探してみてください

C言語の誕生

C言語は、DEC社のミニコンピュータPDP-11で動くUNIXの汎用言語として、1972年にAT&Tベル研究所のD.M.リッチーが開発しました。

ベースとなったのはAlgol68という言語で、さらにそのベースは1950年代の終わり頃に生まれたAlgolという言語です。1950年代当時の主力プログラミング言語だったFORTRANは、数学的な計算処理には最適でした。が、時代と共にコンピュータを単なる高速計算装置ではなく、論理を扱って問題を解決する思考装置とする考え方が沸き起こってきました。

この発想は米国よりヨーロッパで顕著で、コンピュータに扱わせる問題をアルゴリズムとして記述する手法が研究されていました。後に米国でも同様の研究が始まり、米欧の研究組織が合体したI.A.L.(International Algebraic Language)委員会が、同名のI.A.L.という言語を開発し、後にAlgol58と呼ばれることになります。Algolとは“ALGOristic Language”から付けられた名前です。

Algolは手続き型言語の始祖

論理的な問題をプログラムとして記述するためには、まず処理自体の論理構造がしっかりしていなくてはなりません。そのためプログラマーは、分類・整理された現実の事象とそれらに対する扱い方とを、個別の処理単位として括り出す必要があります。

つまり、プログラムの構造化です。Algol58は構造化言語、手続き型言語の始祖と言えます。

時を経てこの言語は改良を施され、Alogol60、Algol68と進化していきました。Algol68は、整数型(int)、論理型(bool)などの他に複素数型(compl)、書式型(format)など多数のデータ型、さらに構造体(struct)、共用体(union)、ポインタ(ref)などのデータ構造を定義できる機能、caseによる条件判断と分岐、whileとforによる繰り返し構造など、まさにCのルーツと言える強力な機能を備えていました。

また、数式の記述を意識したFORTRANや文書性を重視したCOBOLとは異なり、Algol系の言語は大文字と小文字の混在を許し、記号的な記述のできることも大きな特徴でした。その他、I.A.Lでは表だって論議された訳ではないのですが、手続き型言語の仕様として手続きの『再帰呼び出し』 ※13 が可能だったことも特筆すべきです。

ある完結した処理がその内部で自分自身を呼び出す構造。階乗の計算やアッカーマン関数(自動車が旋回する際の左右前輪の切れ角の違いを計算する関数)が代表的

「C」という名称

1963年、Algol60をベースに研究用の言語仕様としてCPL(Combined Programming Language)という言語が考案されました。記号的で簡潔に論理を記述できる言語です。4年後の1967年、M.リチャーズはCPLの“言語的な優美さ”を受け継ぎつつ、コンパイラを作るための言語BCPLを開発します。名前の由来は“Basic CPL”です。

1970年、K.トンプソンはBCPLを元にして、DEC社のPDP-7用の言語“B”を開発します。C言語は、この“B”に、Alogol68の制御構造とデータ型の概念を加えた言語です。名前の由来は「Bの次だからC」ということだそうです(なんとまぁ、名前までシンプルなこと……)。

関数から関数を呼び出す言語

Cは『関数の中から関数を呼び出す』という形でプログラムを組み上げていく言語です。従って、プログラムは関数の集合となります。入出力や数値演算などの基本的な機能も、すべて関数のライブラリという形で提供されます。

従来の高級言語では、求められる様々な処理のために多数の命令語が存在します。が、C言語にはごくわずかなキーワードとそれに付随する記述規則があるだけです。他の言語の命令語に相当するもののほとんどは、標準ライブラリに含まれる標準関数でまかなわれます。

標準関数は単に『予め用意された関数』というだけであって、プログラマーが必要に応じて作成した関数と何ら変わりません。処理系に備わっている標準関数も、プログラマーが作った汎用的な関数も、まったく同じ扱いを受けます。

CとPascalは兄弟

C言語の基礎をマスターするために覚えなければならないキーワードは、従ってごくわずかです。但し、演算子の種類は少なくありません。豊富な演算子によって、ソースの記号的・抽象的な記述が可能になっています。

また、#記号を使ったプリプロセッサ指令により、他のソースファイルの取り込みやマクロ定義などが簡単に記述できる点も特徴的です。

これらについて、具体的には回を追って紹介しましょう。C言語の演算子は一見簡単そうで案外難しかったりします。でも、そこがまた面白いところでもあります。

同じAlgol系の言語から生まれた言語にPascalがあります。CとPascalは兄弟と言ってもいいでしょう。

Pascalはプログラミング教育のために考案されたため、ソースコードの記述規則が非常に厳密です。一方C言語は、ソースの読みやすさや数学的な厳密さといった側面より、簡潔な記述と効率的なコード生成の方が重視されています ※14

PascalとCの関係を見ていると、真面目な大学教授の兄とコメディアン出身の映画監督である弟を連想してしまいます。KITANO-BLUEはきれいです

UNIXを書いた言語

1973年、改良を重ねられたC言語によって、UNIXのカーネル(中枢部分)やシェル(ユーザー・インターフェイス部分)が書き直されました。遂にCは、自分自身を生んだOSを書き直したのです。

こうしてUNIX version.4が誕生し、C言語は“UNIXの標準開発言語”となったと同時に“OSも書ける柔軟な言語”としての地位を固めることになりました。

1978年にはD.リッチーとB.カーニハンによっていわゆる“K&R”(日本語版は「プログラミング言語C」石田晴久 訳/共立出版 刊)が著され、1989年にANSI、1990年にISO――と、C言語は標準化の道をたどりました。現在、スーパーコンピュータからパソコンまで、あらゆるコンピュータ上のOSに移植されているのはご存知の通りです。

あとがき

さて、次回からコンソールモードを前提として、C言語の入門から高度な処理までを紹介していきます。その目的は単にC言語を覚えることではなく、Cによる基本的なプログラミングを出発点として、Windowsプログラミングやオブジェクト指向の理解へとつなげていくことです。

既にVisual C++やVisual Basicを使いこなしている人も、おさらいのつもりで読んでみてください。忘れていたことを思い出したり、意外な発見があったりするかもしれません。

参考文献:ソフトウェアの20世紀(長谷川裕行 著/翔泳社 刊)