Selbst (Programmiersprache)

Selbst ist eine objektorientierte auf dem Konzept von Prototypen gestützte Programmiersprache. Im Wesentlichen ein äußerster Dialekt des Plausches, es wurde hauptsächlich als ein experimentelles Testsystem für das Sprachdesign in den 1980er Jahren und 1990er Jahren verwendet. 2006, Selbst wurde noch als ein Teil des Projektes von Klein entwickelt, das Selbst virtuelle Maschine geschrieben völlig in Selbst war. Die letzte Version ist 4.4, veröffentlicht im Juli 2010.

Mehrere gerade rechtzeitig wurde für Kompilationstechniken den Weg gebahnt und hat sich in Selbst Forschung verbessert, weil sie erforderlich waren, orientierter Sprache eines sehr hohen Gegenstands zu erlauben, mit der bis zu Hälfte der Geschwindigkeit von optimiertem C zu leisten. Viel von der Entwicklung Selbst hat an Sonne-Mikrosystemen stattgefunden, und die Techniken, die sie entwickelt haben, wurden später für Javas HotSpot virtuelle Maschine aufmarschiert.

Einmal wurde eine Version des Plausches in Selbst durchgeführt. Weil es im Stande gewesen ist, den JIT zu verwenden, hat das auch äußerst gute Leistung gegeben.

Geschichte

Selbst wurde größtenteils von David Ungar und Randall Smith 1986 entworfen, während man an Xerox PARC gearbeitet hat. Ihr Ziel war, vorwärts den Stand der Technik in der objektorientierten Programmiersprache-Forschung zu stoßen, sobald Plausch 80 von den Laboratorien veröffentlicht wurde und begonnen hat, durch die Industrie ernst genommen zu werden. Sie haben sich zur Universität von Stanford bewegt und haben Arbeit an der Sprache fortgesetzt, das erste Arbeiten Selbst Bearbeiter 1987 bauend. An diesem Punkt hat sich Fokus zum Versuchen geändert, ein komplettes System für Selbst im Vergleich mit gerade der Sprache heraufzubringen.

Die erste öffentliche Ausgabe war 1990, und im nächsten Jahr die zu Sonne-Mikrosystemen bewegte Mannschaft, wo sie Arbeit an der Sprache fortgesetzt haben. Mehrere neue Ausgaben sind bis zum Fallen größtenteils schlafend 1995 mit der 4.0 Version gefolgt. Die 4.3 Version wurde 2006 veröffentlicht und ist auf Mac OS X und Solaris gelaufen. Eine neue Ausgabe, Version 4.4, ist für MacOS X und Linux von einer Gruppe entwickelt worden, die einige der ursprünglichen Mannschaften und unabhängigen Programmierer umfasst, und ist für Mac OS X und Linux verfügbar.

Selbst hat auch mehrere auf seinen Konzepten gestützte Sprachen begeistert. Am bemerkenswertesten war vielleicht die Sprache von NewtonScript für den Apple Newton und die Sprache von JavaScript verwendet in erster Linie für dynamische Webseiten in allen modernen Browsern. Andere Beispiele schließen Io, Mobil, Lisaac und Agora ein. Das verteilte Gegenstand-System von IBM Tivoli Framework, entwickelt 1990, war am Tiefststand, ein Prototyp gestütztes Gegenstand-System, das durch Selbst begeistert ist.

Prototyp-basierte Programmiersprachen

Traditionelle klassenbasierte OO Sprachen basieren auf einer tief eingewurzelten Dualität:

  1. Klassen definieren die grundlegenden Qualitäten und Handlungsweisen von Gegenständen.
  2. Gegenstand-Beispiele sind besondere Manifestationen einer Klasse.

Nehmen Sie zum Beispiel an, dass Gegenstände der Klasse einen Namen und die Fähigkeit haben, verschiedene Handlungen, solche durchzuführen, die zur Arbeit fahren und Baumaterialien liefern. ist ein besonderer Gegenstand (Beispiel) der Klasse, mit dem Namen "Bobs Auto". In der Theorie kann man dann eine Nachricht senden an, ihm sagend, Baumaterialien zu liefern.

