Gibt es objektorientierte Programmiersprachen, die nicht auf Klassen basieren?

44

Gibt es objektorientierte Programmiersprachen , die nicht auf dem Klassenparadigma basieren?

Fehler
quelle
1
Technisch gesehen ist C. Obwohl orientiert eine ziemliche Strecke im Sinne der Sprache, die es einfach macht. Ich weiß, dass dies nicht die Art von Antwort ist, nach der Sie suchen, aber wenn Sie sich Gedanken darüber machen möchten, wie C dies tun kann, gibt es möglicherweise einen Einblick, was Klassen tatsächlich tun und wie alternative Ansätze funktionieren können.
kylben
4
@kylben: "Oriented" ist eine unangebrachte Strecke. Sie können C zu objektorientiertem Verhalten verleiten. Man kann es nicht dazu bringen, sich so zu orientieren.
David Thornley

Antworten:

74

Soweit ich weiß, ist Self die Originalsprache, die das "klassenlose" Paradigma erfunden hat, das auf Prototypen basiert . Es existierte bereits (in einem experimentellen Stadium) in den 1980er Jahren und treibt Smalltalks elegante Verwendung des Prototypmusters auf die Spitze, so dass Klassen vollständig beseitigt werden.

Es beeinflusste alle anderen "klassenfreien" OO-Sprachen, die ich kenne:

  • am prominentesten Javascript,
  • die klassische Programmiersprache und -umgebung Squeak (die auf Smalltalk aufbaut)
  • die Multi-Paradigma-Skriptsprache Lua .
DaveFar
quelle
2
@Adam: Ohne statische Eingabe, ist es nicht ALLES nur syntaktischer Zucker?
Kevin Cline
5
@DeadMG OO-Sprache ist nicht die Sprache, mit der Sie OO-Ideen umsetzen können, sondern eine, die dies für Sie erledigt :)
Piotr Dobrogost
4
Tatsächlich hatten sowohl Simula (1960) als auch Smalltalk-71 (und Smalltalk-72) keinen Unterricht, der fast drei Jahrzehnte älter ist als Self. Klassen wurden nur in Simula-67 und Smalltalk-74 hinzugefügt (und Alan Kay betrachtete sie als Fehler oder genauer gesagt als notwendiges Übel).
Jörg W Mittag
2
@ Kevincline: Ich bin mir nicht sicher, worauf du das gründest. OO und statische Typisierung sind vollständig orthogonal.
Paul Biggar
2
Abgesehen von Simula (die das Klassenparadigma angenommen hat) wurde Flavours 1979 am MIT eingeführt und war ein Vorläufer von CLOS, die beide älter sind als Self.
Matthew Flynn
32

Sprachen wie JavaScript basieren auf Prototypen , bei denen das Verhalten durch Klonen vorhandener Objekte wiederverwendet wird. Der Wikipedia-Artikel, auf den ich verlinkt habe, zeigt an, dass Lua, ActionScript und eine Reihe anderer Sprachen diesem Paradigma folgen.

Thomas Owens
quelle
2
Jede ECMAScript-Variante verwendet das Prototyp-Paradigma.
zzzzBov
Na ja, fast jede Variante. ActionScript (die Flash-Sprache) verwendet Klassen, obwohl die zugrunde liegende VM sie möglicherweise in Form von Prototypen implementiert.
mjfgates
@mjfgates, Actionscript 2 war früher ECMAScript-basiert und ähnelte stark Javascript. Actionscript 3 bewegt sich davon weg, behält aber seinen dynamischen Charakter bei. Sie können jede Variable stark / schwach tippen, da im Wesentlichen alles ein Objekt ist.
J_A_X
13

Die beliebteste objektorientierte Programmiersprache der Welt hat keine Klassen, sie heißt Javascript und basiert auf einem Prototyp: http://en.wikipedia.org/wiki/Prototype-based_programming

bezko
quelle
11
"Beliebteste objektorientierte Programmiersprache der Welt"? Bei dieser Behauptung bin ich mir überhaupt nicht sicher.
Thomas Owens
8
@ThomasOwens Aufgrund seiner Aufnahme in das Web kann man leicht sagen, dass in jeder modernen webfähigen Plattform (einschließlich mobiler Geräte) ein JavaScript-Interpreter enthalten ist. Das ist ein sehr starker Fall, dass es derzeit die beliebteste prototypbasierte Sprache ist, die es gibt. (es sei denn, Sie denken, Sie können ein ähnliches Argument für "SELF" machen)
Riwalk
1
Javascript ist sicherlich eine der am häufigsten verwendeten Programmiersprachen der Welt, aber ich würde erwarten, dass die meisten Verwendungen einfach altmodisch oder prozedural sind, mit vielleicht ein bisschen aspektorientierter Programmierung (Callbacks? AJAX? Event-Handler?) Hier und da ist es nicht ganz gerechtfertigt, Javascript als die 'beliebteste OOP-Sprache' zu bezeichnen.
tdammers
9
Ich würde auch "allgegenwärtig" sagen, um eine Diskussion über die Vorzüge seiner Popularität zu umgehen.
Anthony Pegram
3
@ Stargazer712: Ich mag es nicht, ein Sprach-Bigot zu sein, aber er behauptet, dass "die beliebteste objektorientierte Programmiersprache der Welt [ed: Javascript] keine Klassen hat". Es kann aus zwei Behauptungen zerlegt werden: "Javascript ist die beliebteste objektorientierte Programmiersprache" und "Javascript hat keine Klassen"; Beides stimme ich zu.
Lie Ryan
6

