Cは世界で最も人気のあるプログラミング言語の1つです。1969年から1973年にかけて、AT&T Bell LabsでDennis Ritchieによって最初に開発されました。それ以来、Cを使って何千ものプロジェクトが開発されてきました。オペレーティングシステム、組み込みアプリケーション、ゲーム開発、画像処理、ワープロ、データベースエンジンなど、あらゆる種類のアプリケーションで使用されています。
他のほとんどの言語は長年にわたって大きく進化してきましたが、Cは必ずしもそうではありません。たとえば、 C11標準 でも、Cへ多くの新機能が追加されたわけではなく、いくつかの修正が導入されただけでした。
誕生から50年が経過しても、C言語がこれほど人気であり続ける理由は何でしょうか?
I. 言語の安定性
1990年に戻る:Microsoft Word初期の時代
当時の開発者は、一般的なパーソナルコンピュータが8MHzプロセッサ、1メガバイトのメモリ、20メガバイトのハードディスク、フロッピーディスクドライブを搭載していた時代を覚えています。ワープロアプリケーションを開発することは大きな挑戦でした。
Microsoftは最近、「Microsoft Word 1.1」のソースコードを公開しました。公開先は コンピュータ歴史博物館です。そのソースコードは、調べる価値が十分にあります。25年前に書かれたものですが、現在でも非常に興味深い技術を学ぶことができます。
そのソースコードからのコードスニペットは次のとおりです:

ご覧のとおり、この関数はK&Rスタイルで宣言されています。すべての関数が同じスタイルを使用しています。
「Microsoft Word 1.1」のソースファイルを調べると、興味深いことが分かります。最近のプロジェクトで使用されている技術は、「Microsoft Word 1.1」の実装で使われていた技術と大きく変わらないのです。
例として、次のソースコードを見てみましょう:

このコードは、最近GitHubで作成されたCプロジェクトのもののように見えます。25年前のコードであることを示す兆候はありません。
1994年はLinux初版リリースの年
1994年3月14日、Linux 1.0.0がリリースされました。開発は1991年に始まりました。Linus Torvaldsと他のすべての貢献者に感謝します。この最初のバージョンのソースコードは、 こちら。
sched.cソースファイルからのコードスニペットは次のとおりです:

Linuxカーネルバージョン1と最新バージョンのソースファイルを調べると、驚くほど似ていることが分かります。スタイルや使用されている技術に大きな変化はありません。最初から、コードはシンプルでクリーン、そして基本的なものでした。
II. 基本的な機構
モジュール性
モジュール性は、ソフトウェアが独立した部分で構成される度合いを高めるソフトウェア設計技法です。モジュール化されたコードは、一般的に管理・保守が容易です。
名前空間、コンポーネント、クラスなどの論理的な仕組みが存在しないCのような手続き型言語では、ディレクトリとファイルを使用してモジュール化できます。
考えられるシナリオは次のとおりです:
- すべてのソースファイルを1つのディレクトリに配置する。
- モジュールまたはサブモジュールに関連するファイルを特定のディレクトリへ分離する。
たとえば、Linuxカーネルでは、カーネルソースコードをモジュール化するためにディレクトリとサブディレクトリが使用されています。

カプセル化
カプセル化は、実装内部の関数とデータを隠蔽することです。Cでは、staticキーワードを使用してカプセル化を行います。これらのエンティティは、ファイルスコープの関数と変数と呼ばれます。
次の CQLinq クエリを実行して、すべての静的関数を検索してみましょう。

メトリクスビューを使うと、どれほど多くの関数が該当するかをよく把握できます。メトリクスビューでは、コードベースがツリーマップで表現されます。ツリーマッピングは、入れ子になった長方形を使ってツリー構造のデータを表示する方法です。 CppDepend のツリーマップで使用されるツリー構造は、通常のコード階層です:
- プロジェクトにはディレクトリが含まれる。
- ディレクトリにはファイルが含まれる。
- ファイルには構造体、関数、変数が含まれる。
ツリーマップビューは、CQLinqクエリの結果を表現する便利な方法を提供し、クエリ対象の型を視覚的に確認できます。

ご覧のとおり、多くの関数がstaticとして宣言されています。
次に、静的フィールドを検索してみましょう:

関数と同じことが変数にも言えます。多くの変数がstaticとして宣言されています。
Linuxカーネルのソースコードでは、関数と変数をファイルスコープ内で非公開にする必要がある場合には、常にカプセル化が使用されています。
結論
古いCプロジェクトを簡単に振り返った後では、現代的なCプロジェクトと比較して、実装技術がほとんど変わっていないことが分かります。
Cの強みの1つは、長年にわたる安定性です。比較的シンプルな言語であり続け、導入された高度な機構は少なく、そのコードは今でも理解・保守が簡単です。