Dieses Beispiel zeigt eines der Probleme mit dieser Annäherung: Bobs Auto, das zufällig ein Sportwagen ist, ist nicht im Stande, Baumaterialien (in jedem bedeutungsvollen Sinn) zu tragen und zu liefern, aber das ist eine Fähigkeit, die s modelliert werden, um zu haben. Ein nützlicheres Modell entsteht aus dem Gebrauch des Subklassifizierens, um Spezialisierungen dessen zu schaffen; zum Beispiel und. Nur Gegenstände der Klasse müssen einen Mechanismus zur Verfügung stellen, Baumaterialien zu liefern; Sportwagen, denen schlecht dieser Sorte der Arbeit angepasst wird, müssen nur schnell fahren. Jedoch verlangt dieses tiefere Modell mehr Scharfsinnigkeit während des Designs, Scharfsinnigkeit, die nur ans Licht kommen kann, weil Probleme entstehen.

Dieses Problem ist einer der Motivieren-Faktoren hinter Prototypen. Wenn man mit der Gewissheit nicht voraussagen kann, welche Qualitäten eine Reihe von Gegenständen und Klassen in der entfernten Zukunft haben werden, kann man keine Klassenhierarchie richtig entwerfen. Allzu häufig würde das Programm schließlich hinzugefügte Handlungsweisen brauchen, und Abteilungen des Systems würden (oder refactored) neu entworfen werden müssen, um die Gegenstände auf eine verschiedene Weise auszubrechen. Die Erfahrung mit frühen OO Sprachen wie Plausch hat gezeigt, dass diese Sorte des Problems immer wieder heraufgekommen ist. Systeme würden dazu neigen, zu einem Punkt zu wachsen und dann sehr starr zu werden, weil die grundlegenden Klassen tief unter dem Code des Programmierers gewachsen sind, um einfach falsch zu sein. Ohne eine Weise, die ursprüngliche Klasse leicht zu ändern, konnten ernste Probleme entstehen.

Dynamische Sprachen wie Plausch haben diese Sorte der Änderung über wohl bekannte Methoden in den Klassen berücksichtigt; durch das Ändern der Klasse würden die darauf gestützten Gegenstände ihr Verhalten ändern. Jedoch mussten solche Änderungen sehr sorgfältig getan werden, weil andere auf derselben Klasse gestützte Gegenstände dieses "falsche" Verhalten erwarten könnten: "Falsch" ist häufig vom Zusammenhang abhängig. (Das ist eine Form des zerbrechlichen Grundklassenproblems.) Weiter, auf Sprachen wie C ++, wo Unterklassen getrennt von Superklassen kompiliert werden können, kann eine Änderung zu einer Superklasse wirklich vorkompilierte Unterklasse-Methoden brechen. (Das ist eine andere Form des zerbrechlichen Grundklassenproblems und auch eine Form des zerbrechlichen binären Schnittstelle-Problems.)

In Selbst, und andere Prototyp-basierte Sprachen wird die Dualität zwischen Klassen und Gegenstand-Beispielen beseitigt.

Anstatt ein "Beispiel" eines Gegenstands zu haben, der auf einer "Klasse", in Selbst basiert, macht man eine Kopie eines vorhandenen Gegenstands, und ändert sie. So würde durch das Bilden einer Kopie eines vorhandenen "Fahrzeug"-Gegenstands, und dann das Hinzufügen des Laufwerkes schnelle Methode, das Modellieren der Tatsache geschaffen, dass es zufällig ein Porsche 911 ist. Grundlegende Gegenstände, die in erster Linie verwendet werden, um Kopien zu machen, sind als Prototypen bekannt. Wie man fordert, vereinfacht diese Technik Dynamismus außerordentlich. Wenn sich ein vorhandener Gegenstand (oder Satz von Gegenständen) erweist, ein unzulängliches Modell zu sein, kann ein Programmierer einfach einen modifizierten Gegenstand mit dem richtigen Verhalten und Gebrauch das stattdessen schaffen. Code, der die vorhandenen Gegenstände verwendet, wird nicht geändert.

Beschreibung