Objektorientierung ist ein Überbegriff für mehrere wichtige Konzepte, die nur teilweise voneinander abhängig sind. Zum Beispiel kann die Vererbung von Fall zu Fall zwischen Instanzen und nicht zwischen Klassen deklariert werden, oder die gesamte Klasse kann durch ein konkretes prototypeObjekt dargestellt werden, wie Thomas schrieb. Es ist nur üblicher, die Strukturbeschreibung von der Instanzerstellung zu trennen. In ähnlicher Weise bedeutet eine späte Bindung, dass Objekte mit nominell derselben Methode nicht unbedingt dasselbe tun, wenn sie aufgerufen werden, und dass die Entscheidung zur Laufzeit getroffen wird. Dies ist auch mit dem prototypbasierten Ansatz möglich. Die Kapselung ist im Wesentlichen völlig unabhängig davon, ob Ihre Objekte Instanzen deklarierter Klassen sind oder nicht.

Die meisten OO-Sprachen sind jedoch fest im Klassencamp verankert. Aber selbst dann gibt es Redewendungen, die die Grenze verwischen: Das domänengetriebene Design führt häufig zu Systemen, in denen die Identität bestimmter Objekte viel wichtiger ist als das statische Klassendiagramm, und Dekoratoren lassen Objekte derselben Klasse oder Schnittstelle sehr viel zu anderes Verhalten.

Kilian Foth
quelle
6

Fortress ist eine objektorientierte Sprache, die auf Eigenschaften anstatt auf Klassen basiert. Der Unterschied liegt hauptsächlich in der Zusammensetzung der Implementierung. Das Verhalten eines Objekts (Methodendefinitionen) wird weiterhin durch die Deklarationen an einer bestimmten Stelle im Programmtext bestimmt. In diesem Sinne ähnelt es klassenbasierten Systemen.

Es gibt Objektkalküle (von Cardelli, glaube ich), die rein objektbasiert sind. Jede Methode ist ein Instanzmitglied. Sie bilden neue Objekte, indem Sie den Inhalt eines vorhandenen Objekts übernehmen und einige seiner Mitglieder hinzufügen, entfernen oder ersetzen. Es unterscheidet sich geringfügig von Prototypen, da das neue Objekt keine Verknüpfung zum alten Objekt hat, sondern nur einen Teil seines Inhalts.

IIRC, es ist möglich, auf ähnliche Weise mit Python und anderen hashtabellenorientierten Sprachen zu programmieren: Sie können eine Funktion als Instanzmitglied hinzufügen und sie dann als Methode aufrufen.

Ryan Culpepper
quelle
5

Ada, seit seiner Revision von 1995, ist Ada objektorientiert, kombiniert jedoch im Gegensatz zu vielen anderen OO-Sprachen objektorientierte Typen und Module nicht in einem einzigen Konstrukt, das als "Klasse" bezeichnet wird. Anstatt einen Typ als "Klasse Foo" zu deklarieren und alle zugehörigen Methodendeklarationen in die Klassendeklaration einzufügen, deklarieren Sie ein Paket und deklarieren den Typ (als a record) und andere Dinge im Paket. Es ist nicht so "klassenfrei" wie einige der anderen erwähnten Sprachen, es ist nur eine etwas andere Art, Dinge zu organisieren.

Die objektorientierten Funktionen von Ada 95 wurden in die bestehende Version der Sprache von 1983 aufgenommen. es erweiterte die bestehenden Record- und Package-Konstrukte, um die Vererbung et al. zu unterstützen.

Keith Thompson
quelle
Das ist es, woran ich mich erinnerte. Außerdem musst du deine Akte an jede Mitgliedsfunktion weitergeben
Nikko,
@Nikko: Das passiert in jeder objektorientierten Sprache hinter den Kulissen und ziemlich explizit in Python und CLOS (Common Lisp).
Marcin
5

Io ist eine weitere prototypbasierte objektorientierte Sprache. Es wurde tatsächlich von mehreren Sprachen inspiriert, die bereits in anderen Antworten erwähnt wurden.

Io ist eine dynamische prototypbasierte Programmiersprache. Die Ideen in Io basieren hauptsächlich auf Smalltalk (alle Werte sind Objekte), Self (prototypbasiert), NewtonScript (differenzielle Vererbung), Act1 (Akteure und Zukünfte auf Parallelität), Lisp (Code ist ein zur Laufzeit inspizierbarer / modifizierbarer Baum) und Lua (klein, einbettbar).

Zsolt Török
quelle
4

Erlang. Und ja, Erlang ist eine objektorientierte Sprache, da sie alle drei Punkte der Definition von OO erfüllt.

Jörg W. Mittag
quelle