Rein virtuell oder abstrakt, was steckt in einem Namen?

15

Bei der Diskussion einer Frage zu virtuellen Funktionen in Stack Overflow habe ich mich gefragt, ob es eine offizielle Benennung für reine (abstrakte) und nicht reine virtuelle Funktionen gibt.

Ich habe mich zu meiner Information immer auf Wikipedia verlassen, wo es heißt, dass reine und nicht reine virtuelle Funktionen der Oberbegriff sind. Leider enthält der Artikel keine Herkunft oder Referenzen.

Um Jon Skeets Antwort auf meine Antwort zu zitieren: "Rein" und "Unrein" sind die allgemeinen Begriffe, die verwendet werden:

@Steven: Hmm ... möglicherweise, aber ich habe es bisher nur im Kontext von C ++ gesehen. Ich vermute, dass jemand, der darüber spricht, wahrscheinlich einen C ++ - Hintergrund hat :)

Entstanden die Begriffe aus C ++ oder wurden sie zuerst in einer früheren Sprache definiert oder implementiert, und sind sie die "offiziellen" wissenschaftlichen Begriffe?

AKTUALISIEREN:

Frank Shearar stellte hilfreich einen Link zur Beschreibung der SIMULA 67 Common Base Language (1970) zur Verfügung. Diese Sprache scheint die erste Sprache zu sein, die OO-Schlüsselwörter als Klasse , Objekt und auch virtuell als formales Konzept einführt . Es definiert nicht rein / nicht rein oder abstrakt , aber es unterstützt die Konzepte .

Wer hat sie definiert?

Steven Jeuris
quelle
1
Könnte
Aaron McIver
2
virtuelle Funktionen, virtuelle Vererbung, virtuelle Tabellen - keine mit einer wirklichen Erklärung, was sie "virtuell" macht. Ich kenne die Regeln, aber warum dieses Wort? Immerhin ist eine "virtuelle" Funktion so real wie jede andere Funktion - sie benötigt nur einen späten Lookup, ist alles. Vielleicht hat Stroustrup das Wort wirklich gemocht. Ich dachte, Klassen wären abstrakt (nicht rein), während Methoden rein (aber nicht abstrakt) sein könnten. Es ist jedoch möglich, dass ich das erfunden habe.
Steve314
3
@ Steve314, es war nicht Stroustrup - anscheinend hießen sie schon in Simula so .
Péter Török,

Antworten:

9

Nygaard und Dahl verwendeten den Begriff erstmals in SIMULA 67 Common Base Language . Schauen Sie sich zum Beispiel Abschnitt 2.1 und Abschnitt 2.2.3 an. (Soweit ich das beurteilen kann, ist es wahrscheinlich die erste Verwendung des Begriffs.)

Frank Shearar
quelle
3
Simula war die erste OO-Sprache, AFAIK, daher werden in einem OOP-Kontext zum ersten Mal viele Begriffe verwendet. Es hat Stroustrup stark beeinflusst, der zunächst nur eine Sprache mit C-Effizienz und Simula-Klassen wollte.
David Thornley
Ich überfliege dieses Papier und ja, es scheint das erste zu sein, da es "Klassen" und "Objekte" einführt.
Steven Jeuris
2
Nach einiger Zeit wurde das Lesen der SIMULA 67-Definition verschwendet. Simula 67 prägte 1970 "virtuell" zusammen mit "Klasse", "Objekt", "versteckt", "Call by Value", "Call by Reference". Keine Spur von "rein", "unrein" oder "abstrakt".
Steven Jeuris
5
"Wasted" scheint ein seltsames Wort zu sein, um das Lesen einer der wegweisenden Abhandlungen auf diesem Gebiet zu beschreiben.
Frank Shearar
7

Also ... ich habe ein bisschen recherchiert. Was folgt, ist eine kleine Geschichtsstunde für Interessierte. :) Fahren Sie mit der Schlussfolgerung unten fort, wenn Sie nur an der Antwort interessiert sind.

1967 :

