Javaを中心に偏見ベースでプログラミング言語の関係をまとめた

オブジェクト指向言語の話をするときに便利なように、Javaを中心にプログラミング言語をまとめてみました。
Javaに影響与えるか、Javaから影響を受けるか、という感じですね。

Simula

オブジェクト指向はここから始まったと言われています。 クラス、オブジェクト、継承、仮想関数(多態)といった、オブジェクト指向の基本要素が備わっていました。
ただし、「オブジェクト指向」という言葉は生まれていません。

Smalltalk

Simulaから発想を得て「オブジェクト指向」という言葉を生んだのはアラン・ケイでした。
しかし、モデルとしてはSimulaとは異なりメッセージングを主体としたものでした。また、アラン・ケイの「オブジェクト指向」はプログラミングのパラダイムだけではなく、人がコンピュータをどのように扱うかというメタファであり、ダイナブックというハードウェアやそのユーザーインタフェースを含むものでした。
Smalltalkは、そのような思想でコンピュータを扱うための環境として開発されました。

ここでSmalltalkに関しては3つのバージョンを分けていますが、これは「オブジェクト指向」の源流としてのSmalltalkを扱うときに、バージョン間の変遷が重要になるからです。

メッセージングのオブジェクト指向によるコンピューティングを実現するために開発された最初のバージョンはSmalltalk 72ですが、Smalltalk-76ではSimulaのオブジェクト指向のようなクラスや継承を取り入れています。
そして、Smalltalk-80として商用化され現場のプログラマが使うようになったのですが、このバージョンに関してアラン・ケイは「Smalltalk-80は私の手を離れ、Lisp好きの影響を強く受けてた」のようなことを言ったようです。
https://matz.rubyist.net/20060608.html

また、エンドユーザーではなく開発現場のプログラマが使うようになったことを「Smalltalkの死」とも表現しているようです。
https://sumim.hatenablog.com/entry/20060612/p1

つまり、商用化され広く開発で使われるようになったSmalltalkを「アラン・ケイのオブジェクト指向を実現する言語」というのはあまり適切ではないということです。
C++のオブジェクト指向とSmalltalkのオブジェクト指向は違うといわれることがありますが、GoFの「デザインパターン」がSmalltalkで整理され出版されるときにC++に書き直されたことからわかるよう、両者とも同じ問題が発生し同じく継承を使った解決方法をとることになるくらい似ていたということになります。

C++

C++はCにSimulaのクラスを導入したものです。
詳しくはこちらの本に。

Java

JavaはC++をベースにしたように言われますが、実際にはObjective-Cの後継です。Objective-CにC++の構文を載せた、というのが適切だと思います。
インタフェースはObjective-Cのプロトコルであり、クラスが大文字はじめ、メソッドやフィールドは小文字という命名規約もObjective-Cと同様です。
Objective-CはCにSmalltalkのオブジェクト指向を持ってきたものなので、Javaのオブジェクト指向もSmalltalk由来と言えます。
JavaがC++ではなくObjective-Cの流れであるという話は、Javaの開発者のひとりであるPatrick Naughtonのメールのアーカイブに。
https://web.archive.org/web/20110713014816/http://cs.gmu.edu/~sean/stuff/java-objc.html

JavaScript

クラス、インスタンス、オブジェクトという用語の区別に悩んだことはないでしょうか?「クラスのオブジェクト」と言ったとき、クラスを表すオブジェクトなのかクラスがインスタンス化されたオブジェクトなのか、そもそもこの説明なにいってるかようわからん、になったりしてないでしょうか。
そこで、Smalltalkからオブジェクト指向の発想をえつつ「全部オブジェクトでええやん、新しいオブジェクトを作るときには、プロトタイプになるオブジェクトをコピーすればええやん」という考えのもとSelfという言語ができました。

To make a new object in SELF, an existing object (called the prototype) is simply cloned (shallow-copied)
https://dl.acm.org/doi/pdf/10.1145/74878.74884

そして、インターネットが流行ったときにブラウザの中でプログラムを動かしたいなーとBreandan Eichを呼んできてSchemeを動かさせようとしたところ、当時話題になっていたJavaに似せる必要があるということでSelfのプロトタイプベースのオブジェクト指向を取り込みつつJavaの見た目とライブラリをかぶせてJavaScriptができあがりました。

ライブラリをそのまま移植したため、java.util.Dateの2000年バグまでもってきてしまったと後悔していますね。あとプリミティブも。

JavaScript誕生の話はこちら
https://brendaneich.com/2008/04/popularity/

C♯

C#へと至る道も長いですね。
まずWindows用にDelphiという開発環境がありました。これはPascalという言語にオブジェクト指向をのせたObject Pascalという言語を使っていました。VBのような開発環境ですが、VBよりかなりいいという評判に。
そして、Delphiと同じことをC++でやれるようにと、C++Builderが開発されました。このとき、ボタンのイベントハンドラを登録するときに関数ポインタにイベントの受け取りオブジェクトも結び付ける必要があったため、__closureという拡張が行われています。

さて、そんなところにJavaが流行ってきました。MicrosoftとしてはJavaでWindowsアプリを作れるようにしたい、そこにDelphi/C++Bulderの開発者であるAnders Hejlsbergが、Borlandの開発環境部門廃止で会社を追い出されたので、Javaを拡張してJ++を作ってもらったのでした。この拡張は、C++Builderの__closureをJavaに持ってきたもので、delegateと呼ばれました。
しかし、Write Once Run Anywareを掲げてJavaを作っていたSun Microsystemsはそんな独自拡張を許すわけもなく。
http://web.archive.org/web/20040404002128/http://java.sun.com/docs/white/delegates.html

ということでMicrosoftはJavaを離れ、C#という独自言語を作ったのでした。

PHP

PHPはPHP/FIをもうちょっとちゃんとしてPHP3になったときに流行りました。 そして用途が広まるときにZend社が入ってある程度しっかりしたものにしつつ、オブジェクト指向を取り入れたのがPHP4です。このとき、Javaが超流行ってたため、PHPのオブジェクト指向はJavaの機能を再現した感じになっています。

Scala, Kotlin, Swift

ScalaはJavaの資産を利用しつつ関数型をとりこんで実用的に仕上げた言語です。
Kotlinは歴史の積もったJavaをリセットして現代的につくりなおした言語といえます。

SwiftはObjective-Cの代替として現代的につくりなおされた言語ですね。

と、そんな感じでまとめてみました。

※補足 RubyやPython、RustやGoについては、この図にいれてもどこからも線が引かれないか、「オブジェクト指向の機能あるんだからSimulaかSmalltalkの影響は受けとるやろ」程度のつながりになってそんな面白くないなーとなって載せてないです。GoはCに、RustはC++につなげて「代替したい」くらいの関係に・・・(あとJavaとつなげて「反面教師」ってやるか)
あと、いろいろ掘り出せば際限ないので、Tiobe index20位、せめて50位に入る程度にメジャーなものってやるとGroovyやClosureは外れて・・・。オブジェクト指向の話としてそんなに発展もないし。
※追記 2023/11/27 SmalltalkからSelfに線を引きました。 ※追記 2023/11/27 GoとかRustとかKotlinとかSwiftとか、2010年くらいからの言語の場合、「この機能はこの言語由来、この機能はこの言語由来」というのではなくて、成熟したプログラミング言語開発の中でトータルでバランス考えながら設計した、という感じがあるので、言語相関図の中での線がひきにくい気もします。なので、KotlinやSwiftはベースのプラットフォームからの線はひけるけど、その他の部分については「現代化」としてます。