クラスベースではないオブジェクト指向プログラミング言語は存在しますか?


44

任意のあるオブジェクト指向のプログラミング言語クラスのパラダイムに基づいていませんか?


1
技術的に言えば、C。指向的であるにもかかわらず、言語の意味ではかなりのストレッチがあり、簡単になっています。私はそれがあなたが探している種類の答えではないことを知っていますが、Cがそれをどのように行うことができるかを注意深く見れば、クラスが実際に行うことと代替アプローチがどのように機能するかについての洞察を提供するかもしれません。
キルベン

4
@kylben:「Oriented」は、呼ばれないストレッチです。Cをオブジェクト指向の動作に変更できます。あなたはそれをそのように方向づけることにudgeすることはできません。
デビッドソーンリー

回答:


74

私の知る限り、Selfプロトタイプに基づいた「クラスフリー」パラダイムを発明した元の言語です。1980年代には既に(実験段階で)存在しており、Smalltalkプロトタイプパターンのエレガントな使用法を極端に押し上げ、クラスが完全に排除されました。

私が知っている他のすべての「クラスフリー」オブジェクト指向言語に影響を与えました。

  • 最も顕著なJavascript、
  • 古典的なプログラミング言語と環境Squeak(Smalltalkの上に構築されています)
  • マルチパラダイムスクリプト言語Luaの

2
@Adam:静的な型付けがなければ、それはすべて単なる構文糖ではありませんか?
ケビンクライン

5
@DeadMG OO言語は、OOのアイデアを実装できるようにするものではなく、あなたのためにそれを行うものです:)
Piotr Dobrogost

4
実際、Simula(1960)とSmalltalk-71(Smalltalk-72)の両方にもクラスがありませんでした。これは、Selfの30年近く前のものです。クラスはSimula-67とSmalltalk-74でのみ追加されました(そして、Alan Kayはそれらを間違い、またはより正確には必要な悪と見なしました)。
ヨルグWミットタグ

2
@kevincline:それが何に基づいているのかわからない。オブジェクト指向と静的型付けは完全に直交しています。
ポールビガー

2
Simula(クラスパラダイムを引き受けた)とは別に、Flavorsは1979年にMITで導入され、CLOSの前身であり、どちらもSelfよりも前のものでした。
マシューフリン

32

JavaScriptのような言語はプロトタイプ基づいており、既存のオブジェクトを複製することで動作が再利用されます。私がリンクしたウィキペディアの記事は、Lua、ActionScript、および他の多くの言語がこのパラダイムに従っていることを示しています。


2
すべてのECMAScriptバリアントは、プロトタイプパラダイムを使用します。
zzzzBov

まあ、ほぼすべてのバリアント。ActionScript(Flash言語)はクラスを使用しますが、基礎となるVMはプロトタイプの観点からクラスを実装している場合があります。
mjfgates

@ mjfgates、Actionscript 2は以前はECMAScriptベースであり、Javascriptによく似ていました。Actionscript 3はそれから遠ざかりつつありますが、それでも動的な性質を保持しています。本質的にすべてがオブジェクトであるため、任意の変数を強く/弱く入力できます。
J_A_X

13

世界で最も人気のあるオブジェクト指向プログラミング言語にはクラスがなく、Javascriptと呼ばれ、プロトタイプベースです:http : //en.wikipedia.org/wiki/Prototype-based_programming


11
「世界で最も人気のあるオブジェクト指向プログラミング言語」?私はその主張についてはまったくわかりません。
トーマスオーエンズ

8
@ThomasOwensは、Webに含まれているため、最新のWeb対応プラットフォーム(モバイルデバイスを含む)にはJavaScriptインタープリターが含まれていると簡単に言うことができます。これは、現在最も存在するプロトタイプベースの言語であるという非常に強力なケースです。(あなたは「SELF」のために同様の議論を行うことができると思うしない限り)
riwalk

1
Javascriptは確かに世界で最も広く使用されているプログラミング言語の1つですが、ほとんどの使用法は、ここで少しアスペクト指向のプログラミング(コールバック?AJAX?イベントハンドラー?)そのため、javascriptを「最も人気のあるOOP言語」と呼ぶことは正当化されません。
tdammers