Selbst sind Gegenstände eine Sammlung von "Ablagefächern". Ablagefächer sind Zugriffsberechtigter-Methoden, die Werte und das Stellen eines Doppelpunkts zurückgeben, nachdem der Name eines Ablagefaches den Wert setzt. Zum Beispiel, für ein Ablagefach hat "Namen", genannt

:

gibt den Wert im Namen und zurück

:

Sätze es.

Selbst, wie Plausch, Gebrauch-Blöcke für die Fluss-Kontrolle und anderen Aufgaben. Methoden sind Gegenstände, die Code zusätzlich zu Ablagefächern enthalten (den sie für Argumente und vorläufige Werte verwenden), und in Selbst Ablagefach gerade wie jeder andere Gegenstand gelegt werden kann: eine Zahl zum Beispiel. Die Syntax bleibt dasselbe in jedem Fall.

Bemerken Sie, dass es keine Unterscheidung in Selbst zwischen Feldern und Methoden gibt: Alles ist ein Ablagefach. Seit dem Zugreifen auf Ablagefächer über Nachrichten bildet die Mehrheit der Syntax in Selbst, viele Nachrichten werden an "selbst" gesandt, und "selbst" kann (folglich der Name) weggelassen werden.

Grundlegende Syntax

Die Syntax, um auf Ablagefächer zuzugreifen, ist diesem des Plausches ähnlich. Drei Arten von Nachrichten sind verfügbar:

unär:

binär:

Schlüsselwort:

Alle Nachrichten geben Ergebnisse zurück, so kann der Empfänger (wenn anwesend) und Argumente sich das Ergebnis anderer Nachrichten sein. Im Anschluss an eine Nachricht durch Periode-Mittel Selbst wird den zurückgegebenen Wert verwerfen. Zum Beispiel:

:

Das ist Selbst Version des hallo Weltprogramms. Die Syntax zeigt einen wörtlichen Schnur-Gegenstand an. Andere Druckfehler schließen Zahlen, Blöcke und allgemeine Gegenstände ein.

Gruppierung kann durch das Verwenden von Parenthesen gezwungen werden. Ohne ausführliche Gruppierung, wie man betrachtet, lassen die unären Nachrichten der höchsten Priorität durch den binären (Gruppierung verlassen zum Recht) und die Schlüsselwörter folgen, die das niedrigste haben. Der Gebrauch von Schlüsselwörtern für die Anweisung würde zu einer Extraparenthese führen, wo Ausdrücke auch Schlüsselwort-Nachrichten hatten, um so zu vermeiden, dass Selbst verlangt, dass der erste Teil eines Schlüsselwort-Nachrichtenauswählenden mit einem Kleinbuchstaben anfängt, und nachfolgende Teile mit einem Großbuchstaben anfangen.

:

kann eindeutig grammatisch analysiert werden, und bedeutet dasselbe als:

:

Im Plausch 80 würde derselbe Ausdruck schriftlich wie aussehen:

:

das Annehmen, und war nicht Beispiel-Variablen dessen, aber, war tatsächlich, Methoden.

Das Bilden neuer Gegenstände

Denken Sie ein ein bisschen komplizierteres Beispiel:

:

macht eine Kopie des "LabelWidget"-Gegenstands mit der Kopie-Nachricht (keine Abkürzung dieses Mal), sendet ihm dann eine Nachricht, um "Hallo, Welt" ins Ablagefach genannt "Etikett" zu stellen. Jetzt, etwas damit zu tun:

:

In diesem Fall durchgeführt erst zu sein, das aktive Fenster von der Liste von Fenstern zurückgebend, über die der Tischgegenstand weiß. Als nächstes (liest inner zum Außen-, verlassenen zum Recht), der Code haben wir früheren Umsatz der labelWidget untersucht. Schließlich wird das Produkt ins Attraktionsablagefach des aktiven Fensters gesandt.

Erbe/Delegation

