プログラミング言語の系統樹(言語の派生図)
なぜこの言語はこう書くのか、が腑に落ちる。ALGOL・Lisp・C・Smalltalk の4祖から主要言語へ続く影響関係を、年代と分岐つきの系統図として俯瞰します。
- 1.現代の主要言語の大半は ALGOL・Lisp・C・Smalltalk の4系統に源流をたどれ、各祖が異なる設計思想(ブロック構造・第一級関数・低水準制御・メッセージ送信)を継承させた。
- 2.系統は厳密な「親子」ではなく多重継承で、C++ や Python のように複数の祖から思想を取り込むハイブリッドが現代の主流。
- 3.言語の文法や型の癖は偶然ではなく、どの祖から何を受け継いだかで説明でき、新言語の学習コストの当たりもつけられる。
なぜ「系統樹」で言語を見るのか
新しい言語を学ぶとき、文法を丸暗記するより「どの系統に属し、何を受け継いだか」を押さえる方が速く理解できます。生物の系統樹と同じく、言語にも祖(共通祖先)から派生した影響関係があり、似た特徴を共有するグループが存在するからです。
ただし重要な前提があります。言語の系統は生物のような単一の親子関係ではなく、**多重継承(複数の祖から思想を取り込む)**が普通です。C++ は C の構文と Simula のクラスを、Python は ALGOL 系の構文と Lisp 系の高階関数を同時に継承しました。したがって「系統樹」は厳密な木ではなく、**有向グラフ(影響の矢印が交差する図)**として捉えるのが正確です。
4つの祖と継承された設計思想
現代の主要言語をたどると、源流は概ね次の4本に収束します。各祖が「何を発明し、後世に何を残したか」を押さえることが、系統理解の核心です。
| 祖 | 登場 | 中心思想 | 後世に残した核 |
|---|---|---|---|
| ALGOL | 1958/1960 | ブロック構造と構造化 | begin–end ブロック、字句スコープ、再帰、構文の数学的定義(BNF) |
| Lisp | 1958 | コードもデータ(同図像性) | 第一級関数、ガベージコレクション、再帰、リスト処理、マクロ |
| C | 1972 | ハードウェアに近い手続き型 | ポインタ、明示的メモリ管理、移植性の高い低水準制御、C系の波括弧構文 |
| Smalltalk | 1972/1980 | 純粋オブジェクト指向 | すべてがオブジェクト、メッセージ送信、動的ディスパッチ、IDE/GC一体の環境 |
ALGOL は今日では使われませんが、**字句スコープ(変数が見える範囲をソースの構造で決める)**や if/while/for を持つ「普通の手続き型構文」の原型を作りました。私たちが当たり前と思う制御構文の多くは ALGOL の子孫です。詳しくは変数のスコープとクロージャも参照してください。
系統別の主要な派生(年代付き)
源流ごとに、代表的な派生を年代順に並べます。矢印(→)は「強い影響を受けた」を意味し、複数祖からの合流は併記します。
ALGOL 系(手続き型・構造化の本流)
ALGOL 60 (1960)
→ Pascal (1970) 教育向け・厳格な型
→ CPL (1963) → BCPL (1967) → B (1969) → C (1972)
→ Simula 67 (1967) クラスとオブジェクトを世界初導入
→ Ada (1983) 大規模・安全性重視
ここで見落とせないのが Simula 67 です。Simula は ALGOL を拡張して「クラス」「オブジェクト」「継承」を初めて言語機能化し、C++ のクラス設計の直接の祖(さらに C++ を介して Java の OOP の源流)になりました。OOP の源流は Smalltalk「だけ」ではなく、Simula 系(型付き静的 OOP)と Smalltalk 系(動的 OOP)の2系統がある点が上級者の要注意ポイントです。
C 系(システム言語と波括弧の覇権)
C (1972)
→ C++ (1985) C + Simula のクラス → 静的OOP
→ Objective-C (1984) C + Smalltalk のメッセージ送信
→ Java (1995) C++構文 + GC + VM + 単一継承
→ C# (2000) Java系 + .NET、後に関数型機能を吸収
→ JavaScript (1995) C系構文 + Scheme(Lisp)の関数 + Selfのプロトタイプ
→ Go (2009) C系 + Pascal系の簡潔さ + CSP並行
C++ と Objective-C は、どちらも「C に OOP を足す」という同じ目的に対し、継承元の祖が違うために性格が正反対になった好例です。C++ は Simula 由来の静的なクラス、Objective-C は Smalltalk 由来の動的メッセージ送信を採りました。型の静的/動的の違いについては型システムが詳しいです。
Lisp 系(関数型と「コードはデータ」)
Lisp (1958)
→ Scheme (1975) 字句スコープを徹底した極小Lisp
→ Common Lisp (1984) 実用大規模Lisp
→ ML (1973) → Haskell (1990) 静的型 + 純粋関数型
→ Clojure (2007) JVM上のLisp、不変データ重視
Lisp はガベージコレクションと第一級関数を世界で初めて実装した言語で、これらは今やほぼ全言語が継承しています(ガベージコレクション参照)。ML 系で生まれた Hindley–Milner 型推論(型注釈なしで型を自動決定する仕組み)は、後に Rust や Swift、TypeScript の型推論へ流れ込みました。不変性を核に据える設計はイミュータビリティで扱う思想と直結します。
Smalltalk 系(純粋OOPと動的環境)
Smalltalk (1980)
→ Objective-C (1984) メッセージ送信構文をCへ移植
→ Ruby (1995) Smalltalkの純粋OOP + Perlの実用性
→ Python (1991) ALGOL系構文 + Lisp系高階関数 + 動的OOP
Smalltalk の「すべてがオブジェクト・すべてはメッセージ送信」という思想は、Ruby に最も純粋な形で受け継がれました。Ruby で 3.times { ... } のように数値さえメソッドを持つのは、この系統の刻印です。
ハイブリッドが主流になった現代
2000年代以降の主要言語は、ほぼ例外なく複数祖のハイブリッドです。たとえば Scala は「C/Java系の静的型 OOP」と「Haskell系の関数型」を融合し、Rust は「C系の低水準制御」「ML系の型推論と代数的データ型」「所有権という独自概念」を組み合わせています。系統樹の末端ほど枝が合流する、と理解しておくと混乱しません。
この合流を、設計思想の継承という観点で整理すると次のようになります。
| 言語 | 主に継承した祖 | 受け継いだ核となる思想 |
|---|---|---|
| C++ | C + Simula(ALGOL系) | 低水準制御 + 静的クラス、ゼロコスト抽象 |
| Java | C++ + Lisp(GC) | 波括弧構文 + GC + VM移植性、単一継承 |
| Python | ALGOL + Lisp + Smalltalk | 読みやすい構文 + 高階関数 + 動的OOP |
| JavaScript | C + Scheme + Self | C系構文 + クロージャ + プロトタイプ継承 |
| Rust | C + ML | メモリ安全 + 型推論・代数的データ型・所有権 |
JavaScript が「C に似た見た目なのに関数がやたら強力」なのは、構文を C から、関数の扱い(クロージャ・第一級関数)を Scheme から受け継いだ異なる祖の混血だからです。見た目と中身の祖が違うことを知っていると、言語の「意外な挙動」の多くが腑に落ちます。
「OOP を最初に言語機能化したのは?」の答えは Smalltalk ではなく Simula 67 です。Smalltalk は「純粋 OOP(すべてがオブジェクト)」を確立した言語であり、両者の役割を区別できるかが上級者の分かれ目になります。
まとめ:系統を知ると何が得か
言語の文法や型の癖は偶然の産物ではなく、どの祖から何を継承したかでほぼ説明できます。ALGOL は構造化構文を、Lisp は第一級関数と GC を、C は低水準制御を、Smalltalk と Simula は OOP の2系統を残しました。新しい言語に出会ったら「これはどの系統の混血か」を見極めることで、学習すべき勘所と既存知識からの差分が一気に見通せます。系統樹は暗記表ではなく、未知の言語を高速に位置づけるための地図なのです。
プログラミング Article
プログラミング言語の系統樹(言語の派生図)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
言語史
比較で見る軸
難易度: advanced / カテゴリ: プログラミング / タグ数: 4
導入後に効く点
系統は厳密な「親子」ではなく多重継承で、C++ や Python のように複数の祖から思想を取り込むハイブリッドが現代の主流。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- プログラミング
- タグ数
- 4
判断チェックリスト
- 自社の用途が「言語史 / 設計思想」に近いか確認する。
- 強みである「現代の主要言語の大半は ALGOL・Lisp・C・Smalltalk の4系統に源流をたどれ、各祖が異なる設計思想(ブロック構造・第一級関数・低水準制御・メッセージ送信)を継承させた。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。