9
また、その人気のメリットに関する議論を回避するために、「ユビキタス」とも言います。
アンソニーペグラム

3
@ Stargazer712:私は言語の偏見が好きではありませんが、彼は「世界で最も人気のあるオブジェクト指向プログラミング言語[ed:Javascript]にはクラスがない」と主張しています。「Javascriptは最も人気のあるオブジェクト指向プログラミング言語です」と「Javascriptにはクラスがありません」という2つの主張に分解できます。両方とも、私は同意します。
ライライアン

6

オブジェクト指向とは、互いに部分的にしか依存しないいくつかの重要な概念の総称です。たとえば、prototypeThomasが書いたように、継承はクラス間ではなくインスタンス間で個別に宣言したり、クラス全体を具体的なオブジェクトで表すことができます 。インスタンスの作成から構造の説明を分離するのがより一般的です。同様に、遅延バインディングは、名目上同じメソッドを持つオブジェクトが呼び出されたときに必ずしも同じことを行うわけではなく、実行時に決定が行われることを意味します。プロトタイプベースのアプローチでも同様に可能です。また、カプセル化は、オブジェクトが宣言されたクラスのインスタンスであるかどうかとは本質的に完全に独立しています。

そうは言っても、ほとんどのオブジェクト指向言語はクラスベースのキャンプにしっかりと入っています。しかし、それでも線を曖昧にするイディオムがあります:ドメイン駆動設計は、特定のオブジェクトのアイデンティティが静的クラス図よりもはるかに重要であり、デコレータが同じクラスまたはインターフェースのオブジェクトに異なる動作。


6

Fortressは、クラスではなく特性に基づいたオブジェクト指向言語です。違いは主に実装構成にあります。オブジェクトの動作(メソッド定義)は、プログラムテキストの特定のポイントでの宣言によって決定されます。その意味では、クラスベースのシステムに似ています。

純粋にオブジェクトベースのオブジェクト計算(Cardelliによると思います)があります。すべてのメソッドはインスタンスメンバーです。既存のオブジェクトの内容を取得し、そのメンバーの一部を追加、削除、または置換することにより、新しいオブジェクトを作成します。新しいオブジェクトは古いオブジェクトへのリンクを持たず、その内容の一部だけを持っているため、プロトタイプとは少し異なります。

IIRCでは、Pythonおよびその他のハッシュテーブル指向言語を使用して同様の方法でプログラミングできます。インスタンスメンバとして関数を追加し、メソッドとして呼び出すことができます。


5

Adaは1995年の改訂時点でオブジェクト指向ですが、他の多くのOO言語とは異なり、オブジェクト指向のタイプとモジュールを「クラス」と呼ばれる単一の構造に結合していません。型を「class Foo」として宣言し、関連するすべてのメソッド宣言をクラス宣言内に置くのではなく、パッケージを宣言し、(aとしてrecord)型およびパッケージ内の他のことを宣言します。他の言及された言語のいくつかがそうであるように、それは「クラスフリー」ではなく、物事を整理するわずかに異なる方法です。

Ada 95のオブジェクト指向機能は、既存の1983バージョンの言語に追加されました。継承などをサポートするために既存のレコードとパッケージの構成を拡張しました。


それは私が覚えていたことです。また、各メンバー機能に記録を渡す必要があります
日光

@Nikko:それは、すべてのオブジェクト指向言語の背後で、そしてPythonとCLOS(common lisp)でかなり明示的に行われていることです。
マーチン

5

Ioは、別のプロトタイプベースのオブジェクト指向言語です。実際には、他の回答ですでに言及されているいくつかの言語からインスピレーションを得ています。

Ioは、動的なプロトタイプベースのプログラミング言語です。Ioのアイデアは、Smalltalk(すべての値はオブジェクト)、Self(プロトタイプベース)、NewtonScript(微分継承)、Act1(同時実行の実行者と未来)、Lisp(コードは実行時検査可能/変更可能なツリーです)とLua(小さい、埋め込み可能)。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.