In der Theorie jeder Selbst ist Gegenstand eine eigenständige Entität. Selbst hat weder Klassen noch Meta-Klassen. Änderungen zu einem besonderen Gegenstand betreffen keinen anderer, aber in einigen Fällen ist es wünschenswert, wenn sie getan haben. Normalerweise kann ein Gegenstand nur Nachrichten entsprechend seinen lokalen Ablagefächern verstehen, aber indem er ein oder mehr Ablagefächer gehabt wird, die Elternteilgegenstände, anzeigen, Gegenstand jeder Nachricht delegieren, die es selbst zum Elternteilgegenstand nicht versteht. Jedes Ablagefach kann ein Elternteilzeigestock durch das Hinzufügen eines Sternchens als eine Nachsilbe gemacht werden. Auf diese Weise Selbst behandelt Aufgaben, die Erbe auf klassenbasierten Sprachen verwenden würden. Delegation kann auch verwendet werden, um Eigenschaften wie namespaces und lexikalischer scoping durchzuführen.

Nehmen Sie zum Beispiel an, dass ein Gegenstand genannt "Bankkonto" definiert wird, das in einer einfachen Buchhaltungsanwendung verwendet wird. Gewöhnlich würde dieser Gegenstand mit den Methoden innen geschaffen, "sich" vielleicht "ablagern" und "sich", und irgendwelche von ihnen erforderlichen Datenablagefächer "zurückziehen". Das ist ein Prototyp, der nur in der Weise speziell ist, wie er verwendet wird, da er auch zufällig ein völlig funktionelles Bankkonto ist.

Charakterzüge

Das Bilden eines Klons dieses Gegenstands auf die "Rechnung von Bob" wird einen neuen Gegenstand schaffen, der genau wie der Prototyp aufbricht. In diesem Fall haben wir die Ablagefächer einschließlich der Methoden und irgendwelcher Daten kopiert. Jedoch ist eine allgemeinere Lösung, zuerst einen einfacheren Gegenstand genannt einen Charakterzug-Gegenstand zu machen, der die Sachen enthält, die man normalerweise mit einer Klasse vereinigen würde.

In diesem Beispiel würde der "Bankkonto"-Gegenstand die Ablagerung nicht haben und Methode zurückziehen, aber würde als ein Elternteil ein Gegenstand haben, der getan hat. Auf diese Weise können viele Kopien des Bankkonto-Gegenstands gemacht werden, aber wir können noch das Verhalten von ihnen allen ändern, indem wir die Ablagefächer in diesem Wurzelgegenstand ändern.

Wie ist das etwas von einer traditionellen Klasse verschieden? Denken Sie gut die Bedeutung:

:

Dieses Exzerpt ändert die "Klasse" von myObject an der Durchlaufzeit durch das Ändern des Werts, der mit dem 'Elternteil *' Ablagefach vereinigt ist (das Sternchen ist ein Teil des Ablagefach-Namens, aber nicht die entsprechenden Nachrichten). Unterschiedlich mit dem Erbe oder lexikalischem scoping kann der Delegierter-Gegenstand an der Durchlaufzeit modifiziert werden.

Das Hinzufügen von Ablagefächern

Gegenstände in Selbst können modifiziert werden, um zusätzliche Ablagefächer einzuschließen. Das kann mit der grafischen Programmierumgebung, oder mit dem Primitiven '_AddSlots getan werden:'. Ein Primitiver hat dieselbe Syntax wie eine normale Schlüsselwort-Nachricht, aber sein Name fängt mit dem unterstreichen Charakter an. Der _AddSlots Primitive sollte vermieden werden, weil es ein linker zu Ende von frühen Durchführungen ist. Jedoch werden wir es im Beispiel unten zeigen, weil es den Code kürzer macht.

Ein früheres Beispiel war über das Wiederfactoring eine einfache Klasse genannt das Fahrzeug, um im Stande zu sein, das Verhalten zwischen Autos und Lastwagen zu unterscheiden. In Selbst würde man das mit etwas wie das vollbringen:

:

Seit dem Empfänger '_AddSlots:' Primitiv wird nicht angezeigt, es ist "selbst". Im Fall von Ausdrücken, die am schnellen getippt sind, das ein Gegenstand ist, hat die "Vorhalle" genannt. Das Argument für '_AddSlots:' Ist der Gegenstand, dessen Ablagefächer zum Empfänger kopiert werden. In diesem Fall ist es ein wörtlicher Gegenstand mit genau einem Ablagefach. Der Name des Ablagefaches ist 'Fahrzeug', und sein Wert ist ein anderer wörtlicher Gegenstand."

