Open5

OOPLとObject-based言語の整理

wintwint

モチベ

  • 未だに混迷してるOOP(オブジェクト指向プログラミング)周りの言説を整理したい。
  • OOPL(オブジェクト指向プログラミング言語)の特徴的な言語機能をふるい分けたい。
  • Object-based language の概念を導入して整理に役立てたい。
  • Object の概念のコアを見定めたい。
  • OOUI との関係を明らかにしたい。
  • アラン・ケイの思想の系譜を確認したい。
  • Simula → C++ からの系統を確認したい。

参考リンク

定義など

https://en.wikipedia.org/wiki/Object-oriented_programming

https://en.wikipedia.org/wiki/Object-based_language

https://en.wikipedia.org/wiki/Object_(computer_science)

ブログ

論考など

https://zenn.dev/takahashim/articles/d34b1a3b244e46

https://nowokay.hatenablog.com/entry/2021/09/25/042831

wintwint

new 使ってればOOPなのかって話だ

ただ半ばジョークとして、「ドット記法が唯一OOPLに共通する特徴だ」なんて言われてたりする。

obj.method()

wintwint

OOPL なしに OOP はできるのか? OOUI は それか?

コード・レベルの話とモデリング・レベルの話を区別したい。

wintwint

OOPL 小史

これは抜粋

OOPL-families

code
@startuml OOP-families

object LISP {
	dynamic
}
note right : the idea of object

object Simula {
	static
	class-based
}
note left : the origin
LISP ..> Simula : GC

package 70s {

	object Smalltalk {
		dynamic
		messaging
	}
	note right : coined OOP
	Simula --> Smalltalk : messaging
	LISP ..> Smalltalk : dynamic

	' object Pascal
	' note right : non OOPL
	' Simula --> Pascal

}

package 80s {

	object "C++" as Cpp {
		static
		no GC
		overload
		multiple inheritance
	}
	Simula --> Cpp : ADT
	Smalltalk --> Cpp

	object "Objective-C" as ObjC {
		static + dynamic
		no GC / ARC
		messaging
		' selector
	}
	Smalltalk --> ObjC : messaging

	object Self {
		dynamic
		prototype-based
	}
	Smalltalk --> Self

}

package 90s {

	object Python {
		dynamic
		multiple inheritance
	}
	Cpp --> Python
	' Pascal --> Python

	object Java {
		static
		overload
	}
	Cpp ---> Java
	' Pascal ..> Java
	' Smalltalk ..> Java : how?
	ObjC ---> Java : protocol = interface

	object JavaScript {
		dynamic
		prototype-based
	}
	Self --> JavaScript
	Python ..> JavaScript
	' Java . JavaScript : same age
	' Java .r.> JavaScript : name after

	object Ruby {
		dynamic
		mixin
	}
	Cpp ..> Ruby
	Smalltalk --> Ruby
	Python --> Ruby

	object PHP {
		dynamic
	}
	Java --> PHP
	JavaScript --> PHP

	' object OCaml
	' Pascal ---> OCaml

}

package 2000s {

	object "C#" as CS {
		static
		overload
	}
	Cpp ---> CS
	Java ---> CS

}

@enduml