最初のCコンパイラ:業界を生み出したデニス・リッチーの遺産コードを振り返る

BigGo Editorial Team
最初のCコンパイラ:業界を生み出したデニス・リッチーの遺産コードを振り返る

1970年代初頭に Dennis Ritchie(dmrとして知られる)によって書かれた最初のCコンパイラは、プログラマーやコンピュータ科学者にとって興味深い歴史的遺物となっています。現在 legacy-cc リポジトリに保存されているこの原始的なコードは、後に兆ドル規模の産業へと成長する謙虚な始まりを垣間見せてくれます。

コンパイルできないコンパイラ

このリポジトリには、1972年頃にさかのぼる最も初期のバージョンのCコンパイラが含まれています。興味深いことに、これらのソースファイルは GCC のような現代のCコンパイラではコンパイルできません。この歴史的なコードはプログラミング言語開発の過渡期を表しており、複数のコメンテーターが指摘しているように、最初のCコンパイラは実際にはB言語で書かれ、コードベースが徐々に反復的な変更を経て、現在私たちが認識するCへと進化していきました。

「おそらく私が今まで見た中で最も好きなソフトウェアの一つです。これから多くのことを学びました!」

別の時代の構文

このコードは、初期のCと現代のCの間に顕著な違いを明らかにしています。あるコメンテーターは、extern や auto などのキーワードの珍しい使用法を強調しました - これらの用語は現代のCにも存在しますが、今日では異なる機能を持っています。これらの初期のファイルでは、extern は関数スコープにグローバルシンボルを取り込むために使用され、すべてが明示的な宣言なしで int 型をデフォルトとしていました。配列宣言では、サイズを指定するものもあれば指定しないものもあり、サイズのない配列は本質的にポインタとして機能していました。

この構文は、多くの人が K&R C(Kernighan and Ritchie C)と呼ぶものを表しており、現在ほとんどのプログラマーが認識する標準化された ANSI C/C89 よりも前のものです。数十年前に非推奨となったにもかかわらず、このスタイルは比較的最近まで GCC で -traditional フラグを使用してサポートされていました。

レガシーccに関する重要情報

  • オリジナルの作者: Dennis Ritchie (dmr)
  • 時代: 1972年頃
  • ハードウェア: PDP-11向けに開発
  • 注目すべき特徴:
    • K&R スタイルの関数宣言
    • デフォルトの "int" 型
    • 特殊なメモリ管理技術
    • 2段階のコンパイラ設計

役立つリソース

創造的なメモリ管理

おそらくコードベースの中で最も興味深い側面は、waste() という関数で、これはかなりの議論を引き起こしています。この関数は、再帰的な自己呼び出しによって意図的にスペースを消費しているように見えます:

waste()  /* waste space */
{
 waste(waste(waste),waste(waste),waste(waste));
 waste(waste(waste),waste(waste),waste(waste));
 ...
}

簡潔なコメントは単に「waste space」と述べていますが、コミュニティの分析によれば、これは実際にはメモリを確保するための巧妙な技術でした。あるコメンテーターは、両方のコンパイラフェーズがこのアプローチを使用して、予約されたメモリ領域がフェーズ間で同じアドレスを持つことを確保し、ポインタを持つ式ツリーをフェーズ間で効率的に渡すことができるようにしていたと説明しました。これは、当時のハードウェアの制限により、プログラマーが今日の基準では奇妙に思えるかもしれない創造的な解決策を開発せざるを得なかったことを示しています。

歴史的影響

このコードの重要性は、その技術的な珍しさをはるかに超えています。あるコメンテーターが指摘したように、Oracle Database の最初に公開されたバージョン(1979年にリリースされたv2)は PDP-11 向けのアセンブリで書かれていました。Oracle が後にクロスプラットフォームの移植性のためにバージョン3(1983年)をCで書き直したとき、メインフレームにはCコンパイラがないことに気づきました。彼らはデータベースを COBOL や他のメインフレーム言語で書き直す代わりに、メインフレーム用の独自のCコンパイラを作成しました。

このパターンは業界全体で繰り返され、Cはシステムプログラミングの共通言語となり、多様なハードウェアプラットフォーム間でのソフトウェアの移植性を可能にしました。C言語と並行して開発された UNIX オペレーティングシステム自体が、1980年までに IBM の System/370 メインフレームに移植されていました。

シンプルさと複雑さに関する考察

このリポジトリは、Cの性質についての思慮深い議論を促しています。多くのプログラマーはCの明らかなシンプルさを評価していますが、いくつかのコメンテーターは、このシンプルさがある程度幻想的であると指摘しています。言語は小さくハードウェアに近いかもしれませんが、暗黙的な型変換、エイリアシングルール、メモリ管理要件を通じて重要な意味的複雑さを含んでいます。

あるコメンテーターが雄弁に述べたように、Cは小さいが、単純ではない。その認識されるシンプルさは、言語自体が実装や完全に理解するのが簡単であることからではなく、強力な抽象化を制限することでプログラムをシンプルに保つことを強制することから来ています。

この歴史的なコードを見ることで、コンピューティングがどれだけ進化したかについての貴重な視点が得られると同時に、最も洗練された現代のシステムでさえ、これらの謙虚な始まりにそのルーツをたどることができることを思い出させてくれます。legacy-cc リポジトリは、一人の優れた頭脳によって作成された比較的小さなソフトウェアが、数十年にわたる技術的進歩の基礎を築くことができたことの証となっています。

参照: legacy-cc