📚 The CoCalc Library - books, templates and other resources
License: OTHER
%!TEX root = Programmierparadigmen.tex1\chapter{X10}\index{X10|(}%2X10 ist eine objektorientierte Programmiersprache, die 2004 bei IBM entwickelt3wurde.45Wie in Scala sind auch in X10 Funktionen First-Class Citizens.67X10 nutzt das PGAS-Modell:89\begin{definition}[PGAS\footnotemark]\xindex{PGAS}%10PGAS (partitioned global address space) ist ein Programmiermodell für11Mehrprozessorsysteme und massiv parallele Rechner. Dabei wird der globale12Adressbereich des Arbeitsspeichers logisch unterteilt. Jeder Prozessor13bekommt jeweils einen dieser Adressbereiche als lokalen Speicher zugeteilt.14Trotzdem können alle Prozessoren auf jede Speicherzelle zugreifen, wobei auf15den lokalen Speicher mit wesentlich höherer Geschwindigkeit zugegriffen16werden kann als auf den von anderen Prozessoren.17\end{definition}18\footnotetext{\url{https://de.wikipedia.org/wiki/PGAS}}1920Im PGAS-Modell gibt es \texttt{places}. Diese sind Platzhalter für Aktivitäten21und Objekte.2223\begin{itemize}24\item \texttt{Place.FIRST\_PLACE} ist der place 0.25\item \texttt{here} ist der Prozess-eigene place und \texttt{here.next()} ist26der darauf folgende Place.27\item \texttt{main} wird in \texttt{place 0} ausgeführt.28\item \texttt{Place.places()} liefert einen Iterator für alle verfügbaren places.29Ein spezifischer Place kann durch \texttt{Place(n)} ausgewählt werden.30\end{itemize}3132\section{Erste Schritte}33Als erstes sollte man x10 von \url{http://x10-lang.org/x10-development/building-x10-from-source.html?id=248} herunterladen.3435Dann kann man die \texttt{bin/x10c} zum erstellen von ausführbaren Dateien nutzen.36Der Befehl \texttt{x10c HelloWorld.x10} erstellt eine ausführbare Datei namens37\texttt{a.out}.3839\inputminted[numbersep=5pt, tabsize=4, frame=lines, label=HelloWorld.x10]{cpp}{scripts/x10/HelloWorld.x10}4041\section{Syntax}42Genau wie Scala nutzt X10 \texttt{val}\xindex{val (X10)@\texttt{val} (X10)} und \texttt{var}\xindex{var (X10)@\texttt{var} (X10)}, wobei \texttt{val} für43\enquote{value} steht und ein unveränderbarer Wert ist. \texttt{var} hingegen44steht für \enquote{variable} und ist veränderbar.4546Eine Besonderheit sind sog. \textit{Constrianed types}\xindex{types!constrained}:4748\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/x10/constrained-type-example.x10}4950\subsection{Logische Operatoren}51\begin{table}[H]52\centering53\begin{tabular}{CCCC}54UND & ODER & Wahr & Falsch \\ \hline\hline55\&\& & || & true & false \\[4ex]56GLEICH & UNGLEICH & NICHT & ~ \\ \hline\hline57== & != & ! & ~ \\58\end{tabular}59\caption{Logische Operatoren in X10}\xindex{Logische Operatoren!X10}60\end{table}6162\subsection{Closures}\xindex{closure}%6364Closres werden unterstützt:6566\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/x10/closures-example.x10}6768\subsection{async}\xindex{async}%6970Durch \texttt{async S} kann das Statement \texttt{S} asynchron ausgeführt werden.71Das bedeutet, dass ein neuer Kindprozess (eine Kind-Aktivität) erstellt wird, die72\texttt{S} ausführt. Dabei wird nicht auf das Beenden von \texttt{S} gewartet.73Will man das, so muss \texttt{finish}\xindex{finish (X10)@\texttt{finish} (X10)} vor das Statement gestellt werden.7475\subsection{atomic}\xindex{atomic}%76Durch \texttt{atomic S} wird das Statement \texttt{S} atomar ausgeführt. Auch77Methoden können atomar gemacht werden.7879\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/x10/atomic-example.x10}8081\subsection[Bedingtes Warten]{Bedingtes Warten\footnote{WS 2013/2014, Kapitel 43, Folie 22}}\xindex{when (X10)@\texttt{when} (X10)}%82Durch \texttt{when (E) S} kann eine Aktivität warten, bis die Bedingung \texttt{E}83wahr ist um dann das Statement \texttt{S} auszuführen.8485An \texttt{E} werden einige Forderungen gestellt:8687\begin{itemize}88\item \texttt{E} muss ein boolescher Ausdruck sein.89\item \texttt{E} darf nicht blockieren.90\item \texttt{E} darf keine nebenläufigen Aktivitäten erstellen, muss also91sequenziell laufen.92\item \texttt{E} darf nicht auf \textit{remote data} zugreifen, muss also93lokal arbeiten.94\item \texttt{E} muss frei von Seiteneffekten sein.95\end{itemize}9697\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/x10/when-example.x10}9899\subsection{Lokalisierung}\footnote{WS 2013/2014, Kapitel 43, Folie 23}\xindex{at}%100Durch \texttt{at (p) S} wird sichergestellt, dass das Statement \texttt{S} auf101dem place \texttt{p} ausgeführt wird. Dabei ist zu beachten, dass die Eltern-Aktivität102so lange blockiert, bis \texttt{S} beendet.103104Es wird eine Deep-Copy des lokalen Objektgraphen auf den place \texttt{p} erstellt.105106\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/x10/at-example.x10}107108\section{Datentypen}109Byte, UByte, Short, UShort, Char, Int, UInt, Long, ULong, Float, Double, Boolean,110Complex, String, Point, Region, Dist, Array111112\subsection{Arrays}%113Arrays werden in X10 wie folgt definiert:114115\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/x10/array-example.x10}116117Das ergibt den Array \texttt{[ 0, 2, 4, 6, 8 ]}.118119\subsection{struct}\xindex{struct (X10)@\texttt{struct} (X10)}%120In X10 gibt es, wie auch in C, den Typ \texttt{struct}. Dieser erlaubt im Gegensatz121zu Objekten keine Vererbung, kann jedoch auch interfaces implementieren.122123Alle Felder eines X10-Structs sind \texttt{val}.124125Structs werden verwendet, da sie effizienter als Objekte sind.126127\begin{beispiel}[struct]128\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/x10/x10-struct-example.x10}129\end{beispiel}130131\section{Beispiele}132133\todo[inline]{ACHTUNG: Das folgende Beispiel kompiliert noch nicht!}134\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=Fibonacci.x10]{scala}{scripts/x10/Fibonacci.x10}135136\section{Weitere Informationen}137\begin{itemize}138\item \url{http://x10-lang.org/}139\end{itemize}140\index{X10|)}141142