C言語はなぜ廃れないか

昨年暮マイクロソフトはC++、 Javaに代わる新しいプログラミング言語としてのC#言語を発表した。 C#は、マイクロソフトが今後提唱していく .NET (ドットネット)の中核を担う言語になるという。

一方で、Linuxやその他のオープンソースプロダクトなど、 いまだC言語で記述されているプロジェクトは多い。 C++、Java、perl、ruby … などいわゆる高級言語とされているプログラミング言語花盛りのなかで、 ことシステム記述言語としてC言語が現役の座を譲らないその理由は何だろう。

高級言語のもたらしたもの

Cは1970年代前半に開発された、 いまとなっては相当歴史を持つプログラミング言語である。 今日までの積み重ねにより、 膨大な開発者の数に支えられていることが主たる要因のひとつであることはもっともだろうが、 今日のCの稼働率ははたしてそれだけの理由だろうか。

Cの誕生から今日まで、Cを改良したC++、 あらゆるプラットフォームで実行できることを理想として掲げた Java など、 様々な高級言語が提案されてきた。 これらにはそれなりに流行しているものもあれば、 いまとなっては廃れてしまったものもある (参考として代表的なプログラミング言語を末尾に挙げておいた)。

現代的なプログラミング言語には、 ひとつのキーワードとしてオブジェクト指向の概念が必須のものとなっている。 その他にも、ガベージコレクションなど動的なメモリ管理や、スレッド処理、 エラー処理のための構文など、様々な工夫が採り入れられている。 しかしこれらの機能は、本来のCには無い。

新たな言語の問題点

プログラミング言語それ自身の研究が進み、 新たな言語には様々な機能が追加されてきたにもかかわらず、 Cにとって代わるだけの言語が現れていないのは何故だろうか。

・理解の難しさ

まずC言語には非常にシンプルであるという利点がある。 C++ や Java で開発を始めるまえに、 オブジェクト指向の理解でつまずくプログラマもいることだろう。 プログラミングの手始めとしてはCはとっつきやすいプログラム言語である。

もっともCも使いこなすためには技術が必要だ。熟練のプログラマであれば、 Cをオブジェクト指向的に記述することも可能である。 また様々なライブラリを活用して新言語と同等の機能を活用することもできる。

・言語実装の不具合

Cは他の言語に比べればかなり低レベルな言語である。 他の高級言語では、より抽象度を高めてその記述を人間のロジックに近づけている。 ところがそこにバグが入り込む余地が生じているのである。

例えばJavaや Visual Basic などで開発をしていると、 プログラミングではどうにも避けられない問題点にぶつかることがある。 調べてみると、言語のバグリストに載っていたりしてがっかりする。

オープンソースの言語処理系であればまだ手の出しようがあるが、 一般にはブラックボックス化されていることも多く、 不具合の修正は諦めざるをえない。 上記のようにバグレポートが既にあればまだマシなほうかもしれない。 不幸にも新たなバグであったとすると、 それを回避する手だてとしては、 言語ベンダにバグレポートを送り修正を願うのみだ。

・いろいろな制限

現在はJITやHotSpotといった様々な新技術によってだいぶ改善されてきてはいるが、 Javaが当初から懸念されていたのはその実行の速度である。 またiアプリとして携帯電話に搭載されるJavaも、 ハードウェアの制約もありかなりの制限が加えられている。

Cであれば、 アプリケーション性能はほとんどハードウェアの制限に近いところまでチューニングすることが可能である。 しかしその他の言語では、その言語の抽象度が高いほど、 プログラミングの容易さと引替えに各種の制限を我慢しなければならなくなっている。

これもブラックボックス化の弊害のひとつといえよう。

実はオペレーティングシステムも

さていままでの話は実はオペレーティングシステム(OS)についても同じことがいえる。 プログラミング言語とOSはコンピュータの両輪として情報処理のインフラを提供する。

問題が多いインフラの上では真に良いものは産まれない、 ということを、情報処理技術開発者のひとりとして昨今は切に感じている。 OSや言語などプラットフォームを提供するベンダには、更なる奮起を期待したい。

多機能で不確実な実装は、もうそろそろ勘弁願いたい。 シンプルかつ確実な、力強い言語とOSを望むところである。