ここまでの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
プログラミング言語の系統樹(簡略版)。ALGOL 60を祖父に、C系の大帝国とLISP/ML系の関数型が広がる。JavaScriptは複数系統の交配種

交配種としての言語 — 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がなぜ同じ数年間に集中して生まれたのか——にズームインします。

理解度チェック

問題 0 / 50%
Q1

「プログラミング言語ファミリーツリーの祖父」と呼ばれ、ブロック構造を通じてC系の大帝国の源流となった言語はどれですか?

キーボード: 1〜4 で選択、Enter で回答