SIMULA 67 , die erste objektorientierte Programmiersprache, definiert Schlüsselwörter als Klasse , Objekt , Call by Reference , Call by Value und Virtual .

Das Vererbungssystem von SIMULA wurde ursprünglich unter einem anderen Namen, der Verkettung (und später als Präfix bezeichnet ), bekannt. Dies bezog sich auf die Tatsache, dass der Code von Supertypen kopiert und mit dem Code von Subtypen „verkettet“ wurde. Später entstand eine andere Form des Vererbungssystems, die Delegation , bei der Anrufe unter Bezugnahme auf den richtigen Typ delegiert werden.

Virtuell bezieht sich höchstwahrscheinlich auf den Prozess, der ausgeführt werden muss, um mithilfe einer virtuellen Methodentabelle einen Aufruf an die richtige Implementierung zu senden . Es ist virtuell im Vergleich zu einer festen / konkreten Implementierung.

1971 :

Niklaus Wirth schreibt über ein Konzept, das als schrittweise Verfeinerung definiert ist . Grundsätzlich wird erklärt, wie ein Programm in Teillösungen aufgeteilt wird, die erweitert werden können.

1974 :

Dies ist die früheste Veröffentlichung, die ich gefunden habe und die den Begriff abstrakte Datentypen von Barbara Liskov prägt .

Ein abstrakter Datentyp definiert eine Klasse abstrakter Objekte, die vollständig durch die für diese Objekte verfügbaren Operationen charakterisiert ist. Dies bedeutet, dass ein abstrakter Typ definiert werden kann, indem die charakterisierenden Operationen für diesen Typ definiert werden. Wenn ein Programmierer ein abstraktes Datenobjekt verwendet, befasst er sich nur mit dem Verhalten, das dieses Objekt aufweist, aber nicht mit Einzelheiten darüber, wie dieses Verhalten mittels einer Implementierung erreicht wird.

In diesem Dokument wird auch ein Operationscluster definiert, der das zu spezifizieren scheint, was wir jetzt als Schnittstelle kennen .

Interessante wissenschaftliche Terminologie (Arbeit von 1996):

Vererbung : Ein Mechanismus auf niedrigerer Ebene, mit dem Objekte oder Klassen Verhalten oder Daten gemeinsam nutzen können.

Subtyping : drückt konzeptionelle Spezialisierung aus. Eine bestimmte Form der Vererbung, auch Schnittstellenvererbung genannt .

Abstraktionsprinzipien : Der Prozess der Organisation unseres Wissens über einen Anwendungsbereich in hierarchische Rangfolgen von Ordnungen von Abstraktionen, um ein besseres Verständnis der betreffenden Phänomene zu erhalten.

Teilweise implementierte Abstraktionen : Abstraktionen, deren Definitionen absichtlich unvollständig sind.

Abstrakte Klassen : Spezifischer Begriff für eine teilweise implementierte Klasse in objektorientierten Systemen.

Unbeschränkte Vererbung : Ermöglicht das Neudefinieren (oder sogar Entfernen) von Operationen in Unterklassen.

Strikte Vererbung : Verhaltenskompatible Vererbung.

Fazit :

Abstrakte Klasse ist der allgemeinste Begriff, der in objektorientierten Systemen verwendet wird. Es scheint, dass reine und nicht reine virtuelle Funktionen nur aus C ++ stammen. Zum Beispiel lässt dieses Interview mit Stroustrup den Anschein erwecken , als hätte er die Begriffe erfunden. Wissenschaftliche Arbeiten verwenden eine allgemeinere Terminologie.

Virtual stammt von SIMULA, weshalb es häufig verwendet wird, ist aber kein allgemeiner Begriff. Es definiert bereits Implementierungsdetails. In Bezug auf Vererbungsarten zu sprechen ist angemessener. Nicht-virtuellen standardmäßig entspricht strengen Vererbung standardmäßig, während virtuelle standardmäßig entspricht nicht strikte Vererbung .

Möchtest du den Wikipedia-Eintrag anpassen ? :)