Hier ist der Empfänger der vorherige Gegenstand, der jetzt 'Namen' und Ablagefächer 'des Namens:' zusätzlich zum 'Elternteil *' einschließen wird.

::

Obwohl vorher 'Fahrzeug' und 'sportsCar' jetzt genau ähnlich waren, schließt der Letztere ein neues Ablagefach mit einer Methode ein, die das Original nicht hat. Methoden können nur in unveränderliche Ablagefächer eingeschlossen werden.

::

Der neue Gegenstand 'porsche911' begonnen genau wie 'sportsCar', aber die letzte Nachricht hat den Wert seines 'Namen'-Ablagefaches geändert. Bemerken Sie, dass beide noch genau dieselben Ablagefächer haben, wenn auch einer von ihnen einen verschiedenen Wert hat.

Die Umgebung

Eine Eigenschaft Selbst ist, dass es auf derselben Sorte des virtuellen Maschinensystems basiert, das frühere Plausch-Systeme verwendet haben. D. h. Programme sind nicht eigenständige Entitäten, wie sie auf Sprachen wie C sind, aber ihre komplette Speicherumgebung brauchen, um zu laufen. Das verlangt, dass Anwendungen in Klötzen des gesparten Gedächtnisses verladen werden, das als Schnellschüsse oder Images bekannt ist. Ein Nachteil dieser Annäherung ist, dass Images manchmal groß und unhandlich sind; jedoch ist das Beseitigen bei einem Image häufig einfacher als das Beseitigen bei traditionellen Programmen, weil der Laufzeitstaat leichter ist, zu untersuchen und zu modifizieren. (Interessanterweise ist der Unterschied zwischen der bildbasierten und quellbasierten Entwicklung dem Unterschied zwischen der klassenbasierten und archetypischen objektorientierten Programmierung analog.)

Außerdem wird die Umgebung zur schnellen und Fluktuation der Gegenstände im System geschneidert. Wiederfactoring ein "Klassen"-Design ist so einfach wie schleifende Methoden aus den vorhandenen Vorfahren in neue. Einfache Aufgaben wie Testmethoden können durch das Bilden einer Kopie, das Schleppen der Methode in die Kopie, dann das Ändern davon behandelt werden. Verschieden von traditionellen Systemen hat nur der geänderte Gegenstand den neuen Code, und nichts muss wieder aufgebaut werden, um es zu prüfen. Wenn die Methode arbeitet, kann sie einfach zurück in den Vorfahren geschleppt werden.

Leistung

Selbst hat VMs Leistung der ungefähr Hälfte der Geschwindigkeit von optimiertem C auf einigen Abrisspunkten erreicht.

Das wurde durch gerade rechtzeitig Kompilationstechniken erreicht, für die den Weg gebahnt wurde und sich in Selbst Forschung verbessert hat, um eine hohe Sprache das gut durchführen zu lassen.

Müll-Sammlung

Der Müllmann für Selbst verwendet generational Müll-Sammlung, die Gegenstände durch das Alter trennt. Durch das Verwenden des Speicherverwaltungssystems, um Seite zu registrieren, schreibt, dass eine Schreiben-Barriere aufrechterhalten werden kann. Diese Technik gibt ausgezeichnete Leistung, obwohl nach dem Laufen für einige Zeit einer vollen Müll-Sammlung vorkommen kann, längere Zeitdauer nehmend.

Optimierungen

Das Durchlaufzeit-System macht auswählend Anruf-Strukturen glatt. Das gibt bescheidene Beschleunigungen an sich, aber erlaubt das umfassende Verstecken der Typ-Information und die vielfachen Versionen des Codes für verschiedene Anrufer-Typen. Das entfernt das Bedürfnis, viele Methode lookups zu tun, und erlaubt bedingten Zweigbehauptungen und hart codierten Anrufen - häufig das Geben C ähnlicher Leistung ohne Verlust der Allgemeinheit an der Sprachebene eingefügt zu werden, aber auf völlig hat Müll System gesammelt.

Siehe auch

Weiterführende Literatur

Links


Pinniped / Begräbnis in Berlin
Impressum & Datenschutz