<?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=X10_%28Programmiersprache%29</id>
	<title>X10 (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=X10_%28Programmiersprache%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=X10_(Programmiersprache)&amp;action=history"/>
	<updated>2026-06-02T23:24:11Z</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=X10_(Programmiersprache)&amp;diff=1980856&amp;oldid=prev</id>
		<title>imported&gt;Aka: falsches Komma entfernt</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=X10_(Programmiersprache)&amp;diff=1980856&amp;oldid=prev"/>
		<updated>2024-12-04T11:52:03Z</updated>

		<summary type="html">&lt;p&gt;falsches Komma entfernt&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Infobox Programmiersprache&lt;br /&gt;
| Name                         = X10&lt;br /&gt;
| Logo                         = &lt;br /&gt;
| Beschreibung                 = &lt;br /&gt;
| Paradigma                    = [[Objektorientierte Programmierung|Objektorientierte Programmiersprache]]&lt;br /&gt;
| Betriebssystem               = [[AIX]], [[Linux]], [[macOS]], [[Windows]]/[[Cygwin]]&lt;br /&gt;
| Lizenz                       = [[Eclipse Public License]] 1.0&lt;br /&gt;
| Erscheinungsjahr             = 2004&lt;br /&gt;
| Entwickler                   = Kemal Ebcioğlu, Vijay Saraswat und Vivek Sarkar ([[IBM]])&lt;br /&gt;
| AktuelleVersion              = 2.6.2&amp;lt;ref name=&amp;quot;Spec&amp;quot;&amp;gt;{{Literatur |Autor=Vijay Saraswat, Bard Bloom, Igor Peshansky, Olivier Tardieu, David Grove, |Titel=X10 Language Specification Version 2.6.2 |Datum=2019 |Seiten=1–303 |Online=http://x10.sourceforge.net/documentation/languagespec/x10-262.pdf |Format=PDF |KBytes=1500 |Abruf=2019-01-04}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
| AktuelleVersionFreigabeDatum = 8. Januar 2019&lt;br /&gt;
| Typisierung                  = [[Starke Typisierung|stark]], [[Statische Typisierung|statisch]]&lt;br /&gt;
| Implementierung              = &lt;br /&gt;
| Dialekte                     = &lt;br /&gt;
| Standardisierungen           = &lt;br /&gt;
| Beeinflusst_von              = [[Java (Programmiersprache)|Java]], [[C++]], [[Scala (Programmiersprache)|Scala]]&lt;br /&gt;
| Beeinflusste                 = &lt;br /&gt;
| Website                      = http://x10-lang.org/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;X10&amp;#039;&amp;#039;&amp;#039; ist eine [[Parallele Programmierung|parallele]], [[Objektorientierung|objektorientierte]] [[Programmiersprache]], für high-end Hardware mit bis zu 10000 Hardware-[[Thread (Informatik)|Threads]]&amp;lt;ref name=&amp;quot;Spec&amp;quot; /&amp;gt;. Sie wurde 2004 bei [[IBM]] am [[Thomas J. Watson Research Center|Forschungszentrum Thomas J. Watson]] als Teil des [[PERCS]]-Projekts entwickelt. Zielplattformen der Programmiersprache sind Cluster-Systeme mit unterschiedlichen Berechnungseinheiten (Non-Uniform Cluster Computing). Die Programmiererproduktivität solcher Systeme soll mit X10 um den Faktor zehn erhöht werden, was zu dem Namen X10 geführt hat.&amp;lt;ref&amp;gt;{{Literatur |Autor=Philippe Charles, Christian Grothoff, Vijay A. Saraswat et al. |Titel=X10: An Object-Oriented Approach to Non-Uniform Cluster Computing |Sammelwerk=OOPSLA |Band= |Nummer= |Datum=2005 |Seiten=519–538 |DOI=10.1145/1094811.1094852}}&amp;lt;/ref&amp;gt; Die Entwicklung von X10 wurde durch das [[High Productivity Computing Systems]] (HPCS) Programm der [[DARPA]] finanziert.&lt;br /&gt;
&lt;br /&gt;
X10 wurde speziell zur parallelen Programmierung nach dem [[PGAS|Partitioned Global Address Space]] (PGAS) Modell entworfen. X10 erweitert dieses sogar noch um [[Asynchronität]], was zu einem APGAS Modell führt. Eine Berechnung ist auf verschiedene Places aufgeteilt. Diese enthalten Daten und eine oder mehrere Activities, die mit diesen Daten arbeiten. X10 hat ein beschränktes Typsystem für [[objektorientierte Programmierung]]. Außerdem hat es noch andere Eigenschaften wie benutzerdefinierte primitive &amp;#039;&amp;#039;struct&amp;#039;&amp;#039;-Typen, global verteilte [[Feld (Datentyp)|Arrays]] und strukturierten und unstrukturierten Parallelismus.&amp;lt;ref name=&amp;quot;Spec&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grundkonzepte ==&lt;br /&gt;
=== Activities ===&lt;br /&gt;
Eine Activity ist ein leichtgewichtiger Thread ohne eigenen Namen. Asynchrone Activities werden durch den Befehl&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
at (p) async s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
erstellt. Dabei ist &amp;#039;&amp;#039;p&amp;#039;&amp;#039; der Place, an dem die Activity ausgeführt werden soll und &amp;#039;&amp;#039;s&amp;#039;&amp;#039; der Befehl (engl. Statement). Eine Aktivität wird an einem bestimmten Place erstellt und bleibt dort für die gesamte Lebensdauer. Mit dem Schlüsselwort &amp;#039;&amp;#039;here&amp;#039;&amp;#039; kann eine Aktivität auf ihren Place zugreifen.&amp;lt;ref name=&amp;quot;Saraswat2005&amp;quot;&amp;gt;{{Literatur |Autor=Vijay Saraswat, Radha Jagadeesan |Titel=Concurrent Clustered Programming |Sammelwerk=Lecture Notes in Computer Science |Band=3653 |Verlag=Springer |Ort=Berlin Heidelberg |Datum=2005 |Seiten=353-367 |DOI=10.1007/11539452_28}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Places ===&lt;br /&gt;
Ein Place enthält Daten und Activities, die auf diesen Daten arbeiten. Man kann sich einen Place als eigenen Knoten einer verteilten [[Java Virtual Machine]] (JVM) mit eigenem [[Dynamischer Speicher|Heap]] und eigenen [[Thread (Informatik)|Threads]] vorstellen. Dabei kann angenommen werden, dass alle Places geordnet sind. Handelt es sich bei &amp;#039;&amp;#039;p&amp;#039;&amp;#039; um einen Place, so kann mit &amp;#039;&amp;#039;p.next&amp;#039;&amp;#039; auf den nächsten Place zugegriffen werden.&amp;lt;ref name=&amp;quot;Saraswat2005&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt keinen expliziten Befehl um einen neuen Place zu erzeugen, vielmehr wird jede Activity mit einer expliziten Anzahl Places gestartet. Daraus ergibt sich eine fixe Anzahl von Places für das gesamte Programm, die während der gesamten Programmlaufzeit konstant bleibt. Die Places des Programms sind von &amp;#039;&amp;#039;0&amp;#039;&amp;#039; bis &amp;#039;&amp;#039;Place.MAX_PLACES-1&amp;#039;&amp;#039; nummeriert und werden in einer sortierten Sequenz von &amp;#039;&amp;#039;Place.places()&amp;#039;&amp;#039; gespeichert. Auf den Place der aktuellen Activity kann mit dem Schlüsselwort &amp;#039;&amp;#039;here&amp;#039;&amp;#039; zugegriffen werden.&amp;lt;ref name=&amp;quot;Spec&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Zugriff abhängig vom Place wird durch das statische Feld &amp;#039;&amp;#039;location&amp;#039;&amp;#039;, das jedes Objekt enthält, geregelt. Nur die Objekte eines Places erhalten Zugriff auf nicht-finale Felder der anderen Objekte dieses Places. Versuche auf nicht-finale Felder von Objekten auf einem anderen Place zuzugreifen scheitern mit einer &amp;#039;&amp;#039;BadPlaceException (BPE)&amp;#039;&amp;#039;.&amp;lt;ref name=&amp;quot;Saraswat2005&amp;quot; /&amp;gt; Man kann jedoch mit dem Ausdruck &amp;#039;&amp;#039;at&amp;#039;&amp;#039; einzelne Activitys synchron auf andere Places verschieben. Dabei handelt es sich, wie bei jeder verteilten Operation, um eine sehr teure Operation. Sie bildet jedoch die Grundlage für [[Mehrkernprozessor|Multicore]] Programmierung in X10.&amp;lt;ref name=&amp;quot;Spec&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objekte werden auf dem Place erzeugt, auf dem der Konstruktor-Aufruf läuft. Anschließend kann ein Objekt, im Gegensatz zu Activities, nicht mehr den Place wechseln. Es kann nur auf einen anderen Place kopiert oder über &amp;#039;&amp;#039;GlobalRef&amp;#039;&amp;#039; von anderen Places referenziert werden.&amp;lt;ref name=&amp;quot;Spec&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Distributions und distributed Arrays ===&lt;br /&gt;
Mit Distributions werden distributed Arrays auf Places verteilt. Dabei ist die Distribution ein Objekt, die jedem Element des Arrays einen Place zuordnet. Auf welchem Place ein Element eines distributed Arrays liegen soll, muss bereits zur Array-Erstellung bekannt sein. Dabei ist zu beachten, dass auf einem Place nur auf diejenigen Elemente des distributed Arrays zugegriffen werden kann, die auch auf diesem Place liegen.&amp;lt;ref name=&amp;quot;Saraswat2005&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Atomarität ===&lt;br /&gt;
Wie in vielen anderen Programmiersprachen verbergen sich hinter einfachen Befehlen, wie dem [[Inkrement]] mehrere Maschinenbefehle, was diese zu einem [[Kritischer Abschnitt|kritischen Abschnitt]] macht. Das bedeutet, dass ein solcher Befehl potentiell von einem parallel ausgeführten anderen Befehl unterbrochen werden kann. Um das zu verhindern können in X10 einzelne Befehle mit einem&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
when(c) S&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
umgeben werden. Dabei ist &amp;#039;&amp;#039;c&amp;#039;&amp;#039; die [[Boolesche Variable|boolesche]] Wächterbedingung und &amp;#039;&amp;#039;S&amp;#039;&amp;#039; der atomar auszuführende Befehl (engl. &amp;#039;&amp;#039;statement&amp;#039;&amp;#039;). Solange &amp;#039;&amp;#039;c&amp;#039;&amp;#039; nicht true ist, blockiert die Ausführung. Wenn &amp;#039;&amp;#039;c&amp;#039;&amp;#039; true wird, so wird &amp;#039;&amp;#039;S&amp;#039;&amp;#039; atomar ausgeführt.&amp;lt;ref name=&amp;quot;Saraswat2005&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um ganze Methoden atomar auszuführen, kann man das Schlüsselwort &amp;#039;&amp;#039;atomic&amp;#039;&amp;#039; davor schreiben. Die Methode &amp;#039;&amp;#039;increment&amp;#039;&amp;#039; wird beispielsweise atomar ausgeführt&amp;lt;ref name=&amp;quot;Saraswat2005&amp;quot; /&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
atomic boolean increment() {&lt;br /&gt;
   value++;&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clocks ===&lt;br /&gt;
Viele parallele [[Algorithmus|Algorithmen]] sind in verschiedene Phasen aufgeteilt, dabei müssen alle Aktivitäten einer Phase abgearbeitet werden, bevor die nächste Phase beginnt. In X10 werden diese Phasen durch sogenannte &amp;#039;&amp;#039;Clocks&amp;#039;&amp;#039; getrennt. Um eine Aktivität an einen solchen Clock zu binden, definiert man diese als &amp;#039;&amp;#039;clocked()&amp;#039;&amp;#039; mit dem entsprechenden Clock Objekt.&amp;lt;ref name=&amp;quot;Spec&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im folgenden Beispiel werden zwei Aktivitäten &amp;#039;&amp;#039;A&amp;#039;&amp;#039; und &amp;#039;&amp;#039;B&amp;#039;&amp;#039; durch ein Clock Objekt synchronisiert, so dass zuerst die Ausgaben der ersten Phase beider Aktivitäten ausgegeben werden und anschließend die Ausgaben der zweiten Phase beider Aktivitäten&amp;lt;ref group=&amp;quot;Anmerkung&amp;quot;&amp;gt;Aktivitäten haben in X10 keine Namen, im Beispiel werden die Aktivitäten nur aus didaktischen Gründen benannt.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//erzeuge ein Clock Objekt&lt;br /&gt;
val clock = Clock.make();&lt;br /&gt;
&lt;br /&gt;
//erzeuge Aktivität A und binde sie an clock&lt;br /&gt;
async clocked(clock) {&lt;br /&gt;
   //gebe parallel zu B Text aus&lt;br /&gt;
   print(&amp;quot;A: 1st phase. &amp;quot;);&lt;br /&gt;
   //warte auf B&lt;br /&gt;
   Clock.advanceAll();&lt;br /&gt;
   print(&amp;quot;A: 2nd phase. &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//erzeuge Aktivität B und binde sie an clock&lt;br /&gt;
async clocked(clock) {&lt;br /&gt;
   //gebe parallel zu A Text aus&lt;br /&gt;
   print(&amp;quot;B: 1st phase. &amp;quot;);&lt;br /&gt;
   //warte auf A&lt;br /&gt;
   Clock.advanceAll();&lt;br /&gt;
   print(&amp;quot;B: 2nd phase. &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein mögliches Ergebnis des Beispiels wäre:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;A: 1st phase. B: 1st phase. B: 2nd phase. A: 2nd phase. &amp;#039;&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
nicht aber&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;A: 1st phase. A: 2nd phase. B: 1st phase. B: 2nd phase. &amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Klassen ==&lt;br /&gt;
Eine [[Klasse (Objektorientierung)|Klasse]] enthält, analog zu Java, Daten und Code. Eine Klasse kann verschiedene Felder, Eigenschaften, [[Methode (Programmierung)|Methoden]], [[Konstruktoren und Destruktoren|Konstruktoren]] enthalten. Außerdem spezifiziert eine Klasse maximal eine oder keine Elternklasse. Eine Klasse kann mehrere [[Schnittstelle#Softwareschnittstelle|Interfaces]] implementieren.&lt;br /&gt;
&lt;br /&gt;
Eine Klasse kann als &amp;#039;&amp;#039;final&amp;#039;&amp;#039; markiert werden. Von einer solchen Klasse kann nicht mehr [[Vererbung (Programmierung)|geerbt]] werden.&lt;br /&gt;
&lt;br /&gt;
=== Felder ===&lt;br /&gt;
Felder spezifizieren Daten, die zu einer Klasse gehören. Dabei unterscheidet man, ob die Felder veränderbar (gekennzeichnet mit dem Schlüsselwort &amp;#039;&amp;#039;var&amp;#039;&amp;#039;), oder unveränderbar (gekennzeichnet mit dem Schlüsselwort &amp;#039;&amp;#039;val&amp;#039;&amp;#039;) sind. Der Typ eines veränderbaren Feldes muss immer spezifiziert werden. Dieser folgt dem Namen der Variable nach einem Doppelpunkt. Unveränderbare Felder können bereits mit einem Wert initialisiert werden, müssen es aber nicht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//veränderbares Feld mit dem Namen &amp;quot;population&amp;quot;, vom Typ Integer und mit dem initialen Wert 42&lt;br /&gt;
var population:Int = 42;&lt;br /&gt;
//veränderbares Feld mit dem Namen &amp;quot;growthRate&amp;quot;, vom Typ Integer und ohne initialen Wert&lt;br /&gt;
var growthRate:Int;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Typ eines unveränderbaren Feldes muss nicht explizit angegeben werden. Er kann auch implizit aus dem Initialisierungswert abgeleitet werden. Ein unveränderbares Feld muss nicht initialisiert werden, solange es im Konstruktor der Klasse initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//unveränderbares Feld mit dem Namen &amp;quot;pi&amp;quot;, vom expliziten Typ Double und ohne initialen Wert&lt;br /&gt;
val pi:Double;&lt;br /&gt;
//unveränderbares Feld mit dem Namen &amp;quot;truth&amp;quot;, vom impliziten Typ Integer und mit initialem Wert 42&lt;br /&gt;
val truth = 42;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Felder können entweder objektspezifisch oder [[Static (Schlüsselwort)|statisch]] (mit dem Schlüsselwort &amp;#039;&amp;#039;static&amp;#039;&amp;#039; gekennzeichnet) sein. Standardmäßig sind Felder objektspezifisch, das heißt jedes Objekt hat seine eigene Instanz des Feldes. Ist ein Feld statisch, so gibt es für alle Objekte nur eine Instanz dieses Feldes. In X10 müssen statische Variablen immer unveränderbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//statisches, unveränderbares Feld mit dem Namen &amp;quot;pi&amp;quot;, vom impliziten Typ Double und mit initialem Wert&lt;br /&gt;
static val pi = 3,141;&lt;br /&gt;
//objektspezifisches, unveränderbares Feld mit dem Namen &amp;quot;truth&amp;quot;, vom impliziten Typ Integer und mit initialem Wert&lt;br /&gt;
val truth = 42;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementierungen ==&lt;br /&gt;
Es gibt zwei Implementierungen von X10: &amp;#039;&amp;#039;Native X10&amp;#039;&amp;#039; und &amp;#039;&amp;#039;Managed X10&amp;#039;&amp;#039;. Native X10 basiert auf C++ und bildet einen Place auf einen [[Prozess (Informatik)|Prozess]] ab. Es ist für folgende Betriebssysteme verfügbar: [[Linux]], [[AIX]], [[Mac OS]], [[Cygwin]] und [[Blue Gene]]. Managed X10 ist JVM basiert. Es bildet einen Place auf einen JVM-Prozess ab. Da es auf Java basiert, läuft es unabhängig vom Betriebssystem mit jeder Version ab Java 6.&amp;lt;ref name=&amp;quot;X10Tut&amp;quot;&amp;gt;{{Literatur |Autor=David Grove, Vijay Saraswat, Olivier Tardieu |Titel=Developing Scalable Parallel Applications in X10 |Datum=2012 |Seiten=1–85 |Online=[http://x10.sourceforge.net/tutorials/x10-2.2/SC_2012/SC12_X10_Tutorial.pdf online] |Format=PDF |KBytes=1300 |Abruf=2013-08-26}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;Anmerkung&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://x10-lang.org/ X10 Website]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmiersprache für die Java Virtual Machine]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Aka</name></author>
	</entry>
</feed>