From d8b63ef3403b2a9d726e8c26eeb3fef6ed4868cb Mon Sep 17 00:00:00 2001 From: Robert Jeutter Date: Tue, 6 Apr 2021 11:32:51 +0200 Subject: [PATCH] Objektorientierung neu geordnet --- Programmierparadigmen.pdf | Bin 6785186 -> 6755367 bytes Programmierparadigmen.tex | 5080 ++++++++++++++++++------------------- 2 files changed, 2465 insertions(+), 2615 deletions(-) diff --git a/Programmierparadigmen.pdf b/Programmierparadigmen.pdf index 7080adfadc8039d877b501cfd1d2774fbccc3898..ba0566fb9ed08d9760653cc116d4efc29be939ad 100644 GIT binary patch delta 282633 zcmZsCLv$q!ux8M)ZQHi3j&0jUC%Lh0+qP}nwrywrH;dWKt5b_Qr?$1IPX+NgprvJ5 zprm99qT+N+^lZ>%b4$Z(&}@W^g!V>O(7e3R41Z1S%v~%9Sy&U}326Y@n@*eJ$Ud{` zjGmH;XpRA!dk57UNq98U2Nv!$35OL`ufWXWq$zE64)wS)r06jecVOriVN>Ghbt>3`(`0w`(gm6&|-SVO%W``eOux zGSxdWx-+LRUx(9&EoubF@s$V+jb@s~2ZQM-)9RMr!1lV~!ajg^>7r+HwDoqcF;#7j zf{)0Ln}Usl0J9jphPmU$;9;FywNL%`Xtqn;2z4xMwVjO8=nn@NKowWF3ED23m+Ee< z!Mn9b`p4M?BQB;TV9X83`AQ*_4wTFUrVv{XL`FbN&`by4OWkuVuv<>m zRo*A=<~c?agEnKk;uUK9z_iVXD#FO52Ug^3A%gz?vrGU7*_YiSvg7^hAFp|t-t2pgZZ}?aJ~M^^Pd6-Lg5$adh1~!^m^`U3YS^~4SN`8 zM(%g@`O9Wr7)Jq>ZIYtmF$0eFcZYO4#jRmN0FDl(=D8nDx!qNo`Lp1|7HpJ5TYn53 zERyB)C=@_ABQcYm-nFgI)}>D7dJPM&zl7)Z?cN{kpR?oM>|i2Xah)aEto;l9vdh~U zVd%Rh(foEQI#xIONord)a16qu<bZ?p~77xhz0 z9d$SQJru8h($i!B^^OfCmr!6|T*puP(!%CKNwW*!D)oW zQuB+~ICIi(%JPB&`XGN8uiZM0IK-yf(Sfn%_`Rk>!};z|rk2U)-=9aap37(_!*pw9 zKc(86WBVzq`iBKJJvyRZ6*@#Mr?*v8{7c#Zd0}mzIQe%$MqG?ZcD)F%3vm3-pHzTt zwo0|mLq|-27kBn07iw%26fM2<=i-b_{5^JKfiEtAj9_dCNrz4rL#_FCJvJlDWM`;)7)P{+?KU@a(E^FnCRREhqD-;L0d8w{r zGqMS3R_s?)|3123>{>`7ODrj9J7oavXJ$u#*RI;#@Ik}`Qklu*lx9r#Hr?l&1`2-N0AEJGiMm;m*I^8;BgvI8PA0z^%{?n?#0kf8-KrXl} zwhOF1Vxxa@VI7`_j500HNFhX2EAw6pkq#CsseUua{2+M!R5$pb{18QpbZo>jyc?B@ zD{!GcR=LTt3tiZ{g; zwsY8w>p*rorJ2gY1J#O>q|3dx*g0voXz?LCBU&ww9@tE+awSW18`uG^KEooTE0%y^ zK6no0jGX<4t887r>)qI9cR(CoSyVDsg1CLnPRpAc44)cB>LL~O!$TN;D@{sNA-Atk0Z~R z&wf`3(Tdr~aF3YUToE^-hxZt$)Jta_A1Hn1B+W&soRZwrIt1;+izDa1?6i021=w)& zRK;L*zYZu@U;=;&*lzF<^;Jkw6)m&3uoYcGV`C`?3`N_|Y~$G@aWvRXJZ zFXo(b*_~94LSFbtp-t~8D05R)-*=pB9W|izD0%0uw8)lne8IzAi`TN-1tu-WvR8^T zxb&YC?2ml>jN!7lC7%amz$xOtZ-Q29vapfrj@3}%Da=Wdy@h);qvHLKor>0uxm;UZ zd`+K}a7_LJTw0Atax&E%203g@7>mACodvsP)xL!|33nm_UIi-+$ zoYjr}Y=8owV{{DO)%3nAzgST>!tTM{M|gS9P{0}ws=I&Oq5r4GO#%apE)3;yyQpd3N# zS}L&zc4{@c+!@Q&pO?ISB<#T~P13eXJvQb{=8_zp~xD?`(2`FbLyNe)YX^CDdC z71QBhHP3n9DNjG`0vQ#4C_V*_<3^1v6%`X+PS;!VfHP%;$fjqKxm8HBVo!8ZKTIj# zKA`5^YRO-B7C0CCg|_71-R?p+Z@v!Qq|5BE;=r;Zq&&n$I*jXz5GFv9kLBC12H}-N z`T=J-O@L93tw{v(b2K1N-Tp7fU@+Fpn_?3h^ws6*wLLXir5!qtF9c*3ti0Y0VQ-D%ch!yq^Fodcb1P(&Bp<25Cp=PMurXZxa6O8)Mi~$UhR5pg1i5PXL+p zjVlL*q0{X_ZN{uR;z@ywxwpp64O3PBy)by{Xr5jEJu`nVP^iMAv<4Tyef}4U-{vT5 zyzq$v$oybMd6}4mb4l$O#ERoYgx+ZPP(sffiky?fpG2chSt5+fz&9_*EArNP`;xON zQ08sy}yH!uUDQms%OQY%nLfLoeLyu^8m4}{NOe_n;j#ZlF zFgT;C$emQq!GEnX3>&(3aD-IANAQ*TXtQ+;@^fyp6nL<5SA8CIx{tD_7Mu(RY(}Ck z77Ui>_y1w^4I_9j$KA5Hb$^ar zijT1$;`&Y!QF~^=XT&i-eu-Ehs4?#rKLHoLps09X*CKU=p+XNtReW`!`W6!r2AK9+ z!A9#lj@>&MbsF&3EDE(3lc2h$eq0m{vUH|qgi;Wfhix2vj@x)@J@7$L5=Ruj6jkQ^ zPT#KwCy~Fv2;A7Ssr@m)sA&HSqGMrA^`AAQ0!(X3C2q2#_nfLz`ba8bMUq1XMCz7D zp>$?X$5?O8sF2P0(G~Sl z^ze0k9zT>3z$djs{@CBM;=VIh2j3@D%EysnYs-N3b^M8s4P9_QSzCIitqdW-f|zN% z1XR#3W^(J(Rhs@FnKw4|bDir9g8H6xJ!~`AdVX1@1<9!`zdNyiJzsRv1^8u{Aht^# zK^2Kpa{N6qAPvf7q`URmf8Gh=NO~4O_#pO!()zLk)>rjs8E3iCfjh($(7&H;D!<93 zvV(wd17*OD;#Cj%Q2s53!o2rKTJd0E05l$x>=+7J7r6`yX1_S8n#%aTin#GSp%^IT zkNZQNbGbItH!{skH6Dwi{K#%pUAnesB%d4QkD9GB(>zvHy;In$$xXf7@*V5;`J?bM z!c(2vCa!9_0<#z;hO)2vZ^z@1?HizWPNX6j@WyLL-*Y;XUZRgpnRC41xC(PN1M(k8 zVyd4ImJ$_d3Mp`M6LYGudM>F9xcCR-dOvappN8{UpYp{?0>gK;3YS~NNkoJS5#pE* zZ2cAWXlIHK4l=9$pwViCdauTQ;c*|WUo?VTx7T@;WPOHMLiDecF=!q4>cL3}@?XXZ z%dXPuO*LGa4Suj66G$_LB6zevT?45fR}voD(Ib7;Ht-K*Zu_K3|~+} zn4KKswBU0-3&~=Y|It|&VLRSDCjCv5�n|O2Gu%&L5a~?~$Az$i+RdKL9VV*U8PD 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%0A{K#2}yKqfhf?@*h6 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

Fj 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 dR_Pn0`jvci-iez=P8R&i2o*oShJhy4e*oAk Wenn es für jedes Objekt $o_1$ eines Typs S ein Objekt $o_2$ des Typs T gibt, so dass für alle Programme P, die mit Operationen von T definiert sind, das Verhalten von P unverändert bleibt, wenn $o_2$ durch $o_1$ ersetzt wird, dann ist S ein Subtyp von T. -Barbara Liskov, 1988 bzw. 1993 - -Typsicherheit -\begin{lstlisting}[ - language=java, - showspaces=false, - basicstyle=\ttfamily - ] -String s = GMethod.thisOrThat("Java", "C++"); -Integer i = GMethod.thisOrThat(new Integer(42), new Integer(23)); -\end{lstlisting} - -\paragraph{Generics in Java} -... - -\paragraph{Ziel des Kapitels} +\subsection{Ziel des Kapitels} Einführen von Mechanismen zur Handhabung von komplexeren Code -\begin{itemize} +\begin{itemize*} \item Systematisiertes \& schnelles Testen \item Inspektion/Veränderung von Code zur Laufzeit \item Zusichern von Bedingungen \item Fehlerbehandlung \item Typsicherheit \item Generische und wiederverwendbare Algorithmen -\end{itemize} - -\subsection{Objektorientierung am Beispiel C++} -\begin{itemize} - \item Ziel von C++: volle Kontrolle über Speicher \& Ausführungsreihenfolgen sowie skalierbarere Projekt-Größe - \item Kompiliert zu nativem Maschinencode und erlaubt genauere Aussagen über Speicher-, Cache- und Echtzeitverhalten - \item Viele Hochsprachenelemente - \item Jedoch kompromissloser Fokus Ausführungsgeschwindigkeit, d.h. - \begin{itemize} - \item Keine automatische Speicherverwaltung - \item Keine Initialisierung von Variablen (im Allgemeinen) - \item Kein Speicherschutz! - \item Dinge, die Zeit kosten, müssen im Allgemeinen erst durch Schlüsselworte aktiviert werden - \end{itemize} -\end{itemize} - -> C makes it easy to shoot yourself in the foot; C++ makes it harder, -but when you do it blows your whole leg off. -Bjarne Stroustrup - -\paragraph{Vergleich mit Java} -\begin{lstlisting}[ - language=java, - showspaces=false, - basicstyle=\ttfamily - ] -[Hello.java] -package hello; -public class Hello { - public static void main(String args[]){ - System.out.println("Hi Welt"); - } -} -\end{lstlisting} -\begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] -[Hello.cpp] -\#include -int main(int argc, char* argv[]){ - std::cout << "Hello World" << std::endl; - return 0; -} -\end{lstlisting} - -Wichtige Makrobefehle: -\begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] -\#include "X.hpp" // Datei X.hpp aus Projekt-Ordner -\#include // Datei cstdio aus System-Includes - -\#ifdef DEBUG // falls Konstante DEBUG definiert ist -std::cout << "Wichtige Debugausgabe" << std::endl; -\#endif - -\#define DEBUG // Konstante setzen -\#define VERSION 3.1415 // Konstante auf einen Wert setzen -\#define DPRINT(X) std::cout << X << std::endl; // Macro-Fkt. -\#undef DEBUG // Konstante löschen, good practice! - -\#ifndef __linux__ // falls nicht für Linux übersetzt -playMinesweeper(); -\#endif -\end{lstlisting} - -\paragraph{Speichermanagement} -Anlegen eines Objektes auf dem Heap: -\begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] -std::string* s = new std::string("wiz!"); -delete s; -\end{lstlisting} -Allokation von Feldern: -\begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] -int* i = new int[29]; // gültige Indicies 0-28 -i[0] = 23; -delete [] i; // nicht mit delete i; verwechseln! -\end{lstlisting} -Zeiger können durch \& auf beliebige Variablen ermittelt werden -\begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] -int i = 0; -int* j = \&i; // \&-Operator erzeugt Zeiger; j darf nicht gelöscht werden -\end{lstlisting} -Zeiger können durch * dereferenziert werden -\begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] -int i = 0; -int* j = \&i; // \&-Operator erzeugt Zeiger -*j = 1; // Zugriff auf Variableninhalt -\end{lstlisting} -Zugriff auf Methoden/Member Variablen -\begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] -std::string* s = new std::string("wiz"); -(*s).push_back('?'); // manuelles Derefenzieren -s$\rightarrow$push_back('?'); // $\rightarrow$ Operator -delete s; -\end{lstlisting} -Zeiger können verwendet werden, um schreibend zuzugreifen -\begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] -void set(std::string* s) { *s = "foo"; } -int main() { - std::string s = "bar"; - set(\&s); - std::cout << s; // gibt foo aus - return 0; -} -\end{lstlisting} - -\paragraph{Vererbung} -Definierte Programmierschnittstellen durch Überschreiben von Methoden/abstrakte Methoden; Vermeiden von Dopplung interner Daten. -Unterschied zu Java: Methoden "liegen" bei C++ statisch im Speicher - -\begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] -class Stromfresser { -public: - Stromfresser() { - std::cerr << "Mjam" << std::endl; - } -}; -class Roboter : virtual public Stromfresser {}; -class Staubsauger : virtual public Stromfresser {}; -class Roomba : public Staubsauger, public Roboter {}; - -int main() { - Roomba q; - return 0; -} -\end{lstlisting} -Mit virtual: "Mjam", ohne virtual: "Mjam Mjam" - - -\paragraph{Mehrfachvererbung} - - -\paragraph{Operator-Overloading} -\begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] -class MagicString { // Remember me? - std::string* s; -public: - MagicString() : s(new std::string("wiz!")) {} - MagicString(const MagicString\& m) : s(new std::string(*m.s)) {} - std::string* magicStr() { return s; } - // Neu: = operator erlaubt Zuweisungen - MagicString\& operator=(const MagicString\& other) { - if(this != \&other) { - // ACHTUNG beide Werte werden dereferenziert... - // ruft operator= in std::string auf $\rightarrow$ String wird kopiert - *s = *other.s; - } - return *this; - } - ~MagicString() { delete s; } -}; -\end{lstlisting} - - -\paragraph{Templates} -\begin{itemize} - \item Generische Datentypen werden in C++ mit Templates realsiert - \item Häufig ähnlich eingesetzt wie Generics, aber können neben Typen auch Konstanten enthalten - \item Zur Compile-Zeit aufgelöst $\rightarrow$ Deklaration \& Implementierung in Header-Dateien - \item Einfaches Beispiel (mit Typen, ähnl. zu Generics, primitive Typen ok!): -\end{itemize} - -\paragraph{Container} -\begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] -template class vector; // dynamisches Array -template class list; // doppelt verkette Liste -template class set; // geordnete Menge basiert auf Baum -template class map; // Assoziatives Array, -\end{lstlisting} - - -\paragraph{Shared Pointer} -\begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] -template class shared_ptr { // Vereinfacht! - T* p; // Zeiger auf eigentliches Objekt - int*r; // Referenzzähler -public: - // neue Referenz auf Objekt erzeugen - shared_ptr(T* t) : p(t), r(new int) { *r = 1; } - // Referenz durch andere Referenz erzeugen - shared_ptr(const shared_ptr\& sp) : p(sp.p), r(sp.r) { ++(*r); } - T* operator$\rightarrow$() const { // benutzen wie einen richtigen Zeiger - return p; - } - ~shared_ptr() { - if(--(*r) == 0) { // Objekt loeschen, wenn letzte Referenz weg - delete r; - delete p; -}}}; -\end{lstlisting} - -\paragraph{Zusammenfassung} -\begin{itemize} - \item C++ erlaubt sehr detaillierte Kontrolle über Speicher- und Laufzeitverhalten - \item Es ist relativ einfach, schwierig zu findende Fehler einzubauen - \item Die Sprache ist durch Operator-Overloading, Mehrfachvererbung und Templates sehr mächtig - \item Erlaubt hohen Grad an Wiederverwendung - \item Anzahl an Code-Zeilen kann reduziert werden - \item Code kann völlig unlesbar werden! Viele Features sollten nur eingesetzt werden wenn sich dadurch ein wirklicher Vorteil ergibt! -\end{itemize} - - -\subsection{Objektorientierung am Beispiel Java} -\begin{itemize*} - \item Bekannt: - \begin{itemize*} - \item Grundlegendes Verständnis von Java - \item Kapselung durch Klassen und Vererbung - \end{itemize*} - \item Ziele: - \begin{itemize*} - \item Verständnis der Probleme bei Vererbung und Typersetzbarkeit in objektorientierten Programmiersprachen - \item Kennenlernen der Grundideen generischer und abstrahierender Konzepte in Objekt-orientierter Programmierung (OOP) - \item Praktische Erfahrungen anhand von Java \& C++ - \end{itemize*} - \item Ausdrucksstärke erhöhen, Komplexität verbergen \end{itemize*} -\subsubsection{Unit Testing} +\subsection{Unit-Testing} \paragraph{Motivation} \begin{itemize*} \item Große Software-Systeme entwickeln sich über lange Zeiträume @@ -654,21 +202,14 @@ public: \item Gute Praxis: Wenn ein Bug beim Testen oder Live-Betrieb auftritt -> Schreiben eines zusätzlichen Tests, um Wiederauftreten zu erkennen \end{itemize*} -\paragraph{Unit-Testing in Java} \begin{itemize*} - \item De facto Standard: JUnit Framework - \item "Best Practice" für einfachen Einsatz: - \begin{itemize*} - \item Java Code in ein oder mehrere Klassen im Ordner src speichern - \item Im Ordner tests jeweils eine Klasse anlegen, die Funktionen einer Implementierungsklasse prüft - \item Konvention: Testklasse einer Klasse Name heißt NameTest - \item Eigentliche Tests werden in Methoden implementiert, die als Tests annotiert sind - \item Typischer Ansatz: für bekannte Werte ausführen und Ergebnis mit Grundwahrheit (erwartetes Verhalten) vergleichen, bspw. mit assertEquals-Funktion - \end{itemize*} - \item Viele weitere Features, z.B. Deaktivieren von Tests, Timeouts, GUI Coverage, Mocks + \item reproduzierbar \& vollautomatisierbar + \item Wann immer Änderungen in komplexen Programmen vorgenommen werden, möglichst vollständiger Test, da Programmierer nicht mehr alles überblicken + \item Messung von Überdeckung (Coverage) in Bezug auf Anzahl Funktionen, Code-Zeilen oder Verzweigungen + \item Wenn ein Bug beim Testen oder Live-Betrieb auftritt $\rightarrow$ Schreiben eines zusätzlichen Tests, um Wiederauftreten zu erkennen \end{itemize*} -\paragraph{Unit Testing - Richtiges Abstraktionsniveau} +\paragraph{Richtiges Abstraktionsniveau bei Unit Testing} \begin{itemize*} \item Um die Tests auszuführen, müssen jeweils entsprechende Hauptprogramme generiert werden ("Test Suites") \item Hauptschwierigkeiten von Unit-Tests: @@ -693,7 +234,44 @@ public: \end{itemize*} \end{itemize*} -\subsubsection{Reflections} +Zwei wesentliche Möglichkeiten: +\begin{itemize*} + \item Individuelles Testen von Klassen: Vernachlässigt Zusammenspiel zwischen Klassen + \item Gemeinsames Testen von Klassen: Erfordert Eingreifen in gekapselte Funktionalitäten +\end{itemize*} + +Klasse +\begin{lstlisting}[ + language=java, + showspaces=false, + basicstyle=\ttfamily + ] +public class Multi { + int mul(int a, int b) { + return a * b; + } +} +\end{lstlisting} + +Testklasse +\begin{lstlisting}[ + language=java, + showspaces=false, + basicstyle=\ttfamily + ] +import static org.junit.jupiter.api.Assertions.*; +class MultiTest { + @org.junit.jupiter.api.Test + void mul() { + Multi m = new Multi(); + assertEquals(m.mul(1,2), 2, "should work"); + assertEquals(m.mul(2,0), 1, "explodes"); + } +} +\end{lstlisting} + +\subsection{Reflections} + \begin{itemize*} \item Normaler Ablauf: Programm schreiben, compilieren, ausführen \begin{itemize*} @@ -738,6 +316,31 @@ for (Method m : methods) System.out.println(m.getName()); \end{lstlisting} +Kurz: Programm zur Laufzeit inspizieren oder verändern + +\begin{lstlisting}[ + language=java, + showspaces=false, + basicstyle=\ttfamily + ] +static class Foo { + private String h = "Hallo"; + public void greet() { System.out.println(h); } +} +public static void main(String[] args) { + Foo foo = new Foo(); + foo.greet(); + try { + Field f = foo.getClass().getDeclaredField("h"); + f.setAccessible(true); + f.set(foo, "Moin"); + } catch (Exception e) { + } + foo.greet(); +} +\end{lstlisting} + + \paragraph{Annotationen} \begin{itemize*} \item Annotationen erlauben Anmerkungen an Klassen \& Methoden @@ -758,6 +361,15 @@ class MultiTest { void mul() { ... \end{lstlisting} +Annotationen erlauben Anmerkungen an Klassen \& Methoden, Beginnen mit @ +Einige wenige vordefinierte z.B. @Override + +Nachteile: +\begin{itemize*} + \item Geringe Geschwindigkeit weil Zugriff über Programmcode erfolgt + \item Kapselung kann umgangen werden +\end{itemize*} + \paragraph{Reflektionen über Reflections} @@ -783,7 +395,8 @@ void mul() { \end{itemize*} -\subsubsection{Assertions} + +\subsection{Assertions/Pre-/Postconditions/Invarianten} \begin{itemize*} \item Kann man interne Zustände testen, ohne invasive Techniken wie Reflections? \item Einfache Möglichkeit: An sinnvollen Stellen im Programmcode testen, ob Annahmen/Zusicherungen (Assertions) stimmen... @@ -811,26 +424,30 @@ public void push(Object o) { \end{lstlisting} + +An sinnvollen Stellen im Programmcode testen, ob Annahmen/Zusicherungen (Assertions) stimmen... + Aber: Ausführungsgeschwindigkeit niedriger \begin{itemize*} - \item Zeitverlust stark abhängig von Programm/Programmiersprache - \item Verbreitetes Vorgehen: - \begin{itemize*} - \item Aktivieren der Tests in UnitTests und Debug-Versionen - \item Deaktivieren in Releases - \item Benötigt spezielle "if"-Bedingung: assert - \end{itemize*} - \item Aktivierung der Tests über Start mit java -ea +\item Zeitverlust stark abhängig von Programm/Programmiersprache +\item Verbreitetes Vorgehen: +\begin{itemize*} + \item Aktivieren der Tests in UnitTests und Debug-Versionen + \item Deaktivieren in Releases \end{itemize*} +\item Wann Assertion hinzufügen? "Eigentlich"-Regel: beim Gedanken "eigentlich müsste hier ... gelten" hinzufügen +\item Aktivierung der Tests über Start mit java -ea +\item Benötigt spezielle "if"-Bedingung: assert \begin{lstlisting}[ - language=java, - showspaces=false, - basicstyle=\ttfamily - ] + language=java, + showspaces=false, + basicstyle=\ttfamily + ] class Stack { -public void push(Object o) { - ... - assert empty() == false + public void push(Object o) { + ... + assert empty() == false + } } \end{lstlisting} @@ -847,6 +464,12 @@ public void push(Object o) { \paragraph{Spezielle Assertions: Pre- \& Postconditions} \begin{itemize*} + \item Methoden/Programmabschnitte testen Bedingung vor und nach Ausführung + \item Einige Sprachen bieten spezialisierte Befehle: requires und ensures + \item Bei OO-Programmierung sind Vor- und Nachbedingungen nur eingeschränkt sinnvoll + \begin{itemize*} + \item Bedingungen oft besser auf Objekt-Ebene $\rightarrow$ interner Zustand + \end{itemize*} \item An welchen Stellen ist es sinnvoll, Annahmen zu prüfen? \item Einfache Antwort: an so vielen Stellen wie möglich \item Komplexere Antwort: Design by contract, ursprünglich Eiffel @@ -870,7 +493,6 @@ public void push(Object o) { } \end{lstlisting} - \paragraph{Klasseninvarianten} \begin{itemize*} \item Bei OO-Programmierung sind Vor- und Nachbedingungen nur eingeschränkt sinnvoll @@ -901,7 +523,8 @@ public void push(Object o) { \end{lstlisting} -\subsubsection{Exeptions} +\subsection{Exceptions} + Signifikantes Element vieler Sprachen: Wie wird mit Fehlern umgegangen? Fehler können unterschiedliche Gründe haben Besser für Code-Komplexität: Fehlerprüfungen an zentralerer Stelle @@ -910,23 +533,40 @@ Besser für Code-Komplexität: Fehlerprüfungen an zentralerer Stelle \item Dabei Fehler sinnvoll gruppieren \item Java (und viele mehr): try/catch/throw-Konstrukt \end{itemize*} + +\begin{itemize*} + \item Wie wird mit Fehlern umgegangen? + \item gut für Code-Komplexität: Fehlerprüfungen an zentralerer Stelle + \begin{itemize*} + \item Abbrechen und Programm-Stack "abbauen" bis (zentralere) Fehlerbehandlung greift + \item Dabei Fehler sinnvoll gruppieren + \end{itemize*} + \item Java (und viele mehr): try/catch/throw-Konstrukt + \begin{itemize*} + \item throw übergibt ein Objekt vom Typ Throwable an Handler, dabei zwei Unterarten: + \item Error: Sollte nicht abgefangen werden z.B. Fehler im Byte-Code, Fehlgeschlagene Assertions + \item Exceptions: Programm muss Exception fangen oder in Methode vermerken, + \end{itemize*} +\end{itemize*} + \begin{lstlisting}[ - language=java, - showspaces=false, - basicstyle=\ttfamily - ] + language=java, + showspaces=false, + basicstyle=\ttfamily +] private void readFile(String f) { try { - Path file = Paths.get("/tmp/file"); - if(Files.exists(file) == false) - throw new IOException("No such dir"); - array = Files.readAllBytes(file); +Path file = Paths.get("/tmp/file"); +if(Files.exists(file) == false) + throw new IOException("No such dir"); +array = Files.readAllBytes(file); } catch(IOException e) { - // do something about it +// do something about it } } \end{lstlisting} + throw übergibt ein Objekt vom Typ Throwable an Handler, dabei zwei Unterarten: \begin{itemize*} \item Error: Sollte nicht abgefangen werden z.B. Fehler im Byte-Code, Fehlgeschlagene Assertions @@ -979,24 +619,22 @@ dangerousFunction(); Aufräumen nach einem try-catch-Block: Anweisungen im finally-Block werden immer ausgeführt, d.h. auch bei return in try- oder catch-Block (oder fehlerloser Ausführung) \begin{lstlisting}[ - language=java, - showspaces=false, - basicstyle=\ttfamily - ] + language=java, + showspaces=false, + basicstyle=\ttfamily + ] try { -dangerousFunction(); + dangerousFunction(); } catch(Exception e) { -// handle exceptions -return; + // handle exceptions + return; } finally { -// release locks etc.. + // release locks etc.. } \end{lstlisting} - - -\subsubsection{Generizät von Datentypen} -(Typ-)Generizität: +\subsection{Generizät von Datentypen} +(Typ-)Generizität: \begin{itemize*} \item Anwendung einer Implementierung auf verschiedene Datentypen \item Parametrisierung eines Software-Elementes (Methode, Datenstruktur, Klasse, ...) durch einen oder mehrere Typen @@ -1020,7 +658,8 @@ return a.compareTo(b) < 0 ? a : b; \paragraph{Grenzen von Typsubstitution} -Problem: Für jeden Typ? Wie kann sort implementiert werden? +Kann ein Objekt einer Oberklasse (eines Typs) durch ein Objekt seiner Unterklasse (Subtyps) ersetzt werden? + Möglicher Ausweg: Klassenhierarchie mit zentraler Basisklasse \begin{lstlisting}[ language=java, @@ -1076,20 +715,26 @@ c.skaliereY(.5); //is das noch ein Kreis? evtl. Reihenfolge in der Klassenhierarchie tauschen (nutzung von Radius)? Was bedeutet das für Ellipse? Verwandte Probleme: Rechteck-Quadrat, Set-Bag -\paragraph{Ko- und Kontravarianz} +\subsubsection{Ko- und Kontravarianz} Geg.: Ordnung von Datentypen von spezifisch $\rightarrow$ allgemeiner +Gleichzeitige Betrachtung einer Klassenhierarchie, die Datentypen verwendet \begin{itemize*} - \item Gleichzeitige Betrachtung einer Klassenhierarchie, die Datentypen verwendet \item Kovarianz: Erhaltung der Ordnung der Typen \item Kontravarianz: Umkehrung der Ordnung \item Invarianz: keines von beiden - \item Anwendung für - \begin{itemize*} - \item Parameter - \item Rückgabetypen - \item Ausnahmetypen - \item Generische Datenstrukturen - \end{itemize*} +\end{itemize*} +In objektorientierten Programmiersprachen im Allgemeinen +\begin{itemize*} + \item Kontravarianz: für Eingabeparameter + \item Kovarianz: für Rückgabewerte und Ausnahmen + \item Invarianz: für Ein- und Ausgabeparameter +\end{itemize*} +Anwendung für +\begin{itemize*} + \item Parameter + \item Rückgabetypen + \item Ausnahmetypen + \item Generische Datenstrukturen \end{itemize*} Beispiel: Basierend auf Meyer‘s SKIER-Szenario @@ -1181,12 +826,23 @@ In objektorientierten Programmiersprachen im Allgemeinen \item Invarianz: für Ein- und Ausgabeparameter \end{itemize*} -\paragraph{Liskovsches Substitutionsprinzip (LSP)} +\subsection{Liskovsches Substitutionsprinzip (LSP)} Barbara Liskov, 1988 bzw. 1993, definiert stärkere Form der Subtyp-Relation, berücksichtigt Verhalten: > Wenn es für jedes Objekt $o_1$ eines Typs S ein Objekt $o_2$ des Typs T gibt, so dass für alle Programme P, die mit Operationen von T definiert sind, das Verhalten von P unverändert bleibt, wenn $o_2$ durch $o_1$ ersetzt wird, dann ist S ein Subtyp von T.' Subtyp darf Funktionalität eines Basistyps nur erweitern, aber nicht einschränken.
Beispiel: Kreis-Ellipse $\rightarrow$ Kreis als Unterklasse schränkt Funktionalität ein und verletzt damit LSP +Typsicherheit +\begin{lstlisting}[ + language=java, + showspaces=false, + basicstyle=\ttfamily + ] +String s = GMethod.thisOrThat("Java", "C++"); +Integer i = GMethod.thisOrThat(new Integer(42), new Integer(23)); +\end{lstlisting} + + \paragraph{Generics in Java (Typsicherheit)} Motivation: Parametrisierung von Kollektionen mit Typen \begin{lstlisting}[ @@ -1350,7 +1006,7 @@ GArray anotherArray = (GArray) anArray; \end{lstlisting} -\paragraph{Wildcards} +\subsubsection{Wildcards} Wildcard "?" als Typparameter und abstrakter Supertyp für alle Instanziierungen \begin{lstlisting}[ language=java, @@ -1443,11 +1099,11 @@ Object obj = array.get(0); PECS = Producer extends, Consumer super $\rightarrow$ Producer liest nur sachen, Consumer legt daten/Objekte/... ab -\subsection{Objectorientierung am Beispiel C++} +\subsection{Objektorientierung am Beispiel C++} \begin{itemize*} \item Ziel von C++: volle Kontrolle über Speicher \& Ausführungsreihenfolgen sowie skalierbarere Projekt-Größe \item Kompiliert zu nativem Maschinencode und erlaubt genauere Aussagen über Speicher-, Cache- und Echtzeitverhalten - \item Viele Hochsprachenelemente (Wie Java objektorientiert; sogar ähnliche Syntax an viele Stellen (weil Java ursprünglich an C++ angelehnt)) + \item Viele Hochsprachenelemente \item Jedoch kompromissloser Fokus Ausführungsgeschwindigkeit, d.h. \begin{itemize*} \item Keine automatische Speicherverwaltung @@ -1463,72 +1119,32 @@ PECS = Producer extends, Consumer super $\rightarrow$ Producer liest nur sachen, \end{itemize*} \end{itemize*} -\subsubsection{Vergleich mit Java} +> C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off. [Bjarne Stroustrup] + + +Wichtige Makrobefehle: \begin{lstlisting}[ - language=java, - showspaces=false, - basicstyle=\ttfamily - ] -[Hello.java] -package hello; // say that we are part of a package -public class Hello { // declare a class called Hello: -// declare the function main that takes an array of Strings: -public static void main(String args[]) { -// call the static method, println on class System.out with parameter "Hi Welt!": - System.out.println("Hi Welt!"); -} -} // end of class Hello + language=C++, + showspaces=false, + basicstyle=\ttfamily + ] +#include "X.hpp" // Datei X.hpp aus Projekt-Ordner +#include // Datei cstdio aus System-Includes + +#ifdef DEBUG // falls Konstante DEBUG definiert ist +std::cout << "Wichtige Debugausgabe" << std::endl; +#endif + +#define DEBUG // Konstante setzen +#define VERSION 3.1415 // Konstante auf einen Wert setzen +#define DPRINT(X) std::cout << X << std::endl; // Macro-Fkt. +#undef DEBUG // Konstante löschen, good practice! + +#ifndef __linux__ // falls nicht für Linux übersetzt +playMinesweeper(); +#endif \end{lstlisting} -\begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] -[Hello.cpp] -// include declarations for I/O library where cout object is specified in namespace std:: -\#include -// declare the function main that takes an int and array of strings and returns an int as the exit code -int main(int argc, char* argv[]) { -// stream string to cout object flush line with endl -std::cout << "Hello world!" -<< std::endl; -return 0; -} // end of main() -\end{lstlisting} - -\begin{itemize*} - \item Unterschiede im Aufbau: - \begin{itemize*} - \item C++ hat globale Funktionen, also außerhalb von Klassen, wie main - \item \#include gibt Dateien mit Klassen- und Funktionsdefinitionen an, die der Compiler einlesen soll - \item Java-Programme werden in packages gegliedert, in C++ gibt es mit modules ein ähnliches Konzept, welches aber (noch) nicht verbreitet ist - \item C++-Programme können (ohne Bezug zu Dateien) in namespaces untergliedert werden, hier std - \end{itemize*} - \item Programmargumente: - \begin{itemize*} - \item In Java bekommt main ein String-Array übergeben, die Länge kann über .length abgefragt werden - \item C/C++-Programme erhalten ein Array von char* (Details zu Pointern folgen) - \item In C/C++ sind Arrays keine Pseudoobjekte, sondern Speicherbereiche in denen die Daten konsekutiv abgelegt sind $\rightarrow$ argc wird benötigt die Anzahl an Elementen zu kodieren - \end{itemize*} - \item Rückgabewerte: - \begin{itemize*} - \item In Java keine Rückgabe in der main-Methode - \item In C++ Rückgabe eines exit code - \begin{itemize*} - \item 0 gibt an: Programmausführung erfolgreich - \item Andere Werte geben einen Programm-spezifischen Fehlercode zurück - \end{itemize*} - \end{itemize*} - \item Primitive Datentypen: - \begin{itemize*} - \item Wie in Java einfache Datentypen, die "Zahlen" enthalten - \item char, short, int, long sind auf 64-bit Maschinen 8 bit, 16 bit, 32 bit und 64 bit breit (char braucht in Java 16 Bit!) - \item long ist auf 32 bit Maschinen 32 Bit breit, long long [sic!] ist immer 64 Bit - \item bool speichert Boolsche Werte (Breite hängt vom Compiler ab!) - \item Ein unsigned vor Ganzahltypen gibt an, dass keine negativen Zahlen in der Variable gespeichert werden (Beispiel: unsigned int) $\rightarrow$ Kann größere Zahlen speichern \& zu viel Unsinn führen (beim Vergleich mit vorzeichenbehafteten Zahlen) - \end{itemize*} -\end{itemize*} \subsubsection{C++ Klassen} Header Foo.hpp deklariert Struktur und Schnittstelle @@ -1644,33 +1260,33 @@ Beispiele: showspaces=false, basicstyle=\ttfamily ] -\#include "X.hpp" // Datei X.hpp aus Projekt-Ordner -\#include // Datei cstdio aus System-Includes +#include "X.hpp" // Datei X.hpp aus Projekt-Ordner +#include // Datei cstdio aus System-Includes -\#ifdef DEBUG // falls Konstante DEBUG definiert ist +#ifdef DEBUG // falls Konstante DEBUG definiert ist std::cout << "Wichtige Debugausgabe" << std::endl; -\#endif +#endif -\#define DEBUG // Konstante setzen -\#define VERSION 3.1415 // Konstante auf einen Wert setzen -\#define DPRINT(X) std::cout << X << std::endl; // Macro-Fkt. -\#undef DEBUG // Konstante löschen, good practice! +#define DEBUG // Konstante setzen +#define VERSION 3.1415 // Konstante auf einen Wert setzen +#define DPRINT(X) std::cout << X << std::endl; // Macro-Fkt. +#undef DEBUG // Konstante löschen, good practice! -\#ifndef __linux__ // falls nicht für Linux übersetzt +#ifndef __linux__ // falls nicht für Linux übersetzt playMinesweeper(); -\#endif +#endif \end{lstlisting} -\paragraph{Einschub: Include Guards} +\subsubsection{Include Guards} Eine (oft hässliche) Eigenschaft des \#include-Befehls: kein Überprüfen ob eine Datei vorher bereits eingebunden wurde. Problematisches Beispiel: \begin{lstlisting}[ language=C++, showspaces=false, basicstyle=\ttfamily ] -\#include "Bar.hpp" //in "Bar.hpp" ist "Foo.hpp" bereits inkludiert worden -\#include "Foo.hpp" //Fehler weil kallse Foo bereits deklariert wurde +#include "Bar.hpp" //in "Bar.hpp" ist "Foo.hpp" bereits inkludiert worden +#include "Foo.hpp" //Fehler weil kallse Foo bereits deklariert wurde \end{lstlisting} Common Practice: Include-Guards um alle Header-Dateien @@ -1679,14 +1295,15 @@ Common Practice: Include-Guards um alle Header-Dateien showspaces=false, basicstyle=\ttfamily ] -\#ifndef FOO_HPP -\#define FOO_HPP +#ifndef FOO_HPP +#define FOO_HPP ... -\#endif +#endif \end{lstlisting} \subsubsection{Speichermanagement} + \begin{itemize*} \item Programmspeicher enthält Code und Daten, vom Betriebssystem i.A. auf virtuelle Adressbereiche abgebildet \item Unterschiedliche Varianten von Datenspeicher: @@ -1857,6 +1474,60 @@ Beispiele } \end{lstlisting} \end{itemize*} +Allokation von Feldern: +\begin{lstlisting}[ + language=C++, + showspaces=false, + basicstyle=\ttfamily + ] +int* i = new int[29]; // gültige Indicies 0-28 +i[0] = 23; +delete [] i; // nicht mit delete i; verwechseln! +\end{lstlisting} +Zeiger können durch \& auf beliebige Variablen ermittelt werden +\begin{lstlisting}[ + language=C++, + showspaces=false, + basicstyle=\ttfamily + ] +int i = 0; +int* j = \&i; // \&-Operator erzeugt Zeiger; j darf nicht gelöscht werden +\end{lstlisting} +Zeiger können durch * dereferenziert werden +\begin{lstlisting}[ + language=C++, + showspaces=false, + basicstyle=\ttfamily + ] +int i = 0; +int* j = \&i; // \&-Operator erzeugt Zeiger +*j = 1; // Zugriff auf Variableninhalt +\end{lstlisting} +Zugriff auf Methoden/Member Variablen +\begin{lstlisting}[ + language=C++, + showspaces=false, + basicstyle=\ttfamily + ] +std::string* s = new std::string("wiz"); +(*s).push_back('?'); // manuelles Derefenzieren +s$\rightarrow$push_back('?'); // $\rightarrow$ Operator +delete s; +\end{lstlisting} +Zeiger können verwendet werden, um schreibend zuzugreifen +\begin{lstlisting}[ + language=C++, + showspaces=false, + basicstyle=\ttfamily + ] +void set(std::string* s) { *s = "foo"; } +int main() { + std::string s = "bar"; + set(\&s); + std::cout << s; // gibt foo aus + return 0; +} +\end{lstlisting} Warum wirken sich Speicherfehler so unvorhersehbar aus? @@ -1988,7 +1659,6 @@ std::string* magicStr() { \end{itemize*} \end{itemize*} - \subsubsection{Vererbung} \begin{itemize*} \item Vermeiden von Mehrfachimplementierungen @@ -2045,8 +1715,34 @@ class FooBar : public Foo { \item override-Markierung optional, aber hätte vor fehlendem virtual gewarnt! \end{itemize*} \end{itemize*} +Definierte Programmierschnittstellen durch Überschreiben von Methoden/abstrakte Methoden; Vermeiden von Dopplung interner Daten. +Unterschied zu Java: Methoden "liegen" bei C++ statisch im Speicher + +\begin{lstlisting}[ + language=C++, + showspaces=false, + basicstyle=\ttfamily + ] +class Stromfresser { +public: + Stromfresser() { + std::cerr << "Mjam" << std::endl; + } +}; +class Roboter : virtual public Stromfresser {}; +class Staubsauger : virtual public Stromfresser {}; +class Roomba : public Staubsauger, public Roboter {}; + +int main() { + Roomba q; + return 0; +} +\end{lstlisting} +Mit virtual: "Mjam", ohne virtual: "Mjam Mjam" + + +\paragraph{Mehrfachvererbung} -\subsubsection{Mehrfachvererbung} \begin{itemize*} \item C++ unterstützt keine Interfaces \item Aber C++ unterstützt Mehrfachvererbung! Pro Interface eine Basisklasse -> mit abstrakten Methoden erstellen @@ -2110,8 +1806,8 @@ public: }; \end{lstlisting} +\subsubsection{Operator-Overloading} -\subsubsection{Operator Overloading} \begin{itemize*} \item In Java: Unterschied zwischen "==" und "equals()" bei String-Vergleich \item In C++: "=="-Operator für String-Vergleich @@ -2129,29 +1825,55 @@ public: \end{itemize*} \end{itemize*} +\begin{lstlisting}[ + language=C++, + showspaces=false, + basicstyle=\ttfamily + ] +class MagicString { // Remember me? + std::string* s; +public: + MagicString() : s(new std::string("wiz!")) {} + MagicString(const MagicString\& m) : s(new std::string(*m.s)) {} + std::string* magicStr() { return s; } + // Neu: = operator erlaubt Zuweisungen + MagicString\& operator=(const MagicString\& other) { + if(this != \&other) { + // ACHTUNG beide Werte werden dereferenziert... + // ruft operator= in std::string auf $\rightarrow$ String wird kopiert + *s = *other.s; + } + return *this; + } + ~MagicString() { delete s; } +}; +\end{lstlisting} + + \subsubsection{Templates} \begin{itemize*} \item Generische Datentypen werden in C++ mit Templates realsiert \item Häufig ähnlich eingesetzt wie Generics, aber können neben Typen auch Konstanten enthalten - \item Zur Compile-Zeit aufgelöst $rightarrow$ Deklaration \& Implementierung in Header-Dateien + \item Zur Compile-Zeit aufgelöst $\rightarrow$ Deklaration \& Implementierung in Header-Dateien \item Einfaches Beispiel (mit Typen, ähnl. zu Generics, primitive Typen ok!): \end{itemize*} + \begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] - template // typename keyword -> deklariert T als Typ - T max(T a, T b) { - return (a > b ? a : b); - } + language=C++, + showspaces=false, + basicstyle=\ttfamily +] +template // typename keyword -> deklariert T als Typ +T max(T a, T b) { +return (a > b ? a : b); +} \end{lstlisting} \begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] + language=C++, + showspaces=false, + basicstyle=\ttfamily +] int i = 10; int j = 2; int k = max(j, i); // explizit @@ -2165,63 +1887,60 @@ int l = max(j, i); // automat. Typinferenz durch Parametertypen \item Wir können alternativ versuchen, durch SFINAE zu verhindern, dass Funktionen doppelt definiert sind \item Trick: Einführen eines Pseudoparameters, der nicht benutzt wird \begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] - template - T quadrieren(T i, typename T::Val pseudoParam = 0) { - T b(i); b *= i; return b; - } - \end{lstlisting} + language=C++, + showspaces=false, + basicstyle=\ttfamily +] +template +T quadrieren(T i, typename T::Val pseudoParam = 0) { +T b(i); b *= i; return b; +} +\end{lstlisting} \item Trick: Einführen eines Hilfstemplates (sogenannter trait): wenn arithmetic::Cond definiert ist, muss T = int sein \begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] - template struct arithmetic {}; - template<> struct arithmetic { using Cond = void*; }; - \end{lstlisting} + language=C++, + showspaces=false, + basicstyle=\ttfamily +] +template struct arithmetic {}; +template<> struct arithmetic { using Cond = void*; }; +\end{lstlisting} \item Definition einer Funktion, die nur für int instanziiert werden kann: \begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] - template - T quadrieren(T i, typename arithmetic::Cond = nullptr) { - return i * i; - } - \end{lstlisting} + language=C++, + showspaces=false, + basicstyle=\ttfamily +] +template +T quadrieren(T i, typename arithmetic::Cond = nullptr) { +return i * i; +} +\end{lstlisting} \end{itemize*} \end{itemize*} - \subsubsection{Container} + \begin{itemize*} \item Templates werden an vielen Stellen der C++ Standard-Bibliothek verwendet \item Container implementieren alle gängigen Datenstrukturen \item Prominente Beispiele: \begin{lstlisting}[ - language=C++, - showspaces=false, - basicstyle=\ttfamily - ] + language=C++, + showspaces=false, + basicstyle=\ttfamily + ] template class vector; // dynamisches Array template class list; // doppelt verkette Liste template class set; // geordnete Menge basiert auf Baum -template class map; // Assoziatives Array, geordnet -// wie oben aber basierend auf Hash-Datenstruktur -template class unordered_set; -template class unordered_map; +template class map; // Assoziatives Array, \end{lstlisting} - \item Alle Templates sind stark vereinfacht dargestellt, weitere Parameter haben Standardwerte, die z.B. Speicherverhalten regeln \end{itemize*} + \paragraph{Container Enumerieren} \begin{itemize*} \item Je nach Struktur unterschiedlicher Zugriff @@ -2275,8 +1994,8 @@ template class unordered_map; \item std::set, std::map, ... löschen nur mit erase() \end{itemize*} - \subsubsection{Shared Pointer} + \begin{itemize*} \item Synonym: Smart Pointer \item Ziel: Sichereres Verwenden von Speicher @@ -2321,6 +2040,137 @@ public: }; // TODO operator= implementieren! \end{lstlisting} +\begin{lstlisting}[ + language=C++, + showspaces=false, + basicstyle=\ttfamily + ] +template class shared_ptr { // Vereinfacht! + T* p; // Zeiger auf eigentliches Objekt + int*r; // Referenzzähler +public: + // neue Referenz auf Objekt erzeugen + shared_ptr(T* t) : p(t), r(new int) { *r = 1; } + // Referenz durch andere Referenz erzeugen + shared_ptr(const shared_ptr\& sp) : p(sp.p), r(sp.r) { ++(*r); } + T* operator$\rightarrow$() const { // benutzen wie einen richtigen Zeiger + return p; + } + ~shared_ptr() { + if(--(*r) == 0) { // Objekt loeschen, wenn letzte Referenz weg + delete r; + delete p; +}}}; +\end{lstlisting} + + +\subsubsection{Vergleich mit Java} +\begin{itemize*} + \item Unterschiede im Aufbau: + \begin{itemize*} + \item C++ hat globale Funktionen, also außerhalb von Klassen, wie main + \item \#include gibt Dateien mit Klassen- und Funktionsdefinitionen an, die der Compiler einlesen soll + \item Java-Programme werden in packages gegliedert, in C++ gibt es mit modules ein ähnliches Konzept, welches aber (noch) nicht verbreitet ist + \item C++-Programme können (ohne Bezug zu Dateien) in namespaces untergliedert werden, hier std + \end{itemize*} + \item Programmargumente: + \begin{itemize*} + \item In Java bekommt main ein String-Array übergeben, die Länge kann über .length abgefragt werden + \item C/C++-Programme erhalten ein Array von char* (Details zu Pointern folgen) + \item In C/C++ sind Arrays keine Pseudoobjekte, sondern Speicherbereiche in denen die Daten konsekutiv abgelegt sind $\rightarrow$ argc wird benötigt die Anzahl an Elementen zu kodieren + \end{itemize*} + \item Rückgabewerte: + \begin{itemize*} + \item In Java keine Rückgabe in der main-Methode + \item In C++ Rückgabe eines exit code + \begin{itemize*} + \item 0 gibt an: Programmausführung erfolgreich + \item Andere Werte geben einen Programm-spezifischen Fehlercode zurück + \end{itemize*} + \end{itemize*} + \item Primitive Datentypen: + \begin{itemize*} + \item Wie in Java einfache Datentypen, die "Zahlen" enthalten + \item char, short, int, long sind auf 64-bit Maschinen 8 bit, 16 bit, 32 bit und 64 bit breit (char braucht in Java 16 Bit!) + \item long ist auf 32 bit Maschinen 32 Bit breit, long long [sic!] ist immer 64 Bit + \item bool speichert Boolsche Werte (Breite hängt vom Compiler ab!) + \item Ein unsigned vor Ganzahltypen gibt an, dass keine negativen Zahlen in der Variable gespeichert werden (Beispiel: unsigned int) $\rightarrow$ Kann größere Zahlen speichern \& zu viel Unsinn führen (beim Vergleich mit vorzeichenbehafteten Zahlen) + \end{itemize*} +\end{itemize*} + +\begin{lstlisting}[ + language=java, + showspaces=false, + basicstyle=\ttfamily + ] +[Hello.java] +package hello; // say that we are part of a package + public class Hello { // declare a class called Hello: + // declare the function main that takes an array of Strings: + public static void main(String args[]) { + // call the static method, println on class System.out with parameter "Hi Welt!": + System.out.println("Hi Welt!"); + } +} // end of class Hello +\end{lstlisting} + +\begin{lstlisting}[ + language=C++, + showspaces=false, + basicstyle=\ttfamily + ] +[Hello.cpp] +// include declarations for I/O library where cout object is specified in namespace std:: +#include +// declare the function main that takes an int and array of strings and returns an int as the exit code +int main(int argc, char* argv[]) { + // stream string to cout object flush line with endl + std::cout << "Hello world!" << std::endl; + return 0; +} // end of main() +\end{lstlisting} + +\subsubsection{Zusammenfassung} +\begin{itemize*} + \item C++ erlaubt sehr detaillierte Kontrolle über Speicher- und Laufzeitverhalten + \item Es ist relativ einfach, schwierig zu findende Fehler einzubauen + \item Die Sprache ist durch Operator-Overloading, Mehrfachvererbung und Templates sehr mächtig + \item Erlaubt hohen Grad an Wiederverwendung + \item Anzahl an Code-Zeilen kann reduziert werden + \item Code kann völlig unlesbar werden! Viele Features sollten nur eingesetzt werden wenn sich dadurch ein wirklicher Vorteil ergibt! +\end{itemize*} + + +\subsection{Objektorientierung am Beispiel Java} +\begin{itemize*} + \item Bekannt: + \begin{itemize*} + \item Grundlegendes Verständnis von Java + \item Kapselung durch Klassen und Vererbung + \end{itemize*} + \item Ziele: + \begin{itemize*} + \item Verständnis der Probleme bei Vererbung und Typersetzbarkeit in objektorientierten Programmiersprachen + \item Kennenlernen der Grundideen generischer und abstrahierender Konzepte in Objekt-orientierter Programmierung (OOP) + \item Praktische Erfahrungen anhand von Java \& C++ + \end{itemize*} + \item Ausdrucksstärke erhöhen, Komplexität verbergen +\end{itemize*} + +\paragraph{Unit-Testing in Java} +\begin{itemize*} + \item De facto Standard: JUnit Framework + \item "Best Practice" für einfachen Einsatz: + \begin{itemize*} + \item Java Code in ein oder mehrere Klassen im Ordner src speichern + \item Im Ordner tests jeweils eine Klasse anlegen, die Funktionen einer Implementierungsklasse prüft + \item Konvention: Testklasse einer Klasse Name heißt NameTest + \item Eigentliche Tests werden in Methoden implementiert, die als Tests annotiert sind + \item Typischer Ansatz: für bekannte Werte ausführen und Ergebnis mit Grundwahrheit (erwartetes Verhalten) vergleichen, bspw. mit assertEquals-Funktion + \end{itemize*} + \item Viele weitere Features, z.B. Deaktivieren von Tests, Timeouts, GUI Coverage, Mocks +\end{itemize*} + \section{Einführung in Funktionale Programmierung} Sind $v_1, ..., v_n$ Unbestimmte vom Typ $T_1, ..., T_n$ (bool oder int) und ist $t(v_1,...,v_n)$ ein Term, so heißt $f(v_1,...,v_n)= t(v_1,...,v_n)$ eine Funktionsdefinition vom Typ $T$. $T$ ist dabei der Typ des Terms. @@ -2328,37 +2178,37 @@ Sind $v_1, ..., v_n$ Unbestimmte vom Typ $T_1, ..., T_n$ (bool oder int) und ist Ein **applikativer Algorithmus** ist eine Menge von Funktionsdefinitionen $f_1(v_{1,1}, ..., v_{1,n_1}) = t_1(v_{1,1},...,v_{1,n_1},..., f_m(v_{m,1},...,v_{m,n_m}) = t_m(v_{m,1},..., v_{m,n_m}))$. Die erste Funktion $f_1$ wird wie beschrieben ausgewertet und ist die Bedeutung (Semantik) des Algorithmus. Kategorien der funktionalen Sprachen -\begin{itemize} +\begin{itemize*} \item Ordnung der Sprache - \begin{itemize} - \item Erster Ordnung: - \begin{itemize} - \item Funktionen können (nur) definiert und aufgerufen werden - \end{itemize} - \item Höherer Ordnung: - \begin{itemize} - \item Funktionen können außerdem als Parameter an Funktionen übergeben werden und/oder Ergebnisse von Funktionen sein. - \item Funktionen sind hier auch Werte! -- erstklassige Werte; - \item Erstklassig: Es gibt keine Einschränkungen. - \item Umgekehrt: Wert ist eine Funktion ohne Parameter - \end{itemize} - \end{itemize} + \begin{itemize*} + \item Erster Ordnung: + \begin{itemize*} + \item Funktionen können (nur) definiert und aufgerufen werden + \end{itemize*} + \item Höherer Ordnung: + \begin{itemize*} + \item Funktionen können außerdem als Parameter an Funktionen übergeben werden und/oder Ergebnisse von Funktionen sein. + \item Funktionen sind hier auch Werte! -- erstklassige Werte; + \item Erstklassig: Es gibt keine Einschränkungen. + \item Umgekehrt: Wert ist eine Funktion ohne Parameter + \end{itemize*} + \end{itemize*} \item Auswertungsstrategie: - \begin{itemize} - \item Strikte Auswertung: - \begin{itemize} - \item Synonyme: strict evaluation, eager evaluation, call by value, applikative Reduktion - \item Die Argumente einer Funktion werden vor Eintritt in die Funktion berechnet (ausgewertet) - wie z.B. in Pascal oder C. - \end{itemize} - \item Bedarfsauswertung: - \begin{itemize} - \item Synonyme: Lazy evaluation, call by need - \item Funktionsargumente werden unausgewertet an die Funktion übergeben - \item Erst wenn die Funktion (in ihrem Körper) die Argumente benötigt, werden die eingesetzten Argumentausdrücke berechnet, und dann nur einmal. - \item Realisiert "Sharing" (im Unterschied zur Normalform-Reduktion - dort werden gleiche Ausdrücke immer wieder erneut berechnet). - \end{itemize} - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Strikte Auswertung: + \begin{itemize*} + \item Synonyme: strict evaluation, eager evaluation, call by value, applikative Reduktion + \item Die Argumente einer Funktion werden vor Eintritt in die Funktion berechnet (ausgewertet) - wie z.B. in Pascal oder C. + \end{itemize*} + \item Bedarfsauswertung: + \begin{itemize*} + \item Synonyme: Lazy evaluation, call by need + \item Funktionsargumente werden unausgewertet an die Funktion übergeben + \item Erst wenn die Funktion (in ihrem Körper) die Argumente benötigt, werden die eingesetzten Argumentausdrücke berechnet, und dann nur einmal. + \item Realisiert "Sharing" (im Unterschied zur Normalform-Reduktion - dort werden gleiche Ausdrücke immer wieder erneut berechnet). + \end{itemize*} + \end{itemize*} +\end{itemize*} \subsection{Applikaive Algorithmen} Grundidee: @@ -2647,7 +2497,7 @@ Was passiert wenn wir mathstuff:factorial() mit einem negativen Argument aufrufe \item Erste Reaktion: rette das Laufzeitsystem durch Eingabe von CTRL-G \begin{itemize*} \item User switch command - \begin{enumerate} + \begin{enumerate*} \item --> h \item c [nn] - connect to job \item i [nn] - interrupt job @@ -2658,7 +2508,7 @@ Was passiert wenn wir mathstuff:factorial() mit einem negativen Argument aufrufe \item q - quit erlang \item ? | h - this message \item --> - \end{enumerate} + \end{enumerate*} \item Liste durch Eingabe von j alle Jobnummern auf \item Beende den entsprechenden Shell-Job durch k \item Starte eine neue Shell durch Eingabe von s @@ -2784,11 +2634,11 @@ Anonyme Funktionen: \item Die Funktionen, die anonyme Funktionen als Parameter akzeptieren bzw. als Ergebnis zurückgeben nennt man Funktionen höherer Ordnung \end{itemize*} -\begin{itemize} +\begin{itemize*} \item Erlang-Programme werden durch Definition der entsprechenden Funktionen in Modulen erstellt \item Module können in den Erlang-Interpreter geladen und von diesem in Zwischencode übersetzt werden \item Anschließend können Anfragen im Interpreter gestellt werden -\end{itemize} +\end{itemize*} Modul fakultaet.erl: \begin{lstlisting}[ @@ -2819,7 +2669,7 @@ fakultaet:fak(5). \end{lstlisting} \paragraph{Elemente von Erlang} -\begin{itemize} +\begin{itemize*} \item Kommentare: werden mit % eingeleitet und erstrecken sich bis Zeilenende \item Ganzzahlen (Integer): 10, -234, \$A, \$Char, 16\#AB10F \item Gleitkommazahlen (Floats): 17.368, -56.34, 12.34E-10 @@ -2829,20 +2679,20 @@ fakultaet:fak(5). \item Variablen: Abc, A\_long\_variable \#fangen mit Großbuchstaben an; zur Speicherung von Werten; können nur einmal gebunden werden \item Komplexe Datenstrukturen: beliebige komplexe Datenstrukturen können erzeugt werden (durch einfaches Hinschreiben) \item Pattern Matching - \begin{itemize} - \item {B, C, D} = {10, foo, bar} \#bindet B zu 10, C zu foo und D zu bar - \item {A, A, B} = {abc, def, ghi} \#schlägt fehl A=!A - \item [A, B, C, D] = [1, 2, 3] \#schlägt fehl; Länge des ersten Patterns zu groß - \item [A, B | C] = [1, 2, 3, 4, 5] \#bindet A zu 1, B zu 2, C zu [3, 4, 5] - \item [A, \_, B ] = [1, 2, 3] \#bindet A zu 1, B zu 3; 2 anonyme Variable $\rightarrow$ kann nie ausgelesen werden - \end{itemize} + \begin{itemize*} + \item {B, C, D} = {10, foo, bar} \#bindet B zu 10, C zu foo und D zu bar + \item {A, A, B} = {abc, def, ghi} \#schlägt fehl A=!A + \item [A, B, C, D] = [1, 2, 3] \#schlägt fehl; Länge des ersten Patterns zu groß + \item [A, B | C] = [1, 2, 3, 4, 5] \#bindet A zu 1, B zu 2, C zu [3, 4, 5] + \item [A, \_, B ] = [1, 2, 3] \#bindet A zu 1, B zu 3; 2 anonyme Variable $\rightarrow$ kann nie ausgelesen werden + \end{itemize*} \item Funktionsaufrufe - \begin{itemize} - \item module:func(Arg\_1, Arg\_2,...) - \item func(Arg\_1, Arg\_2,...) - \end{itemize} + \begin{itemize*} + \item module:func(Arg\_1, Arg\_2,...) + \item func(Arg\_1, Arg\_2,...) + \end{itemize*} \item Modul Deklaration - \begin{lstlisting}[ + \begin{lstlisting}[ language=erlang, showspaces=false, basicstyle=\ttfamily @@ -2853,48 +2703,48 @@ fakultaet:fak(5). times(X, N) $\rightarrow$ X * N. \end{lstlisting} \item Eingebaute Funktionen (Built In Functions, BIFs) - \begin{itemize} - \item date() - \item time() - \item length([1,2,3,4,5]) - \item size({a,b,c}) - \item atom\_to\_list(an\_atom) - \item list\_to\_tuple([1,2,3,4]) - \item integer\_to\_list(2234) - \item tuple\_to\_list({}) - \end{itemize} + \begin{itemize*} + \item date() + \item time() + \item length([1,2,3,4,5]) + \item size({a,b,c}) + \item atom\_to\_list(an\_atom) + \item list\_to\_tuple([1,2,3,4]) + \item integer\_to\_list(2234) + \item tuple\_to\_list({}) + \end{itemize*} \item Definition von Funktionen: func(Pattern1, Pattern2,...) $\rightarrow$ ...; ... . \#";" kündigt weitere Alternativen an. Am Ende muss "." stehen \item Guards (Wächter): - \begin{lstlisting}[ + \begin{lstlisting}[ language=erlang, showspaces=false, basicstyle=\ttfamily ] factorial(N) when N > 0 $\rightarrow$ N* factorial(N-1); \end{lstlisting} - \begin{itemize} - \item number(X) % X is a number - \item integer(X) % X is an integer - \item float(X) % X is a float - \item atom(X) % X is an atom - \item tuple(X) % X is a tuple - \item list(X) % X is a list - \item length(X) == 3 % X is a list of length 3 - \item size(X) == 2 % X is a tuple of size 2. - \item X > Y + Z % X is > Y + Z - \item X == Y % X is equal to Y - \item X =:= Y % X is exactly equal to Y - \end{itemize} + \begin{itemize*} + \item number(X) % X is a number + \item integer(X) % X is an integer + \item float(X) % X is a float + \item atom(X) % X is an atom + \item tuple(X) % X is a tuple + \item list(X) % X is a list + \item length(X) == 3 % X is a list of length 3 + \item size(X) == 2 % X is a tuple of size 2. + \item X > Y + Z % X is > Y + Z + \item X == Y % X is equal to Y + \item X =:= Y % X is exactly equal to Y + \end{itemize*} \item Traversieren ("Ablaufen") von Liste: - \begin{itemize} - \item sum([H|T]) $\rightarrow$ H + sum(T); sum([]) $\rightarrow$ 0. - \item len([\_|T]) $\rightarrow$ 1 + len(T); len([]) $\rightarrow$ 0. - \end{itemize} + \begin{itemize*} + \item sum([H|T]) $\rightarrow$ H + sum(T); sum([]) $\rightarrow$ 0. + \item len([\_|T]) $\rightarrow$ 1 + len(T); len([]) $\rightarrow$ 0. + \end{itemize*} \item Case-Ausdrücke: - \begin{lstlisting} + \begin{lstlisting} case Expression of Pattern1 [when Guard1] $\rightarrow$ Expr_seq1; ... end \end{lstlisting} -\end{itemize} +\end{itemize*} \subsection{Lambda Kalkül} @@ -2903,11 +2753,11 @@ Hier: $\lambda$-Kalkül (Church, Landin) für sequentielle (funktionale /imperat Definition der $\lambda$-Terme: Die Klasse $\bigwedge$ der Lambda-Terme ist die kleinste Klasse, welche die folgenden Eigenschaften erfüllt: -\begin{itemize} +\begin{itemize*} \item Wenn x eine Variable ist, dann ist $x \in \bigwedge$ \item Wenn $M \in \bigwedge$ ist, dann ist $(\lambda xM) \in \bigwedge$ (Abstraktion) \item Wenn $M, N \in \bigwedge$ sind, dann ist $(MN) \in \bigwedge$ (Funktionsanwendung) -\end{itemize} +\end{itemize*} %| Bezeichnung | Notation | Beispiele | %| -\item | -\item | -\item | @@ -2918,17 +2768,17 @@ Die Klasse $\bigwedge$ der Lambda-Terme ist die kleinste Klasse, welche die folg $\lambda$-Abstraktionen: $\lambda x. t$ bindet die Variable x im Ausdruck t Die Menge der freien Variablen eines Terms M wird mit FV(M) bezeichnet und ist wie folgt induktiv definiert: -\begin{itemize} +\begin{itemize*} \item $FV(x)={x}$ \item $FV(MN) = FV(M) \cup FV(N)$ \item $FV(\lambda x.M) = FV(M) - {x}$ -\end{itemize} +\end{itemize*} Ein Lambda-Term ohne freie Variablen heißt Kombinator -\begin{itemize} +\begin{itemize*} \item Identitätsfunktion: $I \equiv \lambda x.x$ \item Konstanten-Funktional: $K \equiv \lambda xy.x$ \item Fixpunkt-Kombinator: $Y \equiv \lambda f.(\lambda x. f (x x)) (\lambda x. f (x x))$ -\end{itemize} +\end{itemize*} \subsection{Äquivalenz} $\alpha$-Äquivalenz: $t_1$ und $t_2$ heißen $\alpha$-äquivalent $(t_1 t_2)$, wenn $t_1$ in $t_2$ durch konsistente Umbenennung der $\lambda$-gebundenen Variablen überführt werden kann. @@ -2936,22 +2786,22 @@ $\alpha$-Äquivalenz: $t_1$ und $t_2$ heißen $\alpha$-äquivalent $(t_1 t_2)$, $\eta $-Äquivalenz: Terme $\lambda x. f\ x$ und $f$ heißen $\eta $-äquivalent $(\lambda x. f x = f )$ falls $x$ nicht freie Variable von f ist \subsection{Ausführung von $\lambda$ Termen} -\begin{itemize} +\begin{itemize*} \item Redex: Ein $\lambda $-Term der Form $(\lambda x. t_1 ) t_2$ heißt Redex. \item $\beta$ -Reduktion: $\beta$ -Reduktion entspricht der Ausführung der Funktionsanwendung auf einem Redex: $(\lambda x. t_1 ) t_2 \Rightarrow t_1 [x \rightarrow t_2 ]$ \item Substitution: $t_1 [x \rightarrow t_2 ]$ erhält man aus dem Term $t_1$ , wenn man alle freien Vorkommen von $x$ durch $t_2$ ersetzt. \item Normalform: Ein Term, der nicht weiter reduziert werden kann, heißt in Normalform. -\end{itemize} +\end{itemize*} Beispiel: $(\lambda x.x)y \Rightarrow x[x \rightarrow y] = y$ \subsection{Kodierung boolscher Werte} Church Booleans -\begin{itemize} +\begin{itemize*} \item True wird zu: $C_{true} = \lambda t.\lambda f.t$ \item False wird zu: $C_{false} = \lambda t.\lambda f.f$ \item If-then-else wird zu: $If = \lambda a.a$ -\end{itemize} +\end{itemize*} Bsp: \begin{lstlisting} @@ -2975,56 +2825,56 @@ Nullvergleich: $isZero = \lambda n. n (\lambda x. C false ) C true$ \subsection{Einführung} \subsubsection{Kalküle} Kalküle sind -\begin{itemize} +\begin{itemize*} \item Minimalistische Programmiersprachen zur Beschreibung von Berechnungen, \item mathematische Objekte, über die Beweise geführt werden können. -\end{itemize} +\end{itemize*} In dieser Vorlesung: -\begin{itemize} +\begin{itemize*} \item $\lambda$-Kalkül (Church, Landin) für sequentielle (funktionale/imperative Sprachen) -\end{itemize} +\end{itemize*} Beispiele weiterer Kalküle: -\begin{itemize} +\begin{itemize*} \item CSP (Hoare) Communicating Sequential Processes - für nebenläufige Programme mit Nachrichtenaustausch \item $\pi$-Kalkül (Milner) für nebenläufige, mobile Programme -\end{itemize} +\end{itemize*} \subsubsection{Das untypisierte Lambdakalkül} -\begin{itemize} +\begin{itemize*} \item Turing-mächtiges Modell funktionaler Programme \item Auch: Beschreibung sequentieller imperativer Konstrukte -\end{itemize} +\end{itemize*} \subitem\colorbox{lightgray}{ \begin{minipage}[h]{0.9\linewidth} Definition der $\lambda$-Terme: Die Klasse $\Lambda$ der Lambda-Terme ist die kleinste Klasse, welche die folgenden Eigenschaften erfüllt: - \begin{itemize} + \begin{itemize*} \item Wenn x eine Variable ist, dann ist x $\in \Lambda$ \item Wenn M $\in \Lambda$ ist, dann ist ($\lambda$xM) $\in \Lambda$ (Abstraktion) \item Wenn M, N $\in \Lambda$ sind, dann ist (MN) $\in \Lambda$ (Funktionsanwendung) - - \end{itemize} + + \end{itemize*} \end{minipage} } -\begin{itemize} +\begin{itemize*} \item Um Klammern zu sparen verwendet man oft eine alternative Notation: $\lambda$x.M \item Bei mehreren zu bindenden Variablen: $\lambda$xyz.M = ($\lambda$x($\lambda$y($\lambda$zM))) -\end{itemize} +\end{itemize*} \subsubsection{Strukturelle Induktion} -\begin{itemize} +\begin{itemize*} \item Aufgrund des "rekursiven" Aufbaus der Definition der Klasse $\Lambda$ der Lamda-Terme, können Aussagen über Lambda-Terme mittels \color{blue} "struktureller Induktion" \color{black} geführt werden: - \begin{itemize} - \item Hierbei folgt der Induktionsbeweis der Struktur der Lambda-Terme, wie er in der Definition vorgegeben wird - \end{itemize} + \begin{itemize*} + \item Hierbei folgt der Induktionsbeweis der Struktur der Lambda-Terme, wie er in der Definition vorgegeben wird + \end{itemize*} \item Beispiel: Jeder Term in $\Lambda$ ist wohl geklammert - \begin{itemize} - \item \color{blue}{Induktionsanfang:} \color{black} trivial, da jede Variable ein wohlgeklammerter Lambda-Term ist. - \item \color{blue} Induktionsannahme: \color{black} M,N sind wohlgeklammerte Lambda-Terme - \item \color{blue} Induktionsschritt: \color{black} dann sind auch die Terme (MN) und ($\lambda$xM) wolgeklammert. - \end{itemize} -\end{itemize} + \begin{itemize*} + \item \color{blue}{Induktionsanfang:} \color{black} trivial, da jede Variable ein wohlgeklammerter Lambda-Term ist. + \item \color{blue} Induktionsannahme: \color{black} M,N sind wohlgeklammerte Lambda-Terme + \item \color{blue} Induktionsschritt: \color{black} dann sind auch die Terme (MN) und ($\lambda$xM) wolgeklammert. + \end{itemize*} +\end{itemize*} \subsubsection{Das untypisierte $\lambda$-Kalkül} @@ -3070,10 +2920,10 @@ Variablenbindung in Haskell (erlaubt anonyme Lambda-Funktionen): \\ Analog bei $\lambda$-Abstraktionen: $\lambda$x.t bindet die Variable x im Ausdruck t\\ Beispiele: -\begin{itemize} +\begin{itemize*} \item $\lambda$x.$\lambda$y.fyx bindet x in $\lambda$y.fyx, das selbst x in fyx bindet. \item f ist frei in $\lambda$x.$\lambda$y.fyx. -\end{itemize} +\end{itemize*} \ \\ Innere Abstraktionen können äußere Variablen verdecken: \ \\ \begin{center} @@ -3084,30 +2934,30 @@ Innere Abstraktionen können äußere Variablen verdecken: \ \\ \end{center} \subsubsection{Freie und gebundene Variablen} -\begin{itemize} +\begin{itemize*} \item Die Menge der \color{blue} freien Variablen \color{black} eines Terms M wird mit FV(M) bezeichnet und ist wie folgt induktiv definiert: - \begin{itemize} - \item FV(x) = \{x\} - \item FV(MN) = FV(M) $\cup $ FV(N) - \item FV($\lambda$x.M) = FV(M) - \{x\} - \end{itemize} + \begin{itemize*} + \item FV(x) = \{x\} + \item FV(MN) = FV(M) $\cup $ FV(N) + \item FV($\lambda$x.M) = FV(M) - \{x\} + \end{itemize*} \item Übung: Definieren sie analog die Menge der gebundenen Variablen GV(M) \item Ein Lambda-Term ohne freie Variablen heißt \color{blue}Kombinator \color{black} \item Einige besonders wichtige Kombinatoren haben eigene Namen: - \begin{itemize} - \item Identitätsfunktion:\enspace\enspace \enspace \enspace\enspace\enspace\enspace I $\equiv$ $\lambda$x.x - \item Konstanten-Funktional: \enspace K $\equiv$ $\lambda$xy.x - \item Fixpunkt-Kombinator: \enspace\enspace Y $\equiv$ $\lambda$f.($\lambda$x.f(x x)) ($\lambda$x.f(x x)) - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Identitätsfunktion:\enspace\enspace \enspace \enspace\enspace\enspace\enspace I $\equiv$ $\lambda$x.x + \item Konstanten-Funktional: \enspace K $\equiv$ $\lambda$xy.x + \item Fixpunkt-Kombinator: \enspace\enspace Y $\equiv$ $\lambda$f.($\lambda$x.f(x x)) ($\lambda$x.f(x x)) + \end{itemize*} +\end{itemize*} \subsection{Rechenregeln} \subsubsection{$\alpha$-Äquivalenz} Namen gebundener Variablen -\begin{itemize} +\begin{itemize*} \item dienen letztlich nur der Dokumentation \item entscheidend sind die Bindungen -\end{itemize} +\end{itemize*} \colorbox{lightgray}{ \begin{minipage}[h]{1.0\linewidth} @@ -3129,9 +2979,9 @@ aber \subsubsection{$\eta$-Äquivalenz} Extensionalitäts-Prinzip: -\begin{itemize} +\begin{itemize*} \item Zwei Funktionen sind gleich, falls Ergebnis gleich für alle Argumente -\end{itemize} +\end{itemize*} \colorbox{lightgray} { \begin{minipage}[h]{1.0\linewidth} $\eta$-Äquivalenz \\ @@ -3141,7 +2991,7 @@ Extensionalitäts-Prinzip: Beispiele: \begin{center} $\lambda$x.$\lambda$y.f z x y $\stackrel{\eta}{=}$ $\lambda$x.f z x \newline \newline - f z $\stackrel{\eta}{=}$ $\lambda$x.f z x \newline \newline $\lambda$x.x $\stackrel{\eta}{=}$ $\lambda$x.($\lambda$x.x)x \newline \newline + f z $\stackrel{\eta}{=}$ $\lambda$x.f z x \newline \newline $\lambda$x.x $\stackrel{\eta}{=}$ $\lambda$x.($\lambda$x.x)x \newline \newline \end{center} aber \begin{center} $\lambda$x.f x x $\stackrel{\eta}{\neq}$ f x @@ -3222,28 +3072,28 @@ Beispiel: let x = g y in f x berechnet f(g y)\\ \begin{center} \includegraphics[width=0.9\linewidth]{Assets/Programmierparadigmen-003.png} - \end{center} +\end{center} -\begin{itemize} +\begin{itemize*} \item if True then x else y ergibt: - \subitem ($\lambda$\color{blue}a.a\color{black})(\color{red} $\lambda$t.$\lambda$f.t\color{black}) x y $\Rightarrow$ ($\lambda$\color{blue}t\color{black}.$\lambda$f.\color{blue}t\color{black}) \color{red}x\color{black} y $\Rightarrow$ ($\lambda$\color{blue}f\color{black}.x)\color{red}y\color{black} $\Rightarrow$ x + \subitem ($\lambda$\color{blue}a.a\color{black})(\color{red} $\lambda$t.$\lambda$f.t\color{black}) x y $\Rightarrow$ ($\lambda$\color{blue}t\color{black}.$\lambda$f.\color{blue}t\color{black}) \color{red}x\color{black} y $\Rightarrow$ ($\lambda$\color{blue}f\color{black}.x)\color{red}y\color{black} $\Rightarrow$ x \item $b_1$ \&\& $b_2$ ist äquivalent zu if $b_1$ then $b_2$ else False - \subitem $\Rightarrow$ $b_1$ \&\& $b_2$ wird zu ($\lambda$a.a) $b_1$ $b_2$ $C_false$ - \subitem $\Rightarrow$ $b_1$ \&\& $b_2$ wird zu ($\lambda$a.a) $b_1$ $b_2$ ($\lambda$t.$\lambda$f.f) + \subitem $\Rightarrow$ $b_1$ \&\& $b_2$ wird zu ($\lambda$a.a) $b_1$ $b_2$ $C_false$ + \subitem $\Rightarrow$ $b_1$ \&\& $b_2$ wird zu ($\lambda$a.a) $b_1$ $b_2$ ($\lambda$t.$\lambda$f.f) \item True \&\& True ergibt: - \subitem \color{white} $\Rightarrow$ \color{black}($\lambda$\color{blue}a.a\color{black})\color{red}$C_true$ \color{black} $C_true$ ($\lambda$t.$\lambda$f.f) - \subitem $\Rightarrow$ ($\lambda$\color{blue}t\color{black}.$\lambda$f.\color{blue}t\color{black})\color{red}($\lambda$t.$\lambda$f.t)\color{black}($\lambda$t.$\lambda$f.f) - \subitem $\Rightarrow$ ($\lambda$\color{blue}f\color{black}.($\lambda$t.$\lambda$f.t)) \color{red}($\lambda$t.$\lambda$f.f)\color{black} $\Rightarrow$ $\lambda$t.$\lambda$f.f = $C_true$ -\end{itemize} + \subitem \color{white} $\Rightarrow$ \color{black}($\lambda$\color{blue}a.a\color{black})\color{red}$C_true$ \color{black} $C_true$ ($\lambda$t.$\lambda$f.f) + \subitem $\Rightarrow$ ($\lambda$\color{blue}t\color{black}.$\lambda$f.\color{blue}t\color{black})\color{red}($\lambda$t.$\lambda$f.t)\color{black}($\lambda$t.$\lambda$f.f) + \subitem $\Rightarrow$ ($\lambda$\color{blue}f\color{black}.($\lambda$t.$\lambda$f.t)) \color{red}($\lambda$t.$\lambda$f.f)\color{black} $\Rightarrow$ $\lambda$t.$\lambda$f.f = $C_true$ +\end{itemize*} -\begin{itemize} +\begin{itemize*} \item $b_1 \lor b_2$ entspricht: - \subitem if $b_1$ then True else $b_2$ + \subitem if $b_1$ then True else $b_2$ \item $\neg b_1$ entspricht: - \subitem if $b_1$ then False else True + \subitem if $b_1$ then False else True \item $b_1 \Rightarrow b_2$ entspricht: - \subitem if $b_1$ then $b_2$ else True -\end{itemize} + \subitem if $b_1$ then $b_2$ else True +\end{itemize*} \subsubsection{Kodierung natürlicher Zahlen} \begin{center} @@ -3318,37 +3168,37 @@ $\lambda x.xx$ wendet sein Argument auf das Argument selbst an $\Rightarrow$ dad \end{minipage} } \newline -\begin{itemize} +\begin{itemize*} \item Der Fixpunktsatz besagt, dass im Lambda-Kalkül jeder Term einen Fixpunkt hat, d.h. einen Wert, der auf sich selber abgebildet wird. \item Beweis: - \begin{itemize} - \item Zu jedem beliebigen F sei W = $\lambda$x.F(x x) und X = (W W) - \item Dann gilt: X $\equiv$ WW $\equiv$ ($\lambda$x.F(x x)) W $\equiv$ F(W W) $\equiv$ F X - \end{itemize} + \begin{itemize*} + \item Zu jedem beliebigen F sei W = $\lambda$x.F(x x) und X = (W W) + \item Dann gilt: X $\equiv$ WW $\equiv$ ($\lambda$x.F(x x)) W $\equiv$ F(W W) $\equiv$ F X + \end{itemize*} \item Bemerkungen: - \begin{itemize} - \item Für einige Lambda-Terme ist die Identifikation eines Fixpunktes einfach, z.B. für den Term $\lambda$x.x (alle Terme sind Fixpunkte) - \item Für andere Terme, wie $\lambda$xy.xy (= $\lambda$x.$\lambda$y.xy) ist das nicht so klar - \item Der Beweis des Fixpunktsatzes ist konstruiv, d.h. er liefert zu jedem Lambda-Term einen Fixpunkt - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Für einige Lambda-Terme ist die Identifikation eines Fixpunktes einfach, z.B. für den Term $\lambda$x.x (alle Terme sind Fixpunkte) + \item Für andere Terme, wie $\lambda$xy.xy (= $\lambda$x.$\lambda$y.xy) ist das nicht so klar + \item Der Beweis des Fixpunktsatzes ist konstruiv, d.h. er liefert zu jedem Lambda-Term einen Fixpunkt + \end{itemize*} +\end{itemize*} \subsubsection{Anwendung des Fixpunktsatzes} -\begin{itemize} +\begin{itemize*} \item Aufgabe: Berechne den Fixpunkt zum Term $\lambda$xy.xy - \begin{itemize} - \item Lösungsansatz: W $\equiv$ $\lambda$x.($\lambda$\color{blue}x\color{black}y.\color{blue}x\color{black}y)\color{red}(xx) \color{black} $\equiv$ $\lambda x.\lambda y.(x x)y \equiv \lambda xy.(xx)y$ - \item Damit ist der gesuchte Fixpunkt X $\equiv ((\lambda xy.(xx)y)(\lambda xy.(xx)y))$ - \item Nachrechnen: - \begin{description} - \item[ \space ] $(\lambda xy.xy) ((\lambda xy.(xx)y) (\lambda xy.(xx)y))$ - \item[$\equiv$] $(\lambda \color{blue}x\color{black}.\lambda y. \color{blue} x \color{black} y) \color{red} ((\lambda xy.(xx)y) (\lambda xy.(xx)y)$ \color{black} - \item[$\equiv$] $\lambda \color{blue}y \color{black}.((\lambda xy.(xx)y)) (\lambda xy.(xx)y) \color{red}y\color{black}$ - \item[$\equiv$] $(\lambda xy.(xx)y)(\lambda xy.(xx)y)$ - \item[$\equiv$] X - \end{description} - \end{itemize} + \begin{itemize*} + \item Lösungsansatz: W $\equiv$ $\lambda$x.($\lambda$\color{blue}x\color{black}y.\color{blue}x\color{black}y)\color{red}(xx) \color{black} $\equiv$ $\lambda x.\lambda y.(x x)y \equiv \lambda xy.(xx)y$ + \item Damit ist der gesuchte Fixpunkt X $\equiv ((\lambda xy.(xx)y)(\lambda xy.(xx)y))$ + \item Nachrechnen: + \begin{description*} + \item[ \space ] $(\lambda xy.xy) ((\lambda xy.(xx)y) (\lambda xy.(xx)y))$ + \item[$\equiv$] $(\lambda \color{blue}x\color{black}.\lambda y. \color{blue} x \color{black} y) \color{red} ((\lambda xy.(xx)y) (\lambda xy.(xx)y)$ \color{black} + \item[$\equiv$] $\lambda \color{blue}y \color{black}.((\lambda xy.(xx)y)) (\lambda xy.(xx)y) \color{red}y\color{black}$ + \item[$\equiv$] $(\lambda xy.(xx)y)(\lambda xy.(xx)y)$ + \item[$\equiv$] X + \end{description*} + \end{itemize*} \item Bemerkung: Der so für die Identitätsfunktion $\lambda x.x$ konstruierte Fixpunkt ist übrigens $(\lambda x.xx)(\lambda x.xx)$, er spielt die besondere Rolle des Standardterms $\bot$ für nicht-terminierende Ausführungen -\end{itemize} +\end{itemize*} \subsubsection{Der Fixpunkt-Kombinator} \colorbox{lightgray}{ @@ -3359,61 +3209,61 @@ $\lambda x.xx$ wendet sein Argument auf das Argument selbst an $\Rightarrow$ dad \end{center} \end{minipage} } -\begin{itemize} +\begin{itemize*} \item Dieser Kombinator spielt eine wichtige Rolle bei der Definition rekursiver Funktionen im Lambda-Kalkül, wie wir im folgenden sehen werden \item Für jeden Lambda-Term M gilt: Y M = M (Y M) - \begin{itemize} - \item Beweisidee: zeige, dass beide Terme auf einen identischen Term reduziert werden können - \end{itemize} + \begin{itemize*} + \item Beweisidee: zeige, dass beide Terme auf einen identischen Term reduziert werden können + \end{itemize*} \item Der Term Y ist übrigens nicht der einzige Kombinator, der Fixpunkte zu Lambda-Termen konstruiert - \begin{itemize} - \item A. Turing: $\Theta \equiv (\lambda xy.y(xxy)) (\lambda xy.y(xxy))$ - \end{itemize} -\end{itemize} + \begin{itemize*} + \item A. Turing: $\Theta \equiv (\lambda xy.y(xxy)) (\lambda xy.y(xxy))$ + \end{itemize*} +\end{itemize*} \subsubsection{Rekursion im Lambda-Kalkül} -\begin{itemize} +\begin{itemize*} \item Die bisher definierten Funktionen waren alle nicht-rekursiv \item Viele Funktionen kann man aber nur unter Zuhilfenahme von Rekursion (bzw. Iteration) beschreiben \item In üblichen Programmiersprachen werden rekursive Funktionsdefinitionen durch die Verwendung von Namen für Funktionen möglich - man verwendet hierbei einfach den Namen der gerade zu definierenden Funktion im Rumpf der Definition: - \begin{itemize} - \item fun fak(i) -$>$ if (i = 0) then 1 else i * fak(i-1). - \end{itemize} + \begin{itemize*} + \item fun fak(i) -$>$ if (i = 0) then 1 else i * fak(i-1). + \end{itemize*} \item Im Lambda-Kalkül gibt es jedoch keine Namen für Funktionen: - \begin{itemize} - \item Daher stellt man eine rekursive Funktion f mittels einer Funktion G dar, die einen zusätzlichen Parameter g hat, an den man dann G selber bildet - \item Schaut kompliziert aus, ist es auch (Q-Q) - \item Warum so kompliziert? Damit die Definition von G im eigenen Rumpf verfügbar ist - - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Daher stellt man eine rekursive Funktion f mittels einer Funktion G dar, die einen zusätzlichen Parameter g hat, an den man dann G selber bildet + \item Schaut kompliziert aus, ist es auch (Q-Q) + \item Warum so kompliziert? Damit die Definition von G im eigenen Rumpf verfügbar ist + + \end{itemize*} +\end{itemize*} \subsubsection{Rekursive Funktionen sind Fixpunkte} -\begin{itemize} +\begin{itemize*} \item Rekursive Funktion von g - \begin{itemize} - \item g = $\lambda$n.…g…n… Rumpf verwendet g - - \end{itemize} + \begin{itemize*} + \item g = $\lambda$n.…g…n… Rumpf verwendet g + + \end{itemize*} \item Daraus gewinnt man das Funktional - \begin{itemize} - \item G = $\lambda$g.$\lambda$n.…g…n… - \end{itemize} + \begin{itemize*} + \item G = $\lambda$g.$\lambda$n.…g…n… + \end{itemize*} \item Falls G einen Fixpunkt g* hat, d.h. G(g*) = g*, so - \begin{itemize} - \item g* = G(g*) = $\lambda$n.…g*…n - \end{itemize} + \begin{itemize*} + \item g* = G(g*) = $\lambda$n.…g*…n + \end{itemize*} \item Vergleiche: g = $\lambda$n.…g…n… -\end{itemize} +\end{itemize*} \begin{center} Rekursive Definition $\Leftrightarrow$ Fixpunkt des Funktionals \end{center} -\begin{itemize} +\begin{itemize*} \item Beispiel: Fakultät - \begin{itemize} - \item g = $\lambda$ n. if isZero n then $c_1$ else (times n g(pred n)) - rekursiv - \item G = $\lambda$g.$\lambda$n.if isZero n then $c_1$ else (times n g(pred n)) - funktional - \end{itemize} -\end{itemize} + \begin{itemize*} + \item g = $\lambda$ n. if isZero n then $c_1$ else (times n g(pred n)) - rekursiv + \item G = $\lambda$g.$\lambda$n.if isZero n then $c_1$ else (times n g(pred n)) - funktional + \end{itemize*} +\end{itemize*} \subsubsection{Der Fixpunktkombinator dient als Rekursionsoperator} Wir berechnen den gesuchten Fixpunkt des Funktionals G mit dem Fixpunktkombinator, der somit als Rekusrionsoperator dient: \\ @@ -3437,129 +3287,129 @@ d.h. \space\space\space Yf ist Fixpunkt von f \subsection{Ausdrucksfähigkeit des Lambdakalküls} \subsubsection{Ausdrucksstärke des Lambdakalküls} -\begin{itemize} +\begin{itemize*} \item Im Folgenden wollen wir zeigen, dass der Lambda-Kalkül genau die rekursiven Funktionen beschreibt \item Eine numerische Funktion ist eine Abbildung f: $\mathbb{N}^k \rightarrow \mathbb{N}$ mit k$ \in \mathbb{N} \cap \{0\}$ \item Wir definieren hierzu: - \begin{itemize} - \item Anfangsfunktionen: - \begin{itemize} - \item Projektion: $U_i^k (n_1,n_2,…,n_k) = n_i$ für $1<=i<=k$ - \item Nullfunktion: Z(n) = 0 - \item Nachfolger: S(n) = n+1 - \end{itemize} - \item Minimalisierung: - \begin{itemize} - \item Für eine Relation P(m) bezeichne $\mu$m[P(m)] die kleinste Zahl m sodass P(m) gilt. - \end{itemize} - \end{itemize} + \begin{itemize*} + \item Anfangsfunktionen: + \begin{itemize*} + \item Projektion: $U_i^k (n_1,n_2,…,n_k) = n_i$ für $1<=i<=k$ + \item Nullfunktion: Z(n) = 0 + \item Nachfolger: S(n) = n+1 + \end{itemize*} + \item Minimalisierung: + \begin{itemize*} + \item Für eine Relation P(m) bezeichne $\mu$m[P(m)] die kleinste Zahl m sodass P(m) gilt. + \end{itemize*} + \end{itemize*} \item Bemerkung: im Folgenden notieren wir $n_1,n_2,…,n_k$ kurz als $\overline{n_k}$ \item Eine numerische Funktion ist Lambda-definierbar, wenn es einen Kombinator M gibt, sodass M $\overline{n_k}$ = f($\overline{n_k}$) -\end{itemize} +\end{itemize*} \subsubsection{Ausdrucksstärke des Lambdakalküls (2)} -\begin{itemize} +\begin{itemize*} \item Im folgenden sei C eine Klasse von numerischen Funktionen, und es gelte $g,h,h_1,h_2,…,h_m \in C$ \item Wir definieren nun die folgenden Eigenschaften: - \begin{itemize} - \item C ist \color{blue} abgeschlossen unter Komposition\color{black}, wenn für jede Funktion f, die über f($\overline{n_k}$) := $g(h_1(\overline{n_k}),…,h_m(\overline{n_k}))$ definiert ist, gilt $f \in C$ - \item C ist \color{blue} abgeschlossen unter primitiver Rekursion\color{black}, wenn für jede Funktion f, die über - \begin{center} - f(0,$\overline{n_k}$) = g($\overline{n_k}$) \\ - f(j+1, $\overline{n_k}$) = h(f(j,$\overline{n_k}$),j,$\overline{n_k}$) - \end{center} - definiert ist, gilt: $f \in C$ - \item C ist \color{blue} abgeschlossen unter unbeschränkter Minimalisierung \color{black}, wenn für jede Funktion f, die über f($\overline{n_k}$) = $\mu$m[g($\overline{n_k}$,m)= 0] definiert ist (wobei für alle $\overline{n_k}$ ein m existiere, sodass g($\overline{n_k}$,m) = 0 ist), gilt $f \in C$ - \end{itemize} -\end{itemize} + \begin{itemize*} + \item C ist \color{blue} abgeschlossen unter Komposition\color{black}, wenn für jede Funktion f, die über f($\overline{n_k}$) := $g(h_1(\overline{n_k}),…,h_m(\overline{n_k}))$ definiert ist, gilt $f \in C$ + \item C ist \color{blue} abgeschlossen unter primitiver Rekursion\color{black}, wenn für jede Funktion f, die über + \begin{center} + f(0,$\overline{n_k}$) = g($\overline{n_k}$) \\ + f(j+1, $\overline{n_k}$) = h(f(j,$\overline{n_k}$),j,$\overline{n_k}$) + \end{center} + definiert ist, gilt: $f \in C$ + \item C ist \color{blue} abgeschlossen unter unbeschränkter Minimalisierung \color{black}, wenn für jede Funktion f, die über f($\overline{n_k}$) = $\mu$m[g($\overline{n_k}$,m)= 0] definiert ist (wobei für alle $\overline{n_k}$ ein m existiere, sodass g($\overline{n_k}$,m) = 0 ist), gilt $f \in C$ + \end{itemize*} +\end{itemize*} \subsubsection{Ausdrucksstärke des Lambda-Kalküls (3)} \colorbox{lightgray}{\begin{minipage}[h]{1.0\linewidth} Definition: \\ Die Klasse der rekursiven Funktionen ist die kleinste Klasse numerischer Funktionen, die alle oben genannten Anfangsfunktionen enthält und abgeschlossen ist unter Komposition, primitiver Rekursion und unbeschränkter Minimalisierung \end{minipage}} \newline -\begin{itemize} +\begin{itemize*} \item \color{blue} Lemma 1: Die Anfangsfunktionen sind Lambda-definierbar \color{black} \item Beweis: - \begin{itemize} - \item $U_i^k$ = $\lambda x_1 x_2 … x_k.x_i$ - \item S = $\lambda n.\lambda s. \lambda z.s(nsz)$ (siehe succ bei Churchzahlen) - \item Z = $\lambda fx.x$ (siehe $c_0$ bei Churchzahlen) - \end{itemize} -\end{itemize} + \begin{itemize*} + \item $U_i^k$ = $\lambda x_1 x_2 … x_k.x_i$ + \item S = $\lambda n.\lambda s. \lambda z.s(nsz)$ (siehe succ bei Churchzahlen) + \item Z = $\lambda fx.x$ (siehe $c_0$ bei Churchzahlen) + \end{itemize*} +\end{itemize*} \subsubsection{Ausdrucksstärke des Lambda-Kalküls (4)} -\begin{itemize} +\begin{itemize*} \item \color{blue} Lemma 2: Die Lambda-definierbaren Funktionen sind abgeschlossen unter primitiver Rekursion \color{black} \item Beweis: Sei f definiert über - \begin{center} - f(0,$\overline{n_k}$) = g($\overline{n_k}$)\\ - f(j+1, $\overline{n_k}$) = h(f(j, $\overline{n_k}$),j,$\overline{n_k}$) - \end{center} - und seien g und h Funktionen (die per Induktionsvoraussetzung) durch die Lambda-terme G und H berechnet werden - \begin{itemize} - \item Intuitiv kann f berechnet werden, indem man überprüft ob j = 0 ist, und wenn ja g($\overline{n_k}$), ansonsten h(f(j, $\overline{n_k}$),j,$\overline{n_k}$) - \item Ein Term M hierfür existiert laut Fixpunktsatz und es gilt: - $M \equiv Y (\lambda f\:x\: \overline{y_k}.if(isZero \: x)(G\:\overline{y_k})(H(f(pred\: x)\overline{y_k})(pred \: x)\overline{y_k}))$ - \end{itemize} -\end{itemize} + \begin{center} + f(0,$\overline{n_k}$) = g($\overline{n_k}$)\\ + f(j+1, $\overline{n_k}$) = h(f(j, $\overline{n_k}$),j,$\overline{n_k}$) + \end{center} + und seien g und h Funktionen (die per Induktionsvoraussetzung) durch die Lambda-terme G und H berechnet werden + \begin{itemize*} + \item Intuitiv kann f berechnet werden, indem man überprüft ob j = 0 ist, und wenn ja g($\overline{n_k}$), ansonsten h(f(j, $\overline{n_k}$),j,$\overline{n_k}$) + \item Ein Term M hierfür existiert laut Fixpunktsatz und es gilt: + $M \equiv Y (\lambda f\:x\: \overline{y_k}.if(isZero \: x)(G\:\overline{y_k})(H(f(pred\: x)\overline{y_k})(pred \: x)\overline{y_k}))$ + \end{itemize*} +\end{itemize*} \subsubsection{Ausdrucksstärke des Lambda-Kalküls (5)} -\begin{itemize} +\begin{itemize*} \item \color{blue} Lemma 3: Die Lambda-definierbaren Funktionen sind abgeschlossen unter unbeschränkter Minimalisierung \color{black} \item Beweis: - \begin{itemize} - \item Sei f über f($\overline{n_k}$) = $\mu$m[g($\overline{n_k}$,m) = 0] definiert, wobei g (per Induktionsvoraussetzung) durch den Lambda-Term G berechnet wird - \item Intuitiv kann man f berechnen, indem man bei 0 beginnend für m überprüft, ob g($\overline{n_k}$,m) = 0 ist, und wenn ja m ausgibt, ansonsten die Überprüfung mit m+1 fortsetzt - \item Ein Term für eine solche Funktion kann laut Fixpunktsatz konstruiert werden und man erhält mit Anwendung des Fixpunktkombinators zunächst: \\ - $N \equiv Y (\lambda f \: \overline{x_k} \: y. if(isZero \: (G \: \overline{x_k} \: y))y(f\:\overline{x_k}\:(succ \: y)))$ - \item Nun definiert man die Funktion f durch den folgenden Term M: \\ - $M \equiv \lambda \overline{x_k}.N \: \overline{x_k} \: c_0$ - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Sei f über f($\overline{n_k}$) = $\mu$m[g($\overline{n_k}$,m) = 0] definiert, wobei g (per Induktionsvoraussetzung) durch den Lambda-Term G berechnet wird + \item Intuitiv kann man f berechnen, indem man bei 0 beginnend für m überprüft, ob g($\overline{n_k}$,m) = 0 ist, und wenn ja m ausgibt, ansonsten die Überprüfung mit m+1 fortsetzt + \item Ein Term für eine solche Funktion kann laut Fixpunktsatz konstruiert werden und man erhält mit Anwendung des Fixpunktkombinators zunächst: \\ + $N \equiv Y (\lambda f \: \overline{x_k} \: y. if(isZero \: (G \: \overline{x_k} \: y))y(f\:\overline{x_k}\:(succ \: y)))$ + \item Nun definiert man die Funktion f durch den folgenden Term M: \\ + $M \equiv \lambda \overline{x_k}.N \: \overline{x_k} \: c_0$ + \end{itemize*} +\end{itemize*} \subsubsection{Ausdrucksstärke des Lambda-Kalküls (6)} \begin{center} \includegraphics[width=1.0\linewidth]{Assets/Programmierparadigmen-004.png} \end{center} -\begin{itemize} +\begin{itemize*} \item Aus den Lemmata 1 bis 3 folgt nun der Satz:\\ - \colorbox{lightgray}{ - \begin{minipage}[h]{1.0\linewidth} - Alle rekursiven Funktionen sind Lambda-definierbar - \end{minipage}} -\end{itemize} + \colorbox{lightgray}{ + \begin{minipage}[h]{1.0\linewidth} + Alle rekursiven Funktionen sind Lambda-definierbar + \end{minipage}} +\end{itemize*} \subsection{Berechnungsreihenfolgen und Konfluenz} \subsubsection{Noch einmal Auswertungsstrategien} -\begin{itemize} +\begin{itemize*} \item Bei unserer initialen Betrachtung der Auswertungsstrategien haben wir die volle $\beta$-Rekursion und die Normalreihenfolge kennengelernt \item Nun wollen wir unsere Betrachtungen hierzu noch einmal vertiefen und definieren zunächst: - \begin{itemize} - \item Ein Redex wird als \color{blue} "äußerst" (outermost) \color{black} bezeichnet, wenn er nicht Teil eines anderen Redex ist. - \item Ein Redex wird als \color{blue} "innerst" (innermost) \color{black} bezeichnet, wenn er keinen eigenständigen Redex beinhaltet - \end{itemize} + \begin{itemize*} + \item Ein Redex wird als \color{blue} "äußerst" (outermost) \color{black} bezeichnet, wenn er nicht Teil eines anderen Redex ist. + \item Ein Redex wird als \color{blue} "innerst" (innermost) \color{black} bezeichnet, wenn er keinen eigenständigen Redex beinhaltet + \end{itemize*} \item Mit diesen Begriffen können im folgenden die gebräuchlichsten Auswertungsstrategien formuliert werden - \begin{itemize} - \item \color{blue} Normal Order: \color{black} Evaluiere Argumente so oft, wie sie verwendet werden - \item \color{blue} Applicative Order: \color{black} Evaluiere Argumente einmal - \item \color{blue} Lazy Evaluation: \color{black} Evaluiere Argumente höchstens einmal - \end{itemize} + \begin{itemize*} + \item \color{blue} Normal Order: \color{black} Evaluiere Argumente so oft, wie sie verwendet werden + \item \color{blue} Applicative Order: \color{black} Evaluiere Argumente einmal + \item \color{blue} Lazy Evaluation: \color{black} Evaluiere Argumente höchstens einmal + \end{itemize*} \item Eine zentrale Kernfrage: \color{blue} Welche Auswertungsstrategie führt (möglichst schnell) zu einem nicht weiter reduzierbaren Term? - \color{black} - \begin{itemize} - \item Bei unserer beispielhaften Berechnung des Terms Fak $c_2$ haben wir nach der initialen Anwendung des Fixpunktkombinators zunächst den Term isZero $c_2$ reduziert. - \item Ebenso hätten wird den weiter innen stehenden Fixpunktkombinator zuerst erneut anwenden können(bei voller $\beta$-Reduktion kann jeder Term jederzeit reduziert werden). - \item Auf diese Weise hätten wir unendlich oft vorgehen, damit einen immer länger werdenden Term ableiten können und somit nicht das gewünschte Resultat $c_2$ berechnet. - \end{itemize} + \color{black} + \begin{itemize*} + \item Bei unserer beispielhaften Berechnung des Terms Fak $c_2$ haben wir nach der initialen Anwendung des Fixpunktkombinators zunächst den Term isZero $c_2$ reduziert. + \item Ebenso hätten wird den weiter innen stehenden Fixpunktkombinator zuerst erneut anwenden können(bei voller $\beta$-Reduktion kann jeder Term jederzeit reduziert werden). + \item Auf diese Weise hätten wir unendlich oft vorgehen, damit einen immer länger werdenden Term ableiten können und somit nicht das gewünschte Resultat $c_2$ berechnet. + \end{itemize*} \item Eine weitere Kernfrage: Angenommen mehrere unterschiedliche Reduktionsreihenfolgen führen zu einem nicht weiter zu reduzierenden Ergebnis - \color{blue} führen all diese Reihenfolgen zum gleichen Ergebnis? \color{black} \item Wir definieren zuerst einen zentralen begriff in diesem Zusammenhang: - \colorbox{lightgray}{\begin{minipage}[h]{1.0\linewidth} - Ein Transitiosnsystem (D, $\rightarrow*$) heißt genau dann konfluent, wenn für alle $t,t_1,t_2 \in D$ gilt: wenn $ t \rightarrow* t_1$ und $t \rightarrow* t_2$, dann gibt es ein $t' \in D$ mit $t_1 \rightarrow* t'$ und $t_2 \rightarrow* t'$ - \end{minipage}} + \colorbox{lightgray}{\begin{minipage}[h]{1.0\linewidth} + Ein Transitiosnsystem (D, $\rightarrow*$) heißt genau dann konfluent, wenn für alle $t,t_1,t_2 \in D$ gilt: wenn $ t \rightarrow* t_1$ und $t \rightarrow* t_2$, dann gibt es ein $t' \in D$ mit $t_1 \rightarrow* t'$ und $t_2 \rightarrow* t'$ + \end{minipage}} \item Wenn der Lambda-Kalkül konfluent ist, kann hieraus gefolgert werden, dass unterschiedliche Reduktionsreihenfolgen, die zu einer nicht mehr weiter zu reduzierenden Form führen, somit auf den gleichen Term führen müssen. \item Achtung: hieraus kann nicht gefolgert werden, dass alle Reduktionsreihenfolgen auf den gleichen Term führen, da dies ja nur für "terminierende" Reduktionsreihenfolgen gilt! -\end{itemize} +\end{itemize*} \subsubsection{Church-Rosser-Eigenschaft} \color{blue} Satz (Church-Rosser) \newline Der untypisierte $\lambda$-Kalkül ist konfluent: Wenn $t \stackrel{*}{\Rightarrow} t_1$ und $t \stackrel{*}{\Rightarrow} t_2$, dann gibt es ein t' mit $t_1 \stackrel{*}{\Rightarrow} t'$ und $t_2 \stackrel{*}{\Rightarrow} t'$ @@ -3571,10 +3421,10 @@ d.h. \space\space\space Yf ist Fixpunkt von f \end{center} \color{black} Beweisidee: Definiere $\stackrel{\rightarrow}{\rightarrow}$ als "parallele" $\beta$-Reduktion. -\begin{itemize} +\begin{itemize*} \item Es gilt: $\Rightarrow \subseteq \stackrel{\rightarrow}{\rightarrow} \subseteq \stackrel{*}{\Rightarrow}$ \item Zeige Diamant Eigenschaft für $\stackrel{\rightarrow}{\rightarrow}$ -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.25\linewidth]{Assets/Programmierparadigmen-011} @@ -3585,212 +3435,212 @@ Die Normalform eines $\lambda$-Terms ist - sofern sie existiert - eindeutig. \co \newline \newline Beweis: -\begin{itemize} +\begin{itemize*} \item $t_1$ und $t_2$ Normalformen von t, d.h. $t \stackrel{*}{\Rightarrow} t_1 \nRightarrow$ und $t \stackrel{*}{\Rightarrow} t_2 \nRightarrow$ \item Nach Chruch-Rosser gibt es t' mit $t_1 \stackrel{*}{\Rightarrow} t'$ und $t_2 \stackrel{*}{\Rightarrow} t'$ \item Nach Annahme $t_1 \nRightarrow$ und $t_2 \nRightarrow$, also $t_1 = t' = t_2$ -\end{itemize}\ \newline +\end{itemize*}\ \newline \color{blue} Bei terminierenden $\beta$-Reduktionen ist irrelevant, welchen Redex man zuerst reduziert!\color{black} \subsection{Auswertung von Parametern in Programmiersprachen} \subsubsection{Behandlung von Parametern in Programmiersprachen} -\begin{itemize} +\begin{itemize*} \item Die Art und Weise, wie in einer Programmiersprache Parametter übergeben - d.h. wie die Reihenfolge und die Zeitpunkte ihrer Auswertung gehandhabt - werden, hat Einfluss auf wichtige Eigenschaften der Sprache: - \begin{itemize} - \item Effizienz der Berechnungen - \item Termininerungsverhalten - \item Ausdruckskraft - \end{itemize} + \begin{itemize*} + \item Effizienz der Berechnungen + \item Termininerungsverhalten + \item Ausdruckskraft + \end{itemize*} \item Hierbei ist es insbesondere von Interesse, wie Parameter gehandhabt werden, deren Werte undefiniert sind (z.B. 1/0)\newline - \colorbox{lightgray}{ - \begin{minipage}[h]{1.0\linewidth} - Wir definieren zunächst den zentralen begriff "strikt": \newline Eine n-stellige Funktion heißt strikt im k-ten Argument ($1<=k<=n$), wenn gilt: f($x_1,x_2,…,x_{k-1},\bot,x_{k+1},…,x_n$) = $\bot$ - \end{minipage}} + \colorbox{lightgray}{ + \begin{minipage}[h]{1.0\linewidth} + Wir definieren zunächst den zentralen begriff "strikt": \newline Eine n-stellige Funktion heißt strikt im k-ten Argument ($1<=k<=n$), wenn gilt: f($x_1,x_2,…,x_{k-1},\bot,x_{k+1},…,x_n$) = $\bot$ + \end{minipage}} \item Ein undefiniertes Argument führt hier zu einem undefinierten Resultat \item Grundsätzlich kann man die Auswertungsstrategien von Programmiersprachen in strikte und nicht-strikte Strategien einteilen; sehr gebräuchlich sind dabei insbesondere: - \begin{itemize} - \item Call by Value: Ausdrücke, die Parameter bei einem Funktionsaufruf beschreiben, werden vor der Übergabe an die Funktion vollständig ausgewertet - \item Call by Name: Ausdrücke, die Parameter bei einem Funktionsaufruf beschreiben, werden nicht bei Übergabe, sondern erst dann ausgewertet, wenn sie in der aufgerufenen Funktion tatsächlich benötigt werden - \end{itemize} + \begin{itemize*} + \item Call by Value: Ausdrücke, die Parameter bei einem Funktionsaufruf beschreiben, werden vor der Übergabe an die Funktion vollständig ausgewertet + \item Call by Name: Ausdrücke, die Parameter bei einem Funktionsaufruf beschreiben, werden nicht bei Übergabe, sondern erst dann ausgewertet, wenn sie in der aufgerufenen Funktion tatsächlich benötigt werden + \end{itemize*} \item Beide Varianten haben spezifische Vor- und Nachteile: - \begin{itemize} - \item Call by Value: weniger Berechnungsaufwand, wenn ein Parameter mehr als einmal im Funktionsrumpf vorkommt; weniger Speicheraufwand bei der Übergabe - \item Call by Name: weniger Berechnungsaufwand, wenn ein Argument nicht zum Ergebnis beiträgt; höherer Aufwand bei Übergabe - \end{itemize} + \begin{itemize*} + \item Call by Value: weniger Berechnungsaufwand, wenn ein Parameter mehr als einmal im Funktionsrumpf vorkommt; weniger Speicheraufwand bei der Übergabe + \item Call by Name: weniger Berechnungsaufwand, wenn ein Argument nicht zum Ergebnis beiträgt; höherer Aufwand bei Übergabe + \end{itemize*} \item Die Programmiersprache Erlang realisiert grundsätzlich eine strikte Handhabung von Parametern, da sie die Strategie Call by Value verwendet \item Allerdings wird bei der Definition einer Funktion der resultierende Wert erst dann berechnet, wenn die Funktion ausgewertet wird - \begin{itemize} - \item Das erlaubt über den Umweg zusätzlicher Funktionsdefinitionen auch die Realisierung einer nicht-strikten Auswertungsstrategie - ermöglicht Nachbildung der sogenannten Lazy-Evaluation - \item hierbei wird ein nicht-strikt zu evaluierendes Argument als Resultat einer anonymen nullstelligen Funktion (ohne Parameter) "verpackt" - \item Im Rumpf der eigentlichen Funktion wird diese Funktion dann ausgewertet (= aufgerufen), wenn feststeht, dass dieses Argument für die Berechnung des Ergebnisses benötigt wird - \item Andere funktionale Sprachen wie Haskell oder Gofer verwenden Call by Name und realisieren damit grundsätzlich Lazy-Evaluation - \end{itemize} - \ \linebreak - \begin{center} - \centering - \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-012} - \end{center} - \begin{center} - \centering - \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-013} - \end{center} + \begin{itemize*} + \item Das erlaubt über den Umweg zusätzlicher Funktionsdefinitionen auch die Realisierung einer nicht-strikten Auswertungsstrategie - ermöglicht Nachbildung der sogenannten Lazy-Evaluation + \item hierbei wird ein nicht-strikt zu evaluierendes Argument als Resultat einer anonymen nullstelligen Funktion (ohne Parameter) "verpackt" + \item Im Rumpf der eigentlichen Funktion wird diese Funktion dann ausgewertet (= aufgerufen), wenn feststeht, dass dieses Argument für die Berechnung des Ergebnisses benötigt wird + \item Andere funktionale Sprachen wie Haskell oder Gofer verwenden Call by Name und realisieren damit grundsätzlich Lazy-Evaluation + \end{itemize*} + \ \linebreak + \begin{center} + \centering + \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-012} + \end{center} + \begin{center} + \centering + \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-013} + \end{center} \item Erläuterungen: - \begin{itemize} - \item Im zweiten Beispiel wird der Rückgabewert der übergebenen Funktionne nur ausgewertet, wenn sie im Rumpf der auszuführenden Funktion aufgerufen werden - \item Innerhalb von Erlang-Modulen kann man sich mit Hilfe einer Macro-Definition Schreibarbeit sparen: \newline -define(DELAY(E), fun() -$>$ E end). \newline check() -$>$ test2(true, ?DELAY(3), ?DELAY(4/0)). - \end{itemize} + \begin{itemize*} + \item Im zweiten Beispiel wird der Rückgabewert der übergebenen Funktionne nur ausgewertet, wenn sie im Rumpf der auszuführenden Funktion aufgerufen werden + \item Innerhalb von Erlang-Modulen kann man sich mit Hilfe einer Macro-Definition Schreibarbeit sparen: \newline -define(DELAY(E), fun() -$>$ E end). \newline check() -$>$ test2(true, ?DELAY(3), ?DELAY(4/0)). + \end{itemize*} \item Je nachdem, ob und wie häufig ein übergebener Parameter im Funktionsrumpf benötigt wird, können bei Lazy-Evaluation Berechnungen - \begin{itemize} - \item komplett eingespart oder - \item (in identischer Form) wiederholt erforderlich werden - \item Unter Umständen kann man in der betreffenden Funktion durch Einführung einer temporären Variable redundante Mehrfachberechnungen einsparen ($\rightarrow$ Call by Need) - \end{itemize} + \begin{itemize*} + \item komplett eingespart oder + \item (in identischer Form) wiederholt erforderlich werden + \item Unter Umständen kann man in der betreffenden Funktion durch Einführung einer temporären Variable redundante Mehrfachberechnungen einsparen ($\rightarrow$ Call by Need) + \end{itemize*} \item Die Parameterübergabe ist bei Call by Name in der Regel aufwändiger als bei Call by Value - \begin{itemize} - \item Die meisten Programmiersprachen (Java, C, C++, Pascal etc.) verwenden daher Call by Value ($\rightarrow$ strikte Auswertung) - \item Eine Ausnahme wird oft bei dem IF-Konstrukt gemacht (der auszuführende Code ist hier ja meist auch kein Parameter) - \end{itemize} + \begin{itemize*} + \item Die meisten Programmiersprachen (Java, C, C++, Pascal etc.) verwenden daher Call by Value ($\rightarrow$ strikte Auswertung) + \item Eine Ausnahme wird oft bei dem IF-Konstrukt gemacht (der auszuführende Code ist hier ja meist auch kein Parameter) + \end{itemize*} \item Zu Ausdrucksstärke: während strikte Funktionen durch die Strategie Call by Value realisiert werden, ist es nicht so, dass Lazy Evaluation es erlaubt, alle nicht-strikten Funktionen zu realisieren - \begin{itemize} - \item Die folgenden Gleichungen definieren eine nicht-strikte Multiplikation $\otimes$ auf der Basis der Multiplikation · für Zahlen:\newline \begin{center} - 0 $\otimes$ y = 0 \newline - x $\otimes$ 0 = 0 \newline - x $\otimes$ y = x · y \newline - \end{center} - \item Wenn ein Arguemnt undefiniert ist, dann liefert $\otimes$ ein Ergebnis, sofern das andere Argument zu 0 evaluiert wird ($\rightarrow$ fak(-1) $\otimes$ (fak(3)-6)) - \item Implementiert werden kann die Funktion nur durch eine Art von paralleler Auswertung mit Abbruch der anderen Berechnung sobald 0 als Resultat berechnet und zurückgegeben wurde - \end{itemize} + \begin{itemize*} + \item Die folgenden Gleichungen definieren eine nicht-strikte Multiplikation $\otimes$ auf der Basis der Multiplikation · für Zahlen:\newline \begin{center} + 0 $\otimes$ y = 0 \newline + x $\otimes$ 0 = 0 \newline + x $\otimes$ y = x · y \newline + \end{center} + \item Wenn ein Arguemnt undefiniert ist, dann liefert $\otimes$ ein Ergebnis, sofern das andere Argument zu 0 evaluiert wird ($\rightarrow$ fak(-1) $\otimes$ (fak(3)-6)) + \item Implementiert werden kann die Funktion nur durch eine Art von paralleler Auswertung mit Abbruch der anderen Berechnung sobald 0 als Resultat berechnet und zurückgegeben wurde + \end{itemize*} \item Wir betrachten nun die Beziehungen zwischen Parameterbehandlung in Programmiersprachen und Reduktion von Lambda-Termen -\end{itemize} +\end{itemize*} \subsubsection{Auswertungsstrategien \& Programmiersprachen} \color{blue} Werte in Programmiersprachen wie Haskell: \color{black} -\begin{itemize} +\begin{itemize*} \item Primitive Werte: 2, True \item Funktionen: (\textbackslash x $\rightarrow$ x), (\&\&), (x $\rightarrow$(\textbackslash y $\rightarrow$ y+y)x) -\end{itemize} +\end{itemize*} \ \newline \color{blue} Werte im $\lambda$-Kalkül: -\color{black} \begin{itemize} +\color{black} \begin{itemize*} \item Abstraktionen: $c_2 = \lambda s. \lambda z.s\;(s\;z),\;\;\; C_{true} = \lambda t- \lambda f.t,\;\;\; \lambda x.x,\;\;\; \newline \lambda b_1. \lambda b_2.\;b_1\; b_2 (\lambda t.\lambda f.\;f),\;\;\; \lambda x.\;(\lambda y.\;plus\; yy)x$ -\end{itemize} +\end{itemize*} \color{blue} Auswertungsstrategie: \color{black} Keine weitere Reduzierung von Werten \newline Reduziere keine Redexe unter Abstraktionen (umgeben von $\lambda$):\newline $\Rightarrow$ call-by-name, call-by-value \subsubsection{Call-By-Name} Call-By-Name: Reduziere linkesten äußersten Redex -\begin{itemize} +\begin{itemize*} \item Aber nicht falls von einem $\lambda$ umgeben \newline - \subitem $(\lambda y. (\lambda x.y(\lambda z.z)x))\color{red} ((\lambda x.x)(\lambda y.y))$ \color{black} \newline - \subitem $(\lambda x.((\lambda \color{blue}x.x\color{black}) \color{red}(\lambda y.y)\color{black})(\lambda z.z)x)$ - \begin{center} - Intuition: Reduziere Argumente erst, wenn benötigt - \end{center} - -\end{itemize} + \subitem $(\lambda y. (\lambda x.y(\lambda z.z)x))\color{red} ((\lambda x.x)(\lambda y.y))$ \color{black} \newline + \subitem $(\lambda x.((\lambda \color{blue}x.x\color{black}) \color{red}(\lambda y.y)\color{black})(\lambda z.z)x)$ + \begin{center} + Intuition: Reduziere Argumente erst, wenn benötigt + \end{center} + +\end{itemize*} Auswertung in Haskell: \color{blue} Lazy-Evaluation = call-by-name (+sharing) -\color{black} \begin{itemize} +\color{black} \begin{itemize*} \item Standard-Auswertungsstrategie für Funktionen/Konstruktoren \item[] listOf x = x : listOf x \item[] 3: listOf 3 $\nRightarrow$ \item[] \item[] (div 1 0) : (6 : []) \item[] tail ((div 1 0): (6 : [])) $\Rightarrow$ 6 : [] $\nRightarrow$ -\end{itemize} +\end{itemize*} \subsubsection{Call-By-Value} Call-By-Value: Reduziere linkesten Redex -\begin{itemize} +\begin{itemize*} \item der nicht einen $\lambda$ umgibt \item und dessen Argument ein \color{blue} Wert \color{black} ist - \subsubitem $(\lambda y.(\lambda x.y(\lambda z.z)x)((\lambda \color{blue} x.x \color{black})\color{red}(\lambda y.y)\color{black})$ - \subsubitem $\Rightarrow (\lambda \color{blue}y\color{black}(\lambda x. \color{blue}y\color{black}(\lambda z.z)x))\color{red}(\lambda y.y)\color{black}$ - \subsubitem $\Rightarrow (\lambda x.(\lambda y.y(\lambda z.z)x)) \nRightarrow$ + \subsubitem $(\lambda y.(\lambda x.y(\lambda z.z)x)((\lambda \color{blue} x.x \color{black})\color{red}(\lambda y.y)\color{black})$ + \subsubitem $\Rightarrow (\lambda \color{blue}y\color{black}(\lambda x. \color{blue}y\color{black}(\lambda z.z)x))\color{red}(\lambda y.y)\color{black}$ + \subsubitem $\Rightarrow (\lambda x.(\lambda y.y(\lambda z.z)x)) \nRightarrow$ \item[] Intuition: Argumente vor Funktionsaufruf auswerten \item[] Auswertungsstrategie vieler Sprachen: Java, C, Scheme, ML, … \item[] Arithmetik in Haskell: Auswertung by-value \item[] prodOf(x) = y * prodOf x \item[] 3 * prodOf 3 $\Rightarrow$ 3 * (3 * prodOf 3) $\Rightarrow$ … \item[] ((div 1 0) * 6) * 0 $\Rightarrow$ $\bot$ - \item[] ((div 2 2 ) * 6) * 0 $\Rightarrow$ ((1 * 6) * 0) $\Rightarrow$ 6 * 0 $\Rightarrow$ 0 $\nRightarrow$ \end{itemize} + \item[] ((div 2 2 ) * 6) * 0 $\Rightarrow$ ((1 * 6) * 0) $\Rightarrow$ 6 * 0 $\Rightarrow$ 0 $\nRightarrow$ \end{itemize*} \subsubsection{Vergleich der Auswertungsstrategien} \color{blue} Call-by-name vs. Call-by-value \color{black} -\begin{itemize} +\begin{itemize*} \item Werten nicht immer zur Normalform aus $\lambda x.(\lambda y.y)x$ \item Gibt es Normalform, dann darauf $\beta$-reduzierbar (Church-Rosser) \item Call-by-name terminiert öfter \item[] $Y(\lambda y.z) = \lambda f. (\lambda x.f(x\;x))(\lambda x.f(x\;x))\color{red}(\lambda y.z)\color{black}$ \newline - \subitem $ \Rightarrow \lambda x.(\lambda y.z(x\;x))\color{red} (\lambda x.(\lambda y.z)(x\;x))$ \newline - \subitem $\Rightarrow (\lambda y.z)\color{red}((\lambda x.(\lambda y.z)(x\;x)) (\lambda x.(\lambda y.z (x\;x)))\color{black} \stackrel{cbn}{\Rightarrow} z$ - \subitem \newline - \subitem $\stackrel{cbv}{\Rightarrow} (\lambda y.z)((\lambda x.(\lambda y.z)(x\;x))\color{red}(\lambda x.(\lambda y.z (x\;x))\color{black})$ - \subitem $\stackrel{cbv}{\Rightarrow} (\lambda y.z)((\lambda y.z)((\lambda x.(\lambda y.z)(x\;x)) \color{red} (\lambda x.(\lambda y.z(x\;x)) \color{black}))$ -\end{itemize} + \subitem $ \Rightarrow \lambda x.(\lambda y.z(x\;x))\color{red} (\lambda x.(\lambda y.z)(x\;x))$ \newline + \subitem $\Rightarrow (\lambda y.z)\color{red}((\lambda x.(\lambda y.z)(x\;x)) (\lambda x.(\lambda y.z (x\;x)))\color{black} \stackrel{cbn}{\Rightarrow} z$ + \subitem \newline + \subitem $\stackrel{cbv}{\Rightarrow} (\lambda y.z)((\lambda x.(\lambda y.z)(x\;x))\color{red}(\lambda x.(\lambda y.z (x\;x))\color{black})$ + \subitem $\stackrel{cbv}{\Rightarrow} (\lambda y.z)((\lambda y.z)((\lambda x.(\lambda y.z)(x\;x)) \color{red} (\lambda x.(\lambda y.z(x\;x)) \color{black}))$ +\end{itemize*} \color{blue} Standardisierungssatz \newline Wenn t eine Normalform hat, dann findet Normalreihenfolgenauswertung diese. \color{black} \subsubsection{Abschließende Bemerkungen} -\begin{itemize} +\begin{itemize*} \item Der Lambda-Kalkül wurde in den dreißiger Jahren des 20. Jahrhunderts von Alonzo Church erfunden, um damit grundsätzliche Betrachtungen über berechenbare Funktionen anzustellen \item Trotz der Einfachheit der dem Kalkül zugrunde liegenden Regeln, realisiert er ein universelles Berechnungsmodell \item Der Lambda-Kalkül hat die Entwicklung zahlreicher, für die Informatik wichtiger Konzepte beeinflusst - \begin{itemize} - \item Funktionale Programmiersprachen (die minimalen Funktionen von Lisp wurden auf Grundlage des Lambda-Kalküls definiert) - \item Forschund zu Typsystemen für Programmiersprachen - \item Repräsentation von Logik-Termen im Lambda-Kalkül führte zu Theorembeweisen für Logiken höherer Stufen - \end{itemize} + \begin{itemize*} + \item Funktionale Programmiersprachen (die minimalen Funktionen von Lisp wurden auf Grundlage des Lambda-Kalküls definiert) + \item Forschund zu Typsystemen für Programmiersprachen + \item Repräsentation von Logik-Termen im Lambda-Kalkül führte zu Theorembeweisen für Logiken höherer Stufen + \end{itemize*} \item Manche Puristen vertreten gelegentlich die Ansicht, dass funktionale Programmiersprachen nicht viel mehr sind, als "Lambda-Kalkül mit etwas syntaktischem Zucker" -\end{itemize} +\end{itemize*} \subsection{Zusammenfassung} -\begin{itemize} +\begin{itemize*} \item Funktionale Programmierung folgt einem verallgemeinerten Konzept der Funktionsauswertung \item Die Programmiersprache Erlang ist dynamisch typisiert und unterstützt auch Funktionen höherer Ordnung \item Manche Algorithmen lassen sich in Erlang aufgrund der mächtigen Listenkonstrukte und des flexiblen Pattern Matching sehr kompakt formulieren ($\rightarrow$ Potenzmenge, Quicksort) \item Das heißt jedoch nicht, dass sehr kompakter Code auch zu sehr effizientem Laufzeit- und/oder Speicherbedarf führt - teilweise muss der Code relativ geschickt optimiert werden, um einigermaßen effiziente Lösungen zu erhalten ($\rightarrow$ Quicksort) \item Manche Aufgaben, die in imperativen Programmiersprachen sehr effizient und einfach lösbar sind ($\rightarrow$ Teilen einer Liste in gleich große Hälften) sind mittels Listen nur recht umständlich und aufwendig lösbar \item Es gilt in der Praxis also abzuwägen, für welche Aufgaben eine funktionale Sprache eingesetzt werden soll -\end{itemize} +\end{itemize*} \section{Multithreading und parallele Programmierung} \subsection{Grundlagen} \subsubsection{Lernziele} -\begin{itemize} +\begin{itemize*} \item Programmierung paralleler Algorithmen und Verfahren als Paradigma \item Verständnis grundlegender Architekturen und Modelle \item Praktische Erfahrungen mit Erlang, Java und C++ -\end{itemize} +\end{itemize*} \subsubsection{The free launch is over} Taktfrequenz wächst nur noch langsam -\begin{itemize} +\begin{itemize*} \item Physikalische Gründe: Wärmeentwicklung, Energiebedarf, Kriechströme,… -\end{itemize} +\end{itemize*} Auswege -\begin{itemize} +\begin{itemize*} \item Hyperthreading: - \begin{itemize} - \item Abarbeitung mehrerer Threads auf einer CPU (5-15 \% Performancegewinn) - \item Einfache Hardwareunterstützung (einige Register) - \end{itemize} + \begin{itemize*} + \item Abarbeitung mehrerer Threads auf einer CPU (5-15 \% Performancegewinn) + \item Einfache Hardwareunterstützung (einige Register) + \end{itemize*} \item Multicore: - \begin{itemize} - \item Mehrere CPUs auf einem Chip - \item Billiger als echte Mehrprozessorsysteme - \end{itemize} + \begin{itemize*} + \item Mehrere CPUs auf einem Chip + \item Billiger als echte Mehrprozessorsysteme + \end{itemize*} \item Caching: - \begin{itemize} - \item Vergrößerung L1, L2, L3 Cache - \item Speicherzugriff 10-50 $\cdot$ teurer als Cachezugriff - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Vergrößerung L1, L2, L3 Cache + \item Speicherzugriff 10-50 $\cdot$ teurer als Cachezugriff + \end{itemize*} +\end{itemize*} \subsubsection{Konsequenzen und Trends} -\begin{itemize} +\begin{itemize*} \item Applikationen müssen nebenläufig programmiert werden um CPU auszunutzen $\rightarrow$ Many-Core-Systeme \item CPU-Begrenzung von Applikationen \item Effizienz und Performanceoptimierung werden immer wichtiger \item Unterstützung von Nebenläufigkeit/Parallelität durch Programmiersprachen -\end{itemize} +\end{itemize*} \subsubsection{Einordnung} @@ -3808,18 +3658,18 @@ Auswege \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-0016} \end{center} -\begin{itemize} +\begin{itemize*} \item Zugriff über Bus auf gemeinsamen Speicher \item jeder Prozessor mit eigenen Caches -\end{itemize} +\end{itemize*} \subsubsection{Multicore-Systeme} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-0017} \end{center} -\begin{itemize} +\begin{itemize*} \item mehrere Prozessorkerne auf einem Chip \item Kerne typischerweise mit eigenen L1/L2-Caches und gemeinsamen L3-Cache -\end{itemize} +\end{itemize*} \subsubsection{Symmetrisch vs. Nicht-symmetrisch} @@ -3829,29 +3679,29 @@ SMP \newline Symmetric Multi Processing \newline \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-0018} \end{center} -\begin{itemize} +\begin{itemize*} \item Speicherbandbreite begrenzt und von allen Prozessoren gemeinsam genutzt \item Skalierbarkeit begrenzt \item Single Socket Lösung -\end{itemize} +\end{itemize*} NUMA \newline Non-Uniform Memory Access \newline \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-0019} \end{center} -\begin{itemize} +\begin{itemize*} \item jedem Prozessor sind Teile des Speichers zugeordnet \item lokaler Zugriff ist schneller als entfernter \item Typisch für Multi-Socket Systeme -\end{itemize} +\end{itemize*} \subsubsection{CPU vs. GPU} -\begin{itemize} +\begin{itemize*} \item GPU = Graphics Processing Units \item Hochparallele Prozessorarchitekturen (nicht nur) für Grafikrendering -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.95\linewidth]{Assets/Programmierparadigmen-0020} \end{center} @@ -3863,37 +3713,37 @@ Non-Uniform Memory Access \newline \end{center} \subsubsection{Maße zur Leistungsbewertung} -\begin{itemize} +\begin{itemize*} \item Maße für Laufzeitgewinn durch Parallelisierung \item $T_n$ = Laufzeit des Programms mit n Prozessoren/Kernen \item Speedup - \begin{center} - \begin{displaymath} - Speedup = {{T_1} \over {T_n}} - \end{displaymath} - \end{center} + \begin{center} + \begin{displaymath} + Speedup = {{T_1} \over {T_n}} + \end{displaymath} + \end{center} \item Effizienz - \begin{center} - \begin{displaymath} - Effizienz = {Speedup \over n} - \end{displaymath} - \end{center} -\end{itemize} + \begin{center} + \begin{displaymath} + Effizienz = {Speedup \over n} + \end{displaymath} + \end{center} +\end{itemize*} \subsubsection{Amdahlsches Gesetz} -\begin{itemize} +\begin{itemize*} \item[] Berücksichtigung parallelisierbarer und serieller Anteile im Programmablauf \item n Prozessoren \newline - p = paralleler Anteil - \newline s = serieller Anteil \newline - p+s = 1 + p = paralleler Anteil + \newline s = serieller Anteil \newline + p+s = 1 \item Maximaler Speedup - \newline \begin{gather} - Speedup_{max} = {T_1 \over T_n} \\ - = {{s+p}\over{s+{p \over n}}} \\ - = {1 \over {s+{p \over n}}} - \end{gather} -\end{itemize} + \newline \begin{gather} + Speedup_{max} = {T_1 \over T_n} \\ + = {{s+p}\over{s+{p \over n}}} \\ + = {1 \over {s+{p \over n}}} + \end{gather} +\end{itemize*} \begin{center} \includegraphics[width=0.35\linewidth]{Assets/Programmierparadigmen-0022} \end{center} @@ -3904,30 +3754,30 @@ Non-Uniform Memory Access \newline \subsubsection{Prozesse und Threads} Prozess := Programm in Ausführung; Ausführungsumgebung für ein Programm -\begin{itemize} +\begin{itemize*} \item hat eigenen Adressraum \item Prozessor kann immer nur einen Prozess ausführen -\end{itemize} +\end{itemize*} Thread ("Faden") := leichtgewichtige Ausführungsreinheit oder Kontrollfluss (Folge von Anweisungen) innerhalb eines sich in Ausführung befindlichen Programms -\begin{itemize} +\begin{itemize*} \item "leichtgewichtig" im Vergleich zu Betriebssystemprozess \item Threads eines Prozesses teilen sich den Adressraum \item Thread kann von einer CPU oder einem Core ausgeführt werden -\end{itemize} +\end{itemize*} \subsubsection{Shared Memory vs Message Passing} Art der Kommunikation zwischen Prozessen oder Threads \newline Shared Memory -\begin{itemize} +\begin{itemize*} \item Kommunikation (über Variable im) gemeinsamen Speicher \item Prozess kann direkt auf Speicher eines anderen Prozesses zugreifen \item erfordert explizite Synchronisation, z.B. über zeitkritische Abschnitte -\end{itemize} +\end{itemize*} Message Passing -\begin{itemize} +\begin{itemize*} \item Prozesse mit getrennten Adressräumen; Zugriff nur auf eigenen Speicher \item Kommunikation durch explizites Senden/Empfangen von Nachrichten -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-0024} @@ -3940,26 +3790,26 @@ Message Passing \subsubsection{Parallelisierungsarten} Instruktionsparallelität: -\begin{itemize} +\begin{itemize*} \item parallele Ausführung mehrerer Operationen durch eine CPU-Instruktion \item explizit: Vektorinstruktionen, SIMD \item implizit: Pipelining von Instruktionen -\end{itemize} +\end{itemize*} Taskparallelität -\begin{itemize} +\begin{itemize*} \item Ausnutzung inhärenter Parallelität durch simultane Ausführung unabhängiger Aufgaben -\end{itemize} +\end{itemize*} Datenparalelität: -\begin{itemize} +\begin{itemize*} \item Gemeinsame Operation auf homogener Datenmenge \item Zerlegung eines Datensatzes in kleinere Abschnitte -\end{itemize} +\end{itemize*} \subsubsection{Instruktionsparallelität: SIMD} -\begin{itemize} +\begin{itemize*} \item Autovektorisierung durch Compiler \item explizite Instruktionen -\end{itemize} +\end{itemize*} Beispiel: Addition zweier Vektoren \begin{center} @@ -3967,75 +3817,75 @@ Beispiel: Addition zweier Vektoren \end{center} \subsubsection{Taskparallelität} -\begin{itemize} +\begin{itemize*} \item Unabhängikeit von Teilprozessen $\rightarrow$ Desequentialisierung \item Beispiel: Quicksort -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-0027} \end{center} \subsubsection{Datenparallelität} -\begin{itemize} +\begin{itemize*} \item homogene Datenmenge: Felder, Listen, Dokumentenmenge,… \item Verteilung der Daten \item alle Prozessoren führen gleiches Programm auf jeweils eigenen Daten aus \item Beispiel: Matrixaddition S = A + B -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.9\linewidth]{Assets/Programmierparadigmen-0028} \end{center} \subsubsection{Herausforderungen} -\begin{itemize} +\begin{itemize*} \item Zerlegung eines Problems in parallel verarbeitbare Teile - \begin{itemize} - \item Beispiel: Suche in einer Datenbank mit 1 TB Größe - \item Annahme: 100 MB/Sekunde mit einem Prozessor = 175 Minuten - \item bei paralleler Suche durch 10 Prozessoren = 17.5 Minuten - \item Übertragbar auf andere Probleme, z.B. Sortieren, Suche in Graphen? - \end{itemize} + \begin{itemize*} + \item Beispiel: Suche in einer Datenbank mit 1 TB Größe + \item Annahme: 100 MB/Sekunde mit einem Prozessor = 175 Minuten + \item bei paralleler Suche durch 10 Prozessoren = 17.5 Minuten + \item Übertragbar auf andere Probleme, z.B. Sortieren, Suche in Graphen? + \end{itemize*} \item Synchronisation konkurrierender Zugriffe auf gemeinsame Ressourcen - \begin{itemize} - \item Beispiel: Produzent-Konsument-Beziehung - \item Annahme: Datenaustausch über gemeinsame Liste - \item Fragestellungen: Benachrichtigung über neues Element in der Liste, Konsument entnimmt Element während Produzent einfügt - \item Wechselseitiger Ausschluss - \end{itemize} + \begin{itemize*} + \item Beispiel: Produzent-Konsument-Beziehung + \item Annahme: Datenaustausch über gemeinsame Liste + \item Fragestellungen: Benachrichtigung über neues Element in der Liste, Konsument entnimmt Element während Produzent einfügt + \item Wechselseitiger Ausschluss + \end{itemize*} \item außerdem: Fehlersuche, Optimierung -\end{itemize} +\end{itemize*} \subsubsection{Zusammenfassung} -\begin{itemize} +\begin{itemize*} \item Parallele Verarbeitung als wichtiges Paradigma moderner Software \item verschiedene parallele - \begin{itemize} - \item Hardwarearchitekturen und - \item Programmiermodelle - \end{itemize} + \begin{itemize*} + \item Hardwarearchitekturen und + \item Programmiermodelle + \end{itemize*} \item Herausforderungen: - \begin{itemize} - \item Problemzerlegung - \item Synchronisation - \item … - \end{itemize} + \begin{itemize*} + \item Problemzerlegung + \item Synchronisation + \item … + \end{itemize*} \item im Weiteren: konkrete Methoden und Techniken in Erlang und C++ -\end{itemize} +\end{itemize*} \subsection{Grundlagen} \paragraph{Architekturen} SIMD, SMP, NUMA, Cluster, Grid Multiprozessorsysteme: -\begin{itemize} +\begin{itemize*} \item Zugriff über Bus auf gemeinsamen Speicher \item jeder Prozessor mit eigenen Caches -\end{itemize} +\end{itemize*} Multicore-Systeme: -\begin{itemize} +\begin{itemize*} \item mehrere Prozessorkerne auf einem Chip \item Kerne typischerweise mit eigenen L1/L2-Caches und gemeinsamen L3-Cache -\end{itemize} +\end{itemize*} Symetrisch vs. Nicht-symetrisch %| SMP (Symmetric Multi Processing) | NUMA (Non-Uniform Memory-Access) | @@ -4046,62 +3896,62 @@ Symetrisch vs. Nicht-symetrisch Maße zur Leistungsbewertung -Maße für den Laufzeitengewinn durch Parallelisierung -\begin{itemize} +\begin{itemize*} \item $T_n=$ Laufzeit des Programms mit n Prozessoren/Kernen \item Speedup:= $\frac{T_1}{T_n}$ \item Effizienz:= $\frac{Speedup}{n}$ -\end{itemize} +\end{itemize*} Amdahlsches Gesetz $n$ Prozessoren, $p$ parallele Anteile, $s$ serielle Anteile, $p+s=1$ Maximaler Speedup: $Speedup_{max}=\frac{T_1}{T_n}=\frac{1}{s+\frac{p}{n}}$ \paragraph{Grundbegriffe} -\begin{itemize} +\begin{itemize*} \item Prozess := Programm in Ausführung; Ausführungsumgebung für ein Programm; hat eigenen Adressraum; Prozessor kann immer nur einen Prozess ausführen \item Thread ("Faden") := leichtgewichtige Ausführungseinheit oder Kontrollfluss (Folge von Anweisungen) innerhalb eines sich in Ausführung befindlichen Programms; "leichtgewichtig" im Vergleich zu Betriebssystemprozess; Threads eines Prozesses teilen sich Adressraum; Thread kann von CPU oder Core ausgeführt werden \item Shared Memory := Kommunikation (über Variablen im) gemeinsamen Speicher; Prozess kann direkt auf Speicher eines anderen Prozesses zugreifen; erfordert explizite Synchronisation, z.B. über kritische Abschnitte \item Message Passing := Prozesse mit getrennten Adressräumen; Zugriff nur auf eigenen Speicher; Kommunikation durch explizites Senden/Empfangen von Nachrichten; implizite Synchronisation durch Nachrichten \item Parallelisierungsarten - \begin{itemize} - \item Instruktionsparallelität: parallele Ausführung mehrerer Operationen durch eine CPU-Instruktion; explizit: Vektorinstruktionen, SIMD; implizit: Pipelining von Instruktionen - \item Taskparallelität: Ausnutzung inhärenter Parallelität durch simultane Ausführung unabhängiger Aufgaben - \item Datenparallelität: Gemeinsame Operation auf homogener Datenmenge; Zerlegung eines Datensatzes in kleinere Abschnitte - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Instruktionsparallelität: parallele Ausführung mehrerer Operationen durch eine CPU-Instruktion; explizit: Vektorinstruktionen, SIMD; implizit: Pipelining von Instruktionen + \item Taskparallelität: Ausnutzung inhärenter Parallelität durch simultane Ausführung unabhängiger Aufgaben + \item Datenparallelität: Gemeinsame Operation auf homogener Datenmenge; Zerlegung eines Datensatzes in kleinere Abschnitte + \end{itemize*} +\end{itemize*} \subsection{Parallele Programmierung in Erlang - Teil 1} \subsubsection{Unterstützung paralleler Programmierung in Erlang} -\begin{itemize} +\begin{itemize*} \item Leichtgewichtige Prozesse und Message Passing \item SMP-Support (Symmetric Multi Processing) \item Ziele für effiziente Parallelisierung - \begin{itemize} - \item Problem in viele Prozesse zerlegen \newline(aber nicht zu viele …) - \item Seiteneffekte vermeiden \newline (würde Synchronisation erfordern …) - \item Sequentiellen Flaschenhals vermeiden - \newline (Zugriff auf gemeinsame Ressourcen: IO, Registrierung von Prozessen, …) - \begin{center} - \color{orange} Small Messages, Big Computation! \color{black} - \end{center} - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Problem in viele Prozesse zerlegen \newline(aber nicht zu viele …) + \item Seiteneffekte vermeiden \newline (würde Synchronisation erfordern …) + \item Sequentiellen Flaschenhals vermeiden + \newline (Zugriff auf gemeinsame Ressourcen: IO, Registrierung von Prozessen, …) + \begin{center} + \color{orange} Small Messages, Big Computation! \color{black} + \end{center} + \end{itemize*} +\end{itemize*} \subsubsection{Prozesse in Erlang} -\begin{itemize} +\begin{itemize*} \item Erlang VM = Betriebssystemprozess \item Erlang-Prozess = Thread innerhalb der Erlang VM - \begin{itemize} - \item kein Zugriff auf gemeinsame Daten, daher "Prozess" - \end{itemize} + \begin{itemize*} + \item kein Zugriff auf gemeinsame Daten, daher "Prozess" + \end{itemize*} \item jede Erlang-Funktion kann einen Prozess bilden \item Funktion spawn erzeugt einen Prozess, der die Funktion Fun ausführt \newline - \color{blue} Pid \color{black} = \color{green} spawn\color{black}(\color{green} fun \color{blue} Fun\color{black}/0) + \color{blue} Pid \color{black} = \color{green} spawn\color{black}(\color{green} fun \color{blue} Fun\color{black}/0) \item Resultat = Prozessidentifikation Pid, mittels der man dem Prozess Nachrichten schicken kann. \item über self() kann man die eigene Pid ermitteln \item Übergabe von Arghumenten an den Prozess bei der Erzeugung - \newline \color{blue} Pid \color{black} = \color{green} spawn\color{black} (\color{green} fun\color{black} () $\rightarrow$ any\_func(Arg1, Arg2, …)\color{green} end\color{black}) -\end{itemize} + \newline \color{blue} Pid \color{black} = \color{green} spawn\color{black} (\color{green} fun\color{black} () $\rightarrow$ any\_func(Arg1, Arg2, …)\color{green} end\color{black}) +\end{itemize*} \subsubsection{Prozesse in Erlang: Beispiele} \begin{center} \includegraphics[width=0.9\linewidth]{Assets/Programmierparadigmen-029} @@ -4113,14 +3963,14 @@ Maximaler Speedup: $Speedup_{max}=\frac{T_1}{T_n}=\frac{1}{s+\frac{p}{n}}$ \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-030} \end{center} } -\begin{itemize} +\begin{itemize*} \item 4 Betriebssystemthreads (hier 2 Kerne mit Hyperthreading) \item kann mit -smp [disable $\mid$ enable $\mid$ auto] beeinflusst werden \item +S [Anzahl] bestimmt Anzahl der Scheduler - \begin{itemize} - \item sollte nicht größer als Anzahl der Kerne/Prozessoren sein - \end{itemize} -\end{itemize} + \begin{itemize*} + \item sollte nicht größer als Anzahl der Kerne/Prozessoren sein + \end{itemize*} +\end{itemize*} \subsubsection{Scheduler in Erlang} \begin{center} @@ -4128,62 +3978,62 @@ Maximaler Speedup: $Speedup_{max}=\frac{T_1}{T_n}=\frac{1}{s+\frac{p}{n}}$ \end{center} \subsubsection{Message Passing in Erlang: Senden einer Nachricht} \ -\begin{itemize} +\begin{itemize*} \item[1.] \color{blue} Pid ! Message \color{black} - -\end{itemize} -\begin{itemize} + +\end{itemize*} +\begin{itemize*} \item an Prozess Pid wird die Nachricht Message gesendet \item der Prozess muss eine Empfangsoperation ausführen. damit ihn die Nachricht erreichen kann - -\end{itemize} + +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-032} \end{center} -\begin{itemize} +\begin{itemize*} \item trifft eine Nachricht ein, wird versucht, diese mit einem Pattern und ggf. vorhandenen Guard zu "matchen" \item erstes zutreffendes Pattern (inkl. Guard) bestimmt, welcher Ausdruck ausgewertet wird \item trifft kein Pattern zu, wird die Nachricht für spätere Verwendung aufgehoben und Prozess wartet auf die nächste Nachricht ($\rightarrow$ "selective receive") -\end{itemize} +\end{itemize*} \subsubsection{Ein einfacher Echo-Server} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-033} \end{center} \subsubsection{Echo-Server: Erklärungen} -\begin{itemize} +\begin{itemize*} \item Funktion loop() realisiert einen (nur bedingt nützlichen) Echo-Dienst, der jede empfangene Nachricht unverändert an den Absender zurückschickt, bis er nach Empfang von stop endet \item Funktion run() - \begin{itemize} - \item[1.] startet den Echoserver (Zeile 4) - \item[2.] schickt ihm als nächstes eine Nachricht (Zeile 5) - \item[3.] wartet auf eine Antwort (Zeile 6) - \item[4.] gibt diese aus (Zeile 7) - \item[5.] schickt dann stop an den Echoserver (Zeile 9) - \end{itemize} + \begin{itemize*} + \item[1.] startet den Echoserver (Zeile 4) + \item[2.] schickt ihm als nächstes eine Nachricht (Zeile 5) + \item[3.] wartet auf eine Antwort (Zeile 6) + \item[4.] gibt diese aus (Zeile 7) + \item[5.] schickt dann stop an den Echoserver (Zeile 9) + \end{itemize*} \item Aufruf in der Funktion loop() erfolgt endrekursiv, daher wird kein wachsender Aufrufstapel angelegt (Hinweis: grundsätzlich zu beachten, da sonst der Speicherbedarf stetig wächst) -\end{itemize} +\end{itemize*} \subsection{Parallele Programmierung in Erlang - Teil 2} \subsubsection{Ansätze zur Parallelisierung} -\begin{itemize} +\begin{itemize*} \item[] Beispiel: Berechnung einer (zufällig generierten) Liste von Fibonaccizahlen - \begin{itemize} - \item Sequentielle Lösung über lists:map/2 - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Sequentielle Lösung über lists:map/2 + \end{itemize*} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-036} \end{center} \subsubsection{pmap: Parallele Funktionen höherer Ordnung} -\begin{itemize} +\begin{itemize*} \item[] Parallele Variante von lists:map(Fun, list) - \begin{itemize} - \item für jedes Listenelement einen Prozess erzeugen - \item Ergebnisse einsammeln - \end{itemize} -\end{itemize} + \begin{itemize*} + \item für jedes Listenelement einen Prozess erzeugen + \item Ergebnisse einsammeln + \end{itemize*} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-035} \end{center} @@ -4194,54 +4044,54 @@ Maximaler Speedup: $Speedup_{max}=\frac{T_1}{T_n}=\frac{1}{s+\frac{p}{n}}$ \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-034} \end{center} -\begin{itemize} +\begin{itemize*} \item Funktion F aufrufen, catch sorgt für korrekte Behandlung von Fehlern in F \item Ergebnis zusammen mit eigener Pid (self()) an Elternprozess senden -\end{itemize} +\end{itemize*} \color{orange} Einsammeln der Ergebnisse \color{black} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-037} \end{center} -\begin{itemize} +\begin{itemize*} \item Zeile 5: Warten bis Paar (Pid, Ergebniswert) eintrifft \item Zeile 7: Tail ist leer $\rightarrow$ alle Ergebnisse eingetroffen -\end{itemize} +\end{itemize*} \subsubsection{Parallele Berechnung der Fibonacci-Zahlen} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-038} \end{center} \subsubsection{Diskussion} -\begin{itemize} +\begin{itemize*} \item Passende Abstraktion wählen - \begin{itemize} - \item Ist Ordnung der Ergebnisse notwendig? - \item Werden Ergebnisse benötigt? - \end{itemize} + \begin{itemize*} + \item Ist Ordnung der Ergebnisse notwendig? + \item Werden Ergebnisse benötigt? + \end{itemize*} \item Anzahl der parallelen Prozesse - \begin{itemize} - \item Abhängig von Berechnungsmodell, Hardware etc. - \item evtl. pmap mit max. Anzahl gleichzeitiger Prozesse - \end{itemize} + \begin{itemize*} + \item Abhängig von Berechnungsmodell, Hardware etc. + \item evtl. pmap mit max. Anzahl gleichzeitiger Prozesse + \end{itemize*} \item Berechnungsaufwand der Prozesse - \begin{itemize} - \item Berechnung vs. Daten/Ergebnisse senden - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Berechnung vs. Daten/Ergebnisse senden + \end{itemize*} +\end{itemize*} \subsubsection{pmap: Alternative Implementierung} -\begin{itemize} +\begin{itemize*} \item ohne Berücksichtigung der Ordnung der Ergebnismenge \item Zählen für die bereits eingetroffenen Ergebnisse -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-039} \end{center} \subsubsection{Diskussion: Speedup} Bestimmung des Speedups erfordert -\begin{itemize} +\begin{itemize*} \item Zeitmessung \item Kontrolle der genutzten Prozessoren/Cores -\end{itemize} +\end{itemize*} \color{orange} Welchen Einfluss hat die Zahl der erzeugten Prozesse. \color{black} \subsubsection{Speedup: Zeitmessung} Nutzung der Funktion timer:tc/3 @@ -4258,30 +4108,30 @@ ch4\_6:benchmark(ch4\_4, run, 1000). \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-042} \end{center} \color{orange} Achtung: \color{black} -\begin{itemize} +\begin{itemize*} \item Aufwand für Berechnung einer Fibonaccizahl ist nicht konstant \item Zufallszahlen als Eingabe -\end{itemize} +\end{itemize*} \subsubsection{Diskussion: Speedup} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-043} \end{center} \subsubsection{Datenparallelität: Das MapReduce-Paradigma} -\begin{itemize} +\begin{itemize*} \item Parallelisierungsmuster inspiriert von Konzepten funktionaler Programmiersprachen (map,reduce/fold) \item Basis von Big-Data-plattformen wie Hadoop, Spark,… \item Grundidee: - \begin{itemize} - \item map(F, Seq) ? wende Funktion F (als Argument übergeben) auf alle Elemente einer Folge Seq an, - \begin{itemize} - \item z.B. multipliziere jedes Element mit 2 - \end{itemize} - \item reduce(F, Seq) = wende eine Funktion F schrittweise auf die Elemente einer Folge Seq an und produziere einen einzelnen Wert, - \begin{itemize} - \item z.B. die Summer aller Elemente einer Folge - \end{itemize} - \end{itemize} -\end{itemize} + \begin{itemize*} + \item map(F, Seq) ? wende Funktion F (als Argument übergeben) auf alle Elemente einer Folge Seq an, + \begin{itemize*} + \item z.B. multipliziere jedes Element mit 2 + \end{itemize*} + \item reduce(F, Seq) = wende eine Funktion F schrittweise auf die Elemente einer Folge Seq an und produziere einen einzelnen Wert, + \begin{itemize*} + \item z.B. die Summer aller Elemente einer Folge + \end{itemize*} + \end{itemize*} +\end{itemize*} \subsubsection{map in Erlang} \begin{center} @@ -4293,16 +4143,16 @@ ch4\_6:benchmark(ch4\_4, run, 1000). \end{center} \subsubsection{Parallelisierung von map und reduce} \color{orange} map -\color{black} \begin{itemize} +\color{black} \begin{itemize*} \item Funktion F kann unabhängig (=parallel) auf jedes Element angewendet werden \item Partitionieren und Verteilen der Elemente der Folge \item siehe pmap - -\end{itemize} + +\end{itemize*} \color{orange} reduce \color{black} -\begin{itemize} +\begin{itemize*} \item prinzipiell ähnlich, d.h. Funktion F kann auf Paare unabhängig angewandt werden -\end{itemize} +\end{itemize*} \subsubsection{Parallelisierung von reduce} \begin{center} \includegraphics[width=0.5\linewidth]{Assets/Programmierparadigmen-046} @@ -4316,16 +4166,16 @@ ch4\_6:benchmark(ch4\_4, run, 1000). \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-047} \end{center} -\begin{itemize} +\begin{itemize*} \item typische funktionale Notation von Quicksort mit List Comprehensions \item Zeile 2: H dient als Pivotelement -\end{itemize} \ \newline +\end{itemize*} \ \newline Idee: -\begin{itemize} +\begin{itemize*} \item Prozess für das Sortieren der einen Hälfte starten \item Elternprozess kann andere Hälfte sortieren \item rekursive Zerlegung… -\end{itemize} +\end{itemize*} \subsubsection{Parallel Quicksort: Version 1} Quicksort in Erlang @@ -4333,27 +4183,27 @@ Quicksort in Erlang \includegraphics[width=0.9\linewidth]{Assets/Programmierparadigmen-048} \end{center} \subsubsection{Erläuterungen} -\begin{itemize} +\begin{itemize*} \item Zeile 4: Erzeugen eines neuen Prozesses zur Sortierung der "oberen" Hälfte \item Zeile 6-7: Wie bisher \item Zeile 8: Warten auf Empfang der sortierten anderen Hälfte -\end{itemize} +\end{itemize*} Zeitmessung: \begin{center} \includegraphics[width=0.9\linewidth]{Assets/Programmierparadigmen-049} \end{center} \subsubsection{Bewertung} -\begin{itemize} +\begin{itemize*} \item parallele Version 1 ist langsamer! \item mögliche Erklärung: Prozess-Start ist aufwändiger als Sortieren kleiner Teilfolgen \item bessere Variante nach John Hughes: Parallel Programming in Erlang - \begin{itemize} - \item Kontrolle der Granularität für parallele Ausführungen - \item danach Sortieren mit sequenzieller Variante - \item einfache Idee: Anzahl der parallelen Zerlegung begrenzen - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Kontrolle der Granularität für parallele Ausführungen + \item danach Sortieren mit sequenzieller Variante + \item einfache Idee: Anzahl der parallelen Zerlegung begrenzen + \end{itemize*} +\end{itemize*} \begin{center} \includegraphics[width=0.9\linewidth]{Assets/Programmierparadigmen-050} \end{center} @@ -4363,56 +4213,56 @@ Zeitmessung: \includegraphics[width=0.9\linewidth]{Assets/Programmierparadigmen-051} \end{center} \subsubsection{Fazit} -\begin{itemize} +\begin{itemize*} \item \color{orange} leichtgewichtige Prozesse \color{black} als Baustein der Parallelisierung in Erlang \item Prozesskommunikation ausschließlich über \color{orange} Message Passing \color{black} \item \color{orange} funktionaler Charakter \color{black} (u.a. Vermeidung von Seiteneffekten) vereinfacht Parallelisierung deutlich \item \color{orange} Daten- und Taskparallelität \color{black} möglich \item hoher Abstraktionsgrad, aber auch wenig Einflussmöglichkeiten -\end{itemize} +\end{itemize*} \subsection{in Erlang} -\begin{itemize} +\begin{itemize*} \item Leichtgewichtige Prozesse und Message Passing \item SMP-Support \item Ziele für effiziente Parallelisierung: - \begin{itemize} - \item Problem in viele Prozesse zerlegen (aber nicht zu viele ...) - \item Seiteneffekte vermeiden (würde Synchronisation erfordern ...) - \item Sequentiellen Flaschenhals vermeiden (Zugriff auf gemeinsame Ressourcen: IO, Registrierung von Prozessen, ...) - \item Small Messages, Big Computation! - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Problem in viele Prozesse zerlegen (aber nicht zu viele ...) + \item Seiteneffekte vermeiden (würde Synchronisation erfordern ...) + \item Sequentiellen Flaschenhals vermeiden (Zugriff auf gemeinsame Ressourcen: IO, Registrierung von Prozessen, ...) + \item Small Messages, Big Computation! + \end{itemize*} +\end{itemize*} \paragraph{Prozesse in Erlang} -\begin{itemize} +\begin{itemize*} \item Erlang VM = Betriebssystemprozess \item Erlang-Prozess = Thread innerhalb der Erlang VM $\rightarrow$ kein Zugriff auf gemeinsame Daten, daher "Prozess" \item jede Erlang-Funktion kann Prozess bilden \item Funktion spawn erzeugt einen Prozess, der die Funktion Fun ausführt: - \begin{lstlisting} + \begin{lstlisting} Pid = spawn(fun Fun/0) \end{lstlisting} \item Resultat = Prozessidentifikation Pid, mittels der man dem Prozess Nachrichten schicken kann \item über self() kann man die eigene Pid ermitteln \item Übergabe von Argumenten an den Prozess bei der Erzeugung: - \begin{lstlisting} + \begin{lstlisting} Pid = spawn(fun() -> any_func(Arg1, Arg2, ...) end) \end{lstlisting} -\end{itemize} +\end{itemize*} \paragraph{Message Passing in Erlang: Senden einer Nachricht} \begin{lstlisting} Pid ! Message \end{lstlisting} -\begin{itemize} +\begin{itemize*} \item an Prozess Pid wird die Nachricht Message gesendet \item der Prozess muss eine Empfangsoperation ausführen, damit ihn die Nachricht erreichen kann \item trifft eine Nachricht ein, wird versucht, diese mit einem Pattern und ggf. vorhandenen Guard zu "matchen" \item erstes zutreffendes Pattern (inkl. Guard) bestimmt, welcher Ausdruck ausgewertet wird \item trifft kein Pattern zu, wird die Nachricht für spätere Verwendung aufgehoben und Prozess wartet auf die nächste Nachricht ($\rightarrow$ "selective receive") -\end{itemize} +\end{itemize*} \begin{lstlisting}[ language=erlang, @@ -4427,44 +4277,44 @@ end \end{lstlisting} \paragraph{Datenparallelität: Das MapReduce-Paradigma} -\begin{itemize} +\begin{itemize*} \item Parallelisierungsmuster inspiriert von Konzepten funktionaler Programmiersprachen ( map , reduce / fold ) \item Basis von Big-Data-Plattformen wie Hadoop, Spark, ... \item Grundidee: - \begin{itemize} - \item map(F, Seq) = wende Funktion F (als Argument übergeben) auf alle Elemente einer Folge Seq an, - \begin{itemize} - \item Funktion F kann unabhängig (=parallel) auf jedes Element angewendet werden - \item Partitionieren und Verteilen der Elemente der Folge - \item z.B. multipliziere jedes Element mit 2 - \end{itemize} - \item reduce(F, Seq) = wende eine Funktion F schrittweise auf die Element einer Folge Seq an und produziere einen einzelnen Wert, - \begin{itemize} - \item prinzipiell ähnlich zu map(F, Seq), d.h. Funktion F kann auf Paare unabhängig angewendet werden - \item z.B. die Summe aller Elemente der Folge - \end{itemize} - \end{itemize} -\end{itemize} + \begin{itemize*} + \item map(F, Seq) = wende Funktion F (als Argument übergeben) auf alle Elemente einer Folge Seq an, + \begin{itemize*} + \item Funktion F kann unabhängig (=parallel) auf jedes Element angewendet werden + \item Partitionieren und Verteilen der Elemente der Folge + \item z.B. multipliziere jedes Element mit 2 + \end{itemize*} + \item reduce(F, Seq) = wende eine Funktion F schrittweise auf die Element einer Folge Seq an und produziere einen einzelnen Wert, + \begin{itemize*} + \item prinzipiell ähnlich zu map(F, Seq), d.h. Funktion F kann auf Paare unabhängig angewendet werden + \item z.B. die Summe aller Elemente der Folge + \end{itemize*} + \end{itemize*} +\end{itemize*} \paragraph{Fazit} -\begin{itemize} +\begin{itemize*} \item leichtgewichtige Prozesse als Baustein der Parallelisierung in Erlang \item Prozesskommunikation ausschließlich über Message Passing \item funktionaler Charakter (u.a. Vermeidung von Seiteneffekten) vereinfacht Parallelisierung deutlich \item Daten- und Taskparallelität möglich \item hoher Abstraktionsgrad, aber auch wenig Einflussmöglichkeiten -\end{itemize} +\end{itemize*} \subsection{Parallele Programmierung in C++} \subsubsection{Threads in C++} \color{orange} Thread (Faden) \color{black} = leichtgewichtige Ausführungseinheit oder Kontrollfluss (Folge von Anweisungen) innerhalb eines sich in Ausführung befindlichen Programms -\begin{itemize} +\begin{itemize*} \item Threads teilen sich den Adressraum ihres Prozesses \item in C++: Instanzen der Klasse std::thread \item führen eine (initiale) Funktion aus -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-052} \end{center} @@ -4480,21 +4330,21 @@ end \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-054} \end{center} \subsubsection{Parameterübergabe bei Threaderzeugung} -\begin{itemize} +\begin{itemize*} \item über zusätzliche Argumente des thread-Konstruktors \item Vorsicht bei Übergabe von Referenzen, wenn Elternthread vor dem erzeugten Thread beendet wird - -\end{itemize} + +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-056} \end{center} \subsubsection{Warten auf Threads} -\begin{itemize} +\begin{itemize*} \item t.join() wartet auf Beendigung des Threads t \item blockiert aktuellen Thread \item ohne join() keine Garantie, dass t zur Ausführung kommt \item Freigabe der Ressourcen des Threads -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-057} \end{center} @@ -4502,65 +4352,65 @@ end \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-058} \end{center} \subsubsection{Hintergrundthreads} -\begin{itemize} +\begin{itemize*} \item Threads können auch im Hintergrund laufen, ohne, dass auf Ende gewartet werden muss \item "abkoppeln" durch detach() \item Thread läuft danach unter Kontrolle des C++-Laufzeitsystems, join nicht mehr möglich -\end{itemize} +\end{itemize*} \subsubsection{Threadidentifikation} -\begin{itemize} +\begin{itemize*} \item Threadidentifikator vom Typ std::thread::id \item Ermittlung über Methode get\_id() -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-059} \end{center} \subsubsection{Berechnung von Fibonacci-Zahlen in C++} -\begin{itemize} +\begin{itemize*} \item rekursive und nichtrekursive Variante möglich -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-060} \end{center} \subsubsection{Parallele Berechnung von Fibonacci-Zahlen} -\begin{itemize} +\begin{itemize*} \item einfachste Lösung (ähnlich zu Erlang): pro Zahl ein Thread -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-061} \end{center} \subsubsection{Erläuterungen} -\begin{itemize} +\begin{itemize*} \item Zeile 1: Feld der Threads \item Zeile 2: Feld für Ergebniswerte \item Zeile 5: Zufallszahl erzeugen \item Zeilen 6-7 Thread zur Berechnung der Fibonacci-Zahl erzeugen und Ergebnis im Feld speichern \item Zeile 10-11: Warten auf Beendigung der Threads (std::mem\_fn = Wrapper für Zeiger auf Member-Funktion) \item \color{orange} aber: \color{black} - \begin{itemize} - \item Zugriff auf gemeinsame Ressource (results)! - \item Anzahl Fibonaccizahlen = Anzahl Threads - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Zugriff auf gemeinsame Ressource (results)! + \item Anzahl Fibonaccizahlen = Anzahl Threads + \end{itemize*} +\end{itemize*} \subsubsection{parallel-for in C++} -\begin{itemize} +\begin{itemize*} \item Unterstützung durch Higher-Level-APIs und Frameworks -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-062} \end{center} \subsubsection{Kontrolle der Anzahl der Threads} -\begin{itemize} +\begin{itemize*} \item Erzeugung von Threads ist mit Kosten verbunden \item begrenzte Anzahl von Hardwarethreads (Anzahl Cores, Hyperthreading) \item Ermittlung der Anzahl der unterstützten Hardwarethreads -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-063} \end{center} -\begin{itemize} +\begin{itemize*} \item Nutzung für Implementierung von Threadpools, Task Libraries, … -\end{itemize} +\end{itemize*} \subsubsection{Probleme nebenläufiger Ausführung} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-064} @@ -4574,67 +4424,67 @@ Ausgabe: \end{center} \color{orange} Race Conditions \color{black}(Wettlaufsituationen) := Ergebnis nebenläufiger Ausführung auf gemeinsamen Zustand (hier: Ausgabekanal) hängt vom zeitlichen Verhalten der Einzeloperationen ab \subsubsection{Wechselseitiger Ausschluss} -\begin{itemize} +\begin{itemize*} \item \color{orange} kritischer Abschnitt\color{black}: Programmabschnitt in einem Thread, in dem auf eine gemeinsame Ressource (Speicher etc.) zugegriffen wird und der nicht parallel (oder zeitlich verzahnt) zu einem anderen Thread ausgeführt werden darf \item Lösung durch \color{orange} wechselseitigen Ausschluss \color{black} (engl. mutual exclusion = mutex) -\end{itemize} +\end{itemize*} \subsubsection{Mutex in C++} -\begin{itemize} +\begin{itemize*} \item Instanz der Klasse std::mutex \item Methoden zum Sperren (lock) und Freigeben (unlock) -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-067} \end{center} \subsubsection{Mutex-Varianten} -\begin{itemize} +\begin{itemize*} \item mutex: Standard-Mutex für exklusiven Zugriff \item timed\_mutex: Mutex mit Timeout für Warten (try\_lock\_for()) \item recursive\_mutex:rekursives Mutex - erlaubt mehrfaches Sperren durch einen Thread, z.B. für rekursive Aufrufe \item recursive\_timed\_mutex: rekursives Mutex mit Timeout \item shared\_mutex: Mutex, das gemeinsamen Zugriff (lock\_shared()) mehrerer Threads oder exklusiven Zugriff (lock()) ermöglicht \item shared\_timed\_mutex: Mutex mit Timeout und gemeinsamen Zugriff -\end{itemize} +\end{itemize*} \subsubsection{Lock Guards} -\begin{itemize} +\begin{itemize*} \item Vereinfachung der Nutzung von Mutexen durch RAII ("Ressourcenbelegung ist Initialisierung") \item Konstruktor = lock \item Destruktor = unlock -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-068} \end{center} \subsubsection{Lock Gurads und Locks} -\begin{itemize} +\begin{itemize*} \item std::unique\_lock erweiterte Variante von lock\_guards, vermeidet aber sofortiges Sperren \item std::lock erlaubt gleichzeitiges deadlock-freies Sperren von 2 Mutexen \item Sperrstrategien: u.a. - \begin{itemize} - \item std::try\_to\_lock versucht Sperre ohne Blockierung zu setzen - \item std::adopt\_lock versucht nicht, ein zweites Mal zu sperren, wenn bereits durch den aktuellen Thread gesperrt - \end{itemize} -\end{itemize} + \begin{itemize*} + \item std::try\_to\_lock versucht Sperre ohne Blockierung zu setzen + \item std::adopt\_lock versucht nicht, ein zweites Mal zu sperren, wenn bereits durch den aktuellen Thread gesperrt + \end{itemize*} +\end{itemize*} \subsubsection{Atomare Datentypen} -\begin{itemize} +\begin{itemize*} \item std::atomic\_flag = sperrfreier, atomarer Datentyp: - \begin{itemize} - \item clear() setzt den Wert auf false - \item test\_and\_set() setzt den Wert atomar auf true und liefert den vorherigen Wert - \end{itemize} + \begin{itemize*} + \item clear() setzt den Wert auf false + \item test\_and\_set() setzt den Wert atomar auf true und liefert den vorherigen Wert + \end{itemize*} \item std::atomic = mächtigere Variante, erlaubt explizites Setzen - \begin{itemize} - \item operator= atomare Wertzuweisung - \item load() liefert den aktuellen Wert - \item read-modify-write-Operation (siehe später) - \end{itemize} + \begin{itemize*} + \item operator= atomare Wertzuweisung + \item load() liefert den aktuellen Wert + \item read-modify-write-Operation (siehe später) + \end{itemize*} \item std::atomic = generische Variante für weitere Datentypen -\end{itemize} +\end{itemize*} \subsubsection{Synchronisation über atomare Variable} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-069} \end{center} \subsubsection{Erläuterungen} -\begin{itemize} +\begin{itemize*} \item Zeile 1: gemeinsam genutzte Liste - erfordert synchronisierten Zugriff \item Zeile 2: atomare boolsche Variable ready \item Zeile 4/12: Konsument/Produzent-Threads @@ -4642,31 +4492,31 @@ Ausgabe: \item Zeile 6-7 kurz warten und neu versuchen \item Zeile 8-9/13 Zugriff auf gemeinsame Liste \item Zeile 14: atomares Setzen der Variablen ready -\end{itemize} +\end{itemize*} \subsubsection{Taskparallelität: Die 5 speisenden Philosophen} -\begin{itemize} +\begin{itemize*} \item fünf Philosophen teilen sich eine Schüssel Sphagetti \item fünf Gabeln, je eine zwischen zwei Philosophen \item Philosoph kann nur mit zwei benachbarten Gabeln essen \item Gabeln werden nur nach dem Essen zurückgelegt \item Philosoph durchläuft Zyklus von Zuständen: denken $\rightarrow$ hungrig $\rightarrow$ essen $\rightarrow$ denken $\rightarrow$ etc. -\end{itemize} +\end{itemize*} \subsubsection{Das Problem mit den Philosophen} -\begin{itemize} +\begin{itemize*} \item Jeder greift die linke Gabel \item und wartet auf die rechte Gabel \item … und wartet … -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.3\linewidth]{Assets/Programmierparadigmen-070} \end{center} \color{orange} \textbf{Verklemmung!} \color{black} \subsubsection{Lösungsidee} -\begin{itemize} +\begin{itemize*} \item immer beide Gabeln aufnehmen, dh. wenn nur eine Gabel verfügbar ist: liegen lassen und warten \item synchronisierter Zugriff auf Gablen, dh. in einem kritischen Abschnitt unter gegenseitige Ausschluss \item Wecken von wartenden Philosophen -\end{itemize} +\end{itemize*} \subsubsection{Verklemmungsfreies Sperren} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-071} @@ -4701,9 +4551,9 @@ Hilfsmethode für zufällige Wartezeit in Millisekunden \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-078} \end{center} \subsubsection{Das Leben eines Philosophen} -\begin{itemize} +\begin{itemize*} \item Zur Erinnerung: überladener ()-Operator eines Objekts definiert auszuführende Funktion eines Threads -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-079} \end{center} @@ -4712,43 +4562,43 @@ Hilfsmethode für zufällige Wartezeit in Millisekunden \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-080} \end{center} \subsubsection{Das Dinner beginnt} -\begin{itemize} +\begin{itemize*} \item Beginn (und Ende) des Dinners über atomare Variable signalisieren \item Philosophen-Threads arbeiten ihre operator()()-Methode ab -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-081} \end{center} \subsubsection{Fazit} -\begin{itemize} +\begin{itemize*} \item Philosophenproblem: klassisches Problem der Informatik zur Demonstration von Nebenläufigkeit und Verklemmung \item von Edsger W. Dijkstra formuliert \item betrachte C++ Lösung illustriert - \begin{itemize} - \item Nebenläufigkeit durch Threads - \item Synchronisation über Mutexe - \item verklemmungsfreies Sperren - \end{itemize} + \begin{itemize*} + \item Nebenläufigkeit durch Threads + \item Synchronisation über Mutexe + \item verklemmungsfreies Sperren + \end{itemize*} \item moderene C++ Sprachversion vereinfacht Programmierung gegenüber Low-Level-API auf Betriebssystemebene (z.B. pthreads) -\end{itemize} +\end{itemize*} \subsubsection{Weitere Möglichkeiten der Thread-Interaktion} -\begin{itemize} +\begin{itemize*} \item bisher: - \begin{itemize} - \item Mutexe und Locks - \item atomare Variablen - \end{itemize} + \begin{itemize*} + \item Mutexe und Locks + \item atomare Variablen + \end{itemize*} \item typischer Anwendungsfall: Warten auf Ereignis / Setzen eines Flags -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-082} \end{center} \subsubsection{Bedingungsvariablen} -\begin{itemize} +\begin{itemize*} \item Thread wartet, bis Bedingung erfüllt ist \item Erfüllung der Bedingung wird durch anderen Thread angezeigt (notify) $\rightarrowtail$ "Aufwecken" des wartenden Threads \item notwendig: synchronisierter Zugriff über Mutex -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-083} \end{center} @@ -4758,65 +4608,65 @@ Hilfsmethode für zufällige Wartezeit in Millisekunden \subsubsection{Thread-sichere Datenstrukturen} \color{orange} Thread-Sicherheit:= \color{black} eine Komponente kann gleichzeitig von verschiedenen Programmbereichen Threads mehrfach ausgeführt werden, ohne dass diese sich gegenseitig behindern \newline \newline verschiedene Varianten: -\begin{itemize} +\begin{itemize*} \item Standard-Datenstruktur + über Mutexe/Sperren synchronisierte Zugriffe \item Integration der Sperren in die Datenstruktur \item Sperr-freie Datenstrukturen: nicht blockierend, Vermeidung von Sperren, z.B. durch Compare/Exchange-Operationen -\end{itemize} +\end{itemize*} \subsubsection{Anforderungen} -\begin{itemize} +\begin{itemize*} \item mehrere Threads können gleichzeitig auf die Datenstruktur zugreifen \item kein Thread sieht (Zwischen-)Zustand, bei dem Invarianten der Datenstruktur durch einen anderen Thread (kurzzeitig) verletzt ist \item Vermeidung von Wettlaufsituationen \item Vermeidung von Verklemmungen \item korrekte Behandlung von Ausnahmen (Fehlern) -\end{itemize} +\end{itemize*} \subsubsection{Thread-sichere Queue} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-085} \end{center} -\begin{itemize} +\begin{itemize*} \item Zeilen 1,2,6: Kapselung der std::queue-Klasse \item Zeile 4: Mutex für exklusiven Zugriff \item Zeile 5: Bedingungsvariable für Warten -\end{itemize} +\end{itemize*} \subsubsection{Thread-sichere Queue: Methode push} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-086} \end{center} -\begin{itemize} +\begin{itemize*} \item Zeile 2: Lock Guard sichert exklusiven Zugriff \item Zeile 3: Element an die Queue anhängen \item Zeile 4: Aufwecken von eventuell wartenden Threads -\end{itemize} +\end{itemize*} \subsubsection{Thread-sichere Queue: Methode waiting\_pop} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-087} \end{center} -\begin{itemize} +\begin{itemize*} \item Zeile 2: Lock Guard sichert exklusiven Zugriff \item Zeile 3: Warten bis Queue nicht mehr leer ist \item Zeilen 4,5: erstes Element aus der Queue entnehmen -\end{itemize} +\end{itemize*} \subsubsection{async, future und promise} -\begin{itemize} +\begin{itemize*} \item std::future - Resultat einer asynchronen Berechnung, d.h. einer Berechnung die erst noch stattfindet \item std::async() - asynchrones Starten eines Tasks - \begin{center} - \centering - \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-088} - \end{center} + \begin{center} + \centering + \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-088} + \end{center} \item std::promise - erlaubt Wert zu setzen, wenn der aktuelle Thread beendet ist, of in Kombination mit std::future eingesetzt \item future = Ergbenisobjekt, promise = Ergebnisproduzent -\end{itemize} +\end{itemize*} \subsubsection{Future} -\begin{itemize} +\begin{itemize*} \item Methoden zum - \begin{itemize} - \item Warten auf das Ende des Tasks (wait(), wait\_for()) - \item Ergebnis lesen (get()) - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Warten auf das Ende des Tasks (wait(), wait\_for()) + \item Ergebnis lesen (get()) + \end{itemize*} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-089} \end{center} @@ -4825,41 +4675,41 @@ verschiedene Varianten: \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-090} \end{center} \subsubsection{Deklarative Parallelisierung mit OpenMP} -\begin{itemize} +\begin{itemize*} \item Programmierschnittstelle für Parallelisierung in C/C++/Fortran \item Programmiersprachenerweiterung durch Direktiven \item in C/C++: \#pragma omp … \item zusätzliche Bibliotheksfunktionen: \#include \item aktuelle Version 5.0 \item Unterstützung in gcc und clang - \begin{itemize} - \item vollständig 4.5, partiell 5.0 - \item Nutzung über Compilerflag - fopenmp - \end{itemize} + \begin{itemize*} + \item vollständig 4.5, partiell 5.0 + \item Nutzung über Compilerflag - fopenmp + \end{itemize*} \item beschränkt auf Architekturen mit gemeinsamen Speicher -\end{itemize} +\end{itemize*} \subsubsection{Programmiermodell} -\begin{itemize} +\begin{itemize*} \item Master-Thread und mehrere Worker-Threads (Anzahl typischerweise durch OpenMP-Laufzeitsystem bestimmt) \item über parallel-Direktive kann Arbeit in einem Programmabschnitt auf Worker-Threads aufgeteilt werden \item Ende des parallelen Abschnitts $\rightarrowtail$ implizite Synchronisation \item Fortsetzung des Master-Threads -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.2\linewidth]{Assets/Programmierparadigmen-091} \end{center} \subsubsection{Hello World! mit OpenMP} -\begin{itemize} +\begin{itemize*} \item der dem pragma folgende Block wird parallel von allen Threads ausgeführt -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-092} \end{center} \subsubsection{Schleifenparallelisierung} -\begin{itemize} +\begin{itemize*} \item parallele Ausführung einer Schleife: jedem Thread wird ein Teil der Iterationen zugewiesen \item für for-Schleifgen mit eingeschränkter Syntax (ganzzahlige Schleifenvariablen, Operatoren auf Schleifenvariablen) und für STL-Iteratoren -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-093} \end{center} @@ -4876,92 +4726,92 @@ bedingte Parallelisierung \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-095} \end{center} \subsubsection{Aufteilung des Iterationsbereichs} -\begin{itemize} +\begin{itemize*} \item Iterationsbereich kann auf verschiedene Weise auf Threads aufgeteilt werden \item Beeinflussung durch schedule-Direktive - \begin{itemize} - \item schedule(auto): Default - implementierungsspezifisch - \item schedule(static,n): statische Round-Robin-Verteilung - Bereiche der Größe n (Angabe von n ist optional) - \item schedule(dynamic, n): dynamische Verteilung nach Bedarf - \item schedule(guided, n): Verteilung nach Bedarf und proportional zur Restarbeit - \item … - \end{itemize} -\end{itemize} + \begin{itemize*} + \item schedule(auto): Default - implementierungsspezifisch + \item schedule(static,n): statische Round-Robin-Verteilung - Bereiche der Größe n (Angabe von n ist optional) + \item schedule(dynamic, n): dynamische Verteilung nach Bedarf + \item schedule(guided, n): Verteilung nach Bedarf und proportional zur Restarbeit + \item … + \end{itemize*} +\end{itemize*} \subsubsection{Geschachtelte Schleifen} -\begin{itemize} +\begin{itemize*} \item Parallelisierung mit \textbf{parallel for} beeinflusst nur äußere Schleife \item collapse(n) gibt an, dass n Schleifen in einem gemeinsamen Iterationsbereich zusammengefasst, und auf die Threads verteilt werden sollen \item Beispiel: Matrizenmultiplikation -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-096} \end{center} \subsubsection{Synchronisation} -\begin{itemize} +\begin{itemize*} \item Direktiven für parallele Ausführung - \begin{itemize} - \item \textbf{\#pragma omp single/master} Abschnitt wird nur durch einen/den Master-Thread ausgeführt - \item \textbf{\#pragma omp critical} kritischer Abschnitt - \item \textbf{\#pragma omp barrier} Warten auf alle Worker-Threads - \item \textbf{\#pragma omp atomic} kritischer Abschnitt - ZUgriff auf gemeinsame Variable (z.B. Zähler) - \end{itemize} + \begin{itemize*} + \item \textbf{\#pragma omp single/master} Abschnitt wird nur durch einen/den Master-Thread ausgeführt + \item \textbf{\#pragma omp critical} kritischer Abschnitt + \item \textbf{\#pragma omp barrier} Warten auf alle Worker-Threads + \item \textbf{\#pragma omp atomic} kritischer Abschnitt - ZUgriff auf gemeinsame Variable (z.B. Zähler) + \end{itemize*} \item Speicherklauseln für Variablen - \begin{itemize} - \item \textbf{shared} für alle Threads sichtbar/änderbar - \item \textbf{private} jeder Thread hat eigene Kopie der Daten, wird nicht außerhalb initialisiert - \item \textbf{reduction} private Daten, die am Ende des Abschnitts zu globalem Wert zusammengefasst werden - \item \textbf{firstprivate/lastprivate} privat - initialisiert mit letztem Wert vor dem Abschnitt / Wert des letzten Threads der Iteration wird zurückgegeben - \end{itemize} -\end{itemize} + \begin{itemize*} + \item \textbf{shared} für alle Threads sichtbar/änderbar + \item \textbf{private} jeder Thread hat eigene Kopie der Daten, wird nicht außerhalb initialisiert + \item \textbf{reduction} private Daten, die am Ende des Abschnitts zu globalem Wert zusammengefasst werden + \item \textbf{firstprivate/lastprivate} privat - initialisiert mit letztem Wert vor dem Abschnitt / Wert des letzten Threads der Iteration wird zurückgegeben + \end{itemize*} +\end{itemize*} \subsubsection{Parallele Abschnitte} -\begin{itemize} +\begin{itemize*} \item Zuweisung von Programmabschnitten zu Threads $\rightarrowtail$ statische Parallelität \item geeignet z.B. für rekursive Aufrufe -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-097} \end{center} \subsubsection{Task-Programmierung mit OpenMP} -\begin{itemize} +\begin{itemize*} \item seit OpenMP 3.0 Unterstützung von Tasks, die - \begin{itemize} - \item reihum Threads zugewiesen werden - \item an beliebiger Stelle definiert werden können - \item von beliebigem Thread definiert werden kann - \end{itemize} -\end{itemize} + \begin{itemize*} + \item reihum Threads zugewiesen werden + \item an beliebiger Stelle definiert werden können + \item von beliebigem Thread definiert werden kann + \end{itemize*} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-098} \end{center} \subsubsection{Fazit} -\begin{itemize} +\begin{itemize*} \item C++ bietet weitreichende und mächtige Konzepte zur Parallelisierung - \begin{itemize} - \item von Basiskontrolle wie Threads und Synchronisationsprimitiven (u.a. Mutexe) - \item …über höherwertige Abstraktionen wie async, Features und Promises - \item bis hin zu deklarativen Ansätzen wie OpenMP - \end{itemize} + \begin{itemize*} + \item von Basiskontrolle wie Threads und Synchronisationsprimitiven (u.a. Mutexe) + \item …über höherwertige Abstraktionen wie async, Features und Promises + \item bis hin zu deklarativen Ansätzen wie OpenMP + \end{itemize*} \item alle Formen von Parallelität (Instruktions-, Daten-, und Taskparallelität) möglich \item aber anspruchsvolle Programmierung \item erleichtert durch zusätzliche Bibliotheken und Frameworks wie Parallel STL, TBB, … -\end{itemize} +\end{itemize*} \subsection{in C++} Thread ("Faden") := leichtgewichtige Ausführungseinheit oder Kontrollfluss (Folge von Anweisungen) innerhalb eines sich in Ausführung befindlichen Programms -\begin{itemize} +\begin{itemize*} \item Threads teilen sich den Adressraum des ihres Prozesses \item in C++: Instanzen der Klasse std::thread \item führen eine (initiale) Funktion aus -\end{itemize} +\end{itemize*} Parameter-Übergabe bei Thread-Erzeugung -\begin{itemize} +\begin{itemize*} \item über zusätzliche Argumente des thread -Konstruktors \item Vorsicht bei Übergabe von Referenzen, wenn Eltern-Thread vor dem erzeugten Thread beendet wird -\end{itemize} +\end{itemize*} \begin{lstlisting}[ language=C++, showspaces=false, @@ -4977,12 +4827,12 @@ t.join(); \end{lstlisting} Warten auf Threads -\begin{itemize} +\begin{itemize*} \item t.join() wartet auf Beendigung des Threads t \item blockiert aktuellen Thread \item ohne join() keine Garantie, dass t zur Ausführung kommt \item Freigabe der Ressourcen des Threads -\end{itemize} +\end{itemize*} \begin{lstlisting}[ language=C++, showspaces=false, @@ -4993,59 +4843,59 @@ t.join(); \end{lstlisting} Hintergrund-Threads -\begin{itemize} +\begin{itemize*} \item Threads können auch im Hintergrund laufen, ohne dass auf Ende gewartet werden muss \item "abkoppeln" durch detach() \item Thread läuft danach unter Kontrolle des C++-Laufzeitsystems, join nicht mehr möglich -\end{itemize} +\end{itemize*} Thread-Identifikation -\begin{itemize} +\begin{itemize*} \item Thread-Identifikator vom Typ std::thread::id \item Ermittlung über Methode get\_id() -\end{itemize} +\end{itemize*} Kontrolle der Anzahl der Threads -\begin{itemize} +\begin{itemize*} \item Erzeugung von Threads ist mit Kosten verbunden \item begrenzte Anzahl von Hardware-Threads (Anzahl Cores, Hyperthreading) \item Ermittlung der Anzahl der unterstützen Hardwarethreads - \begin{lstlisting} + \begin{lstlisting} std::thread::hardware_concurrency() \end{lstlisting} \item Nutzung für Implementierung von Threadpools, Task Libraries, ... -\end{itemize} +\end{itemize*} Probleme nebenläufiger Ausführung -\begin{itemize} +\begin{itemize*} \item Race Conditions (Wettlaufsituation) := Ergebnis nebenläufiger Ausführung auf gemeinsamen Zustand (hier: Ausgabekanal) hängt vom zeitlichen Verhalten der Einzeloperationen ab \item kritischer Abschnitt: Programmabschnitt in einem Thread, in dem auf eine gemeinsame Ressource (Speicher etc.) zugegriffen wird und der nicht parallel (oder zeitlich verzahnt) zu einem anderen Thread ausgeführt werden darf \item Lösung durch wechselseitigen Ausschluss (engl. mutual exclusion = mutex) - \begin{itemize} - \item Instanz der Klasse std::mutex - \item Methoden zum Sperren ( lock ) und Freigeben ( unlock ) - \item 'mutex' : Standard-Mutex für exklusiven Zugriff - \item 'timed\_mutex' : Mutex mit Timeout für Warten ( try\_lock\_for() ) - \item 'recursive\_mutex' : rekursives Mutex - erlaubt mehrfaches Sperren durch einen Thread, z.B. für rekursive Aufrufe - \item 'recursive\_timed\_mutex' : rekursives Mutex mit Timeout - \item 'shared\_mutex' : Mutex, das gemeinsamen Zugriff ( lock\_shared() ) mehrerer Threads oder exklusiven Zugriff ( lock() ) ermöglicht - \item 'shared\_timed\_mutex' : Mutex mit Timeout und gemeinsamen Zugriff - \end{itemize} + \begin{itemize*} + \item Instanz der Klasse std::mutex + \item Methoden zum Sperren ( lock ) und Freigeben ( unlock ) + \item 'mutex' : Standard-Mutex für exklusiven Zugriff + \item 'timed\_mutex' : Mutex mit Timeout für Warten ( try\_lock\_for() ) + \item 'recursive\_mutex' : rekursives Mutex - erlaubt mehrfaches Sperren durch einen Thread, z.B. für rekursive Aufrufe + \item 'recursive\_timed\_mutex' : rekursives Mutex mit Timeout + \item 'shared\_mutex' : Mutex, das gemeinsamen Zugriff ( lock\_shared() ) mehrerer Threads oder exklusiven Zugriff ( lock() ) ermöglicht + \item 'shared\_timed\_mutex' : Mutex mit Timeout und gemeinsamen Zugriff + \end{itemize*} \item Lock Guards - \begin{itemize} - \item Vereinfachung der Nutzung von Mutexen durch RAII ("Ressourcenbelegung ist Initialisierung") - \item Konstruktor = lock - \item Destruktor = unlock - \item std::unique\_lock erweiterte Variante von lock\_guard, vermeidet aber sofortiges Sperren - \item std::lock : erlaubt gleichzeitiges deadlock-freies Sperren von 2 Mutexen - \item Sperrstrategien: u.a. - \begin{itemize} - \item std::try\_to\_lock versucht Sperre ohne Blockierung zu setzen - \item std::adopt\_lock versucht nicht, ein zweites Mal zu sperren, wenn bereits durch den aktuellen Thread gesperrt - \end{itemize} - \end{itemize} - \begin{lstlisting}[ + \begin{itemize*} + \item Vereinfachung der Nutzung von Mutexen durch RAII ("Ressourcenbelegung ist Initialisierung") + \item Konstruktor = lock + \item Destruktor = unlock + \item std::unique\_lock erweiterte Variante von lock\_guard, vermeidet aber sofortiges Sperren + \item std::lock : erlaubt gleichzeitiges deadlock-freies Sperren von 2 Mutexen + \item Sperrstrategien: u.a. + \begin{itemize*} + \item std::try\_to\_lock versucht Sperre ohne Blockierung zu setzen + \item std::adopt\_lock versucht nicht, ein zweites Mal zu sperren, wenn bereits durch den aktuellen Thread gesperrt + \end{itemize*} + \end{itemize*} + \begin{lstlisting}[ language=C++, showspaces=false, basicstyle=\ttfamily @@ -5063,23 +4913,23 @@ std::lock_guard guard(my_mtx); return data.front(); } \end{lstlisting} - + \item Atomare Datentypen - \begin{itemize} - \item std::atomic\_flag = sperrfreier, atomarer Datentyp: - \begin{itemize} - \item clear() setzt den Wert auf false - \item test\_and\_set() setzt den Wert atomar auf true und liefert den vorherigen Wert - \end{itemize} - \item std::atomic = mächtigere Variante, erlaubt explizites Setzen - \begin{itemize} - \item operator= atomare Wertzuweisung - \item load() liefert den aktuellen Wert - \item read-modify-write-Operation (siehe später) - \end{itemize} - \item std::atomic = generische Variante für weitere Datentypen - \end{itemize} -\end{itemize} + \begin{itemize*} + \item std::atomic\_flag = sperrfreier, atomarer Datentyp: + \begin{itemize*} + \item clear() setzt den Wert auf false + \item test\_and\_set() setzt den Wert atomar auf true und liefert den vorherigen Wert + \end{itemize*} + \item std::atomic = mächtigere Variante, erlaubt explizites Setzen + \begin{itemize*} + \item operator= atomare Wertzuweisung + \item load() liefert den aktuellen Wert + \item read-modify-write-Operation (siehe später) + \end{itemize*} + \item std::atomic = generische Variante für weitere Datentypen + \end{itemize*} +\end{itemize*} \paragraph{Verklemmungsfreies Sperren} \begin{lstlisting}[ @@ -5103,18 +4953,18 @@ std::lock(lk1, lk2); \end{lstlisting} \paragraph{Thread-sichere Datenstrukturen} -\begin{itemize} +\begin{itemize*} \item Thread-Sicherheit := eine Komponente kann gleichzeitig von verschiedenen Programmbereichen (Threads) mehrfach ausgeführt werden, ohne dass diese sich gegenseitig behindern \item verschiedene Varianten: - \begin{itemize} - \item Standard-Datenstruktur + über Mutexe/Sperren synchronisierte Zugriffe - \item Integration der Sperren in die Datenstruktur - \item Sperr-freie Datenstrukturen: nicht-blockierend, Vermeidung von Sperren, z.B. durch Compare/Exchange-Operationen - \end{itemize} + \begin{itemize*} + \item Standard-Datenstruktur + über Mutexe/Sperren synchronisierte Zugriffe + \item Integration der Sperren in die Datenstruktur + \item Sperr-freie Datenstrukturen: nicht-blockierend, Vermeidung von Sperren, z.B. durch Compare/Exchange-Operationen + \end{itemize*} \item async , future und promise \item std::future - Resultat einer asynchronen Berechnung, d.h. einer Berechnung die erst noch stattfindet \item std::async() - asynchrones Starten eines Tasks - \begin{lstlisting}[ + \begin{lstlisting}[ language=C++, showspaces=false, basicstyle=\ttfamily @@ -5127,20 +4977,20 @@ std::lock(lk1, lk2); \end{lstlisting} \item std::promise - erlaubt Wert zu setzen, wenn der aktuelle Thread beendet ist; oft in Kombination mit std::future eingesetzt \item future = Ergebnisobjekt, promise = Ergebnisproduzent - \begin{itemize} - \item Warten auf Ende des Tasks (wait(), wait\_for()) - \item Ergebnis lesen (get()) - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Warten auf Ende des Tasks (wait(), wait\_for()) + \item Ergebnis lesen (get()) + \end{itemize*} +\end{itemize*} \subsubsection{Programmiermodell} -\begin{itemize} +\begin{itemize*} \item Master-Thread und mehrere Worker-Threads (Anzahl typischerweise durch OpenMP-Laufzeitsystem bestimmt) \item über parallel -Direktive kann Arbeit in einem Programmabschnitt auf Worker-Threads aufgeteilt werden \item Ende des parallelen Abschnitts $\rightarrow$ implizite Synchronisation $\rightarrow$ Fortsetzung des Master-Threads \item der dem 'pragma' folgende Block wird parallel von allen Threads ausgeführt - \begin{lstlisting}[ + \begin{lstlisting}[ language=C++, showspaces=false, basicstyle=\ttfamily @@ -5159,7 +5009,7 @@ std::lock(lk1, lk2); } \end{lstlisting} \item Schleifenparallelisierung: jedem Thread wird ein Teil der Iteration zugewiesen (beeinflusst nur äußere Schleife) - \begin{lstlisting}[ + \begin{lstlisting}[ language=C++, showspaces=false, basicstyle=\ttfamily @@ -5168,46 +5018,46 @@ std::lock(lk1, lk2); \#pragma omp parallel for for (int i = 0; i < 20; i++) {... \end{lstlisting} - \begin{itemize} - \item collapse(n) gibt an, dass n Schleifen in einem gemeinsamen Iterationsbereich zusammengefasst und auf die Threads verteilt werden sollen - \begin{lstlisting} + \begin{itemize*} + \item collapse(n) gibt an, dass n Schleifen in einem gemeinsamen Iterationsbereich zusammengefasst und auf die Threads verteilt werden sollen + \begin{lstlisting} #pragma omp parallel for collapse(3) \end{lstlisting} - \end{itemize} + \end{itemize*} \item Beeinflussung der Thread Anzahl - \begin{itemize} - \item maximale Anzahl: - \begin{lstlisting} + \begin{itemize*} + \item maximale Anzahl: + \begin{lstlisting} #pragma omp parallel for num_threads(8) \end{lstlisting} - \item bedingte Parallelisierung: - \begin{lstlisting} + \item bedingte Parallelisierung: + \begin{lstlisting} #pragma omp parallel for if(i>50) \end{lstlisting} - \end{itemize} + \end{itemize*} \item Aufteilung des Iterationsbereichs; Beeinflussung durch schedule -Direktive - \begin{itemize} - \item schedule(auto): Default - implementierungsspezifisch - \item schedule(static, n): statische Round-Robin-Verteilung - Bereiche der Größe n (Angabe von n ist optional) - \item schedule(dynamic, n): dynamische Verteilung nach Bedarf - \item schedule(guided, n): Verteilung nach Bedarf und proportional zur Restarbeit - \end{itemize} + \begin{itemize*} + \item schedule(auto): Default - implementierungsspezifisch + \item schedule(static, n): statische Round-Robin-Verteilung - Bereiche der Größe n (Angabe von n ist optional) + \item schedule(dynamic, n): dynamische Verteilung nach Bedarf + \item schedule(guided, n): Verteilung nach Bedarf und proportional zur Restarbeit + \end{itemize*} \item Direktiven für parallele Ausführung - \begin{itemize} - \item '\#pragma omp single/master' Abschnitt wird nur durch einen/den Master-Thread ausgeführt - \item '\#pragma omp critical' kritischer Abschnitt - \item '\#pragma omp barrier' Warten auf alle Worker-Threads - \item '\#pragma omp atomic' kritischer Abschnitt \item Zugriff auf gemeinsame Variable (z.B. Zähler) - \end{itemize} + \begin{itemize*} + \item '\#pragma omp single/master' Abschnitt wird nur durch einen/den Master-Thread ausgeführt + \item '\#pragma omp critical' kritischer Abschnitt + \item '\#pragma omp barrier' Warten auf alle Worker-Threads + \item '\#pragma omp atomic' kritischer Abschnitt \item Zugriff auf gemeinsame Variable (z.B. Zähler) + \end{itemize*} \item Speicherklauseln für Variablen - \begin{itemize} - \item 'shared' für alle Threads sichtbar/änderbar - \item 'private' jeder Thread hat eigene Kopie der Daten, wird nicht außerhalb initialisiert - \item 'reduction' private Daten, die am Ende des Abschnitts zu globalem Wert zusammengefasst werden - \item 'firstprivate / lastprivate' privat - initialisiert mit letztem Wert vor dem Abschnitt / Wert des letzten Threads der Iteration wird zurückgegeben - \end{itemize} + \begin{itemize*} + \item 'shared' für alle Threads sichtbar/änderbar + \item 'private' jeder Thread hat eigene Kopie der Daten, wird nicht außerhalb initialisiert + \item 'reduction' private Daten, die am Ende des Abschnitts zu globalem Wert zusammengefasst werden + \item 'firstprivate / lastprivate' privat - initialisiert mit letztem Wert vor dem Abschnitt / Wert des letzten Threads der Iteration wird zurückgegeben + \end{itemize*} \item zuweisung von Programmabschnitten zu Threads $\rightarrow$ statische Parallelität (geeignet für rekursive Abschnitte) - \begin{lstlisting}[ + \begin{lstlisting}[ language=C++, showspaces=false, basicstyle=\ttfamily @@ -5221,12 +5071,12 @@ std::lock(lk1, lk2); } \end{lstlisting} \item Task Programmierung - \begin{itemize} - \item reihum Threads zugewiesen werden - \item an beliebiger Stelle definiert werden können - \item von beliebigem Thread definiert werden kann - \end{itemize} - \begin{lstlisting}[ + \begin{itemize*} + \item reihum Threads zugewiesen werden + \item an beliebiger Stelle definiert werden können + \item von beliebigem Thread definiert werden kann + \end{itemize*} + \begin{lstlisting}[ language=C++, showspaces=false, basicstyle=\ttfamily @@ -5239,7 +5089,7 @@ std::lock(lk1, lk2); \#pragma omp taskwait return f1 + f2; \end{lstlisting} -\end{itemize} +\end{itemize*} \subsection{Parallele Programmierung in C++} @@ -5477,93 +5327,93 @@ countdown() -> \subsection{Parallele Programmierung in Java} Unterstützung durch -\begin{itemize} +\begin{itemize*} \item Thread-Konzept \item eingebaute Mechanismen zur Synchronisation nebenläufiger Prozesse \item spezielle High-Level-Klassen im Package - \newline \textbf{java.util.concurrent} -\end{itemize} + \newline \textbf{java.util.concurrent} +\end{itemize*} \subsubsection{Threads in Java} -\begin{itemize} +\begin{itemize*} \item Repräsentiert durch Klasse \textbf{java.lang.Thread} \item Implementierung eines eigenen Kontrollflusses - \begin{itemize} - \item Implementierung des Interface \textbf{java.lang.Runnable} - \begin{itemize} - \item keine weitere Beeinflussung des Threads über zusätzliche Methoden notwendig - \item soll von anderer Klasse als Thread abgeleitet werden - \end{itemize} - \item Subklasse von \textbf{java.lang.Thread} - \begin{itemize} - \item zusätzliche Methoden zur Steuerung des Ablaufs benötigt - \item keine andere Superklasse notwendig - \end{itemize} - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Implementierung des Interface \textbf{java.lang.Runnable} + \begin{itemize*} + \item keine weitere Beeinflussung des Threads über zusätzliche Methoden notwendig + \item soll von anderer Klasse als Thread abgeleitet werden + \end{itemize*} + \item Subklasse von \textbf{java.lang.Thread} + \begin{itemize*} + \item zusätzliche Methoden zur Steuerung des Ablaufs benötigt + \item keine andere Superklasse notwendig + \end{itemize*} + \end{itemize*} +\end{itemize*} \subsubsection{Threads: Runnable-Schnittstelle} Eigene Klasse muss \textbf{Runnable} implementieren -\begin{itemize} +\begin{itemize*} \item Methode \textbf{public void run()} - wird beim Start des Threads aufgerufen -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-099} \end{center} \subsubsection{Thread-Erzeugung} -\begin{itemize} +\begin{itemize*} \item Thread-Objekt mit Runnable-Objekt erzeugen \item Methode \textbf{start()} aufrufen - \begin{itemize} - \item Ruft \textbf{run()} auf - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Ruft \textbf{run()} auf + \end{itemize*} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-100} \end{center} \subsubsection{Threads: Subklasse von Thread} -\begin{itemize} +\begin{itemize*} \item Klasse muss von Thread abgeleitet werden \item Methode run() muss überschrieben werden -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-101} \end{center} \subsubsection{Thread-Erzeugung} -\begin{itemize} +\begin{itemize*} \item Objekt der eigenen Thread-Klasse erzeugen \item Methode \textbf{start()} aufrufen - \begin{itemize} - \item Ruft \textbf{run()} auf - \end{itemize} - \begin{center} - \centering - \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-102} - \end{center} + \begin{itemize*} + \item Ruft \textbf{run()} auf + \end{itemize*} + \begin{center} + \centering + \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-102} + \end{center} \item Spätere Beeinflussung durch andere Threads möglich - \begin{center} - \centering - \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-103} - \end{center} -\end{itemize} + \begin{center} + \centering + \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-103} + \end{center} +\end{itemize*} \subsubsection{Threads: Wichtige Methoden} -\begin{itemize} +\begin{itemize*} \item \textbf{void start()} - \begin{itemize} - \item initiiert Ausführung des Threads durch Aufruf der Methode run - \end{itemize} + \begin{itemize*} + \item initiiert Ausführung des Threads durch Aufruf der Methode run + \end{itemize*} \item \textbf{void run()} - \begin{itemize} - \item die eigentliche Arbeitsmethode - \end{itemize} + \begin{itemize*} + \item die eigentliche Arbeitsmethode + \end{itemize*} \item \textbf{static void sleep(int millisec)} - \begin{itemize} - \item hält die Ausführung des aktuellen Threads für millisec Millisekunden an - \item Hat keinen Einfluss auf andere Threads! - \end{itemize} + \begin{itemize*} + \item hält die Ausführung des aktuellen Threads für millisec Millisekunden an + \item Hat keinen Einfluss auf andere Threads! + \end{itemize*} \item \textbf{void join()} - \begin{itemize} - \item blockiert den aufrufenden Thread so lange, bis der aufgerufene Thread beendet ist - \end{itemize} -\end{itemize} + \begin{itemize*} + \item blockiert den aufrufenden Thread so lange, bis der aufgerufene Thread beendet ist + \end{itemize*} +\end{itemize*} \subsubsection{Parallele Berechnung von Fibonacci-Zahlen} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-104} @@ -5574,126 +5424,126 @@ Thread-Erzeugung und Ausführung \end{center} \subsubsection{Wechselseitiger Ausschluss in Java} Schlüsselwort \textbf{synchronized} -\begin{itemize} +\begin{itemize*} \item Implementierung von sogenannten Monitoren bzw. locks (exklusiven Sperren) - \begin{itemize} - \item nur ein Thread darf den kritischen Abschnitt betreten - \item alle anderen Threads, die darauf zugrifen wollen, müssen auf Freigabe warten - \end{itemize} + \begin{itemize*} + \item nur ein Thread darf den kritischen Abschnitt betreten + \item alle anderen Threads, die darauf zugrifen wollen, müssen auf Freigabe warten + \end{itemize*} \item für Methoden: \textbf{public synchronized void doSomething()} - \begin{itemize} - \item nur ein Thread darf diese Methode auf einem Objekt zur gleichen Zeit ausführen - \end{itemize} + \begin{itemize*} + \item nur ein Thread darf diese Methode auf einem Objekt zur gleichen Zeit ausführen + \end{itemize*} \item für Anweisungen: \textbf{synchronized(anObject)\{…\}} - \begin{itemize} - \item nur ein Thread darf den Block betreten - \item Sperre wird durch das Objekt \textbf{anObject} verwaltet (jedem Java-Objekt ist eine Sperre zugeordnet) - \end{itemize} -\end{itemize} + \begin{itemize*} + \item nur ein Thread darf den Block betreten + \item Sperre wird durch das Objekt \textbf{anObject} verwaltet (jedem Java-Objekt ist eine Sperre zugeordnet) + \end{itemize*} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-106} \end{center} \subsubsection{wait \& notify} -\begin{itemize} +\begin{itemize*} \item Signalisierung zwischen Threads in Java \item Basismethoden der Klasse \textbf{java.lang.Object} \item \textbf{wait()}: der aktive Thread wartet an diesem Objekt, Sperren werden ggf. freigegeben. \item \textbf{notify()}: wekct an diesem Objekt wartenden Thread auf \item \textbf{notifyAll()}: weckt alle an diesem Objekt wartenden Threads auf \item \textbf{wait() \& notify()} dürfen nur in einem \textbf{synchronized}-Block aufgerufen werden -\end{itemize} +\end{itemize*} \subsubsection{Java: High-Level-Klassen} -\begin{itemize} +\begin{itemize*} \item Paket \textbf{java.util.concurrent} seit Java Version 1.5 \item Abstraktionsschicht versteckt Details über Thread-Erzeugung \item Übernimmt Erstellung und Überwachung von parallelen Tasks, u.a. - \begin{itemize} - \item \textbf{ExecutorService} zum erzeugen asynchroner Tasks - \item \textbf{Future}: Referenz auf diesen Task bzw. dessen Ergebnis - \item \textbf{ForkJoinPool \& RecursiveAction}: rekursives Aufteilen eines großen Problems - \end{itemize} -\end{itemize} + \begin{itemize*} + \item \textbf{ExecutorService} zum erzeugen asynchroner Tasks + \item \textbf{Future}: Referenz auf diesen Task bzw. dessen Ergebnis + \item \textbf{ForkJoinPool \& RecursiveAction}: rekursives Aufteilen eines großen Problems + \end{itemize*} +\end{itemize*} \subsubsection{Tasks und Futures in Java} -\begin{itemize} +\begin{itemize*} \item Task = logische Ausführungseinheit \item Thread = Mechanismus zur asynchronen/parallelen Ausführung von Tasks -\end{itemize} +\end{itemize*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-107} \end{center} \subsubsection{Future \& ExecutorService} -\begin{itemize} +\begin{itemize*} \item \textbf{ExecutorService} stellt Methoden zum Starten/Beenden/Steuern von parallelen Aufgaben bereit \item implementiert \textbf{Executor}-Interface - \begin{itemize} - \item definiert Methode \textbf{void execute(Runnable r)} - \end{itemize} + \begin{itemize*} + \item definiert Methode \textbf{void execute(Runnable r)} + \end{itemize*} \item Starten einer Aufgabe mit \textbf{submit} - \begin{itemize} - \item \textbf{Future submit(Callable c)} - \item \textbf{Future submit(Runnable r)} - \end{itemize} + \begin{itemize*} + \item \textbf{Future submit(Callable c)} + \item \textbf{Future submit(Runnable r)} + \end{itemize*} \item Zugriff auf das Ergebnis mit \textbf{get} - \begin{itemize} - \item \textbf{T get(long timeout, TimeUnit unit)} - \item \textbf{T get()} - \end{itemize} -\end{itemize} + \begin{itemize*} + \item \textbf{T get(long timeout, TimeUnit unit)} + \item \textbf{T get()} + \end{itemize*} +\end{itemize*} \subsubsection{Future \& ExecutorService: Beispiel} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-108} \end{center} \subsubsection{RecursiveAction \& Fork/Join} -\begin{itemize} +\begin{itemize*} \item Rekursives Zerlegen eines großen Problems in kleinere Probleme \item Solange bis Problem klein genug um direkt ausgeführt werden zu können \item Task erstellt zwei oder mehr Teiltasks von sich selbst $\rightarrowtail$ Datenparallelität \item \textbf{ForkJoinPool} zum Ausführen - \begin{itemize} - \item implementiert \textbf{Executor} Interface - \end{itemize} -\end{itemize} + \begin{itemize*} + \item implementiert \textbf{Executor} Interface + \end{itemize*} +\end{itemize*} \subsubsection{Fork/Join: Beispiel} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-109} \end{center} Starten der Verarbeitung: -\begin{enumerate} +\begin{enumerate*} \item (große) Gesamtaufgabe erstellen \item ForkJoinPool erstellen \item Aufgabe vom Pool ausführen lassen -\end{enumerate} +\end{enumerate*} \begin{center} \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-110} \end{center} \subsubsection{Fazit} -\begin{itemize} +\begin{itemize*} \item Parallelprogrammierung in Java sehr ähnlich zu C++ \item Konzepte: Threads, kritische Abschnitte über \textbf{synchronized} \item mächtige Abstraktionen in \textbf{java.util.concurrent} - \begin{itemize} - \item Tasks und Futures, Executor und Threadpool - \item thread-sichere Datenstrukturen - \item Synchronisation: Barrieren, Semaphoren,… - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Tasks und Futures, Executor und Threadpool + \item thread-sichere Datenstrukturen + \item Synchronisation: Barrieren, Semaphoren,… + \end{itemize*} +\end{itemize*} \subsection{Parallele Programmierung in Java} -\begin{itemize} +\begin{itemize*} \item Unterstützung durch: - \begin{itemize} - \item Thread-Konzept - \item eingebaute Mechanismen zur Synchronisation nebenläufiger Prozesse - \item spezielle High-Level-Klassen im Package 'java.util.concurrent' - \end{itemize} + \begin{itemize*} + \item Thread-Konzept + \item eingebaute Mechanismen zur Synchronisation nebenläufiger Prozesse + \item spezielle High-Level-Klassen im Package 'java.util.concurrent' + \end{itemize*} \item Threads in Java - \begin{itemize} - \item Repräsentiert durch Klasse java.lang.Thread - \item Implementierung eines eigenen Kontrollflusses - \item Eigene Klasse muss Runnable implementieren - \end{itemize} - \begin{lstlisting}[ + \begin{itemize*} + \item Repräsentiert durch Klasse java.lang.Thread + \item Implementierung eines eigenen Kontrollflusses + \item Eigene Klasse muss Runnable implementieren + \end{itemize*} + \begin{lstlisting}[ language=java, showspaces=false, basicstyle=\ttfamily @@ -5716,56 +5566,56 @@ Starten der Verarbeitung: } \end{lstlisting} \item Threads: Wichtige Methoden - \begin{itemize} - \item void start(): initiiert Ausführung des Threads durch Aufruf der Methode run - \item void run(): die eigentliche Arbeitsmethode - \item static void sleep(int millis): hält die Ausführung des aktuellen Threads für 'millis' Millisekunden an; Keinen Einfluss auf andere Threads! - \item void join(): blockiert den aufrufenden Thread so lange, bis der aufgerufene Thread beendet ist - \end{itemize} + \begin{itemize*} + \item void start(): initiiert Ausführung des Threads durch Aufruf der Methode run + \item void run(): die eigentliche Arbeitsmethode + \item static void sleep(int millis): hält die Ausführung des aktuellen Threads für 'millis' Millisekunden an; Keinen Einfluss auf andere Threads! + \item void join(): blockiert den aufrufenden Thread so lange, bis der aufgerufene Thread beendet ist + \end{itemize*} \item Wechselseitiger Ausschluss in Java - \begin{itemize} - \item Schlüsselwort synchronized - \begin{itemize} - \item Implementierung von sogenannten Monitoren bzw. locks (exklusiven Sperren); nur ein Thread darf den kritischen Abschnitt betreten; alle anderen Threads, die darauf zugreifen wollen, müssen auf Freigabe warten - \item für Methoden: - \begin{lstlisting} + \begin{itemize*} + \item Schlüsselwort synchronized + \begin{itemize*} + \item Implementierung von sogenannten Monitoren bzw. locks (exklusiven Sperren); nur ein Thread darf den kritischen Abschnitt betreten; alle anderen Threads, die darauf zugreifen wollen, müssen auf Freigabe warten + \item für Methoden: + \begin{lstlisting} public synchronized void doSomething() \end{lstlisting} - \begin{itemize} - \item nur ein Thread darf diese Methode auf einem Objekt zur gleichen Zeit ausführen - \end{itemize} - \item für Anweisungen: synchronized(anObject) { ... } - \begin{itemize} - \item nur ein Thread darf den Block betreten - \item Sperre wird durch das Objekt anObject verwaltet (jedem Java-Objekt ist ein Sperre zugeordnet) - \end{itemize} - \end{itemize} - \item wait \& notify - \begin{itemize} - \item Signalisierung zwischen Threads in Java - \item Basismethoden der Klasse java.lang.Object - \item wait() : der aktive Thread wartet an diesem Objekt, Sperren werden ggf. freigegeben! - \item notify() : weckt an diesem Objekt wartenden Thread auf - \item notifyAll() : weckt alle an diesem Objekt wartenden Threads auf - \item wait() \& notify() dürfen nur in einem synchronized -Block aufgerufen werden - \end{itemize} - \item Java: High-Level-Klassen - \begin{itemize} - \item Paket java.util.concurrent seit Java Version 1.5 - \item Abstraktionsschicht versteckt Details über Thread-Erzeugung - \item Übernimmt Erstellung und Überwachung von parallelen Tasks, u.a. - \begin{itemize} - \item ExecutorService zum Erzeugen asynchroner Tasks - \item Future: Referenz auf diesen Task bzw. dessen Ergebnis - \item ForkJoinPool \& RecursiveAction: rekursives - \item Aufteilen eines großen Problems - \end{itemize} - \end{itemize} - \item Tasks und Futures in Java - \begin{itemize} - \item Task = logische Ausführungseinheit - \item Thread = Mechanismus zur asynchronen/parallelen Ausführung von Tasks - \begin{lstlisting}[ + \begin{itemize*} + \item nur ein Thread darf diese Methode auf einem Objekt zur gleichen Zeit ausführen + \end{itemize*} + \item für Anweisungen: synchronized(anObject) { ... } + \begin{itemize*} + \item nur ein Thread darf den Block betreten + \item Sperre wird durch das Objekt anObject verwaltet (jedem Java-Objekt ist ein Sperre zugeordnet) + \end{itemize*} + \end{itemize*} + \item wait \& notify + \begin{itemize*} + \item Signalisierung zwischen Threads in Java + \item Basismethoden der Klasse java.lang.Object + \item wait() : der aktive Thread wartet an diesem Objekt, Sperren werden ggf. freigegeben! + \item notify() : weckt an diesem Objekt wartenden Thread auf + \item notifyAll() : weckt alle an diesem Objekt wartenden Threads auf + \item wait() \& notify() dürfen nur in einem synchronized -Block aufgerufen werden + \end{itemize*} + \item Java: High-Level-Klassen + \begin{itemize*} + \item Paket java.util.concurrent seit Java Version 1.5 + \item Abstraktionsschicht versteckt Details über Thread-Erzeugung + \item Übernimmt Erstellung und Überwachung von parallelen Tasks, u.a. + \begin{itemize*} + \item ExecutorService zum Erzeugen asynchroner Tasks + \item Future: Referenz auf diesen Task bzw. dessen Ergebnis + \item ForkJoinPool \& RecursiveAction: rekursives + \item Aufteilen eines großen Problems + \end{itemize*} + \end{itemize*} + \item Tasks und Futures in Java + \begin{itemize*} + \item Task = logische Ausführungseinheit + \item Thread = Mechanismus zur asynchronen/parallelen Ausführung von Tasks + \begin{lstlisting}[ language=java, showspaces=false, basicstyle=\ttfamily @@ -5778,48 +5628,48 @@ Starten der Verarbeitung: Thread thread = new Thread(task); thread.start(); \end{lstlisting} - \end{itemize} - \item Future \& ExecutorService - \begin{itemize} - \item ExecutorService stellt Methoden zum Starten/Beenden/Steuern von parallelen Aufgaben bereit - \item implementiert Executor -Interface - \begin{itemize} - \item definiert Methode void execute(Runnable r) - \end{itemize} - \item Starten einerAufgabe mit submit - \begin{itemize} - \item Future submit(Callable c) - \item Future submit(Runnable r) - \end{itemize} - \item Zugriff auf das Ergebnis mit get - \begin{itemize} - \item T get(long timeout, TimeUnit unit) - \item T get() - \end{itemize} - \end{itemize} - \item RecursiveAction \& Fork/Join - \begin{itemize} - \item Rekursives Zerlegen eines großen Problems in kleinere Probleme - \item Solange bis Problem klein genug um direkt ausgeführt werden zu können - \item Task erstellt zwei oder mehr Teiltasks von sich selbst $\rightarrow$ Datenparallelität - \item ForkJoinPool zum Ausführen $\rightarrow$ implementiert Executor Interface - \end{itemize} - \item Fazit - \begin{itemize} - \item Parallelprogrammierung in Java sehr ähnlich zu C++ - \item Konzepte: Threads, kritische Abschnitte über synchronized - \item mächtige Abstraktionen in java.util.concurrent - \begin{itemize} - \item Tasks und Futures, Executor und ThreadPool - \item thread-sichere Datenstrukturen - \item Synchronisation: Barrieren, Semaphoren, ... - \end{itemize} - \end{itemize} - \end{itemize} -\end{itemize} + \end{itemize*} + \item Future \& ExecutorService + \begin{itemize*} + \item ExecutorService stellt Methoden zum Starten/Beenden/Steuern von parallelen Aufgaben bereit + \item implementiert Executor -Interface + \begin{itemize*} + \item definiert Methode void execute(Runnable r) + \end{itemize*} + \item Starten einerAufgabe mit submit + \begin{itemize*} + \item Future submit(Callable c) + \item Future submit(Runnable r) + \end{itemize*} + \item Zugriff auf das Ergebnis mit get + \begin{itemize*} + \item T get(long timeout, TimeUnit unit) + \item T get() + \end{itemize*} + \end{itemize*} + \item RecursiveAction \& Fork/Join + \begin{itemize*} + \item Rekursives Zerlegen eines großen Problems in kleinere Probleme + \item Solange bis Problem klein genug um direkt ausgeführt werden zu können + \item Task erstellt zwei oder mehr Teiltasks von sich selbst $\rightarrow$ Datenparallelität + \item ForkJoinPool zum Ausführen $\rightarrow$ implementiert Executor Interface + \end{itemize*} + \item Fazit + \begin{itemize*} + \item Parallelprogrammierung in Java sehr ähnlich zu C++ + \item Konzepte: Threads, kritische Abschnitte über synchronized + \item mächtige Abstraktionen in java.util.concurrent + \begin{itemize*} + \item Tasks und Futures, Executor und ThreadPool + \item thread-sichere Datenstrukturen + \item Synchronisation: Barrieren, Semaphoren, ... + \end{itemize*} + \end{itemize*} + \end{itemize*} +\end{itemize*} \subsection{Zusammenfassung} -\begin{itemize} +\begin{itemize*} \item Parallelprogrammierung als wichtige Technik zur Nutzung moderner Hardware (Multicore, GPU, …) \item verschiedene Architekturen und Programmiermodelle \item Instruktions-, Daten- und Taskparallelität @@ -5828,302 +5678,302 @@ Starten der Verarbeitung: \item hoher Abstraktionsgrad funktionaler Sprachen \item C++/Java: Thread-Modell und Synchronisation mit vielen weiteren Konzepten \item höherwertige Abstraktion durch zusätzliche Bibliotheken und Programmierschnittstellen -\end{itemize} +\end{itemize*} \section{Verteilte Programmierung} \subsection{Grundlagen} -\begin{itemize} +\begin{itemize*} \item mehrere Rechner \item Prozesse auf verschiedenen Rechnern \item Kommunikation über Knotengrenzen hinweg \item Behandlung von Knoten- oder Netzwerkausfällen -\end{itemize} +\end{itemize*} -\begin{itemize} +\begin{itemize*} \item viele verschiedene Systeme (Knoten) zur Verfügung - \begin{itemize} - \item PC, Server, virtuelle Maschine - \item Lastverteilung, Spezialisierung auf bestimmte Probleme, ... - \end{itemize} + \begin{itemize*} + \item PC, Server, virtuelle Maschine + \item Lastverteilung, Spezialisierung auf bestimmte Probleme, ... + \end{itemize*} \item Knoten sind über Netwerke verbunden - \begin{itemize} - \item LAN (Wohnräume, Büros, Uni-Campus): bis zu 10 GBit/s - \item Metropolitan Area Network (MAN; dichtbesiedelte Regionen, Behördennetze): bis zu 10 GBit/s - \item Wide Area Network (WAN; weltweite Vernetzung): hohe Kapazitäten zwischen ISPs - \end{itemize} -\end{itemize} + \begin{itemize*} + \item LAN (Wohnräume, Büros, Uni-Campus): bis zu 10 GBit/s + \item Metropolitan Area Network (MAN; dichtbesiedelte Regionen, Behördennetze): bis zu 10 GBit/s + \item Wide Area Network (WAN; weltweite Vernetzung): hohe Kapazitäten zwischen ISPs + \end{itemize*} +\end{itemize*} Wofür werden verteilte Systeme eingesetzt? -\begin{itemize} +\begin{itemize*} \item Gemeinsame Nutzung von Ressourcen - \begin{itemize} - \item Cloud-Umgebungen - \item verteilte (Datenbank)-Systeme - \end{itemize} + \begin{itemize*} + \item Cloud-Umgebungen + \item verteilte (Datenbank)-Systeme + \end{itemize*} \item Teilaufgaben in großen Anwendungen - \begin{itemize} - \item parallele Ausführung - \item getrennte Teilaufgaben (Micro-Services) - \end{itemize} + \begin{itemize*} + \item parallele Ausführung + \item getrennte Teilaufgaben (Micro-Services) + \end{itemize*} \item Informationsaustausch - \begin{itemize} - \item E-Mail, Messenger - \item verteilte Algorithmen - \end{itemize} -\end{itemize} + \begin{itemize*} + \item E-Mail, Messenger + \item verteilte Algorithmen + \end{itemize*} +\end{itemize*} Software-Architekturen -\begin{itemize} +\begin{itemize*} \item Früher: Hardware, Betriebssystem, Anwendung - \begin{itemize} - \item Virtualisierung von Prozessor, Speicher, E/A Systemen - \item Interprozesskommunikation (IPC) - \end{itemize} + \begin{itemize*} + \item Virtualisierung von Prozessor, Speicher, E/A Systemen + \item Interprozesskommunikation (IPC) + \end{itemize*} \item Middlewaresysteme: HW, OS, Middleware, Anwendung - \begin{itemize} - \item verteilte Dienste - \item Programmierparadigmen: RPC, Client/Server, ... - \end{itemize} + \begin{itemize*} + \item verteilte Dienste + \item Programmierparadigmen: RPC, Client/Server, ... + \end{itemize*} \item Heute: Virtualisierung - \begin{itemize} - \item VM Hypervisor: verstecken Hardware vor Betriebssystem - \item Docker: eine Anwendung pro Container - \end{itemize} -\end{itemize} + \begin{itemize*} + \item VM Hypervisor: verstecken Hardware vor Betriebssystem + \item Docker: eine Anwendung pro Container + \end{itemize*} +\end{itemize*} Herausforderungen: -\begin{itemize} +\begin{itemize*} \item viele verschiedene Computer/Server - \begin{itemize} - \item verschiedene Betriebssysteme - \item unterschiedliche Leistungsfähigkeit - \end{itemize} + \begin{itemize*} + \item verschiedene Betriebssysteme + \item unterschiedliche Leistungsfähigkeit + \end{itemize*} \item Systemkomponenten müssen miteinander kommunizieren \item verteilte Algorithmen: Nachrichten senden, empfangen, bestätigen, Synchronisation \item Knotenausfälle behandeln -\end{itemize} +\end{itemize*} $\Rightarrow$ brauchen Modelle zur Beschreibung der Kommunikation Anforderungen an den Betrieb eines (großen) verteilten Systems -\begin{itemize} +\begin{itemize*} \item (Last-)Skalierbarkeit (Scale-out) - \begin{itemize} - \item viele kleine Server - statt eines großen - \item neue Server nach Bedarf hinzufügen - \end{itemize} + \begin{itemize*} + \item viele kleine Server - statt eines großen + \item neue Server nach Bedarf hinzufügen + \end{itemize*} \item Funktionssicherheit (Safety) / IT-Sicherheit (Security) \item Fehlertoleranz / Verfügbarkeit - \begin{itemize} - \item Ausfälle von einzelnen Knoten kompensieren - \item Redundante Verarbeitung - \end{itemize} + \begin{itemize*} + \item Ausfälle von einzelnen Knoten kompensieren + \item Redundante Verarbeitung + \end{itemize*} \item Offenheit / Interoperabilität - \begin{itemize} - \item neue Knoten und Systeme einfach integrieren - \end{itemize} + \begin{itemize*} + \item neue Knoten und Systeme einfach integrieren + \end{itemize*} \item Transparenz - \begin{itemize} - \item verstecke die vielen Server vor Anwendern - \end{itemize} -\end{itemize} + \begin{itemize*} + \item verstecke die vielen Server vor Anwendern + \end{itemize*} +\end{itemize*} \subsection{Grundlagen verteilter Programmierung in Java und Erlang} \paragraph{Sockets} -\begin{itemize} +\begin{itemize*} \item Verteilte Programmierung: Wir müssen einen entfernten Computer ansprechen \item benötigen: Adresse $\rightarrow$ IP-Adresse \item da mehrere Dienste auf demselben Computer laufen lauscht jeder Dienst auf einem Port (Nummer) - \begin{itemize} - \item Wichtige Ports: 80 WWW, 20 (FTP), 25 (SMTP) - \end{itemize} + \begin{itemize*} + \item Wichtige Ports: 80 WWW, 20 (FTP), 25 (SMTP) + \end{itemize*} \item Socket beschreibt einen Endpunkt, d.h. Adresse \& Port in einem TCP (oder UDP) Netzwerk \item Server-Socket wartet auf Verbindungen \item Client initiiert Verbindung, ebenfalls über einen (Client-)Socket -\end{itemize} +\end{itemize*} Socket in dem package ''java.net.Socket'' -\begin{itemize} +\begin{itemize*} \item einen ServerSocket auf Port 4242 erstellen - \begin{lstlisting} + \begin{lstlisting} ServerSocket serverSocket = new ServerSocket(4242); \end{lstlisting} \item Warte blockierend auf Verbindungen - \begin{lstlisting} + \begin{lstlisting} Socket client = serverSocket.accept(); \end{lstlisting} \item Client Socket ertellen und zum Server verbinden - \begin{lstlisting} + \begin{lstlisting} Socket client = new Socket("localhost", 4242); \end{lstlisting} \item Sockets in ähnlicher Form in C/C++ -\end{itemize} +\end{itemize*} \paragraph{Aktormodell} -\begin{itemize} +\begin{itemize*} \item formales Modell für Nebenläufigkeit und Verteilung \item Basis für verschiedene Programmiersprachen/Frameworks: Erlang, Akka (Scala/Java) \item Prinzipien: - \begin{itemize} - \item Aktor kapselt Zustand und Verhalten - \item Aktoren sind aktiv - \item Aktoren kommunizieren durch Nachrichtenaustausch - \begin{itemize} - \item Nichtblockierendes Senden - \item Blockierendes Empfangen - \end{itemize} - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Aktor kapselt Zustand und Verhalten + \item Aktoren sind aktiv + \item Aktoren kommunizieren durch Nachrichtenaustausch + \begin{itemize*} + \item Nichtblockierendes Senden + \item Blockierendes Empfangen + \end{itemize*} + \end{itemize*} +\end{itemize*} Aktormodell in Erlang -\begin{itemize} +\begin{itemize*} \item Aktormodell in Erlang nativ umgesetzt - \begin{itemize} - \item Sende- und Empfangsoperationen schon für parallele Programmierung benutzt - \item bisher aber nur auf einem Knoten - \end{itemize} + \begin{itemize*} + \item Sende- und Empfangsoperationen schon für parallele Programmierung benutzt + \item bisher aber nur auf einem Knoten + \end{itemize*} \item Programmbestandteile im Aktormodell - \begin{itemize} - \item Verhaltensdefinition $\Rightarrow$ f() $\rightarrow$ ... end. - \item Erzeugen neuer Aktoren $\Rightarrow$ Pid = spawn(fun ... ) . - \item Empfangen von Nachrichten $\Rightarrow$ receive ... end . - \item Senden $\Rightarrow$ Pid ! Request . - \end{itemize} + \begin{itemize*} + \item Verhaltensdefinition $\Rightarrow$ f() $\rightarrow$ ... end. + \item Erzeugen neuer Aktoren $\Rightarrow$ Pid = spawn(fun ... ) . + \item Empfangen von Nachrichten $\Rightarrow$ receive ... end . + \item Senden $\Rightarrow$ Pid ! Request . + \end{itemize*} \item kein globaler Zustand -\end{itemize} +\end{itemize*} Cookie-System -\begin{itemize} +\begin{itemize*} \item erteilte Erlang-Knoten benötigen zur Kommunikation gemeinsames Magic Cookie (Passwort) \item Mehrere Varianten - \begin{itemize} - \item Datei \~/.erlang.cookie - \item Erlang-Funktion - \begin{lstlisting}[ + \begin{itemize*} + \item Datei \~/.erlang.cookie + \item Erlang-Funktion + \begin{lstlisting}[ language=erlang, showspaces=false, basicstyle=\ttfamily ]:set_cookie(node(), Cookie). \end{lstlisting} - \item Option - \begin{lstlisting} + \item Option + \begin{lstlisting} erl -setcookie Cookie \end{lstlisting} - \end{itemize} + \end{itemize*} \item Verbindungsaufbau mittels Funktion - \begin{lstlisting} + \begin{lstlisting} net_adm:ping(adress) \end{lstlisting} -\end{itemize} +\end{itemize*} Das Alternating Bit Protokoll - Übersicht -\begin{itemize} +\begin{itemize*} \item ermöglicht es, Nachrichten über einen verlustbehafteten Kommunikationskanal vollständig zu übertragen, sofern Verluste nur gelegentlich auftreten (transiente Fehler) \item Empfänger quittiert jedes erhaltene Paket (Ackknowledgement, kurz: Ack) \item Achtung: Kanal kann Nachrichten und Acks verlieren - \begin{itemize} - \item $\Rightarrow$ benötigen je zwei unterschiedliche Sequenznummern und Acks - \end{itemize} + \begin{itemize*} + \item $\Rightarrow$ benötigen je zwei unterschiedliche Sequenznummern und Acks + \end{itemize*} \item Empfänger liefert eine Nachricht nur beim ersten Empfang aus (keine Duplikate) \item bei Timeout: Nachricht erneut senden \item bei Erhalt eines unerwarteten Ack: aktuelle Nachricht erneut senden -\end{itemize} +\end{itemize*} \subsection{Kommunikationsmodelle \& Implementierungen} das Verhalten der Teilnehmer ist in Kommunikationsmodellen beschrieben Es gibt viele verschiedene Modelle, z.B. für Botschaftenbasierte Modelle -\begin{itemize} +\begin{itemize*} \item Auftragsorientierte Modelle \item Funktionsaufrufbasierte Modelle \item Blackboards (Tuple Spaces) \item Ereignisbasierte Modelle \item (Strombasierte Modelle) \item (Wissenbasierte Modelle) -\end{itemize} +\end{itemize*} Kommunikationspartner sind für uns: -\begin{itemize} +\begin{itemize*} \item Threads/Prozesse innerhalb der verteilten Anwendung \item Komponenten verteilter Systeme (Browser $\leftrightarrow$ Web-Server, DB Client $\leftrightarrow$ DB-Server) -\end{itemize} +\end{itemize*} Modellbestandteile -\begin{itemize} +\begin{itemize*} \item Rollenmodell - \begin{itemize} - \item gemeinsames Handlungsmuster festlegen - \item z.B.: Anrufer/Angerufener, Client/Server, Quelle/Senke - \end{itemize} + \begin{itemize*} + \item gemeinsames Handlungsmuster festlegen + \item z.B.: Anrufer/Angerufener, Client/Server, Quelle/Senke + \end{itemize*} \item Datenmodell - \begin{itemize} - \item einheitliche Interpretation der ausgetauschten Daten - \item z.B.: Dateiformate (XML/JSON), Kodierungen (MPEG4/H.264) - \end{itemize} + \begin{itemize*} + \item einheitliche Interpretation der ausgetauschten Daten + \item z.B.: Dateiformate (XML/JSON), Kodierungen (MPEG4/H.264) + \end{itemize*} \item Fehlersemantiken - \begin{itemize} - \item Einvernehmen über Wirkung von Ausfällen - \item Eigenschaften von Kommunikationsoperationen müssen bei Ausfällen garantiert werden - \end{itemize} + \begin{itemize*} + \item Einvernehmen über Wirkung von Ausfällen + \item Eigenschaften von Kommunikationsoperationen müssen bei Ausfällen garantiert werden + \end{itemize*} \item Terminierungssemantik - \begin{itemize} - \item Einvernehmen über Ende der Kommunikation - \item Garantien über Ende von Kommunikationsoperationen (auch bei Ausfällen) - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Einvernehmen über Ende der Kommunikation + \item Garantien über Ende von Kommunikationsoperationen (auch bei Ausfällen) + \end{itemize*} +\end{itemize*} Kommunikationsarten -\begin{itemize} +\begin{itemize*} \item Wann ist eine Kommunikationsoperation abgeschlossen? \item entspricht Terminierungssemantik \item zwei grundlegende Arten: - \begin{itemize} - \item synchron: - \begin{itemize} - \item blockierend - \item Teilnehmer wartet bis Gegenseite bereit - \item kann lange dauern, Sender kann nicht weiter arbeiten - \item Senden: Botschaftenankunft garantiert, einfache Implementierung synchroner Aktivitäten - \item Empfangen: Botschaftenankunft einfach und präzise feststellbar - \end{itemize} - \item asynchron: - \begin{itemize} - \item nicht-blockierend - \item Teilnehmer wartet nicht auf Gegenseite (”fire and forget”) - \item unklar ob Botschaft angekommen - \item Senden: einfache Implementierung von Nebenläufigkeit - \item Empfangen: unklar wann Botschaft ankommt, einfache Implementierung von Nebenläufigkeit - \end{itemize} - \item für Senden und Empfangen - \end{itemize} -\end{itemize} + \begin{itemize*} + \item synchron: + \begin{itemize*} + \item blockierend + \item Teilnehmer wartet bis Gegenseite bereit + \item kann lange dauern, Sender kann nicht weiter arbeiten + \item Senden: Botschaftenankunft garantiert, einfache Implementierung synchroner Aktivitäten + \item Empfangen: Botschaftenankunft einfach und präzise feststellbar + \end{itemize*} + \item asynchron: + \begin{itemize*} + \item nicht-blockierend + \item Teilnehmer wartet nicht auf Gegenseite (”fire and forget”) + \item unklar ob Botschaft angekommen + \item Senden: einfache Implementierung von Nebenläufigkeit + \item Empfangen: unklar wann Botschaft ankommt, einfache Implementierung von Nebenläufigkeit + \end{itemize*} + \item für Senden und Empfangen + \end{itemize*} +\end{itemize*} Fehlerbehandlung -\begin{itemize} +\begin{itemize*} \item unverlässliches vs. verlässliches Senden - \begin{itemize} - \item "Brief vs. Einschreiben” - \end{itemize} + \begin{itemize*} + \item "Brief vs. Einschreiben” + \end{itemize*} \item verlässliche Kommunikation erfordert - \begin{itemize} - \item Quittierung (Acknowledgements) $\rightarrow$ mehr Daten senden - \item Timeouts $\rightarrow$ Zeitverwaltung, langes Warten - \end{itemize} + \begin{itemize*} + \item Quittierung (Acknowledgements) $\rightarrow$ mehr Daten senden + \item Timeouts $\rightarrow$ Zeitverwaltung, langes Warten + \end{itemize*} \item vielfältige Fehlermöglichkeiten in verteilten Anwendungen: - \begin{itemize} - \item Kommunikations-/Netzwerkfehler: $\rightarrow$ Nachricht/Antwort gar nicht oder verzögert zugestellt - \item Serverausfall: Nachricht empfangen? Operation ausgeführt? - \item Clientausfall: Aufruf gültig? Bestätigung erhalten? - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Kommunikations-/Netzwerkfehler: $\rightarrow$ Nachricht/Antwort gar nicht oder verzögert zugestellt + \item Serverausfall: Nachricht empfangen? Operation ausgeführt? + \item Clientausfall: Aufruf gültig? Bestätigung erhalten? + \end{itemize*} +\end{itemize*} Fehlerbehandlung in Erlang -\begin{itemize} +\begin{itemize*} \item Timeout beim Warten auf Nachrichten \item Wenn keine passende Nachricht innerhalb Time msecs. empfangen wird, dann Rückgabewert des after-Ausdrucks -\end{itemize} +\end{itemize*} \begin{lstlisting}[ language=erlang, showspaces=false, @@ -6137,149 +5987,149 @@ end \end{lstlisting} Überwachung von Erlang Prozessen -\begin{itemize} +\begin{itemize*} \item Linking von Prozessen: link(Pid). \item M überwacht S; S bricht durch Fehler ab \item M wartet auf EXIT Nachricht von S $\rightarrow$ asynchroner Handler nötig -\end{itemize} +\end{itemize*} Umgang mit Fehlern (Timeouts, Ausfälle): -\begin{itemize} +\begin{itemize*} \item Maybe: - \begin{itemize} - \item keine Wiederholung - \item keine Ausführungsgarantie - \end{itemize} + \begin{itemize*} + \item keine Wiederholung + \item keine Ausführungsgarantie + \end{itemize*} \item At-least-once: - \begin{itemize} - \item wiederholte Ausführung, aber keine Erkennung von Nachrichtduplikaten - \item nur für idempotente Operationen (Lesen) - \end{itemize} + \begin{itemize*} + \item wiederholte Ausführung, aber keine Erkennung von Nachrichtduplikaten + \item nur für idempotente Operationen (Lesen) + \end{itemize*} \item At-most-once: - \begin{itemize} - \item garantiert, dass mehrfache Aufrufe nur zu einziger Ausführung führen - \item z.B. durch Sequenznummern (erfordert Protokollierung zur Duplikateliminierung) - \item für nicht-idempotente Operationen (schreibend, z.B. Einfügen, Löschen) - \end{itemize} -\end{itemize} + \begin{itemize*} + \item garantiert, dass mehrfache Aufrufe nur zu einziger Ausführung führen + \item z.B. durch Sequenznummern (erfordert Protokollierung zur Duplikateliminierung) + \item für nicht-idempotente Operationen (schreibend, z.B. Einfügen, Löschen) + \end{itemize*} +\end{itemize*} \subsection{Grundlagen} \subsubsection{Lernziele} -\begin{itemize} +\begin{itemize*} \item Verständnis von Techniken verteilter Programmierung als Paradigma - \begin{itemize} - \item Modelle und Konzepte unabhängig von Programmiersprache und Betriebssystem - \item Herausforderungen und Besonderheiten verteilter Programme - \end{itemize} + \begin{itemize*} + \item Modelle und Konzepte unabhängig von Programmiersprache und Betriebssystem + \item Herausforderungen und Besonderheiten verteilter Programme + \end{itemize*} \item Kennenlernen konkreter Konzepte und Mechanismen - \begin{itemize} - \item praktische Beispiele in Java, Erlang und C++ - \item Bewertung und Vergleich verschiedener Plattformen - \end{itemize} -\end{itemize} + \begin{itemize*} + \item praktische Beispiele in Java, Erlang und C++ + \item Bewertung und Vergleich verschiedener Plattformen + \end{itemize*} +\end{itemize*} \subsubsection{Einordnung} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-001} \end{center} \subsubsection{Ziele} -\begin{itemize} +\begin{itemize*} \item Bisher: - \begin{itemize} - \item eine Maschine - \item Prozesse kommunizieren nur innerhalb dieser Maschine (shared Memory vs. Message Passing) - - \end{itemize} + \begin{itemize*} + \item eine Maschine + \item Prozesse kommunizieren nur innerhalb dieser Maschine (shared Memory vs. Message Passing) + + \end{itemize*} \item Jetzt: - \begin{itemize} - \item mehrere Rechner - \item Prozesse auf verschiedenen Rechnern - \end{itemize} + \begin{itemize*} + \item mehrere Rechner + \item Prozesse auf verschiedenen Rechnern + \end{itemize*} \item Erfordert: - \begin{itemize} - \item Kommunikation über Knotengrenzen hinweg - \item Behandlung von Knoten- oder Netzwerkausfällen - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Kommunikation über Knotengrenzen hinweg + \item Behandlung von Knoten- oder Netzwerkausfällen + \end{itemize*} +\end{itemize*} \subsubsection{Motivation} -\begin{itemize} +\begin{itemize*} \item viele verschiedene Systeme (Knoten) zur Verfügung - \begin{itemize} - \item PC, Server, virtuelle Maschinen - \item Lastverteilung, Spezialisierung auf bestimmte Probleme - \end{itemize} + \begin{itemize*} + \item PC, Server, virtuelle Maschinen + \item Lastverteilung, Spezialisierung auf bestimmte Probleme + \end{itemize*} \item Knoten sind über Netzwerke verbunden - \begin{itemize} - \item LAN(Wohnräume, Büros,…): bis zu 10 Gbit/s - \item MAN(Metropolitan Area Network, Behördennetze, dicht besiedelte Regionen): bis zu 10 Gbit/s - \item WAN(Wide Area Network, weltweite Vernetzung): hohe Kapazitäten zwischen den ISPs - \end{itemize} -\end{itemize} + \begin{itemize*} + \item LAN(Wohnräume, Büros,…): bis zu 10 Gbit/s + \item MAN(Metropolitan Area Network, Behördennetze, dicht besiedelte Regionen): bis zu 10 Gbit/s + \item WAN(Wide Area Network, weltweite Vernetzung): hohe Kapazitäten zwischen den ISPs + \end{itemize*} +\end{itemize*} Wofür werden verteilte Systeme eingesetzt? -\begin{itemize} +\begin{itemize*} \item Gemeinsame Nutzung von Ressourcen - \begin{itemize} - \item Cloud-Umgebungen - \item verteilte Datenbanksysteme - - \end{itemize} + \begin{itemize*} + \item Cloud-Umgebungen + \item verteilte Datenbanksysteme + + \end{itemize*} \item Teilaufgaben in großen Anwendungen - \begin{itemize} - \item parallele Ausführung - \item getrennte Teilaufgaben (Micro-Services) - - \end{itemize} + \begin{itemize*} + \item parallele Ausführung + \item getrennte Teilaufgaben (Micro-Services) + + \end{itemize*} \item Informationsaustausch - \begin{itemize} - \item Email, Messenger - \item verteilte Algorithmen - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Email, Messenger + \item verteilte Algorithmen + \end{itemize*} +\end{itemize*} \subsubsection{Architekturen} \color{orange} Software-Architekturen \color{black} -\begin{enumerate} +\begin{enumerate*} \item Früher: Hardware, Betriebssystem, Anwendung - \begin{itemize} - \item Virtualisierung von Prozessor, Speicher, E/A Systemen - \item Interprozesskommunikation - \end{itemize} + \begin{itemize*} + \item Virtualisierung von Prozessor, Speicher, E/A Systemen + \item Interprozesskommunikation + \end{itemize*} \item Middlewaresysteme: Hardware, OS, Middleware, Anwendung - \begin{itemize} - \item verteilte Dienste - \item Programmierparadigmen: RPC, Client/Server,… - \item Java, CORBA, … - \end{itemize} + \begin{itemize*} + \item verteilte Dienste + \item Programmierparadigmen: RPC, Client/Server,… + \item Java, CORBA, … + \end{itemize*} \item Heute: Virtualisierung - \begin{itemize} - \item VM Hypervisor: verstecken Hardware vor dem Betriebssystem - \item Docker: eine Anwendung pro Container - \end{itemize} -\end{enumerate} + \begin{itemize*} + \item VM Hypervisor: verstecken Hardware vor dem Betriebssystem + \item Docker: eine Anwendung pro Container + \end{itemize*} +\end{enumerate*} \subsubsection{Herausforderungen} \color{orange} Herausforderungen: \color{black} -\begin{itemize} +\begin{itemize*} \item viele verschiedene Computer/Server - \begin{itemize} - \item verschiedene Betriebssysteme - \item unterschiedliche Leistungsfähigkeit - \end{itemize} + \begin{itemize*} + \item verschiedene Betriebssysteme + \item unterschiedliche Leistungsfähigkeit + \end{itemize*} \item Systemkomponenten müssen miteinander kommunizieren \item verteilte Algorithmen: Nachrichten senden, empfangen, bestätigen, Synchronisation \item Knotenausfälle behandeln -\end{itemize} +\end{itemize*} \color{orange} $\Rightarrow$ brauchen Modelle zur Beschreibung der Kommunikation \color{black} \subsubsection{Anforderungen} \color{orange} Anforderungen an Kommunikationsmodelle in … \color{black} \newline … verteilten Systemen\newline \newline \begin{minipage}[h]{0.5\linewidth} - \begin{itemize} + \begin{itemize*} \item Korrektheit \item Sicherheit \item Verfügbarkeit \item Skalierbarkeit \item Heterogenität - \end{itemize} + \end{itemize*} \end{minipage} \begin{minipage}[h]{0.4\linewidth} \includegraphics[width=1.0\linewidth]{Assets/Programmierparadigmen-002} @@ -6287,52 +6137,52 @@ Wofür werden verteilte Systeme eingesetzt? \clearpage …verteilten Verkehrsmanagementsystemen\newline \newline \begin{minipage}[h]{0.5\linewidth} - \begin{itemize} + \begin{itemize*} \item Echtzeitfähigkeit \item Offenheit \item Korrektheit, \newline Sicherheit \item Skalierbarkeit, \newline Verfügbarkeit - \end{itemize} + \end{itemize*} \end{minipage} \begin{minipage}[h]{0.4\linewidth} \includegraphics[width=1.0\linewidth]{Assets/Programmierparadigmen-003} \end{minipage} \newline \newline \newline \newline \color{orange} Anforderungen \color{black} an den Betrieb eines (großen) verteilten Systems -\begin{itemize} +\begin{itemize*} \item (Last-)Skalierbarkeit (Scale-out): - \begin{itemize} - \item viele kleine Server - statt eines großen - \item neue Server nach Bedarf hinzuzufügen - \end{itemize} + \begin{itemize*} + \item viele kleine Server - statt eines großen + \item neue Server nach Bedarf hinzuzufügen + \end{itemize*} \item Funktionssicherheit (Safety) / IT-Sicherheit (Security) \item Fehlertoleranz / Verfügbarkeit - \begin{itemize} - \item Ausfälle von einzelnen Knoten kompensieren - \item Redundante Verarbeitung - \end{itemize} + \begin{itemize*} + \item Ausfälle von einzelnen Knoten kompensieren + \item Redundante Verarbeitung + \end{itemize*} \item Offenheit / Interoperabilität - \begin{itemize} - \item neue Knoten und Systeme einfach integrieren - \end{itemize} + \begin{itemize*} + \item neue Knoten und Systeme einfach integrieren + \end{itemize*} \item Transparenz - \begin{itemize} - \item verstecke die vielen Server vor den Nutzern - \end{itemize} -\end{itemize} + \begin{itemize*} + \item verstecke die vielen Server vor den Nutzern + \end{itemize*} +\end{itemize*} \subsection{Grundlagen verteilter Programmierung in Java und Erlang} \subsubsection{Sockets} -\begin{itemize} +\begin{itemize*} \item Verteilte Programmierung: Wir müssen einen entfernten Computer ansprechen \item benötigen: Adresse $\rightarrow$ IP-Adresse \item da mehrere Dienste auf demselben Computer laufen lauscht jeder Dienst auf einem Port (Nummer) - \begin{itemize} - \item Wichtige Ports: 80 WWW, 20 (FTP), 25 (SMTP) - \end{itemize} + \begin{itemize*} + \item Wichtige Ports: 80 WWW, 20 (FTP), 25 (SMTP) + \end{itemize*} \item \textbf{Socket} beschreibt einen Endpunkt, dh. Adresse und Port in einem TCP (oder UDP) Netzwerk \item \textbf{Server-Socket} wartet auf Verbindungen \item \textbf{Client} initiiert Verbindung, ebenfalls über einen (Client-Socket) -\end{itemize} +\end{itemize*} \subsubsection{Sockets in Java} Socket in dem package java.net.Socket einen \textbf{ServerSocket} auf Port 4242 erstellen \begin{center} @@ -6360,41 +6210,41 @@ Echo Server (Clientseite) \includegraphics[width=0.8\linewidth]{Assets/Programmierparadigmen-005} \end{center} \subsection{Aktormodell in Erlang} -\begin{itemize} +\begin{itemize*} \item formales Modell für Nebenläufigkeit und Verteilung \item Basis für verschiedene Programmiersprachen/Frameworks: Erlang, Akka (Scala/Java) \item Prinzipien: - \begin{itemize} - \item Aktor kapselt Zustand und Verhalten - \item Aktoren sind aktiv - \item Aktoren kommunizieren durch Nachrichtenaustausch - \begin{itemize} - \item Nichtblockierendes Senden - \item Blockierendes Empfangen - \end{itemize} - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Aktor kapselt Zustand und Verhalten + \item Aktoren sind aktiv + \item Aktoren kommunizieren durch Nachrichtenaustausch + \begin{itemize*} + \item Nichtblockierendes Senden + \item Blockierendes Empfangen + \end{itemize*} + \end{itemize*} +\end{itemize*} \subsubsection{Übersicht} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-006} \end{center} -\begin{itemize} +\begin{itemize*} \item Aktormodell in Erlang nativ umgesetzt - \begin{itemize} - \item Sende- und Empfangsoperationen schon für parallele Programmierung benutzt - \item bisher aber nur auf einem Knoten - \end{itemize} + \begin{itemize*} + \item Sende- und Empfangsoperationen schon für parallele Programmierung benutzt + \item bisher aber nur auf einem Knoten + \end{itemize*} \item Programmbestandteile im Aktormodell - \begin{itemize} - \item Verhaltensdefinition $\Rightarrow$ f() $\rightarrow$ … end. - \item Erzeugen neuer Aktoren $\Rightarrow$ Pid = spwan(fun …). - \item Empfangen von Nachrichten $\Rightarrow$ receive … end. - \item Senden $\Rightarrow$ Pid ! Request. - \end{itemize} + \begin{itemize*} + \item Verhaltensdefinition $\Rightarrow$ f() $\rightarrow$ … end. + \item Erzeugen neuer Aktoren $\Rightarrow$ Pid = spwan(fun …). + \item Empfangen von Nachrichten $\Rightarrow$ receive … end. + \item Senden $\Rightarrow$ Pid ! Request. + \end{itemize*} \item kein globaler Zustand -\end{itemize} +\end{itemize*} \subsubsection{Kommunikation zwischen Erlangknoten} Erlangknoten starten (sname = short name) \begin{center} @@ -6414,16 +6264,16 @@ Liste der verbundenen Knoten \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-010} \end{center} \subsubsection{Cookie-System} -\begin{itemize} +\begin{itemize*} \item verteilte Erlangknoten benötigen zur Kommunikation gemeinsames \color{orange} Magic Cookie \color{black} (Passwort) \item Mehrere Varianten - \begin{itemize} - \item Datei {\raise.17ex\hbox{$\scriptstyle\mathtt{\sim}$}}/.erlang.cookie - \item Erlang Funktion \newline - \color{blue} erlang:\color{OliveGreen}set\_cookie(node(), \color{blue}Cookie)\color{black} - \item Option: erl - setcookie Cookie - \end{itemize} -\end{itemize}\clearpage + \begin{itemize*} + \item Datei {\raise.17ex\hbox{$\scriptstyle\mathtt{\sim}$}}/.erlang.cookie + \item Erlang Funktion \newline + \color{blue} erlang:\color{OliveGreen}set\_cookie(node(), \color{blue}Cookie)\color{black} + \item Option: erl - setcookie Cookie + \end{itemize*} +\end{itemize*}\clearpage \subsubsection{Verbindungsaufbau zwischen Erlangknoten} Verbindungsaufbau mittels \color{blue} net\_adm:\color{black}ping Funktion \begin{center} @@ -6438,17 +6288,17 @@ Starten eines Prozesses auf einem entfernten Host \end{center}\clearpage \subsection{Alternating Bit Protokoll} \subsubsection{Übersicht} -\begin{itemize} +\begin{itemize*} \item ermöglicht es, Nachrichten über einen verlustbehafteten Kommunikationskanal vollständig zu übertragen, sofern Verluste nur gelegentlich auftreten (transiente Fehler) \item Empfänger quittiert jedes erhaltene Paket (Achnowledgement, kurz ACK) \item \textbf{Achtung} Kanal kann Nachrichten und ACKs verlieren - \begin{itemize} - \item benötigen je zwei unterschiedliche Sequenznummern und ACKs - \end{itemize} + \begin{itemize*} + \item benötigen je zwei unterschiedliche Sequenznummern und ACKs + \end{itemize*} \item Empfänger liefert eine Nachricht nur beim ersten Empfang aus (keine Duplikate) \item bei Timeout: Nachricht erneut senden \item bei Erhalt eines unerwarteten ACKs: \textbf{aktuelle Nachricht erneut senden} -\end{itemize} +\end{itemize*} \subsubsection{Zustände} \begin{center} \centering @@ -6456,23 +6306,23 @@ Starten eines Prozesses auf einem entfernten Host \end{center} \subsubsection{Das Alternating Bit Protokoll} Wir implementieren eine Variante, bei welcher: -\begin{itemize} +\begin{itemize*} \item der Sender zu Beginn eine Liste mit sämtlichen zu sendenden Nachrichten erhält, und \item der Empfänger die erstmals empfangenen Nachrichten einfach auf dem Bildschirm ausgibt \item alle Aktoren Statusmeldungen ausgeben \item Verluste über einen Zufallszahlengenerator ausgelöst werden -\end{itemize} +\end{itemize*} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-0014} \end{center} drei Prozesse mit \textbf{initialize(ErrorRate, NumberOfMessages, ReceiverPid, SenderPid, ChannelPid)} initialisieren und starten -\begin{itemize} +\begin{itemize*} \item Sender hat vier Zustandsfunktionen; Startet mit senderReady0(List): Liste mit Zahlen 1,…,NumberOfMessages \item Kanal: Nachricht "verlieren", wenn Zufallszahl $\ngeq$ ErrorRate \item Empfänger hat zwei Zustandsfunktionen; zu Beginn wird receiverWait0 gestartet \item initialize wartet auf eine ready-Nachricht; sendet danach stop-Nachrichten an alle -\end{itemize} +\end{itemize*} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-0015} @@ -6504,71 +6354,71 @@ drei Prozesse mit \textbf{initialize(ErrorRate, NumberOfMessages, ReceiverPid, S \subsection{Kommunikationsmodelle \& Implementierungen} \subsubsection{Kommunikationsmodelle} Frage: Wie sollen Knoten miteinander kommunizieren? -\begin{itemize} +\begin{itemize*} \item Sprechen die Teilnehmer direkt miteinander oder über einen Vermittler? \item Kann jeder jedem eine Nachricht schicken? \item Wartet ein Teilnehmer darauf, dass seine Nachricht angekommen ist? \item Wartet ein Teilnehmer darauf, dass eine Nachricht ankommt? \item Muss ein Teilnehmer auf eine Nachricht antworten? -\end{itemize} +\end{itemize*} $\Rightarrow$ das Verhalten der Teilnehmer ist in \color{orange} Kommunikationsmodellen \color{black} beschrieben \subsubsection{Arten von Kommunikationsmodellen} Es gibt viele verschiedene Modelle, z.B. für \color{orange} Botschaftenbasierte Modelle \color{black} -\begin{itemize} +\begin{itemize*} \item Auftragsorientierte Modelle \item Funktionsaufrufbasierte Modelle \item Blackboards \item Ereignisbasierte Modelle \item Strombasierte Modelle \item Wissensbasierte Modelle -\end{itemize} +\end{itemize*} Kommunikationspartner sind für uns: -\begin{itemize} +\begin{itemize*} \item Threads/Prozesse innerhalb verteilter Anwendungen \item Komponenten verteilter Systeme (Browser $\Leftrightarrow$ Webserver, DB Client $\Leftrightarrow$ DB-Server) -\end{itemize} +\end{itemize*} \subsubsection{Modellbestandteile} -\begin{itemize} +\begin{itemize*} \item \color{orange} Rollenmodell: \color{black} - \begin{itemize} - \item gemeinsames Handlungsmuster festlegen - \item z.B. Anrufer/Angerufener, Clinet/Server, Quelle/Senke - \end{itemize} + \begin{itemize*} + \item gemeinsames Handlungsmuster festlegen + \item z.B. Anrufer/Angerufener, Clinet/Server, Quelle/Senke + \end{itemize*} \item \color{orange} Datenmodell: \color{black} - \begin{itemize} - \item einheitliche Interpretation der ausgetauschten Daten - \item z.B. Dateiformate (XML/JSON), Kodierungen (MPEG4/H.264) - \end{itemize} + \begin{itemize*} + \item einheitliche Interpretation der ausgetauschten Daten + \item z.B. Dateiformate (XML/JSON), Kodierungen (MPEG4/H.264) + \end{itemize*} \item \color{orange} Fehlersemantiken \color{black} - \begin{itemize} - \item Einvernehmen über Wirkungen von Ausfällen - \item Eigenschaften von Kommunikationsoperationen müssen bei Ausfällen garantiert werden - \end{itemize} + \begin{itemize*} + \item Einvernehmen über Wirkungen von Ausfällen + \item Eigenschaften von Kommunikationsoperationen müssen bei Ausfällen garantiert werden + \end{itemize*} \item \color{orange} Terminierungssemantik \color{black} - \begin{itemize} - \item Einvernehmen über das Ende der Kommunikation - \item Garantien über das Ende von Kommunikationsoperationen (auch bei Ausfällen) - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Einvernehmen über das Ende der Kommunikation + \item Garantien über das Ende von Kommunikationsoperationen (auch bei Ausfällen) + \end{itemize*} +\end{itemize*} \subsubsection{Kommunikationsarten} -\begin{itemize} +\begin{itemize*} \item Wann ist eine Kommunikationsoperation abgeschlossen? \item entspricht Terminierungssemantik \item zwei grundlegende Arten: - \begin{itemize} - \item \color{orange} synchron \color{black} - \begin{itemize} - \item blockierend - \item Teilnehmer wartet bis die Gegenseite bereit ist - \end{itemize} - \item \color{orange} asynchron \color{black} - \begin{itemize} - \item nicht-blockierend - \item Der Teilnehmer wartet nicht auf die Gegenseite - \end{itemize} - \item gilt sowohl für das Senden als auch das Empfangen - \end{itemize} -\end{itemize} + \begin{itemize*} + \item \color{orange} synchron \color{black} + \begin{itemize*} + \item blockierend + \item Teilnehmer wartet bis die Gegenseite bereit ist + \end{itemize*} + \item \color{orange} asynchron \color{black} + \begin{itemize*} + \item nicht-blockierend + \item Der Teilnehmer wartet nicht auf die Gegenseite + \end{itemize*} + \item gilt sowohl für das Senden als auch das Empfangen + \end{itemize*} +\end{itemize*} \subsubsection{Kommunikationsarten: Senden} \color{orange} synchrones Senden: \color{black} Der Sender wartet bis der Empfänger die Botschaft annimmt \begin{center} @@ -6581,18 +6431,18 @@ Kommunikationspartner sind für uns: \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-0025} \end{center} \subsubsection{Synchrones vs. asynchrones Senden} -\begin{itemize} +\begin{itemize*} \item synchrones Senden - \begin{itemize} - \item kann lange dauern, der Sender kann währenddessen nicht weiterarbeiten - \item die Botschaftenankunft ist garantiert, eine einfache Implementierung synchroner Aktivitäten - \end{itemize} + \begin{itemize*} + \item kann lange dauern, der Sender kann währenddessen nicht weiterarbeiten + \item die Botschaftenankunft ist garantiert, eine einfache Implementierung synchroner Aktivitäten + \end{itemize*} \item asynchrones Senden - \begin{itemize} - \item unklar ob die Botschaft angekommen ist - \item einfache Implementierung von Nebenläufigkeit - \end{itemize} -\end{itemize} + \begin{itemize*} + \item unklar ob die Botschaft angekommen ist + \item einfache Implementierung von Nebenläufigkeit + \end{itemize*} +\end{itemize*} \subsubsection{Kommunikationsarten: Empfangen} \color{orange} synchrones Empfangen: \color{black} Der Empfänger wartet bis die Botschaft eintrifft \begin{center} @@ -6605,36 +6455,36 @@ Kommunikationspartner sind für uns: \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-0027} \end{center} \subsubsection{Synchrones vs. asynchrones Empfangen} -\begin{itemize} +\begin{itemize*} \item synchrones Empfangen: - \begin{itemize} - \item kann lange dauern, der Sender kann nicht weiterarbeiten - \item Botschaftenankunft ist einfach und präzise feststellbar - \end{itemize} + \begin{itemize*} + \item kann lange dauern, der Sender kann nicht weiterarbeiten + \item Botschaftenankunft ist einfach und präzise feststellbar + \end{itemize*} \item asynchrones Empfangen: - \begin{itemize} - \item unklar wann die Botschaft ankommt; - \newline Benachrichtigungstechniken - \begin{itemize} - \item Nachfragen (Polling) - \item ankommende Botschaft erzeugt neuen Thread beim Empfänger - \item weitere Techniken möglich - \end{itemize} - \item einfache Implementierung von Nebenläufigkeit - \end{itemize} -\end{itemize}\clearpage + \begin{itemize*} + \item unklar wann die Botschaft ankommt; + \newline Benachrichtigungstechniken + \begin{itemize*} + \item Nachfragen (Polling) + \item ankommende Botschaft erzeugt neuen Thread beim Empfänger + \item weitere Techniken möglich + \end{itemize*} + \item einfache Implementierung von Nebenläufigkeit + \end{itemize*} +\end{itemize*}\clearpage \subsubsection{Fehlerbehandlung} -\begin{itemize} +\begin{itemize*} \item unverlässliches vs. verlässliches Senden - \begin{itemize} - \item "Brief vs. Einschreiben" - \end{itemize} + \begin{itemize*} + \item "Brief vs. Einschreiben" + \end{itemize*} \item verlässliche Kommunikation erfordert - \begin{itemize} - \item Quittierungen (Acknowledgements) $\rightarrow$ mehr Daten senden - \item Timeouts $\rightarrow$ Zeitverwaltung, langes Warten - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Quittierungen (Acknowledgements) $\rightarrow$ mehr Daten senden + \item Timeouts $\rightarrow$ Zeitverwaltung, langes Warten + \end{itemize*} +\end{itemize*} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-0028} @@ -6646,130 +6496,130 @@ Kommunikationspartner sind für uns: \end{center} vielfältige Fehlermöglichkeiten in verteilten Anwendungen: -\begin{itemize} +\begin{itemize*} \item Kommunikations-/Netzwerkfehler: $\rightarrow$ Nachricht/Antwort gar nicht oder nur verzögert zugestellt \item Serverausfall: Nachricht empfangen? Operation ausgeführt? \item Clientausfall: Aufruf gültig? Bestätigung erhalten? \item Beispiel: Reisebuchung - \begin{itemize} - \item Buchung durchgeführt? Bestätigung erhalten? - \item Bei wiederholter Ausführung: wirklich neue Buchung? - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Buchung durchgeführt? Bestätigung erhalten? + \item Bei wiederholter Ausführung: wirklich neue Buchung? + \end{itemize*} +\end{itemize*} \subsubsection{Fehlerbehandlung in Erlang} -\begin{itemize} +\begin{itemize*} \item Timeout beim Warten auf Nachrichten - \begin{itemize} - \item Wenn keine passende Nachricht innerhalb \textbf{Time} msecs empfangen wird, dann wird der Rückgabewert des \textbf{after}-Ausdrucks verwendet. - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Wenn keine passende Nachricht innerhalb \textbf{Time} msecs empfangen wird, dann wird der Rückgabewert des \textbf{after}-Ausdrucks verwendet. + \end{itemize*} +\end{itemize*} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-030} \end{center} \subsubsection{Überwachung von Erlang-Prozessen} -\begin{itemize} +\begin{itemize*} \item Linking von Prozessen: \color{green}link\color{blue}(Pid) \color{black} \item M überwacht S; S bricht durch Fehler ab - \begin{center} - \centering - \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-031} - \end{center} - + \begin{center} + \centering + \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-031} + \end{center} + \item M wartet auf EXIT Nachricht von S $\rightarrow$ asynchroner Handler nötig -\end{itemize} +\end{itemize*} \subsubsection{on\_exit-Handler} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-032} \end{center} -\begin{itemize} +\begin{itemize*} \item überwacht den Prozess \textbf{Pid} auf Abbruch \item Anwendungsspezifische Reaktionen möglich - \begin{itemize} - \item Fehlermeldung - \item Neustart des Prozesses - \end{itemize} + \begin{itemize*} + \item Fehlermeldung + \item Neustart des Prozesses + \end{itemize*} \item auch über Erlang-Knotengrenzen hinweg! -\end{itemize}\clearpage +\end{itemize*}\clearpage \subsubsection{Anwendung des on\_exit-Handlers} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-033} \end{center} -\begin{itemize} +\begin{itemize*} \item Funktion anlegen (Liste in Atom konvertieren) \item Prozess erzeugen \item \textbf{on\_exit}-Handler definieren \item Fehler verursachen (Nachricht ist keine Liste) -\end{itemize} +\end{itemize*} \subsubsection{Fehlersemantiken} Umgang mit Fehlern (Timeouts, Ausfälle) -\begin{itemize} +\begin{itemize*} \item \color{orange} Maybe: \color{black} - \begin{itemize} - \item keine Wiederholung - \item keine Ausführungsgarantie - \end{itemize} + \begin{itemize*} + \item keine Wiederholung + \item keine Ausführungsgarantie + \end{itemize*} \item \color{orange} At-least-once: \color{black} - \begin{itemize} - \item wiederholte Ausführung, aber keine Erkennung von Nachrichtenduplikaten - \item nur für idempotente Optionen (Lesen) - \end{itemize} + \begin{itemize*} + \item wiederholte Ausführung, aber keine Erkennung von Nachrichtenduplikaten + \item nur für idempotente Optionen (Lesen) + \end{itemize*} \item \color{orange} At-most-once: \color{black} - \begin{itemize} - \item garantiert, dass mehrfache Aufrufe nur zu einziger Ausführung führen - \item z.B. durch Sequenznummern (erfordert Protokollierung zur Duplikatelliminierung) - \item für nicht-idempotente Operationen (schreibend, z.B. Einfügen, Löschen) - \end{itemize} -\end{itemize}\clearpage + \begin{itemize*} + \item garantiert, dass mehrfache Aufrufe nur zu einziger Ausführung führen + \item z.B. durch Sequenznummern (erfordert Protokollierung zur Duplikatelliminierung) + \item für nicht-idempotente Operationen (schreibend, z.B. Einfügen, Löschen) + \end{itemize*} +\end{itemize*}\clearpage \subsubsection{Auftragsorientierte Modelle} -\begin{itemize} +\begin{itemize*} \item klassische Modell serviceorientierten Systemdesigns \item in verteilten Systemen: - \begin{itemize} - \item Menge von Dienstanbietern (Server) - \item Menge von Clients, die diese Dienste nutzen wollen - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Menge von Dienstanbietern (Server) + \item Menge von Clients, die diese Dienste nutzen wollen + \end{itemize*} +\end{itemize*} Typische Anwendungsszenarien -\begin{itemize} +\begin{itemize*} \item \textbf{DB-Server}: verwalten Datenbestände, verarbeiten SQL Anfragen - \begin{itemize} - \item Clients: "Gib mir alle Personen, die älter als 18 Jahre alt sind" - \end{itemize} + \begin{itemize*} + \item Clients: "Gib mir alle Personen, die älter als 18 Jahre alt sind" + \end{itemize*} \item \textbf{Web}: Webserver stellt HTML Dokumente bereit, Brwoser ruft URLs für Dokumente auf \item \textbf{E-Mail}: Mailserver verwalten Postfächer, leiten Mails weiter, Outlook/Thunderbird/…senden/lesen von Emails \item Namensdienste (DNS), Fileserver, Zeitserver (NTP) -\end{itemize} +\end{itemize*} \subsubsection{Auftragsorientierte Modelle: Modellsicht} -\begin{itemize} +\begin{itemize*} \item Rollenmodell: Clients erteilen Aufträge an Server \item Datenmodell: Notschaften mit vereinbarter Struktur (Protokoll) -\end{itemize} +\end{itemize*} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-034} \end{center} -\begin{itemize} +\begin{itemize*} \item Fehlersemantiken: Was ist der Grund, wenn ich keine Antwort erhalte? - \begin{itemize} - \item Auftrag angekommen? Vollständig bearbeitet? - \item Was passiert wenn ein Auftrag wiederholt wird? - \end{itemize} + \begin{itemize*} + \item Auftrag angekommen? Vollständig bearbeitet? + \item Was passiert wenn ein Auftrag wiederholt wird? + \end{itemize*} \item Terminierungssemantiken: - \begin{itemize} - \item Auftragserteilung in der Regel synchron - \item es existieren aber auch asynchrone Aufträge - \end{itemize} -\end{itemize}\clearpage + \begin{itemize*} + \item Auftragserteilung in der Regel synchron + \item es existieren aber auch asynchrone Aufträge + \end{itemize*} +\end{itemize*}\clearpage \subsubsection{Auftragsorientierte Modelle: Implementierung} -\begin{itemize} +\begin{itemize*} \item Implementierung aufbauend auf send/receive -\end{itemize} +\end{itemize*} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-035} @@ -6780,164 +6630,164 @@ Typische Anwendungsszenarien \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-036} \end{center} \subsubsection{Erläuterungen zum Server} -\begin{itemize} +\begin{itemize*} \item Zeile 1 \& 2: Serversocket erstellen, lauscht auf Port 4242, wartet blockierend bis sich ein Client verbindet \item Zeile 6: lies eine Zeile vom Client \item Zeile 7: unser Nachrichtenformat: \textbf{Operation $<$Leerzeichen$>$ Dateipfad} \item Zeile 8ff: unterscheide Operationen und führe Aktionen aus; antworte dem Client entsprechend -\end{itemize} +\end{itemize*} \subsubsection{Ein Fileserver in Java - Client} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-037} \end{center} -\begin{itemize} +\begin{itemize*} \item Zeile 1: erstelle Clientsocket, d.h. Verbindungsaufbau zum Server auf localhost auf Port 4242 \item Zeile 2: lese Befehl und Dateipfad \item Zeile 4: sende Befehl als String an den Server \item Zeile 6ff: lese alle Antwortzeilen vom Server; Ausgabe auf dem Bildschirm -\end{itemize} +\end{itemize*} \subsubsection{Auftragsorientierte Modelle} -\begin{itemize} +\begin{itemize*} \item Können benutzt werden, um einfache Protokolle zu implementieren \item Binär oder ASCII - \begin{itemize} - \item auch Übertragung komplexer Objekte möglich - \end{itemize} + \begin{itemize*} + \item auch Übertragung komplexer Objekte möglich + \end{itemize*} \item gesendeter Befehl könnte einer Methode/Funktion auf dem Server entsprechen - \begin{itemize} - \item es erfolgt eine Art entfernter Funktionsaufruf - \item RPC wird im nächsten Abschnitt behandelt - \end{itemize} + \begin{itemize*} + \item es erfolgt eine Art entfernter Funktionsaufruf + \item RPC wird im nächsten Abschnitt behandelt + \end{itemize*} \item Funktionalität kann über das Internet angeboten werden - \begin{itemize} - \item[$\Rightarrow$] Implementierung eines Webservices - \end{itemize} -\end{itemize} + \begin{itemize*} + \item[$\Rightarrow$] Implementierung eines Webservices + \end{itemize*} +\end{itemize*} \subsubsection{Webservices - Allgemein} -\begin{itemize} +\begin{itemize*} \item WebService: Dienst, der über das Internet/WWW von Clients angesprochen werden kann \item typischerweise über HTTP \item Früher \textbf{SOAP}: Simple Object Access Protocol - \begin{itemize} - \item Protokoll zum Austausch von Informationen in XML - \item Verzeichnisdienste zum Finden von Diensten, z.B. UDDI - \end{itemize} + \begin{itemize*} + \item Protokoll zum Austausch von Informationen in XML + \item Verzeichnisdienste zum Finden von Diensten, z.B. UDDI + \end{itemize*} \item Heute \textbf{REST} -\end{itemize} +\end{itemize*} \subsubsection{REST} -\begin{itemize} +\begin{itemize*} \item Die Grundidee von REST: - \begin{itemize} - \item \textbf{REST}: Representional State Transfer - \item oftmals existiert ein HTTP Server / Anwendungsserver schon - \item Idee: Jede Ressource die vom Server angeboten wird, ist durch eine URI beschrieben/identifiziert - \begin{itemize} - \item Datei, ein Eintrag in einer Datenbank, Tweet,… - \end{itemize} - \item Anlegen, Lesen, Verändern, Löschen (CRUD) - \begin{itemize} - \item Art der Operation über HTTP Request-Typ festlegen (POST, GET, PUT, DELETE) - \end{itemize} - \item Unabhängigkeit von verwendeter Programmiersprache in Client und Server durch HTTP und Textformate - \end{itemize} -\end{itemize} + \begin{itemize*} + \item \textbf{REST}: Representional State Transfer + \item oftmals existiert ein HTTP Server / Anwendungsserver schon + \item Idee: Jede Ressource die vom Server angeboten wird, ist durch eine URI beschrieben/identifiziert + \begin{itemize*} + \item Datei, ein Eintrag in einer Datenbank, Tweet,… + \end{itemize*} + \item Anlegen, Lesen, Verändern, Löschen (CRUD) + \begin{itemize*} + \item Art der Operation über HTTP Request-Typ festlegen (POST, GET, PUT, DELETE) + \end{itemize*} + \item Unabhängigkeit von verwendeter Programmiersprache in Client und Server durch HTTP und Textformate + \end{itemize*} +\end{itemize*} \subsubsection{Anforderungen an Ressourcen} Anforderungen an Ressourcen nach Fielding: -\begin{enumerate} +\begin{enumerate*} \item Adressierbarkeit: jede Ressource muss über URI adressierbar sein (Achtung: URI != URL, Identifier vs. Locator) \item Zustandslosigkeit: Kommunikation zwischen Client und Server hat keinen Zustand (Session/Cookie) - \begin{itemize} - \item bei jeder Anfrage werden alle Informationen gesendet - \end{itemize} + \begin{itemize*} + \item bei jeder Anfrage werden alle Informationen gesendet + \end{itemize*} \item Einheitliche Schnittstelle: über HTTP Standardmethoden auf Ressourcen zugreifen \item Entkopplung von Ressource und Repräsentation: Ressourcen können in verschiedenen Formaten angeboten werden (JSON, XML,…) -\end{enumerate} +\end{enumerate*} \subsubsection{HTTP Methoden für REST} -\begin{itemize} +\begin{itemize*} \item selbe URL mit verschiedenen Methoden aufrufbar \item Methode bestimmt ausgeführte Aktion auf dem Server -\end{itemize} -\begin{itemize} +\end{itemize*} +\begin{itemize*} \item[GET:] eine Ressource lese, Daten sollten nicht verändert werden \item[POST:] neue Ressource erstellen - \begin{itemize} - \item Die URI ist dem Anrufer zunächst unbekannt - \item Der Server kann dem Anrufer die erzeugte URI in der Antwort mitteilen - \end{itemize} + \begin{itemize*} + \item Die URI ist dem Anrufer zunächst unbekannt + \item Der Server kann dem Anrufer die erzeugte URI in der Antwort mitteilen + \end{itemize*} \item[PUT:] neue Ressource erstellen, oder existierende bearbeiten \item[DELETE:] zum Löschen von Ressourcen -\end{itemize} +\end{itemize*} \subsubsection{REST - Beispiel} Spotify API -\begin{itemize} +\begin{itemize*} \item \textbf{Authorization}-Header benötigt \item \textbf{id}: Spotify-ID eines Künstlers -\end{itemize} +\end{itemize*} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-038} \end{center} \subsubsection{Implementierung von RESTful Webservices} -\begin{itemize} +\begin{itemize*} \item manuelle Implementierung recht aufwändig - \begin{itemize} - \item unterscheiden von HTTP Methoden (GET, POST,…) - \item parsen/prüfen von URL Pfaden und Parametern - \item setzen von Antwortheadern \& Kodierung in XML/JSON - \end{itemize} + \begin{itemize*} + \item unterscheiden von HTTP Methoden (GET, POST,…) + \item parsen/prüfen von URL Pfaden und Parametern + \item setzen von Antwortheadern \& Kodierung in XML/JSON + \end{itemize*} \item REST Frameworks erleichtern die Arbeit deutlich - \begin{itemize} - \item JAX-RS Spezifikation für Java zur Erstellung von RESTful Services - \begin{itemize} - \item Implementierung: Jersey: https://eclipse-ee4j.github.io/jersey/ - \item Implementierung: Spring: - https://spring.io/guides/gs/rest-service/ - \end{itemize} - \item Microsofts \textbf{cpprestsdk} für C++ als Client-Bibliothek: - https://github.com/Microsoft/cpprestsdk - \end{itemize} -\end{itemize} -\begin{itemize} + \begin{itemize*} + \item JAX-RS Spezifikation für Java zur Erstellung von RESTful Services + \begin{itemize*} + \item Implementierung: Jersey: https://eclipse-ee4j.github.io/jersey/ + \item Implementierung: Spring: + https://spring.io/guides/gs/rest-service/ + \end{itemize*} + \item Microsofts \textbf{cpprestsdk} für C++ als Client-Bibliothek: + https://github.com/Microsoft/cpprestsdk + \end{itemize*} +\end{itemize*} +\begin{itemize*} \item Beispiel: Jersey \item Definition einer einfachen Klasse - \begin{itemize} - \item Einstellungen über Annotationen - \item Klasse muss als Servlet in einem Applicationserver ausgeführt werden - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Einstellungen über Annotationen + \item Klasse muss als Servlet in einem Applicationserver ausgeführt werden + \end{itemize*} +\end{itemize*} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-039} \end{center} \subsubsection{Restful Webservice - Erläuterungen} -\begin{itemize} +\begin{itemize*} \item Zeile 1: dieser Dienst ist über den Pfad files erreichbar, - z.B. http://localhost/files + z.B. http://localhost/files \item Zeile 3: die nachfolgende Methode soll HTTP GET Anfragen - verarbeiten + verarbeiten \item Zeile 4: die URL enthält den Dateinamen als - Pfad-Bestandteil, z.B. - http://localhost/files/myfile.txt + Pfad-Bestandteil, z.B. + http://localhost/files/myfile.txt \item Zeile 5: Hinweis an das Jersey-Framework das Ergebnis - automatisch ins JSON Format umzuwandeln + automatisch ins JSON Format umzuwandeln \item Zeile 6: normale Definition einer Methode \& Mapping des - Eingabeparameters auf den URL-Parameter + Eingabeparameters auf den URL-Parameter \item Zeile 8: das infos Objekt vom Typ FileInfo wird - automatisch als JSON repräsentiert -\end{itemize} + automatisch als JSON repräsentiert +\end{itemize*} \subsubsection{Aufruf von REST-Services} https://reques.in kostenloser Dienst zum Testen von REST-Clients -\begin{itemize} +\begin{itemize*} \item Variante 1: telnet reques.in 80 … \item Variante 2: Auf der Kommandozeile \newline - \$ curl https://reqres.in/api/users/1 - \begin{center} - \centering - \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-040} - \end{center} + \$ curl https://reqres.in/api/users/1 + \begin{center} + \centering + \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-040} + \end{center} \item Variante 3: Aufruf in einem Programm -\end{itemize}\clearpage +\end{itemize*}\clearpage \subsubsection{HTTP GET Aufrufe in Java} In Java ab Version 11 eingebauter HTTP Client \begin{center} @@ -6956,35 +6806,35 @@ Antwort: \end{center} Eigentlich: JSON Ergebnis mit geeigneten Frameworks parsen und weiterverarbeiten \subsubsection{Zusammenfassung} -\begin{itemize} +\begin{itemize*} \item Auftragsorientierte Modelle nach dem Client-Server Prinzip \item WebServices bieten Dienste über das WWW an \item RESTful WebServices - \begin{itemize} - \item jede Ressource hat eine URI - \item HTTP Methoden für Aktionen auf Ressourcen - \item unabhängig von Programmiersprachen - \end{itemize} -\end{itemize} + \begin{itemize*} + \item jede Ressource hat eine URI + \item HTTP Methoden für Aktionen auf Ressourcen + \item unabhängig von Programmiersprachen + \end{itemize*} +\end{itemize*} \subsubsection{Funktionsaufrufbasierte Protokolle} -\begin{itemize} +\begin{itemize*} \item Grundidee: Adaption von anwendungsnahen und unkomplizierten Kommunikationsparadigmen an Eigenschaften verteilter Systeme \item d.h., aus Aufrufen auf lokalen Prozeduren und Methoden werden Aufrufe entfernter Prozeduren und Methoden \item bekannt als: - \begin{itemize} - \item RPC: Remote Procedure Calls - \item oder Java RMI: Remote Method Invocation - \end{itemize} + \begin{itemize*} + \item RPC: Remote Procedure Calls + \item oder Java RMI: Remote Method Invocation + \end{itemize*} \item Erlang und Java haben die Konzepte nativ implementiert, in C++ nur über zusätzliche Bibliotheken -\end{itemize} +\end{itemize*} \subsubsection{Eigenschaften von Prozedurfernaufrufen} Aufruf und Ausführung in unterschiedlichen Umgebungen/Kontexten -\begin{itemize} +\begin{itemize*} \item Programmiersprachen \item Namens- und Adressräume \item Betriebssystemkontext \item Hardwarekontext -\end{itemize} +\end{itemize*} Woher kennt der Aufrufer die Signatur der Prozedur auf dem Server? $\Rightarrow$ \color{orange} Stubs \color{black} \begin{center} \centering @@ -6992,48 +6842,48 @@ Woher kennt der Aufrufer die Signatur der Prozedur auf dem Server? $\Rightarrow$ \end{center} \subsubsection{RPC: Stubs} Ein Stub hat verschiedene Aufgaben: -\begin{itemize} +\begin{itemize*} \item wandelt lokalen Prozeduraufruf in Netzwerkfunktion um \item Ein- und Auspacken von Argumenten und Ergebnissen \item Anpassung von Datenrepräsentationen \item implementiert Übertragungsprotokoll über das Netzwerk -\end{itemize} +\end{itemize*} Der Server-Stub/Skeleton -\begin{itemize} +\begin{itemize*} \item wartet auf Anfragen von Clients \item übernimmt sonst gleiche Aufgaben wie Client-Stub -\end{itemize} +\end{itemize*} \subsubsection{RPC in Erlang} -\begin{itemize} +\begin{itemize*} \item Vordefiniertes Erlang-Modul für RPC - \begin{center} - \centering - \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-045} - \end{center} + \begin{center} + \centering + \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-045} + \end{center} \item führt \textbf{Module:Func(Args)} auf \textbf{Node} aus - \begin{itemize} - \item weitere Funktionen für asynchrone Aufrufe, Aufrufe von mehreren Servern - \end{itemize} - \begin{center} - \centering - \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-046} - \end{center} + \begin{itemize*} + \item weitere Funktionen für asynchrone Aufrufe, Aufrufe von mehreren Servern + \end{itemize*} + \begin{center} + \centering + \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-046} + \end{center} \item andere Möglichkeit: eigene Funktionen über \textbf{register} anmelden (siehe Alternating Bit Protokoll) \item mit \textbf{whereis} PID von registrierten Erlang-Prozessen finden -\end{itemize} +\end{itemize*} \subsubsection{RMI: Javas RPC Variante} -\begin{itemize} +\begin{itemize*} \item seit Java 5 nativ in die Sprache eingebaut - keine explizite Generierung von Stubs notwendig \item Aufruf von Objektmethoden: - \begin{itemize} - \item Server: Objekte mit Zuständen - \item Objekte können als Methoden-Argumente und Ergebnisse verwendet werden - \end{itemize} + \begin{itemize*} + \item Server: Objekte mit Zuständen + \item Objekte können als Methoden-Argumente und Ergebnisse verwendet werden + \end{itemize*} \item entfernt aufrufbare Methoden in einem Java-interface definieren - \begin{itemize} - \item abgeleitet von \textbf{java.rmi.Remote} - \end{itemize} -\end{itemize} + \begin{itemize*} + \item abgeleitet von \textbf{java.rmi.Remote} + \end{itemize*} +\end{itemize*} \subsubsection{RMI - Schnittstelle für entfernte Objekte} \begin{center} \centering @@ -7041,11 +6891,11 @@ Der Server-Stub/Skeleton \end{center}\clearpage \subsubsection{RMI: Server} Server-Objekt muss: -\begin{itemize} +\begin{itemize*} \item Remote-Schnittstelle implementieren \item im RMI-Laufzeitsystem bekannt gemacht werden \item im Namensverzeichnis registriert werden -\end{itemize} +\end{itemize*} Server-Objekt anlegen: \begin{center} \centering @@ -7057,11 +6907,11 @@ Server-Objekt anlegen: \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-049} \end{center}\clearpage \subsubsection{RMI - Client} -\begin{itemize} +\begin{itemize*} \item über Namensdienst Server-Objekt finden \item Stub erzeugen (erfolgt automatisch von JVM) \item Methode auf dem Server-Objekt aufrufen -\end{itemize} +\end{itemize*} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-050} @@ -7073,29 +6923,29 @@ Server-Objekt anlegen: \end{center} \subsubsection{Interoperabilität von RPC} Problem von Erlang, Java RMI, etc.: -\begin{itemize} +\begin{itemize*} \item an Programmiersprache gebunden $\rightarrow$ verschiedene Systeme können nicht miteinander verbunden werden -\end{itemize} +\end{itemize*} Lösungsansätze: -\begin{itemize} +\begin{itemize*} \item \textbf{XML-RPC, JSON-RPC}: kodiere alle zum Aufruf nötigen Informationen als XML bzw. JSON - \begin{itemize} - \item HTTP zur Übertragung - \item \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-052} - \item \textbf{id} für die Zuordnung von Antworten zu Anfragen - \end{itemize} + \begin{itemize*} + \item HTTP zur Übertragung + \item \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-052} + \item \textbf{id} für die Zuordnung von Antworten zu Anfragen + \end{itemize*} \item \textbf{gRPC}: Code-Generierung für Server, Stubs und ausgetauschte Daten -\end{itemize} +\end{itemize*} \subsubsection{gRPC} -\begin{itemize} +\begin{itemize*} \item initiiert von Google im Jahr 2015 \item plattformunabhängige Beschreibung von Daten und Diensten -\end{itemize} +\end{itemize*} \color{orange} \textbf{gRPC} \color{black} -\begin{itemize} +\begin{itemize*} \item ProtoBuf Dateien übersetzt in konkrete Programmiersprache \item C/C++, Java, Python, GO, uvm. -\end{itemize} +\end{itemize*} \begin{center} \centering \includegraphics[width=0.45\linewidth]{Assets/Programmierparadigmen-053} @@ -7107,29 +6957,29 @@ fileservice.proto \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-054} \end{center}\clearpage \subsubsection{gRPC: Dienstbeschreibung - Erläuterungen} -\begin{itemize} +\begin{itemize*} \item Datenklasse \textbf{FileInfo} mit drei Attributen, Zahlen geben Reihenfolge bei Serialisierung an \item \textbf{Request:} Service darf nur eine Eingabe- und Ausgabe-Message haben - \begin{itemize} - \item extra Typen für Parameter und Ergebnis erlauben einfache Erweiterung ohne Signaturen zu ändern - \end{itemize} + \begin{itemize*} + \item extra Typen für Parameter und Ergebnis erlauben einfache Erweiterung ohne Signaturen zu ändern + \end{itemize*} \item \textbf{FileService:} Klasse die unseren Dienst darstellt; enthält eine Methode \textbf{GetDetail} die von Clients aufgerufen werden kann -\end{itemize} +\end{itemize*} \subsubsection{gRPC: Dienstbeschreibung} -\begin{itemize} +\begin{itemize*} \item *.proto Dateien werden mittels protoc Compiler in die Zielsprache übersetzt - \begin{center} - \centering - \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-055} - \end{center} + \begin{center} + \centering + \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-055} + \end{center} \item erzuegt C++ Dateien für messages sowie Service-Klassen (FileService) \item Klasse \textbf{FileService} enthält generierten Stub und Methoden für den Server zum überschreiben -\end{itemize} +\end{itemize*} \subsubsection{gRPC: Server erzeugen} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-056} -\end{center} +\end{center} \subsubsection{gRPC: Server starten} \begin{center} \centering @@ -7141,139 +6991,139 @@ fileservice.proto \includegraphics[width=0.65\linewidth]{Assets/Programmierparadigmen-058} \end{center} \subsubsection{Zusammenfassung} -\begin{itemize} +\begin{itemize*} \item Funktionsaufrufbasierte Modelle: - \newline Prozedur/Funktion/Methode auf einem entfernten Host aufrufen + \newline Prozedur/Funktion/Methode auf einem entfernten Host aufrufen \item Stubs kapseln Kommunikationsoperationen von Anwendung \item einheitliches Dateiformat notwendig \item Java RMI \item gRPC für Interoperabilität verschiedener Plattformen/Sprachen -\end{itemize} +\end{itemize*} \subsection{Weitere Kommunikationsmodelle und Cloud-Computing} \subsubsection{Blackboards} -\begin{itemize} +\begin{itemize*} \item das "schwarze Brett": Teilnehmer hinterlegen - \begin{itemize} - \item Gesuche und Angebote - \item Aufträge und Ergebnisse - \end{itemize} + \begin{itemize*} + \item Gesuche und Angebote + \item Aufträge und Ergebnisse + \end{itemize*} \item zeitliche und räumliche Entkopplung autonomer und anonymer Komponenten \item implementiert zum Beispiel in JavaSpaces -\end{itemize} +\end{itemize*} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-059} \end{center} \subsubsection{Blackboards: Modell-Sicht} -\begin{itemize} +\begin{itemize*} \item Rollenmodell: - \begin{itemize} - \item Spezialist (Worker): aktiver Nutzer (Anbieter, Suchender, Bearbeiter) - \item Moderator: optionale Kontrollkomponente - \begin{itemize} - \item delegiert Arbeit nach bestimmter Strategie an Spezialisten - - \end{itemize} - \end{itemize} + \begin{itemize*} + \item Spezialist (Worker): aktiver Nutzer (Anbieter, Suchender, Bearbeiter) + \item Moderator: optionale Kontrollkomponente + \begin{itemize*} + \item delegiert Arbeit nach bestimmter Strategie an Spezialisten + + \end{itemize*} + \end{itemize*} \item Datenmodell: - \begin{itemize} - \item globaler virtueller persistenter Speicher - \item allgemein: Tupel \textbf{$$} - \item Methoden zum Lesen, Schreiben, Aktualisieren, Löschen - \end{itemize} + \begin{itemize*} + \item globaler virtueller persistenter Speicher + \item allgemein: Tupel \textbf{$$} + \item Methoden zum Lesen, Schreiben, Aktualisieren, Löschen + \end{itemize*} \item Fehler- und Terminierungssemantiken: - \begin{itemize} - \item als verlässliche und unverlässliche Variante umsetzbar - \item Kommunikationsoperationen i.d.R asynchron - \end{itemize} -\end{itemize} + \begin{itemize*} + \item als verlässliche und unverlässliche Variante umsetzbar + \item Kommunikationsoperationen i.d.R asynchron + \end{itemize*} +\end{itemize*} \subsubsection{Blackboards: Vor- und Nachteile} -\begin{itemize} +\begin{itemize*} \item Vorteile - \begin{itemize} - \item Offenheit: neue Spezialistentypen möglich - \item gute Lastskalierbarkeit: mehr Spezialisten hinzufügen - \item Interoperabilität durch gemeinsame Tupeldefinition - \item Anonymität + Kommunikationskontrolle - \item Fehlertoleranz: redundante Spezialisten - \item Nutzung von Nebenläufigkeit für Spezialisten - \end{itemize} + \begin{itemize*} + \item Offenheit: neue Spezialistentypen möglich + \item gute Lastskalierbarkeit: mehr Spezialisten hinzufügen + \item Interoperabilität durch gemeinsame Tupeldefinition + \item Anonymität + Kommunikationskontrolle + \item Fehlertoleranz: redundante Spezialisten + \item Nutzung von Nebenläufigkeit für Spezialisten + \end{itemize*} \item Nachteile - \begin{itemize} - \item Synchronisation der Schreibzugriffe am Board - \item Moderator potentieller Engpass - \item Board und Moderator sind potentielle Single Point of Failures - \item erschwerte Testbarkeit durch Asynchronität, Nichtdeterminismus - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Synchronisation der Schreibzugriffe am Board + \item Moderator potentieller Engpass + \item Board und Moderator sind potentielle Single Point of Failures + \item erschwerte Testbarkeit durch Asynchronität, Nichtdeterminismus + \end{itemize*} +\end{itemize*} \subsubsection{Ereignisbasierte Modelle} -\begin{itemize} +\begin{itemize*} \item Asynchronität von Blackboards nicht immer hilfreich - \begin{itemize} - \item Niemand weiß, wann etwas an das Board gepinnt wird - \item warten auf bestimmte Tupel (nur Angebote von Mountainbikes) ist umständlich - \end{itemize} + \begin{itemize*} + \item Niemand weiß, wann etwas an das Board gepinnt wird + \item warten auf bestimmte Tupel (nur Angebote von Mountainbikes) ist umständlich + \end{itemize*} \item Börsen, Nachrichtenagenturen, Replikationssysteme sind an bestimmten Themen/Ereignissen interessiert \item Ereignisbasierte Modelle: - \begin{itemize} - \item nutzen ebenfalls autonome und anonyme Komponenten - \item verfügen zusätzlich über asynchrone Benachrichtigung über Veränderung - \end{itemize} -\end{itemize} + \begin{itemize*} + \item nutzen ebenfalls autonome und anonyme Komponenten + \item verfügen zusätzlich über asynchrone Benachrichtigung über Veränderung + \end{itemize*} +\end{itemize*} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-060} \end{center} \subsubsection{Ereignisbasierte Modelle: Modell-Sicht} -\begin{itemize} +\begin{itemize*} \item Rollenmodell: - \begin{itemize} - \item Herausgeber (Publisher): registriert Abonnenten und ihre Interesse an bestimmten Themen, meldet Ereignisse an Abonnenten - \item Abonnent (Subscriber): abonniert Themen bei Herausgebern, erhält passende Ereignisse zugeteilt - \item Agentur: optionale Abonnementverwaltung, Anonymisierung, zeitliche und räumliche Entkopplung - \end{itemize} + \begin{itemize*} + \item Herausgeber (Publisher): registriert Abonnenten und ihre Interesse an bestimmten Themen, meldet Ereignisse an Abonnenten + \item Abonnent (Subscriber): abonniert Themen bei Herausgebern, erhält passende Ereignisse zugeteilt + \item Agentur: optionale Abonnementverwaltung, Anonymisierung, zeitliche und räumliche Entkopplung + \end{itemize*} \item Datenmodell: - \begin{itemize} - \item allgemein: Tupel, z.B. $$ - \item aber auch problemspezifischer Ausprägungen - \item Methoden: Melden (notify/publish), Abonnieren (subscribe/unsubscribe) - \item Ankündigen/Aktualisieren von Ereignisreportoires (advertise/unadvertise) - \end{itemize} + \begin{itemize*} + \item allgemein: Tupel, z.B. $$ + \item aber auch problemspezifischer Ausprägungen + \item Methoden: Melden (notify/publish), Abonnieren (subscribe/unsubscribe) + \item Ankündigen/Aktualisieren von Ereignisreportoires (advertise/unadvertise) + \end{itemize*} \item Fehler- und Terminierungssemantiken: - \begin{itemize} - \item Ankündigungen/Aktualisieren i.d.R. verlässlich, daher synchron - \item Melden unverlässlich, da Abonnenten ausgefallen sein können, daher asynchron - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Ankündigungen/Aktualisieren i.d.R. verlässlich, daher synchron + \item Melden unverlässlich, da Abonnenten ausgefallen sein können, daher asynchron + \end{itemize*} +\end{itemize*} \subsubsection{Ereignisbasierte Modelle: Vor- und Nachteile} -\begin{itemize} +\begin{itemize*} \item Vorteile: - \begin{itemize} - \item wie Blackboards, plus - \item direkte Benachrichtigungen bei gesuchten Ereignissen/Themen - \end{itemize} + \begin{itemize*} + \item wie Blackboards, plus + \item direkte Benachrichtigungen bei gesuchten Ereignissen/Themen + \end{itemize*} \item Nachteile: - \begin{itemize} - \item erhebliche Management-Last beim Vermittler - \begin{itemize} - \item potentieller Engpass, SPoF - es sei denn… - \end{itemize} - \end{itemize} - Variante: mehrere Vermittler-Instanzen parallel und verteilt in einer Clusterumgebung - \begin{itemize} - \item RabbitMQ, Apache Kafka, Apache ActiveMQ - \end{itemize} -\end{itemize} + \begin{itemize*} + \item erhebliche Management-Last beim Vermittler + \begin{itemize*} + \item potentieller Engpass, SPoF - es sei denn… + \end{itemize*} + \end{itemize*} + Variante: mehrere Vermittler-Instanzen parallel und verteilt in einer Clusterumgebung + \begin{itemize*} + \item RabbitMQ, Apache Kafka, Apache ActiveMQ + \end{itemize*} +\end{itemize*} \subsubsection{Beispiel: RabbitMQ} RabbitMQ -\begin{itemize} +\begin{itemize*} \item ist ein Message-Broker, dh. Vermittlersystem für Nachrichten zwischen Publishern und Subscriber \item implementiert in Erlang - \begin{itemize} - \item Topic ist eine Liste von Wörtern, durch Punkte getrennt - \item Wildcards möglich, * ersetzt genau ein Wort, \# ersetzt mehrere Wörter - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Topic ist eine Liste von Wörtern, durch Punkte getrennt + \item Wildcards möglich, * ersetzt genau ein Wort, \# ersetzt mehrere Wörter + \end{itemize*} +\end{itemize*} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-061} @@ -7283,77 +7133,77 @@ RabbitMQ \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-062} \end{center} -\begin{itemize} +\begin{itemize*} \item Zeilen 7,8: \textbf{ConnectionFactory} zum Handling von Verbindungen, im Beispiel nur auf dem lokalen Host \item Zeilen 9,10: erstelle neue Verbindungen und einen Channel \item Zeile 11: Nachrichten sollen anhand des Topics zugestellt werden \item Zeile 13: veröffentliche eine Nachricht: sende an den Exchange "rmq\_test" eine Nachricht mit dem Topic \textbf{uni.ilm.dbis} und dem Inhalt "Hallo Welt". - \begin{itemize} - \item \textbf{null} hier für eventuelle weitere Einstellungen - \end{itemize} -\end{itemize} + \begin{itemize*} + \item \textbf{null} hier für eventuelle weitere Einstellungen + \end{itemize*} +\end{itemize*} \subsubsection{RabbitMQ Subscribe} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-063} \end{center} -\begin{itemize} +\begin{itemize*} \item Zeilen 1\&2: Connection und Channel erstellen, siehe vorherige Bilder \item Zeilen 4-6: Queue erzeugen und auf Topics registrieren \item Zeilen 8-13: Java-Lambda Funktion anlegen, wird für jede eintreffende Nachricht aufgerufen \item Zeilen 15\&16: Warte auf der erzeugten Queue auf Nachrichten - \begin{itemize} - \item durch \textbf{true} Parameter wird ankommende Nachricht mit \textbf{ACK} quittiert - \item zweite anonyme Funktion für Handling von Abbrüchen - \end{itemize} -\end{itemize} + \begin{itemize*} + \item durch \textbf{true} Parameter wird ankommende Nachricht mit \textbf{ACK} quittiert + \item zweite anonyme Funktion für Handling von Abbrüchen + \end{itemize*} +\end{itemize*} \subsection{Cloud Computing} \subsubsection{Cloud Computing} -\begin{itemize} +\begin{itemize*} \item Verteilte Systeme benötigen oftmals viele Knoten \item Administration der Systeme erfordert viel Aufwand \item Hardware, Betriebssystem und Anwendungssoftware veralten schnell \item hohe Kosten, aber Systeme oftmals nicht voll ausgelastet \item Grundidee: einmal eingerichtete Hardware, durch Virtualisierung mehreren Kunden zugänglich machen \item Zugriff über das Internet -\end{itemize} +\end{itemize*} \subsubsection{Cloud Computing: Arten und Ziele} \noindent Arten von Clouds -\begin{itemize} +\begin{itemize*} \item Public Cloud: für jeden zugängliche Ressourcen \item Private Cloud: z.B. in Unternehmen im eigenen Netzwerk \item Community Cloud: Cloud-Umgebung wird von mehreren (festgelegten) Gruppen/Organisationen geteilt \item Hybrid Cloud: private Clouds, aber für Skalierbarkeit auch Ressourcen von Public Clouds nutzen -\end{itemize} +\end{itemize*} Ziele -\begin{itemize} +\begin{itemize*} \item Auslastung der physischen Hardware durch Virtualisierung $\Rightarrow$ Umsatzsteigerung \item für Kunden - \begin{itemize} - \item hohe Verfügbarkeit, Skalierbarkeit - \item keine Anschaffungs-, geringere Administrationskosten - \end{itemize} -\end{itemize} + \begin{itemize*} + \item hohe Verfügbarkeit, Skalierbarkeit + \item keine Anschaffungs-, geringere Administrationskosten + \end{itemize*} +\end{itemize*} \subsubsection{Cloud Computing: Geschätsmodell} Cloud Computing als Geschäftsmodell: -\begin{itemize} +\begin{itemize*} \item Cloudprovider stellen Ressourcen bereit: - \begin{itemize} - \item persistente Speicher (HDDs, SSDs) - \item CPUs/RAM - \item spezialisierte Hardware (FPGAs, GPUs) - \item Software - \end{itemize} + \begin{itemize*} + \item persistente Speicher (HDDs, SSDs) + \item CPUs/RAM + \item spezialisierte Hardware (FPGAs, GPUs) + \item Software + \end{itemize*} \item verschiedene Maschinenvarianten - \begin{itemize} - \item Datenverarbeitungsoptimiert, - Arbeitsspeicheroptimiert, uvm. - \end{itemize} + \begin{itemize*} + \item Datenverarbeitungsoptimiert, + Arbeitsspeicheroptimiert, uvm. + \end{itemize*} \item Kunden starten dynamisch Instanzen der Maschinen/Software - \begin{itemize} - \item Bezahlung nur für genutzte Zeit ("pay-as-you-go") - \end{itemize} -\end{itemize}\clearpage + \begin{itemize*} + \item Bezahlung nur für genutzte Zeit ("pay-as-you-go") + \end{itemize*} +\end{itemize*}\clearpage \subsubsection{Cloud Computing: Architekturen} \begin{center} \centering @@ -7367,44 +7217,44 @@ Cloud Computing als Geschäftsmodell: Hinweis: Bei AWS, Google, Azure viele Dienste auch (dauerhaft) kostenlos nutzbar! \subsubsection{Microservices} -\begin{itemize} +\begin{itemize*} \item typische Anwendung hat verschiedene Komponenten (Suche, Buchungen/Warenkorb, Bezahlsystem, Bewertungssystem) \item monolithisch: alle Komponenten in einer Anwendung - \begin{itemize} - \item bei Bugfix/Update gesamte Anwendung aktualisieren und neu starten - \end{itemize} + \begin{itemize*} + \item bei Bugfix/Update gesamte Anwendung aktualisieren und neu starten + \end{itemize*} \item Ansatz Microservice: jede Komponente oder Funktionalität einer Anwendung als unabhängigen Dienst, läuft 24/7 \item Dienste mit unterschiedlichen Sprachen und Technologien umsetzbar \item unterstützt durch Virtualisierung und Cloud-Angebote, z.B. Serverless Computing -\end{itemize} +\end{itemize*} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-066} \end{center} \subsubsection{Serverless Computing} -\begin{itemize} +\begin{itemize*} \item wörtlich: "ohne Server" - \begin{itemize} - \item aber in Wirklichkeit: "es ist nicht dein Server" - \item Idee: Entwickler konzentriert sich auf (kleine Funktion) - \begin{itemize} - \item Function-as-a-Service (FaaS) - \end{itemize} - \item Laufzeitumgebung bzw. Cloud-Anbieter stellen Server und Konfiguration bereit - \item Ausführung der Funktion nach Bedarf - \item verschiedene Programmiersprachen unterstützt - \end{itemize} -\end{itemize} + \begin{itemize*} + \item aber in Wirklichkeit: "es ist nicht dein Server" + \item Idee: Entwickler konzentriert sich auf (kleine Funktion) + \begin{itemize*} + \item Function-as-a-Service (FaaS) + \end{itemize*} + \item Laufzeitumgebung bzw. Cloud-Anbieter stellen Server und Konfiguration bereit + \item Ausführung der Funktion nach Bedarf + \item verschiedene Programmiersprachen unterstützt + \end{itemize*} +\end{itemize*} Aufgaben des Entwicklers -\begin{itemize} +\begin{itemize*} \item schreibt nur auszuführenden Code \item konfiguriert Triggerereignisse - \begin{itemize} - \item REST Aufruf, neuer Eintrag in DB, Monitoring-Ereignis einer anderen Anwendung - \item $\Rightarrow$ Funktion läuft nur nach Eintreten des Triggers - \item optional: verknüpft z.B. weitere Funktion, die nach Beendigung ausgeführt wird - \end{itemize} -\end{itemize} + \begin{itemize*} + \item REST Aufruf, neuer Eintrag in DB, Monitoring-Ereignis einer anderen Anwendung + \item $\Rightarrow$ Funktion läuft nur nach Eintreten des Triggers + \item optional: verknüpft z.B. weitere Funktion, die nach Beendigung ausgeführt wird + \end{itemize*} +\end{itemize*} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-067} @@ -7412,41 +7262,41 @@ Aufgaben des Entwicklers AWS Lambda Designer: HTTP Trigger, auszuführende Funktion und Nachfolgefunktion. \subsubsection{Vergleich Microservice vs. Serverless} Micorservice: -\begin{itemize} +\begin{itemize*} \item Anwendung wird durch Dienste strukturiert \item Dienst hat einen Service Contract (Schnittstellendefinition) - \begin{itemize} - \item z.B. Portnummer, Antwortzeitgarantien, - \item unterstütze Anfragen und resultierende Antworten - \end{itemize} + \begin{itemize*} + \item z.B. Portnummer, Antwortzeitgarantien, + \item unterstütze Anfragen und resultierende Antworten + \end{itemize*} \item läuft kontinuierlich in einem eigenen (virtuellen) Knoten -\end{itemize} +\end{itemize*} Serverless -\begin{itemize} +\begin{itemize*} \item einzelne Funktionen; kleiner als ein ganzer Dienst \item wird nur nach Trigger ausgeführt \item kurze Lebenszeit; oft begrenzt durch den Anbieter -\end{itemize} +\end{itemize*} Mittlerweile auch Serverless Microservice: Microservice nicht immer ausführen, sondern nach Trigger \subsubsection{AWS Lambda: Java Beispiel} \begin{center} \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-068} \end{center} -\begin{itemize} +\begin{itemize*} \item \textbf{RequestHandler} als Einstiegspunkt für Lambda-Funktionen \item \textbf{handleRequest} wird von der Lambda-Umgebung aufgerufen -\end{itemize} +\end{itemize*} \subsubsection{Spring Functions} -\begin{itemize} +\begin{itemize*} \item neben AWS viele weitere Functions-Angebote \item Anbieter-spezifische API macht Migration schwierig \item zusätzliche Frameworks mit Plugins für konkrete Anbieter - \begin{itemize} - \item serverless.com - \item Spring Cloud Functions - \end{itemize} -\end{itemize} + \begin{itemize*} + \item serverless.com + \item Spring Cloud Functions + \end{itemize*} +\end{itemize*} \subsubsection{Spring Cloud Function: Projekt anlegen} \begin{center} \centering @@ -7458,36 +7308,36 @@ Projekt generieren, herunterladen und entpacken \centering \includegraphics[width=0.7\linewidth]{Assets/Programmierparadigmen-070} \end{center} -\begin{itemize} +\begin{itemize*} \item Zeile 1: für Spring Boot, diese Klasse enthält Definitionen für Dienste \item Zeilen 3-5: Ausführen der Klasse als Spring Applikation \item Zeile 7: Ergebnis der Methode als Bean behandeln - \begin{itemize} - \item Bean Objekt wird von Spring verwaltet, als serverless Funktion - \item durch \textbf{Spring Web} Funktionsname = REST Pfad - \end{itemize} + \begin{itemize*} + \item Bean Objekt wird von Spring verwaltet, als serverless Funktion + \item durch \textbf{Spring Web} Funktionsname = REST Pfad + \end{itemize*} \item Zeile 8ff: Methode \textbf{info} gibt eine Java Lambda-Funktion zurück - \begin{itemize} - \item Eingabe vom Typ \textbf{String} - \item Ergebnis vom Typ \textbf{FileInfo} - \end{itemize} -\end{itemize} + \begin{itemize*} + \item Eingabe vom Typ \textbf{String} + \item Ergebnis vom Typ \textbf{FileInfo} + \end{itemize*} +\end{itemize*} \subsubsection{Aufruf der Spring Cloud Funktion} -\begin{enumerate} +\begin{enumerate*} \item Projekt kompilieren \newline ./mvnw clean install \item Starten \newline - java - jar target/fileinfo-0.0.1-SNAPSHOT.jar + java - jar target/fileinfo-0.0.1-SNAPSHOT.jar \item Aufruf als normaler REST call - \newline curl localhost:8080/info -d myfile.txt - \newline Antwort - \newline \{"name":"myfile.txt","size":1234\} -\end{enumerate} + \newline curl localhost:8080/info -d myfile.txt + \newline Antwort + \newline \{"name":"myfile.txt","size":1234\} +\end{enumerate*} \subsubsection{Zusammenfassung} -\begin{itemize} +\begin{itemize*} \item Cloud-Angebote auf verschiedenen Ebenen (IaaS, PaaS, SaaS) \item Cloud \& Virtualisierung verringern Anschaffungs- und Administrationskosten \item Microservices: monolithische Anwendung in kleinere Dienste zerlegen \item Serverless: nur noch Funktion implementieren (FaaS) -\end{itemize} +\end{itemize*} \end{document} \ No newline at end of file