Steven Jeuris
quelle
Vor Barbara Liskov hatte Dijkstra auch etwas zu "STEP-WISE PROGRAM COMPOSITION" zu sagen , was ebenfalls eine relevante Ressource sein könnte.
Steven Jeuris
4

In C ++ werden Memberfunktionen, die dynamisch gebunden sind und daher von einer Unterklasse überschrieben werden können, als "virtuell" bezeichnet. Virtuelle Funktionen, die unbedingt überschrieben werden müssen, heißen "pure virtual". Beachten Sie, dass eine reine virtuelle Funktion einen Body haben kann, oft jedoch nicht. Eine Klasse mit mindestens einer rein virtuellen Funktion heißt "abstrakt" und kann nicht instanziiert, sondern nur abgeleitet werden.

Ich vermute, der Grund, warum virtuelle Funktionen als virtuell bezeichnet werden, ist die Tatsache, dass nicht bekannt ist, welche tatsächliche Funktion zur Kompilierungszeit aufgerufen wird. In gewisser Weise existiert ein virtueller Funktionsaufruf "nicht" zur Kompilierungszeit.

Ich vermute auch, dass der Begriff "abstrakt" für eine Klasse mit einer rein virtuellen Funktion verwendet wird, weil Sie keine Objekte dieser Klasse haben können. In gewisser Weise ist es ein abstrakter Begriff, der weit von der konkreten Welt der Gegenstände entfernt ist.

Bearbeiten: Andere Sprachen.

Soweit die Frage, wie allgemein der Begriff "virtuell" ist, hier meine zwei Cent. In Smalltalk verwenden alle Funktionen die dynamische Bindung, sodass sie alle virtuell sind und kein spezieller Begriff oder ein Sprachschlüsselwort erforderlich ist. Wenn ich mich in Java nicht irre, entscheidet der Compiler automatisch, ob die dynamische Bindung verwendet werden soll. Für den Programmierer gibt es keine Unterscheidung und daher kein "virtuelles" Schlüsselwort.

In C ++ ist die Unterscheidung zwischen virtuell und nicht virtuell erforderlich, da der Programmierer entscheiden muss, wann die dynamische Bindung verwendet werden soll, um den Overhead zu sparen, wenn er nicht benötigt wird.

Dima
quelle
1
+1: "Abstrakt" gilt auch für viele Sprachen. "Virtual" nicht.
S.Lott
@ S.lott: Die ganze Frage ist, ob virtuell ein allgemeiner Begriff ist oder nicht. Soweit ich das beurteilen kann, gilt virtual für viele Sprachen und wurde zuerst von Simula geprägt. Die Frage bleibt nach rein / nicht rein und abstrakt.
Steven Jeuris
@Steven Jeuris: "virtuell trifft auf viele Sprachen zu"? Ja wirklich. Bisher scheint es C, C ++ und Simula zu sein. Auf Python trifft es sicherlich nicht einmal ein bisschen zu. Es scheint nicht auf Java zuzutreffen.
S.Lott
Dies gilt für Object Pascal / Delphi. Delphi hat ein zusätzliches Konzept - dynamic-, bei dem es sich um eine Art virtuelle Methode handelt, bei der Speicherplatz gegen Zeit eingetauscht wird: Sie benötigen weniger Speicherplatz und sind langsamer auszuführen als virtualMethoden.
Frank Shearar
2
@Steven Jeuris: "standardmäßig virtuell" ist nicht dasselbe wie "virtuell", um abstrakte Funktionen zu beschreiben. Ich denke, Leute, die sagen "alle Funktionen sind virtuell", wenden ein C ++ - Konzept auf eine andere Sprache an. Und ich denke, sie machen es falsch. Da alle Methodenfunktionen in Python virtuell sind, wird das Thema nie mit "virtuell" erwähnt, außer an Stellen wie "Stapelüberlauf", um das C ++ - Konzept auf Python anzuwenden. Ich denke, dass virtual in diesen Fällen nicht richtig angewendet wird, da die Dokumente in der Python-Sprache das Wort nicht verwenden.
S.Lott