ここまでの5章で、私たちは多くの言語を訪ねてきました。本章では一歩引いて、それらが互いにどう影響し合い、 一本の大きな「系統樹(genealogy)」を成しているのかを俯瞰します。言語は決して孤立して生まれません。 必ず祖先から文法・思想・機能を受け継ぎ、ときに複数の系統を交配させて誕生します。系統樹を読めるようになると、 「なぜこの言語はこう設計されたのか」という問いに、自分で答えられるようになります。
4つの大きな家系
膨大な言語たちは、大まかに4つの家系に整理できます。もちろん現実の言語は複数の家系から influence を受けるため 分類には恣意性が伴いますが、地図としては極めて有用です。
| 家系 | 祖 | 特徴 | 主な子孫 |
|---|---|---|---|
| ALGOL系 | ALGOL 60 | ブロック構造・構造化・手続き型の祖父 | Pascal, C, PL/I, Simula |
| C系 | C (1972) | 中括弧 {} の構文、効率、システム志向 | C++, Java, C#, JavaScript, Go |
| LISP/ML系 | LISP, ML | 関数型、型推論、記号処理 | Scheme, Haskell, OCaml, F#, Clojure |
| スクリプト系 | Perl ほか | 動的型、軽量、テキスト処理・Web | PHP, Ruby, Python(多源流) |
注目すべきは、ALGOL 60が「ファミリーツリーの祖父」と呼ばれること(第2章)。
ALGOLのブロック構造が CPL → BCPL → B → C という直系を生み、そのCが
C++・Java・C#・JavaScript・Goという「中括弧の大帝国」を築きました。私たちが日常的に書く
{ } で囲むあの構文は、半世紀以上前のALGOLにルーツを持つのです。
graph TD AL[ALGOL 60\n1960] CPL[CPL/BCPL/B\n1960s] C[C\n1972] CPP[C++\n1985] JAVA[Java\n1995] JS[JavaScript\n1995] CS[C#\n2000] GO[Go\n2009] SIM[Simula 67] PAS[Pascal\n1970] LISP[LISP\n1958] ML[ML\n1973] HS[Haskell\n1990] SCHEME[Scheme] SELF[Self\nプロトタイプ] AL --> CPL AL --> PAS AL --> SIM CPL --> C C --> CPP SIM --> CPP CPP --> JAVA CPP --> CS JAVA --> CS C --> GO SCHEME --> JS SELF --> JS JAVA --> JS LISP --> SCHEME LISP --> ML ML --> HS style AL fill:#f97316,stroke:#ea580c,color:#fff style C fill:#3b82f6,stroke:#1d4ed8,color:#fff style LISP fill:#8b5cf6,stroke:#6d28d9,color:#fff style JS fill:#22c55e,stroke:#15803d,color:#fff
交配種としての言語 — 3つの実例
系統樹の面白さは、多くの名言語が複数の系統の「いいとこ取り」として生まれている点にあります。 影響関係を知ると、その言語の一見奇妙な設計判断が腑に落ちます。
JavaScript — 3つの血を引く混血児
第7章で詳述しますが、JavaScript(1995, ブレンダン・アイク)は3つの系統の合成です—— Schemeから第一級関数とクロージャ、Selfからプロトタイプベースの継承、 そしてJavaから中括弧の構文。アイクは当初ブラウザに「Schemeを載せる」つもりでしたが、 経営陣が当時流行のJavaに似せることを要求しました。結果、「機能はScheme的、オブジェクトモデルはSelf的、 見た目はJava的」という、世界一普及した混血言語が生まれたのです。JavaScriptの「関数が第一級で、 クラスより柔軟」という特徴は、Scheme/Selfの血筋を知ると納得できます。
Go — C++への不満から生まれた「引き算」の言語
Go(2009, Google)は、ロブ・パイク、ケン・トンプソン(B/Cの開発者!)、ロバート・グリーズマーが設計しました。 動機は明快で、肥大化したC++のコンパイルの遅さと複雑さへの不満でした。彼らは「Python並みに読みやすく、 C++並みに速く、現代的な並行処理(goroutine)を持つ」言語を目指し、あえて機能を削ぎ落としました。 Goにジェネリクスが長らく入らなかったり、継承がなかったりするのは、「単純さこそ正義」という設計哲学の表れです。 C系の血を引きながら、C++とは正反対の「引き算」の思想を選んだのです。
TypeScript — JavaScriptの「大人版」
TypeScript(2012, Microsoft)を設計したのは、なんとC#の生みの親アンダース・ヘルスバーグでした。 動的型のJavaScriptは小規模には快適でも、大規模開発では型の欠如が破綻を招く。ヘルスバーグは長年の言語設計の知見を活かし、 JavaScriptに静的型を後付けする「厳密なスーパーセット」(有効なJSは有効なTS)を設計しました。 C#譲りの強力な型システムが、JavaScriptの世界に持ち込まれたわけです。
10年ごとの主役たち
系統樹を時間軸で切ると、各10年に登場した代表的な言語が見えてきます。
| 年代 | 登場した代表言語 | この時代のテーマ |
|---|---|---|
| 1950s | FORTRAN, LISP, COBOL, ALGOL | 高水準言語の誕生(4つの源流) |
| 1960s | BASIC, Simula 67, BCPL | OOPの萌芽、教育用言語 |
| 1970s | Pascal, C, Smalltalk, Prolog, ML, SQL | 構造化・OOP・関数型・宣言型が出揃う |
| 1980s | C++, Objective-C, Perl, Erlang | OOPの実用化、スクリプトの萌芽 |
| 1990s | Python, Ruby, Java, JavaScript, PHP, Haskell | インターネットとスクリプトの爆発 |
| 2000s | C#, Scala, F#, Go, Clojure | 企業言語、関数型の主流回帰、並行性 |
| 2010s | Rust, Kotlin, TypeScript, Swift | メモリ安全・型安全・モダン化 |
なぜ言語は廃れるのか — 3つの運命
系統樹には、栄える枝もあれば枯れる枝もあります。言語の生死を分けるのは、技術的な優劣だけではありません。 キラードメイン(その言語が独占する用途)、エコシステム、企業バックアップ——この3つが鍵です。 3つの対照的な運命を見てみましょう。
| 言語 | 運命 | 理由 |
|---|---|---|
| COBOL | 不滅のレガシー | 銀行・行政システムに深く根を張り、書き換えコストが莫大。ATM取引の多くを今も支える |
| Pascal | 緩やかな衰退 | C/C++のOOP・効率に押され、近代開発のエコシステムを築けなかった(教育・Delphi系で残存) |
| Perl | 急速な凋落 | Perl 6の開発が15年も難航。その間にユーザーがPython/Ruby/PHPへ流出 |
ALGOL 60 = 祖父
ブロック構造がCPL→BCPL→B→Cの直系を生み、中括弧帝国の源流に
C = 中括弧帝国の始祖
C++・Java・C#・JavaScript・Goへ。構文と思想を最も広く残した言語
JavaScript = 混血児
Scheme+Self+Javaの合成。複数系統の交配が世界一の普及言語を生んだ
Go = 引き算の設計
C設計者らがC++の複雑さへの反動として「単純さ」を選択
TypeScript = JSの大人版
C#のヘルスバーグがJSに静的型を後付け。系統樹は設計者でもつながる
Perl 6 → Raku 改名
15年の難産の末、王者Perlは凋落。言語の生死は技術だけでは決まらない
系統樹は単なる「先祖探し」ではありません。それは「この言語はどんな問題を解こうとして、何を受け継ぎ、何を捨てたのか」を 読み解く地図です。次章では、この系統樹のなかでも特に劇的な「1990年代のスクリプト言語大爆発」—— Python・Ruby・Java・JavaScript・PHPがなぜ同じ数年間に集中して生まれたのか——にズームインします。
理解度チェック
「プログラミング言語ファミリーツリーの祖父」と呼ばれ、ブロック構造を通じてC系の大帝国の源流となった言語はどれですか?
キーボード: 1〜4 で選択、Enter で回答