Title: Parsing Parallele Programmierung
1ParsingParallele Programmierung
- Grundlagen der Softwaretechnik für das
Programmier Praktikum
Prof. Dr. Michael Leuschel Institut für
Informatik Universität Düsseldorf
2Ein bisschen über Compilerbau
Hilft vielleicht bei der Analyse der
Benutzereingabe !
3Klassicher CompilerÜbersicht
Source Program
Lexical Syntax Semantic
C o m p i l e r
Front End
Analysis
Back End
Synthesis
Machine Language
4Natural Language Example
thisissometextwithoutspacesandpunctuationmarkswhic
hist hereforequitedifficulttoreadbyhumanslexicalan
alysiswillbre akthistextupintowordswhiletheparsing
phasewillextractthegr ammaticalstructureofthetext
this is some text without spaces and punctuation
marks which is therefore quite difficult to read
by humans lexical analysis will break this text
up into words while the parsing phase
will extract the grammatical structure of the text
This is some text without spaces and
punctuation-marks which is therefore quite
difficult to read by humans. Lexical-analysis
will break this text up into words while
the parsing-phase will extract the
grammatical-structure of the text.
5if n 0 then return 0 else //recursive case
return nf(n-1)
Source Program
C o m p i l e r
Lex
if id(n) op() num(0) then return num(0) else
return id(n) op() id(f) lparen id(n) op(-)
num(1) rparen
Parse
Parse
Parsing Actions
...
Parse Tree
Machine Language
6Wie arbeitet ein Lexer
- Erkennt Token Klassen
- Jede Klasse durch regulären Ausdruck (siehe
"grep" Unix Kommando) beschrieben - Löscht Kommentare, Whitespace
- Effiziente Übersetzung in Java/C Code
- Lex für C, JLex, javacc für Java
7Für MUD
- Was sind die Tokens ?
- Man braucht keine regulären Ausdrücke
- Es kann nützlich sein Whitespace auszufiltern
8Wie funktioniert ein Parser
- Struktur einer Programmiersprache wird durch
grammatikalische Regeln beschrieben - Anweisung ? Var Ausdruck
- Anweisung ? if Ausdruck then Anweisung else
Anweisung -
- Terminal Symbole , if, then, Var,
- Nicht-Terminale Anweisung , Ausdruck,
9Wie funktioniert ein Parser 2
- Top-Down, Predictive Parsing
- Jedes Nicht-Terminal Symbol wird eine Prozedur
- Prozeduren entscheiden welche Grammatik-Regel
angewendet werden muss - Basierend auf dem aktuellen Input-Symbol oder
Token (vom Lexer) - Manchmal wird ein "lookahead" benutzt
- Prozeduren konsumieren Eingabe und rufen sich
gegenseitig auf
10Wie funktioniert ein Parser 3
- Beispiel
- Anweisung ? Var Ausdruck
- Anweisung ? if Ausdruck then Anweisung else
Anweisung - void Anweisung() switch(tok)
- case 'Var'
- eat('Var') eat('') Ausdruck()
- break
- case 'if'
- eat('if') Ausdruck()
- eat('then') Anweisung()
- eat('else') Anweisung()
- break
- default
- raise_error('Anweisung','Var or if')
-
11Für MUD
- Es kann nützlich sein
- Kleine Grammatik zu schreiben
- Einfachen Parser von der Grammatik abzuleiten
- Erlaubt flexible Eingabe
- Erlaubt zB Eingaben zu kombinieren
- "Gehe nach Norden dann nehme Tasche"
12Für mehr Informationen
- Buch (in der ULB)
- Andrew W. Appel
- Modern CompilerImplementation in Java
- Cambridge University Press
- Noch mehr Details
- Aho, Sethi, Ullman
- Compilers
13Parallele Programme in Java
Hilft bei der Entwicklung des Servers
14Was ist ein paralleles Programm?
A sequential program has a single thread of
control. A concurrent program has multiple
threads of control allowing it perform multiple
computations in parallel and to control multiple
external activities which occur at the same time.
15Parallel Warum?
- Performance gain from multiprocessing hardware
- parallelism.
- Increased application throughput
- an I/O call need only block one thread.
- Increased application responsiveness
- high priority thread for user requests.
- More appropriate structure
- for programs which interact with the environment,
control multiple activities and handle multiple
events.
16Threads vs Prozesse
17threads in Java
A Thread class manages a single sequential thread
of control. Threads may be created and deleted
dynamically.
The Thread class executes instructions from its
method run(). The actual code executed depends on
the implementation provided for run() in a
derived class.
class MyThread extends Thread public void
run() //......
Thread x new MyThread()
18thread life-cycle in Java
An overview of the life-cycle of a thread as
state transitions
new Thread()
start() causes the thread to call its run()
method.
start()
Alive
Created
stop(), or run() returns
stop()
Terminated
The predicate isAlive() can be used to test if a
thread has been started but not terminated. Once
terminated, it cannot be restarted (cf. mortals).
19thread alive states in Java
Once started, an alive thread has a number of
substates
start()
Running
sleep()
suspend()
yield()
dispatch
suspend()
Runnable
Non-Runnable
resume()
stop(), or run() returns
wait() also makes a Thread Non-Runnable, and
notify() Runnable
20Beispiel Threads in Java
- class SimpleThread extends Thread
- int myID
- public SimpleThread (int ID)
- myIDID
-
- public void run()
- int i
- for(i0ilt100i)
- System.out.print(myID)
- if(Math.random()lt0.3) Thread.yield()
-
-
- public static void main (String argv)
- Thread t1 new SimpleThread(1)
- t1.start()
- Thread t2 new SimpleThread(2)
- t2.start()
-
21Threads Interface
Since Java does not permit multiple inheritance,
we often implement the run() method in a class
not derived from Thread but from the interface
Runnable.
Thread x new Thread(new MyRun())
22Probleme bei der Parallelen Programmierung
- Interferenz
- Thread/Prozess wird im "ungünstigen" Moment
unterbrochen - Andere Thread/Prozess verändert gemeinsames
Objekt/Daten - Deadlock
- Threads/Prozesse warten alle aufeinander
23Interferenz
class InterferenceThread extends Thread
static SharedCounter counter public
void run() int i for(i0ilt10i)
counter.inc() System.out.println("
count "counter.val()) public static void
main (String argv) counter new
SharedCounter() Thread t1 new
InterferenceThread(1) t1.start()
Thread t2 new InterferenceThread(2)
t2.start()
public class SharedCounter int value public
SharedCounter() value0 void
inc() int temp value valuetemp1
int val() return value
24Interferenz
- Fehler lässt sich oft nicht systematisch
reproduzieren - zB taucht auf bestimmter Hardware nie auf
- Interferenz schwer zu lokalisieren
25Mutual Exclusion synchronized
- Java erlaubt Methoden und Objekte als
"synchronized" zu deklarieren - Jedes Objekt bekommt eine Verriegelung (lock)
- Maximal ein Threadkann eine synchr.Methode
ausführen
public class SharedCounter int value
synchronized void inc() int temp value
valuetemp1
26Beispiel synchronized
public class SharedCounter int value
synchronized void inc() int temp value
valuetemp1
Thread 1
inc()
Thread 2
public class SharedCounter int value
synchronized void inc() int temp value
valuetemp1
Thread 1
Anmerkung inc() darf anderesynchronized Methode
n vomgleichen Objektaufrufen
inc()
Thread 2
27Deadlock
public class SharedObj1 int synchronized
void m1() o2.m2()
Thread 1
m1()
public class SharedObj2 int synchronized
void m2() o1.m1()
Thread 2
m2()
28Deadlock 2
public class SharedObj1 int synchronized
void m1() o2.m2()
Thread 1
m1()
public class SharedObj2 int synchronized
void m2() o1.m1()
Thread 2
m2()
29Deadlock Lösungen
- Gemainsame Ressourcen in der gleichen Reihenfolge
beantragen
public class SharedObj1 int synchronized
void m1() o2.m2()
Thread 1
public class SharedObj2 int synchronized
void m2() ()
Thread 2
30Deadlock Lösungen 2
- Timeout
- Nach bestimmter Zeit falls Ressource immer noch
nicht verfügbar - alle Locks abgeben (Achtung livelock)
- Banker Algorithmus
- Prozess/Thread muss Maximum der verlangten
Ressourcen angeben - Lock wird vergeben wenn dannach noch genügend
Ressourcen vorhanden sind damit wenigstens ein
Prozess terminieren kann - Deadlock Detection (und nicht Prevention
- Wenn Deadlock entdeckt wird Prozesse killen
31Potentielle Problemeder Parallele Programmierung
- Interference (Race Conditions)
- Deadlock
- Fairness
- Starvation (Verhungern)
- Livelock
32Buch
ConcurrencyState Models Java Programs Jeff
Magee Jeff Kramer WILEY
33Client-Server MUD
- Server
- Daten
- Logik Zugang zu Daten
- Client
- Grafische Oberfläche
- Logik (SQL Aufrufe,)
- Threads benötigt ?
- Mutual Exclusion benötigt ?
34Organisation
35Themen für Treffen
- Viertes Treffen (Woche vom 6. Juni)?
- "schau" Aktion Wie können die verschiedenen
Eigenschaften eines Raumes ermittelt werden? - Parsing der Benutzereingabe Wie funktioniert es?
Wie wird/wurde es implementiert? - Fünftes Treffen (Woche vom 13. Juni)
- XML Einlesen Wie lesen Sie die XML Dateien ein?
Wie haben Sie das XML Format erweitert? - Client-Server Architektur Wie gedenken Sie die
"Multi-User" Version zu verwirklichen? - Fehlerbehandlung
36Verschiedenes
- XML Parser
- Für Text zwischen Tags
- ltrequiresgtObjekt55lt/requiresgt
- Child mit Namen "text"
- nodes room.getChildNodes()
- node nodes.item(i)
- node.getNodeName().equals("text")
- Node.toString() ? "Objekt55"
37PP Organisation
- Abgabe nächste Woche, Mittwoch 8. Juni, 1200
Mittags - UML Klassendiagramm, Architektur,
- In CVS in Projekt "Abgaben" einchecken
- Abgabe 1. Prototyp
- Woche vom 20. Juni
- Vortrag während der Treffen
- Endabgabe
- Wahrscheinlich 13. Juli, 1000