X10.tex 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. %!TEX root = Programmierparadigmen.tex
  2. \chapter{X10}\index{X10|(}%
  3. X10 ist eine objektorientierte Programmiersprache, die 2004 bei IBM entwickelt
  4. wurde.
  5. Wie in Scala sind auch in X10 Funktionen First-Class Citizens.
  6. X10 nutzt das PGAS-Modell:
  7. \begin{definition}[PGAS\footnotemark]\xindex{PGAS}%
  8. PGAS (partitioned global address space) ist ein Programmiermodell für
  9. Mehrprozessorsysteme und massiv parallele Rechner. Dabei wird der globale
  10. Adressbereich des Arbeitsspeichers logisch unterteilt. Jeder Prozessor
  11. bekommt jeweils einen dieser Adressbereiche als lokalen Speicher zugeteilt.
  12. Trotzdem können alle Prozessoren auf jede Speicherzelle zugreifen, wobei auf
  13. den lokalen Speicher mit wesentlich höherer Geschwindigkeit zugegriffen
  14. werden kann als auf den von anderen Prozessoren.
  15. \end{definition}
  16. \footnotetext{\url{https://de.wikipedia.org/wiki/PGAS}}
  17. Im PGAS-Modell gibt es \texttt{places}. Diese sind Platzhalter für Aktivitäten
  18. und Objekte.
  19. \begin{itemize}
  20. \item \texttt{Place.FIRST\_PLACE} ist der place 0.
  21. \item \texttt{here} ist der Prozess-eigene place und \texttt{here.next()} ist
  22. der darauf folgende Place.
  23. \item \texttt{main} wird in \texttt{place 0} ausgeführt.
  24. \item \texttt{Place.places()} liefert einen Iterator für alle verfügbaren places.
  25. Ein spezifischer Place kann durch \texttt{Place(n)} ausgewählt werden.
  26. \end{itemize}
  27. \section{Erste Schritte}
  28. Als erstes sollte man x10 von \url{http://x10-lang.org/x10-development/building-x10-from-source.html?id=248} herunterladen.
  29. Dann kann man die \texttt{bin/x10c} zum erstellen von ausführbaren Dateien nutzen.
  30. Der Befehl \texttt{x10c HelloWorld.x10} erstellt eine ausführbare Datei namens
  31. \texttt{a.out}.
  32. \inputminted[numbersep=5pt, tabsize=4, frame=lines, label=HelloWorld.x10]{cpp}{scripts/x10/HelloWorld.x10}
  33. \section{Syntax}
  34. Genau 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ür
  35. \enquote{value} steht und ein unveränderbarer Wert ist. \texttt{var} hingegen
  36. steht für \enquote{variable} und ist veränderbar.
  37. Eine Besonderheit sind sog. \textit{Constrianed types}\xindex{types!constrained}:
  38. \inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/x10/constrained-type-example.x10}
  39. \subsection{Logische Operatoren}
  40. \begin{table}[H]
  41. \centering
  42. \begin{tabular}{CCCC}
  43. UND & ODER & Wahr & Falsch \\ \hline\hline
  44. \&\& & || & true & false \\[4ex]
  45. GLEICH & UNGLEICH & NICHT & ~ \\ \hline\hline
  46. == & != & ! & ~ \\
  47. \end{tabular}
  48. \caption{Logische Operatoren in X10}\xindex{Logische Operatoren!X10}
  49. \end{table}
  50. \subsection{Closures}\xindex{closure}%
  51. Closres werden unterstützt:
  52. \inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/x10/closures-example.x10}
  53. \subsection{async}\xindex{async}%
  54. Durch \texttt{async S} kann das Statement \texttt{S} asynchron ausgeführt werden.
  55. Das bedeutet, dass ein neuer Kindprozess (eine Kind-Aktivität) erstellt wird, die
  56. \texttt{S} ausführt. Dabei wird nicht auf das Beenden von \texttt{S} gewartet.
  57. Will man das, so muss \texttt{finish}\xindex{finish (X10)@\texttt{finish} (X10)} vor das Statement gestellt werden.
  58. \subsection{atomic}\xindex{atomic}%
  59. Durch \texttt{atomic S} wird das Statement \texttt{S} atomar ausgeführt. Auch
  60. Methoden können atomar gemacht werden.
  61. \inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/x10/atomic-example.x10}
  62. \subsection[Bedingtes Warten]{Bedingtes Warten\footnote{WS 2013/2014, Kapitel 43, Folie 22}}\xindex{when (X10)@\texttt{when} (X10)}%
  63. Durch \texttt{when (E) S} kann eine Aktivität warten, bis die Bedingung \texttt{E}
  64. wahr ist um dann das Statement \texttt{S} auszuführen.
  65. An \texttt{E} werden einige Forderungen gestellt:
  66. \begin{itemize}
  67. \item \texttt{E} muss ein boolescher Ausdruck sein.
  68. \item \texttt{E} darf nicht blockieren.
  69. \item \texttt{E} darf keine nebenläufigen Aktivitäten erstellen, muss also
  70. sequenziell laufen.
  71. \item \texttt{E} darf nicht auf \textit{remote data} zugreifen, muss also
  72. lokal arbeiten.
  73. \item \texttt{E} muss frei von Seiteneffekten sein.
  74. \end{itemize}
  75. \inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/x10/when-example.x10}
  76. \subsection{Lokalisierung}\footnote{WS 2013/2014, Kapitel 43, Folie 23}\xindex{at}%
  77. Durch \texttt{at (p) S} wird sichergestellt, dass das Statement \texttt{S} auf
  78. dem place \texttt{p} ausgeführt wird. Dabei ist zu beachten, dass die Eltern-Aktivität
  79. so lange blockiert, bis \texttt{S} beendet.
  80. Es wird eine Deep-Copy des lokalen Objektgraphen auf den place \texttt{p} erstellt.
  81. \inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/x10/at-example.x10}
  82. \section{Datentypen}
  83. Byte, UByte, Short, UShort, Char, Int, UInt, Long, ULong, Float, Double, Boolean,
  84. Complex, String, Point, Region, Dist, Array
  85. \subsection{Arrays}%
  86. Arrays werden in X10 wie folgt definiert:
  87. \inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/x10/array-example.x10}
  88. Das ergibt den Array \texttt{[ 0, 2, 4, 6, 8 ]}.
  89. \subsection{struct}\xindex{struct (X10)@\texttt{struct} (X10)}%
  90. In X10 gibt es, wie auch in C, den Typ \texttt{struct}. Dieser erlaubt im Gegensatz
  91. zu Objekten keine Vererbung, kann jedoch auch interfaces implementieren.
  92. Alle Felder eines X10-Structs sind \texttt{val}.
  93. Structs werden verwendet, da sie effizienter als Objekte sind.
  94. \begin{beispiel}[struct]
  95. \inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/x10/x10-struct-example.x10}
  96. \end{beispiel}
  97. \section{Beispiele}
  98. \todo[inline]{ACHTUNG: Das folgende Beispiel kompiliert noch nicht!}
  99. \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=Fibonacci.x10]{scala}{scripts/x10/Fibonacci.x10}
  100. \section{Weitere Informationen}
  101. \begin{itemize}
  102. \item \url{http://x10-lang.org/}
  103. \end{itemize}
  104. \index{X10|)}