Slide 1

Slide 1 text

Strippen ziehen Nebenläufigkeit in modernen Programmiersprachen

Slide 2

Slide 2 text

Dinge gleichzeitig erledigen • Gegner und Gegenstände in einem Spiel bewegen • Anfragen von entfernten Computern beantworten • Ein komplexes Problem verteilt lösen

Slide 3

Slide 3 text

Wie gleichzeitig ist gleichzeitig? • Abhängig von verwendeter Soft- und Hardware • Fähigkeiten (Architektur) des Systems • Oft nur „gefühlt gleichzeitig“

Slide 4

Slide 4 text

• Früher… • Oberflächlich betrachtet… • Fäden ziehen… oder lieber noch warten?

Slide 5

Slide 5 text

Thomas Künneth, Snapp Mobile @[email protected] https://www.thomaskuenneth.de

Slide 6

Slide 6 text

• Früher… • Oberflächlich betrachtet… • Fäden ziehen… oder lieber noch warten?

Slide 7

Slide 7 text

1980er • Ära der Home Computer • Einfach gestrickte Hardware • Maschinen sehr langsam • „Betriebssystem“ Kombination aus BASIC Interpreter und Editor

Slide 8

Slide 8 text

• Programme wurden oft in BASIC geschrieben • Einfach zu lernen • Langsam • Wer konnte, wich auf Maschinensprache aus

Slide 9

Slide 9 text

• Die meisten Mikroprozessoren führten immer genau ein Programm aus • Reaktion auf Ereignisse durch „Interrupts“ • Tastatur abfragen • Cursor blinken lassen

Slide 10

Slide 10 text

• Hauptprogramm wird unterbrochen • „Interrupt-Routine“ wird ausgeführt • Hauptprogramm wird fortgesetzt • Je nach Prozessor verschiedene Interrupt-Quellen

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

Ein Timer mit Variablen? Echt jetzt??

Slide 15

Slide 15 text

• Commodore BASIC selbst aus damaliger Sicht unkomfortabel • Manche Dialekte boten PAUSE oder DELAY an (keine Möglichkeit, während des Wartens etwas zu tun) • In BASIC (zunächst) kein Pendant zu Interuptroutinen

Slide 16

Slide 16 text

• Manche Dialekte boten Zugriff auf Systemzeit (Variablen TI oder TIME$) • Besser geeignet, weil Dauer für Hochzählen von Variablen abhängig von Geschwindigkeit des Rechners • Hat man aber noch nicht gewusst – oder ignoriert ;-)

Slide 17

Slide 17 text

• Früher… • Oberflächlich betrachtet… • Fäden ziehen… oder lieber noch warten?

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

• Aktualisierung von Bedienelementen auf der Basis von Zustand • Zustand greift auf Flows zurück • Flows werden aus Coroutinen gespeist

Slide 25

Slide 25 text

Flows sind asynchronen Datenströme, die Werte sequenziell emittieren.

Slide 26

Slide 26 text

Coroutinen werden als leichtgewichtige Threads bezeichnet. Sie verbrauchen weniger Ressourcen als Plattform-Threads und nutzen diese zur Ausführung.

Slide 27

Slide 27 text

Ein Thread ist das kleinste Stück Code, das ein Betriebssystem zur Ausführung bringen kann

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

• Aktualisierung von Bedienelementen auf der Basis von Zustand • Zustandsänderungen explizit mit setState() • Wiederholte Ausführung von Code mit Timer.periodic()

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

• Promise repräsentiert (irgendwann vorliegendes) Ergebnis eines asynchronen Aufrufs • Definition asynchroner Funktionen mit async • Warten auf Ergebnis mit await • Währenddessen kann System andere Dinge tun

Slide 40

Slide 40 text

• Kein Observable-ähnlicher Zustand in purem JavaScript/HTML • Wohl aber in Web Frameworks wie React • React macht deklarative UI-Frameworks populär • Inspiration für Flutter, SwiftUI und Jetpack Compose

Slide 41

Slide 41 text

• Früher… • Oberflächlich betrachtet… • Fäden ziehen… oder lieber noch warten?

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

• Warten auf ein Ereignis erlaubt dem System, bis zum Eintreten etwas anderes zu tun • Sinnvoll, wenn nur ein Thread für die Ausführung von Code zur Verfügung steht

Slide 44

Slide 44 text

• Im Kern sind Dart- und JavaScript-Umgebungen single-threaded • Zentrales Element in beiden Fällen event loop • Langlaufender Code verhindert Abarbeiten der event loop • Zeigt sich durch nicht reagierende Benutzeroberfläche

Slide 45

Slide 45 text

• Verfügbarkeit mehrerer Threads macht UI nicht automatisch immun • Praktisch alle UI-Frameworks der letzten 40 Jahre sind single- threaded • Ist dieser ausgelastet, steht die Anwendung

Slide 46

Slide 46 text

Markus Spiske https://unsplash.com/de/fotos/braun-weisses-schachbrett-uqeaZXZkquw

Slide 47

Slide 47 text

Nebenläufigkeit ist die Fähigkeit eines Computersystems, mehrere Aufgaben oder Teile eines Programms scheinbar gleichzeitig auszuführen. Diese Aufgaben oder Teile können in ihrer Ausführung zeitlich überlappen. Sie müssen nicht einzeln, in einer bestimmten Reihenfolge ausgeführt werden.

Slide 48

Slide 48 text

Asynchrone Programmierung erlaubt, Aufgaben auszuführen, ohne den Hauptausführungsfluss eines Programms zu blockieren. Statt auf den Abschluss einer langwierigen Operation zu warten, kann das Programm mit anderen Aufgaben fortfahren. Es wird benachrichtigt, wenn das Ergebnis der lang laufenden Operation verfügbar ist.

Slide 49

Slide 49 text

In der ereignisorientierten Programmierung wird der Ablauf des Programms in erster Linie durch Ereignisse bestimmt. Ereignisse können beispielsweise Benutzereingaben, Alarme / Timer oder Ergebnisse von Netzwerkoperationen sein.

Slide 50

Slide 50 text

Unter reaktiver Programmierung wird die Verarbeitung von kontinuierlichen und asynchronen Datenströmen verstanden. Datenströme transportieren Ereignisse, Zustandsänderungen, Fehler, sowie beliebige andere Arten von Informationen.

Slide 51

Slide 51 text

• Unterstützung dieser Paradigmen üblicherweise durch Bibliotheken • Programmiersprachen selbst nur wenige Schlüsselwörter (async, suspend)

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

No content

Slide 57

Slide 57 text

Vielen Dank! Thomas Künneth, Snapp Mobile @[email protected] https://www.thomaskuenneth.de