<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Self_%28Programmiersprache%29</id>
	<title>Self (Programmiersprache) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Self_%28Programmiersprache%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Self_(Programmiersprache)&amp;action=history"/>
	<updated>2026-05-31T15:22:18Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Self_(Programmiersprache)&amp;diff=369611&amp;oldid=prev</id>
		<title>imported&gt;Nils.katze: /* growthexperiments-addlink-summary-summary:2|0|0 */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Self_(Programmiersprache)&amp;diff=369611&amp;oldid=prev"/>
		<updated>2025-03-15T17:01:20Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;growthexperiments-addlink-summary-summary:2|0|0&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Infobox Software&lt;br /&gt;
| Name                              = Self &amp;lt;!-- Nur falls abweichend vom Artikelnamen --&amp;gt;&lt;br /&gt;
| Logo                              = [[Datei:Self-logo.svg|200px|Logo]]&lt;br /&gt;
| Screenshot                        = &lt;br /&gt;
| Beschreibung                      = &amp;lt;!-- Beschreibung des Screenshots! --&amp;gt;&lt;br /&gt;
| Maintainer                        = &lt;br /&gt;
| Hersteller                        = David Ungar, Randall Smith&lt;br /&gt;
| Erscheinungsjahr                  = &amp;lt;!-- {{Start date and age|YYYY|MM|DD|df=yes/no}} --&amp;gt;&lt;br /&gt;
| AktuelleVersion                   = 2017.1 (&amp;quot;Mandarin&amp;quot;)&lt;br /&gt;
| AktuelleVersionFreigabeDatum      = 24. Mai 2017 &amp;lt;!-- {{Start date and age|YYYY|MM|DD|df=yes/no}} --&amp;gt;&lt;br /&gt;
| AktuelleVorabVersion              = &lt;br /&gt;
| AktuelleVorabVersionFreigabeDatum = &amp;lt;!-- {{Start date and age|YYYY|MM|DD|df=yes/no}} --&amp;gt;&lt;br /&gt;
| Betriebssystem                    = [[Linux]], [[macOS]], u.&amp;amp;nbsp;a.&lt;br /&gt;
| Programmiersprache                = dynamisch, streng typisiert&lt;br /&gt;
| Kategorie                         = [[Objektorientierte Programmiersprache]] ([[Prototypenbasierte Programmierung]]), [[Integrierte Entwicklungsumgebung|IDE]]&lt;br /&gt;
| Lizenz                            = BSD-artige license&lt;br /&gt;
| Deutsch                           = &lt;br /&gt;
| Website                           = [http://selflanguage.org/ selflanguage.org]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Self&amp;#039;&amp;#039;&amp;#039; [{{IPA|sɛlf}}] ist eine [[Programmiersprache]], die vor allem in Hinblick auf &amp;#039;&amp;#039;Ausdrucksfähigkeit&amp;#039;&amp;#039; und &amp;#039;&amp;#039;Formbarkeit&amp;#039;&amp;#039; hin von [[Randall B. Smith]] und [[David Ungar (Informatiker)|David Ungar]] entworfen wurde. Um diese Ziele zu erreichen, wurde ein rein [[Prototypenbasierte Programmierung|prototypen]]&amp;lt;nowiki/&amp;gt;basiertes [[Objektorientierte Programmierung|Objektmodell]] mit einheitlichem Zugriff auf Zustand und Verhalten der Objekte, also auf ihre Attribute und Methoden, entwickelt. Im Gegensatz zu anderen Programmiersprachen ist es in &amp;#039;&amp;#039;Self&amp;#039;&amp;#039; möglich, den Zustand von Objekten zu vererben und die Vererbung zur Laufzeit dynamisch anzupassen.&lt;br /&gt;
&lt;br /&gt;
Die letzte von Sun herausgegebene Version 4.3 wurde im Juni 2006 veröffentlicht. Sie läuft auf [[Intel]]- und [[PowerPC]]-basierten [[Apple Macintosh|Apple]]-Rechnern und auf [[Sun SPARC]], aber nicht unter [[Linux]] oder [[Microsoft Windows]].&amp;lt;ref name=&amp;quot;release_4.3&amp;quot;&amp;gt;{{Webarchiv |url=http://research.sun.com/self/release_4.3/release.html |text=Release 4.3 |wayback=20080628194226}} bei sun.com&amp;lt;/ref&amp;gt; Die Weiterentwicklung wird danach nicht mehr durch Sun betrieben und geschieht derzeit unabhängig.&lt;br /&gt;
&lt;br /&gt;
Ideen und Konzepte, die ihren originären Ursprung in der Programmiersprache Self haben, wurden über die Jahre sowohl in das [[Squeak]] [[Smalltalk (Programmiersprache)|Smalltalk]]-System übernommen, als auch in Programmiersprachen wie [[Slate (Programmiersprache)|Slate]] oder [[Io (Programmiersprache)|io]] weitergeführt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Self-language-universe.jpg|mini|Das Self-Universum]]&lt;br /&gt;
&lt;br /&gt;
Die herausragende Self-Eigenschaft ist wohl das &amp;#039;&amp;#039;Self-Universum&amp;#039;&amp;#039;, eine Art grafische Benutzeroberfläche ([[Grafische Benutzeroberfläche|GUI]]), innerhalb derer mit dem &amp;#039;&amp;#039;Self-Laufzeitsystem&amp;#039;&amp;#039; interagiert werden kann. Eine Interaktion erfolgt hierbei in der Regel über die [[Maus (Computer)|Maus]] und/oder die Tastatur. Visualisiert wird das Self-Universum mittels des GUI-Frameworks [[Morphic]]. Betritt eine Person das Self-Universum, so geschieht dies immer über die Lobby, eine Anspielung auf die Empfangshalle eines Hotels. In ihr befinden sich alle im System vorhandenen Objekte, Module, Namensräume und [[Trait (Programmierung)|Traits]]. Das Konzept des (Programmier-)Universums als auch das Morphic-Konzept wurde nahezu identisch im &amp;#039;&amp;#039;Squeak Smalltalk-System&amp;#039;&amp;#039; umgesetzt.&lt;br /&gt;
&lt;br /&gt;
Trotz der diversen Portierungen sollte man bedenken, dass es sich bei der Programmiersprache Self um ein eher akademisch motiviertes Unterfangen handelt. Trotzdem hatte und haben die in Self erprobten Neuheiten Einfluss auf neuere objektorientierte Programmiersprachen.&lt;br /&gt;
&lt;br /&gt;
== Geschichte ==&lt;br /&gt;
Self wurde ursprünglich 1986 von David Ungar und Randall B. Smith während ihrer Arbeit am [[Xerox PARC|Xerox-Parc]]-Institut entworfen. Ihr Ziel war es, nachdem [[Smalltalk (Programmiersprache)|Smalltalk-80]] veröffentlicht worden war, die Software-Technologie weiter voranzubringen. Sie wechselten zur [[Stanford University|Stanford-Universität]] und veröffentlichten im Folgejahr den ersten funktionierenden [[Compiler]]. Das erste vollständige Self-System wurde 1990 veröffentlicht; im Jahr darauf wechselte die Gruppe zu [[Sun Microsystems]], wo das Self-System als Experimentierfeld für die Entwicklung genutzt wurde. Hier kam [[Urs Hölzle]] dazu, der neue Compiler- und [[Virtuelle Maschine|VM]]-Techniken entwickelte und an der Entwicklung der [[Programmiersprache]] [[Strongtalk]] beteiligt war. 1995 wurde die Entwicklung bei Sun Microsystems offiziell eingestellt: „Self 4.0 ist, in einem gewissen Sinn, der Gipfelpunkt des Self-Projekts, das aber bei Sun offiziell nicht weitergeführt wird.“&amp;lt;ref&amp;gt;{{Webarchiv |url=http://research.sun.com/self/release_4.0/release.html |text=Release 4.0 |wayback=20080531093243}} bei sun.com&amp;lt;/ref&amp;gt; Allerdings gab es noch die Entwicklergruppe an der Stanford-Universität sowie verschiedene andere Initiativen. Trotz des offiziellen Stops wurde im September 2002 die Version 4.1.6 veröffentlicht.&amp;lt;ref&amp;gt;{{Webarchiv |url=http://research.sun.com/self/release_4.1/release.html |text=Release 4.1 |wayback=20080531093248}} bei sun.com&amp;lt;/ref&amp;gt; Im April 2004 erschien dann die Version 4.2 und im Juni 2006 die Version 4.3.&amp;lt;ref name=&amp;quot;release_4.3&amp;quot;/&amp;gt; Seit Juli 2010 gibt es eine Version 4.4.&amp;lt;ref name=&amp;quot;Version_4.4&amp;quot;&amp;gt;[http://files.selflanguage.org/releases/4.4/ Version 4.4]&amp;lt;/ref&amp;gt; Im Februar 2011 wurde ein experimenteller Snapshot einer Version 4.5 herausgegeben.&amp;lt;ref name=&amp;quot;Version_4.5-snapshot&amp;quot;&amp;gt;[http://blog.selflanguage.org/2011/02/05/makeover/ Version 4.5 (früher Snapshot)] auf blog.selflanguage.org&amp;lt;/ref&amp;gt; Bis zur Veröffentlichung einer fertigen Version unter dem Namen &amp;quot;Mallard&amp;quot; dauerte es jedoch bis Januar 2014.&amp;lt;ref name=&amp;quot;Version_4.5&amp;quot;&amp;gt;{{Webarchiv |url=https://blog.selflanguage.org/2014/01/12/self-mallard-4-5-0-released/ |text=Version 4.5 (Release &amp;quot;Mallard&amp;quot;) |wayback=20171206074534}} auf blog.selflanguage.org&amp;lt;/ref&amp;gt; Eine weitere Version mit dem Namen &amp;quot;Mandarin&amp;quot; entstand 2017.&amp;lt;ref&amp;gt;{{Webarchiv |url=https://blog.selflanguage.org/2017/05/24/self-mandarin-2017-1/ |text=Self “Mandarin” 2017.1 |wayback=20170524053153}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Entwicklungsumgebung ==&lt;br /&gt;
Das Self-System kann als [[Prototypenbasierte Programmierung|prototypenbasierte]] [[Smalltalk-80 (Programmiersprache)|Smalltalk]]-Variante verstanden werden. Die Entwickler bezeichnen die Sprache als [[Smalltalk-80 (Programmiersprache)|Smalltalk]]-Dialekt und meinen damit, dass sich die Syntax der Sprache und auch die Objektbibliothek weitgehend an Smalltalk orientiert. Der [[Klassenbrowser]] von Smalltalk wurde durch einen Objektbrowser ersetzt.&lt;br /&gt;
&lt;br /&gt;
Wie [[Smalltalk-80 (Programmiersprache)|Smalltalk]] beruht Self auf einer Laufzeitumgebung und einer [[Virtuelle Maschine|virtuellen Maschine]]. Self-Programme benötigen, genau wie andere auf virtuelle Maschinen beruhende Systeme, immer die zugehörige Speicherumgebung, um ausgeführt werden zu können. Als Folge werden Anwendungen häufig als Abbild des Speichers ausgeliefert. Dieses Speicherabbild wird auch &amp;#039;&amp;#039;Snapshot&amp;#039;&amp;#039; genannt.&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zur Auslieferung von Snapshots sind Textdateien, in die Änderungen am System oder auch ganze Module über den sogenannten Transporter ex- und importiert werden können. Diese Textdateien lassen sich mit einem beliebigen Editor bearbeiten. Sie sind vergleichbar mit einem C-Quelltext, jedoch wesentlich mächtiger. Das gesamte System lässt sich damit steuern. Da diese Textdateien auch automatisch mit dem Start des Systems eingelesen werden können, kann Self genau wie [[Perl (Programmiersprache)|Perl]] als [[Skriptsprache]] genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Die typische Größe eines Snapshots ist ca. 13 MB für ein vollständiges System mit [[JIT-Compiler]], [[Interpreter]] und der [[Integrierte Entwicklungsumgebung|Entwicklungsumgebung]]. Der von Smalltalk geerbte Vorteil ist, dass die Arbeit am System jederzeit, auch mitten in einer Berechnung, unterbrochen werden und in Snapshots gespeichert werden kann. Alle Änderungen, also das was bei klassischen Systemen dem Programmieren, einer Zeichnung oder irgendeiner Arbeit mit dem System entspricht, können beim nächsten Neustart auf Wunsch wieder vorhanden sein. Das System wacht da auf, wo es verlassen wurde. Self ist [[Persistenz (Informatik)|persistent]].&lt;br /&gt;
&lt;br /&gt;
Die Self-Entwicklungsumgebung ermöglicht es [[Quelltext|Quellcode]], Objekte, Vererbung, die Objekthierarchie oder einzelne Werte zur Laufzeit zu verändern. Möglich wird das durch die Fähigkeit zum [[Multitasking]] und einen nahtlos in das System integrierten [[Debugger]]. Das führt zu einer inkrementellen Art des „on the fly“-Entwickelns. Einige moderne Methoden der Softwareentwicklung, etwa die [[Agile Softwareentwicklung]] oder das [[Adaptive Software Development]], propagieren Ähnliches.&lt;br /&gt;
&lt;br /&gt;
So ist die Entwicklungsumgebung auf das schnelle und kontinuierliche Ändern einzelner Objekte zugeschnitten. Das [[Refactoring]] des „Objekt“-Designs ist beinahe so einfach wie das Entfernen einer Methode via [[Drag and Drop|Drag &amp;amp; Drop]], um sie so einem neuen Objekt zuordnen zu können. Einfachere Aufgaben wie das Erstellen von Test-Methoden können durch eine Kopie bewältigt werden. Die entsprechende Methode wird anschließend in die Objekt-Kopie &amp;#039;&amp;#039;gezogen&amp;#039;&amp;#039;, um sie so verändern zu können. Im Vergleich zu traditionellen Systemen besitzt nur das soeben neu erzeugte Objekt auch neuen Quellcode. Es ist folglich nicht erforderlich, Code neu zu kompilieren, um ihn testen zu können. Sobald sichergestellt wurde, dass die Test-Methode entsprechend der Spezifikation funktioniert, kann diese zurück in das Ausgangs-Objekt kopiert werden.&lt;br /&gt;
&lt;br /&gt;
== Sprachbeschreibung ==&lt;br /&gt;
Im Folgenden soll nur ein erster Eindruck dieser Programmiersprache vermittelt werden. Für umfassende Informationen sei auf &amp;#039;&amp;#039;The Self Language&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{Webarchiv |url=http://research.sun.com/self/language.html |text=The Self Language |wayback=20080620223355}} auf research.sun.com&amp;lt;/ref&amp;gt; und &amp;#039;&amp;#039;Teaching Self and Prototype-Based Programming&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{Webarchiv |url=http://research.sun.com/self/teaching.html |text=Teaching Self and Prototype-Based Programming |wayback=20080604161424}} auf research.sun.com&amp;lt;/ref&amp;gt; verwiesen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Self&amp;#039;&amp;#039; ist eine objektorientierte, prototypenbasierte Programmiersprache. Die Grundlage bilden einige wenige einfache Konstrukte: Prototypen, Steckplätze und das Verhalten. Im Gegensatz zu den Konzepten von Smalltalk und vielen anderen Programmiersprachen gibt es weder [[Klasse (Objektorientierung)|Klassen]] noch Variablen. Das Programmiermodell beruht im Wesentlichen auf kommunizierenden Objekten und einer einfachen Form von Vererbung.&lt;br /&gt;
&lt;br /&gt;
In &amp;#039;&amp;#039;Self&amp;#039;&amp;#039; werden keine [[Computerprogramm|Programme]] im eigentlichen Sinn geschrieben – stattdessen wird das „Self-Universum“ beschrieben. Hier gibt es nur Objekte, die durch das Verschicken von Nachrichten miteinander kommunizieren. Dieses Verschicken einer Nachricht entspricht einem [[Prozedur (Programmierung)|Prozedur]]-Aufruf in der klassischen Programmierung. Neue Objekte werden durch Klonen bestehender Objekte erzeugt.&lt;br /&gt;
&lt;br /&gt;
Durch das Prototypen-Konzept ist eine interaktive Programmierung möglich: Der Programmierer interagiert mit den Objekten im Self-Universum.&lt;br /&gt;
&lt;br /&gt;
In Self wird nicht zwischen dem Zustand eines Objekts und seinem Verhalten unterschieden. Der Zustand eines Objekts ergibt sich aus seinen Eigenschaften, also den Werten seiner Attribute. Das Verhalten eines Objekts wird in seinen Methoden beschrieben. Dadurch, dass es keinen Unterschied zwischen dem &amp;#039;&amp;#039;Zustand&amp;#039;&amp;#039; und dem &amp;#039;&amp;#039;Verhalten&amp;#039;&amp;#039; gibt, wird die Lücke verringert, die in anderen Programmiersprachen zwischen Objekten, Prozeduren und Variablen besteht. In Self ist alles eins.&lt;br /&gt;
&lt;br /&gt;
So liefert beispielsweise der Aufruf einer Eigenschaft –&amp;amp;nbsp;sofern das Objekt oder eines seiner Vorfahren diese Eigenschaft denn hat&amp;amp;nbsp;– deren Wert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
   aPerson name&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In dieser Anweisung wird die Eigenschaft &amp;#039;&amp;#039;name&amp;#039;&amp;#039; des Objekts &amp;#039;&amp;#039;aPerson&amp;#039;&amp;#039; aufgerufen bzw. abgefragt. Mit der folgenden Anweisung wird derselben Eigenschaft ein Wert zugewiesen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
    aPerson name:&amp;#039;myself&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sprachkonstrukte ===&lt;br /&gt;
Objekte bestehen aus (theoretisch) beliebig vielen &amp;#039;&amp;#039;Steckplätzen&amp;#039;&amp;#039; (slots). Ein [[Steckplatz]] hat einen Namen und kann ein Attribut (Wert) oder eine Methode (Prozedur) enthalten. In jedem Fall ist es ein Objekt, das er aufnimmt. Ein Objekt besteht somit aus einem oder mehreren Steckplätzen für Objekte, auf die mittels des Namens zugegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;Methoden-Objekt&amp;#039;&amp;#039; enthält eine oder mehrere Anweisungen, die ausgeführt werden, wenn das Methoden-Objekt aufgerufen wird. Ein &amp;#039;&amp;#039;Attribut-Objekt&amp;#039;&amp;#039; liefert sich selbst zurück, wenn es wie ein &amp;#039;&amp;#039;Methoden-Objekt&amp;#039;&amp;#039; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
Neue Objekte werden durch Klonen erzeugt. Dazu wird ein passendes Objekt als Prototyp benutzt, also sozusagen als eine Kopiervorlage. Jedes Objekt kann als Prototyp genutzt werden.&lt;br /&gt;
&lt;br /&gt;
== Ein kurzes Programm ==&lt;br /&gt;
Hier das klassische [[Hallo-Welt-Programm]]:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;#039;Hello, World!&amp;#039; print.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Punkt am Ende der Anweisung bewirkt, dass die Rückgabe des Wertes –&amp;amp;nbsp;die eigentlich bei allen Nachrichten erfolgt&amp;amp;nbsp;– unterdrückt bzw. vermieden wird. Hier noch einmal in einer aufwändigeren Form:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
   (desktop activeWindow) draw: (labelWidget copy label: &amp;#039;Hello, World!&amp;#039;).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erläuterung: Als erstes wird das &amp;#039;&amp;#039;desktop&amp;#039;&amp;#039;-Objekt nach dem aktiven Fenster gefragt. Das &amp;#039;&amp;#039;desktop&amp;#039;&amp;#039;-Objekt sieht dazu in seiner Liste der aktuellen Fenster nach und liefert das entsprechende Objekt zurück. Diesem Objekt wird in dem Steckplatz namens &amp;#039;&amp;#039;draw&amp;#039;&amp;#039; eine zuvor erzeugte Kopie des &amp;#039;&amp;#039;labelWidget&amp;#039;&amp;#039;-Objekt eingetragen. Bevor das passiert, wurde der &amp;#039;&amp;#039;labelWidget&amp;#039;&amp;#039;-Kopie bereits die Nachricht geschickt, dass es einen Steckplatz mit dem Namen &amp;#039;&amp;#039;label&amp;#039;&amp;#039; anlegen soll und dort den Wert &amp;#039;&amp;#039;Hello, World!&amp;#039;&amp;#039; ablegen soll.&lt;br /&gt;
&lt;br /&gt;
== Vererbung ==&lt;br /&gt;
Theoretisch ist jedes Self-Objekt eine eigenständige Entität. Es existieren keine Klassen, keine Meta-Klassen etc., um die Eigenschaften und Verhaltensweisen eines Objektes zu spezifizieren. Änderungen am Objekt selbst beeinflussen das Verhalten anderer Objekte nicht. In Einzelfällen jedoch wäre dies durchaus sinnvoll. Grundsätzlich versteht ein Objekt nur die Nachrichten, die auch einem seiner Slots eindeutig zugeordnet werden können. Verweisen jedoch ein oder mehrere Slots auf ein &amp;#039;&amp;#039;parent&amp;#039;&amp;#039;-Objekt, so ist das Objekt imstande, Nachrichten an diese Elternobjekte zu delegieren, insofern es diese selbst nicht zu interpretieren vermag. Auf diesem Weg verwaltet Self Aufgaben, die in traditionellen objektorientierten Sprachen das Vehikel der Vererbung benötigt hätten. Diese Verfahrensweise wird zudem benutzt, um Namensräume zu implementieren.&lt;br /&gt;
&lt;br /&gt;
Um den Zusammenhang der Vererbung besser veranschaulichen zu können, soll an dieser Stelle von einem Objekt namens &amp;#039;&amp;#039;BankKonto&amp;#039;&amp;#039; ausgegangen werden. Dieses soll in einer einfachen Buchhaltungsanwendung zum Einsatz kommen. Es liegt nahe, das Objekt &amp;#039;&amp;#039;BankKonto&amp;#039;&amp;#039; mit den Methoden &amp;#039;&amp;#039;einzahlen&amp;#039;&amp;#039; und &amp;#039;&amp;#039;abheben&amp;#039;&amp;#039; auszustatten. Zusätzliche Slots für einfache Daten werden ebenfalls benötigt. Das soeben spezifizierte Objekt ist ein Prototyp, stellt aber bereits ein voll funktionsfähiges Bankkonto dar.&lt;br /&gt;
&lt;br /&gt;
Erstellt man einen Klon des Objekts &amp;#039;&amp;#039;BankKonto&amp;#039;&amp;#039; für „Bobs Konto“, so erhält man eine Kopie, die mit dem ursprünglichen Prototyp identisch ist. Eine effektivere Herangehensweise ist es jedoch, ein einfaches Objekt namens &amp;#039;&amp;#039;traits object&amp;#039;&amp;#039; zu erstellen, das all die Elemente enthält, die man normalerweise mit einer Klasse assoziieren würde.&lt;br /&gt;
&lt;br /&gt;
Analog zum aktuellen Beispiel, würde das Objekt &amp;#039;&amp;#039;BankKonto&amp;#039;&amp;#039; als logische Konsequenz weder eine &amp;#039;&amp;#039;einzahlen&amp;#039;&amp;#039;- noch eine &amp;#039;&amp;#039;auszahlen&amp;#039;&amp;#039;-Methode besitzen. Vielmehr hat es nun ein Elternobjekt, das diese Methoden enthält. Auf diese Weise ist es möglich, unzählige Kopien des Bankkonto-Objekts zu erzeugen, deren Verhalten durch eine einzige Änderung am ElternObjekt verändert werden können.&lt;br /&gt;
&lt;br /&gt;
Wie unterscheidet sich der geschilderte Sachverhalt von den traditionellen Klassen einer OO-Sprache? Was bedeutet wohl das nachfolgende Konstrukt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
   myObject parent: someOtherObject.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Konstrukt verändert die „Klasse“ von &amp;#039;&amp;#039;myObject&amp;#039;&amp;#039; zur Laufzeit, indem der Wert, der mit dem Slot &amp;#039;&amp;#039;parent*&amp;#039;&amp;#039; assoziiert ist, verändert wird (der Stern ist Teil des Slot-Namens und gehört folglich nicht zur Nachricht, die dieser Slot empfängt).&lt;br /&gt;
&lt;br /&gt;
== Slots hinzufügen ==&lt;br /&gt;
[[Datei:Self-language-slot.png|mini|200px|Ein Self-Slot-Objekt]]&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle stellt sich die Frage, wie Kopien eines Self-Objekts modifiziert werden müssen, damit diese neue Slots enthalten. Benutzt man die grafische Self-Programmierumgebung, gestaltet sich dies ziemlich einfach. Programmatisch gesehen ist es am sinnvollsten, ein sogenanntes Mirror-Objekt des Objekts zu erzeugen und dann zu modifizieren. Dazu schickt man diesem Mirror-Objekt entsprechende Nachrichten.&lt;br /&gt;
&lt;br /&gt;
Ein Weg, der schneller zum Ziel führt, ist den Primitiv &amp;#039;&amp;#039;_AddSlots:&amp;#039;&amp;#039; zu verwenden. Ein Primitiv hat dieselbe Syntax wie eine normale Schlüsselwort-Nachricht. Jedoch beginnt dessen Name mit einem Unterstrich. Der _AddSlots-Primitiv gilt inzwischen als überholt; wegen seiner Kürze wird er hier trotzdem verwendet.&lt;br /&gt;
&lt;br /&gt;
Eines der ersten Beispiele beschäftigte sich mit dem [[Refactoring]] einer einfachen Klasse namens Fahrzeug. Das Refactoring wurde notwendig, um zwischen Personen- und Lastkraftwagen unterscheiden zu können. Versucht man das Refactoring in Self umzusetzen, so sieht dies etwa aus wie folgt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
   _AddSlots: (| vehicle &amp;lt;- (|parent* = traits clonable|) |).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da der Empfänger des &amp;#039;&amp;#039;_AddSlots:&amp;#039;&amp;#039;-Primitivs nicht angegeben wurde, ist dieser automatisch „self“. Wird ein Ausdruck innerhalb des Shell-Prompt der Entwicklungsumgebung eingegeben und ausgeführt, so ist das Objekt, das daraus resultierende Nachrichten empfängt, immer das &amp;#039;&amp;#039;lobby&amp;#039;&amp;#039;-Objekt. Das an &amp;#039;&amp;#039;_AddSlots:&amp;#039;&amp;#039; übergebene Argument ist das Objekt, das in das Empfänger-Objekt kopiert wird. In diesem Fall handelt es sich um ein Objekt-Literal mit genau einem Slot. Der Name des Slots ist &amp;#039;&amp;#039;vehicle&amp;#039;&amp;#039;, und dessen Wert ist ein weiteres Objekt-Literal. Die Notationsweise „&amp;lt;code&amp;gt;&amp;lt;-&amp;lt;/code&amp;gt;“ impliziert einen weiteren Slot namens &amp;#039;&amp;#039;vehicle:&amp;#039;&amp;#039;, der notwendig ist, um den Wert des ersten Slots zu verändern.&lt;br /&gt;
&lt;br /&gt;
Das „&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;“ weist auf einen Slot mit konstantem Wert hin. Aus diesem Grund gibt es auch keinen korrespondierenden &amp;#039;&amp;#039;parent:&amp;#039;&amp;#039; Slot. Das Objekt-Literal, das den Initialwert &amp;#039;&amp;#039;vehicle&amp;#039;&amp;#039; repräsentiert, hat einen Slot, um auf Nachrichten des Klonens reagieren zu können. Ein Objekt, das tatsächlich leer ist, wird durch &amp;lt;code&amp;gt;(||)&amp;lt;/code&amp;gt; oder einfach &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt; dargestellt. Ein solches Objekt ist nicht in der Lage, Nachrichten zu empfangen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
    vehicle _AddSlots: (| name &amp;lt;- &amp;#039;automobile&amp;#039;|).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel ist der Nachrichten-Empfänger das vorherige Objekt, das zusätzlich zum &amp;#039;&amp;#039;parent*&amp;#039;&amp;#039;-Slot sowohl einen &amp;#039;&amp;#039;name&amp;#039;&amp;#039;- als auch einen &amp;#039;&amp;#039;name:&amp;#039;&amp;#039;-Slot enthält.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
    _AddSlots: (| sportsCar &amp;lt;- vehicle copy |).&lt;br /&gt;
   sportsCar _AddSlots: (| driveToWork = (&amp;#039;&amp;#039;some code, this is a method&amp;#039;&amp;#039;) |).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obwohl zuvor &amp;#039;&amp;#039;vehicle&amp;#039;&amp;#039; und &amp;#039;&amp;#039;sportsCar&amp;#039;&amp;#039; identische Objekte waren, beinhaltet das aktuelle Objekt nun einen Slot, dem eine Methode zugeordnet ist, die es zuvor nicht gab. Methoden können nur in Slots mit konstantem Wert enthalten sein.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
    _AddSlots: (| porsche911 &amp;lt;- sportsCar copy |).&lt;br /&gt;
   porsche911 name:&amp;#039;Bobs Porsche&amp;#039;.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 Bei den folgenden Beispielen handelt es sich um Smalltalk Beispiele.&lt;br /&gt;
 Sie müssen mitunter noch für Self angepasst werden.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Weitere Programmbeispiele ==&lt;br /&gt;
=== [[Hallo-Welt-Programm|Hello World]] ===&lt;br /&gt;
  Transcript show: &amp;#039;Hallo Welt!&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Berechnung der Fakultät ===&lt;br /&gt;
  fakultaet&lt;br /&gt;
    &amp;quot;Liefert die Fakultät des Empfängers zurück.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    self = 0 ifTrue: [^ 1].&lt;br /&gt;
    self &amp;gt; 0 ifTrue: [^ self * (self - 1) fakultaet].&lt;br /&gt;
    self error: &amp;#039;Unzulässig für negative Integer-Werte&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Fibonacci-Folge ===&lt;br /&gt;
  fibonacci&lt;br /&gt;
    &amp;quot;Answer the self&amp;#039;th fibonacci number:  5 fibonacci&amp;quot;&lt;br /&gt;
    self &amp;lt; 3 ifTrue: [ ^ 1 ].&lt;br /&gt;
    ^ (self - 1) fibonacci + (self - 2) fibonacci&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionen ==&lt;br /&gt;
* 4.0: läuft auf SPARC-basierten Sun-Workstations mit SunOS 4.1.x, Solaris 2.3, oder Solaris 2.4 als Betriebssystem&lt;br /&gt;
* 4.1.6: läuft auch als Anwendung unter Mac OS X. Die Unterstützung für Mac OS 9 wurde eingestellt&lt;br /&gt;
* 4.2.1: läuft auch auf G3-Macs&lt;br /&gt;
* 4.3: läuft auch auf [[Intel]]-basierten Macs&lt;br /&gt;
* 4.4: läuft unter Mac OS X und Linux (x86)&lt;br /&gt;
* 4.5: läuft unter Mac OS X und Linux&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Smalltalk (Programmiersprache)|Smalltalk]]&lt;br /&gt;
* [[Strongtalk]]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* [http://research.sun.com/self/papers/papers.html A Self Bibliography] (engl., Literaturliste bei Sun&amp;#039;s ehemaliger Self-Group)&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://groups.yahoo.com/group/self-interest/ Yahoo!-Gruppe über Self]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Websites der Self-Entwickler&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view.php?person=us-davidungar David Ungar]&lt;br /&gt;
* [http://research.sun.com/people/randy/ Randall B. Smith]&lt;br /&gt;
* [http://www.cs.ucsb.edu/~urs/ Urs Hölzle]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Liste einiger Self-Implementierungen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* [http://research.sun.com/self/ Die originäre Self-Implementierung von Sun]&lt;br /&gt;
* [http://www.self-support.com/ Self-Implementierung] für [[X86-Prozessor|x86]]-[[Linux]] und -[[Cygwin]]&lt;br /&gt;
* [http://selflanguage.org/ Aktuelle Weiterentwicklung und Dokumentation]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmiersprache]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Nils.katze</name></author>
	</entry>
</feed>