folien2000868

Werbung
Gliederung: Teil 3 - Anpassungen
1. Einführung
– Motivation
– Definition,
– Konzepte für Komponenten (klassische, kommerzielle, akademische)
2. Industrielle Komponentensysteme der 1. Generation
1. CORBA
2. Enterprise JavaBeans
3. (D)COM
3. Anpassungen
– Daten und Funktion
– Interaktion
• Kommunikation
• Synchronisation
• Protokolle
– Lebendigkeit
Dr. Welf Löwe und Markus Noga
1
Problem
Komponenten mit Zustand
Aufruf der Methoden (Dienste) bewirkt
Zustandstransformationen
Nicht jeder Dienst kann in jedem Zustand erbracht werden
Protokoll beschreibt Folgen möglicher „Dienstleistungen“
einer Komponente
Dr. Welf Löwe und Markus Noga
2
Beispiele
Komponente „Datei“:
open (read | write )* close
Komponente „Keller“:
(pushn popn)*
Thermostat:
(zu kalt | zu heiss)*
Telefonleitung:
Abheben (
Ziffer* (
Aufgelegt |
Timeout |
NummerKorrekt (
besetzt | klingelt (
Aufgelegt |
Angenommen Sprachdaten*(Aufgelegt|RemoteAufgelegt)
))))*
Definitionen
Protokoll:
– Menge von Folgen von Methodenaufrufen
– Formale Sprache mit Methoden als Alphabet
Komponentenprotokoll K
– Protokoll (Sprache), das legale Aufruffolgen von Methoden einer
Komponente definiert
Aufrufprotokoll A
– Protokoll, das die tatsächliche Verwendung einer Komponente
definiert
Dr. Welf Löwe und Markus Noga
4
Korrekte Verwendung
Sei prefix(K) die Menge aller Methodenfolgen, die Anfang
eines Satzes aus K sind.
Komponente wird korrekt verwendet, wenn
A  prefix(K)
oder
AK
Frage, ob Endzustand erreicht werden muss
Was gelten muss, hängt von der Komponente ab (Datei vs.
Keller)
Dr. Welf Löwe und Markus Noga
5
Anpassung
Wrapper um die Komponente
– Generiert notwendige Methoden
– Konsumiert überflüssige Methoden
– Blockt Methoden, die ungelegen kommen, dadurch Umsortieren von
Methodenaufrufen zur Laufzeit
Insgesamt teuere Operationen
Was kann bereits statisch erkannt werden?
Dr. Welf Löwe und Markus Noga
6
Problem
...
File f=new File();
File g=new File();
f=g;
f.open(...);
g.open(...);
f.write(...);
g.write(...);
...
File g ist „Alias“ für
File f
Um festzustellen, ob
Komponenten richtig verwendet
werden, müssen „Aliases“
gefunden werden
Dr. Welf Löwe und Markus Noga
7
Problem
...
File f=new File();
File g=new File();
if someFunc() f=g;
f.open(...);
g.open(...);
f.write(...);
g.write(...);
...
File g ist vielleicht „Alias“ für
File f
Finden von „Aliases“ ist
unentscheidbar
Ergebnis von someFunc()
müsste statisch geraten werden
können
Dr. Welf Löwe und Markus Noga
8
Aliasproblem
Komponente kann durch mehrere Ausdrücken
(Zugriffspfaden) referenziert werden (alias)
Komponentenprotokoll kann durch alle Aliases
fortgeschaltet werden
Finden von Aliases ist unentscheidbar
Lösung
– Points-To Analyse
– Typsplitting
Dr. Welf Löwe und Markus Noga
9
Points-To Analyse
Datenflussanalyse
Datenstruktur ist
– Steuerflussgraph
– SSA Graph des Programms
Jedem Ausdruck im Programm wird Menge von
Definitionen zugeordnet
Aktualisierung bei Zuweisung, Prozeduraufruf
May und Must Problem unterschieden
– Unterschiedliche Behandlung bei Zusammenflüssen im
Steuerflussgraph
Dr. Welf Löwe und Markus Noga
10
Points-To (May)
...
File f=new File();
File g=new File();
if someFunc() f=g;
f.open(...);
g.open(...);
f.write(...);
g.write(...);
...
new
f=#1
g=?
new
f=#1
g=#2
f=#2
g=#2
f={#1,#2}
g=#2
f={#1,#2}
g=#2
f={#1,#2}
g=#2
f={#1,#2}
g=#2
if
=

Dr. Welf Löwe und Markus Noga
11
Points-To (Must)
...
File f=new File();
File g=new File();
if someFunc() f=g;
f.open(...);
g.open(...);
f.write(...);
g.write(...);
...
new
f= #1
g=?
new
f= #1
g=#2
f= #2
g=#2
f= 
g=#2
f= 
g=#2
f= 
g=#2
f= 
g=#2
if
=

Dr. Welf Löwe und Markus Noga
12
Typsplitting
Jedes Objekt hat Protokoll als Typ
Beim Erzeugen von Aliases wird das Protokoll zwischen
beiden Aliasausdrücken aufgeteilt
Es entstehen zwei Sichten auf die Komponente, die
zusammen das gesamte Protokoll bilden
Schwierigkeiten
– mit may-alias
– Zusammenflüssen im Steuerfluss
Dr. Welf Löwe und Markus Noga
13
Beispiel Typsplitting
...
File (open, write*, close) f=new File();
init(f);
f.write(...); //f ist vom Typ: File (write*, close)
...
f.close(...);
...
void init (File (open write) g){
g.open(...);
g.write(...);
}
Dr. Welf Löwe und Markus Noga
14
Problem
...
loop{
x=new K();
x.init();
x.doSome();
x.close();
}
...
new K() steht für eine Menge
von Komponenteninstanzen zur
Laufzeit
Abstrakte Namen zur
Bezeichnung in der statischen
Analyse
Dr. Welf Löwe und Markus Noga
15
Problem
Fabrik(){
K[] container;
init(){
loop{
container.add(new K());
}
}
get(){
return(container.get());
}
}
x=get();
y=get();
x.init();
y.init(); ...
Abstrakte Namen können
konkrete Komponenten
nicht immer unterscheiden
Problem unentscheidbar
Namensschemaproblem
Potentiell beliebige Anzahl von von dynamisch erzeugten
Komponenteninstanzen
Muss für statische Analyse zu endlicher Anzahl abstrahiert
werden
Analyse muss fehlerhaft sein
Dr. Welf Löwe und Markus Noga
17
Mögliche Namensschemata
Alle (dynamischen) Objekte sind eins
Alle (dynamischen) Objekte gleichen Typs (der gleichen
Komponente) zu einem abstrakten zusammenfassen
Alle Objekte, die an der gleichen Stelle erzeugt wurden,
zusammenfassen
Alle Objekte, die an der gleichen Stelle erzeugt wurden,
wobei diese Erzeugung von der gleichen Prozedur
aufgerufen wurde
Letzteres verallgemeinerbar auf Aufrufpfade der Länge k
Dr. Welf Löwe und Markus Noga
18
Problem
Mehrere Klienten greifen auf identische Komponente zu
Klienten laufen parallel aber nicht synchron
Beobachtbares Verhalten der Umgebung ist nicht
deterministisch
– Reihenfolge der Methodenaufrufe, wie sie an der Komponente
ankommen, ist Verzahnung („Interleaving“) der Aufrufe der
beteiligten Klienten
– Eingeschränkt durch Abhängigkeiten der Klienten untereinander
Dr. Welf Löwe und Markus Noga
19
Problem Nebenläufigkeit
Sei A1 das Aufrufprotokoll von Klient 1 und A2 das
Aufrufprotokoll von Klient 2
Sei f1: m1,m2, ... , mn  A1 die Aufruffolge von Klient 1 und
f2: m‘1,m‘2, ... , m‘k  A2 die Aufruffolge von Klient 2
An der Komponente kann jede Folge der Bauart:
m‘‘1, m‘‘2, ... , m‘‘n+k ankommen mit m‘‘i  f1  m‘‘i  f2 und
Folgen f1 und f2 sind Teilfolgen
Aufrufprotokoll ist Produkt der Sprachen A1  A2
Verallgemeinerung auf k Klienten A1  A2  ...  Ak
Exponentielles Wachstum:
– Der Sprache (nicht so schlimm)
– Der Sprachdefinition
Dr. Welf Löwe und Markus Noga
20
Beispiel Keller
S  SS
| push S pop
| 
S‘
(S|S) (S|S)
S 
|
push push S‘pop pop

S  SS
| push S pop
| 
S 
|
push push S‘pop pop

S 
|
push S‘ pop

S 
|
push S‘ pop

Dr. Welf Löwe und Markus Noga
21
Beispiel: 2 Klienten für eine Datei
read/
write
open
close
read/
write
open
close
Dr. Welf Löwe und Markus Noga
22
Nebenläufige Klienten der Datei
read/
write
open
close
read/
write
open
read/
write
open
read/
write
read/
write
close
open
close
open
close
close
read/
write
Legale Aufrufe an eine Datei
read/
write
open
close
open
open
read/
write
read/
write
close
close
open
close
read/
write
Problem
Ein Klient und eine Komponente im System
Komponente ist web-Dienst
Aufrufprotokoll A: z.B. sei f: m1,m2, ... , mn  A
Komponentenprotokoll K: z.B. sei g: m1,m2, ... , mn  K
Web-Kommunikation ist nicht reihenfolgeerhaltend
An der Komponente kommen die Aufrufe in vertauschter
Reihenfolge an, z.B. f‘: m2,m1, ... , mn mit f‘  K
Immer Anpassungen zur Laufzeit notwendig
Dr. Welf Löwe und Markus Noga
25
Statische Analyse
Simulieren der Methodenaufrufe zur Übersetzungszeit
expr.m() erzeugt sog. „Update“ der Menge von Objekten,
die expr bezeichnet
– Mögliche Aliases – „weak update“ – alter Zustand wird als möglicher
aktueller gemerkt
– Garantierte Aliases – „strong update“ – alter Zustand wird
fortgeschaltet
Aussagen
– Garantiert korrekt
– Fehler können nicht ausgeschlossen werden
– Fehler garantiert
Dr. Welf Löwe und Markus Noga
26
Program Slicing
Aufgabe: lösche Programmstellen, die zu Aufrufen an die
Komponente keinen Beitrag leisten
Ziel: konservative Abschätzung
Datenstruktur ist Aufrufgraph oder Steuerflussgraph
Anfang: potentielle Erzeugungen und Aufrufe
Lösche alle Knoten, die nicht auf einem Pfad vom
Programmanfang main zur Erzeugung einer Instanz oder
zum Aufruf an eine Instanz führen
Ungenau, da in gelöschten Prozeduren berechnete Werte
den Steuerfluss zum Aufruf beeinflussen können
Dr. Welf Löwe und Markus Noga
27
Berechnung der Aufrufprotokolls
Definition einer Grammatik
Jeder Methode der Komponente entspricht Terminalsymbol
Jeder anderen Methode entspricht Nichtterminal
main – Satzsymbol
Methodenrümpfe entsprechen rechten Seiten von
Produktionen
– Schleife: *
– Bedingung: |
– Methodenaufruf: Terminal oder Nichtterminal
Dr. Welf Löwe und Markus Noga
28
Beispiel
main{
File f=new File();
start(f);
}
start(File f){
f.open(...);
doSome(f);
f.close();
}
doSome(File f){
loop char c=f.read();
f.write(„bla“);
}
Main  Start
Start  open DoSome close
DoSome  read* write
Dr. Welf Löwe und Markus Noga
29
Ergebnis
Kontextfreie Grammatik
Definiert Obermenge A‘ des Aufrufprotokolls A
A  A‘
A‘  K  A  K
Wie ist K definiert?
Dr. Welf Löwe und Markus Noga
30
Endlicher Automat
K ist durch endlichen Automaten gegeben
Alternativ regulärer Ausdruck oder Grammatik
A‘  K ist unentscheidbar, da A‘ kontextfrei
Lösung: finde reguläre Obermenge A‘‘ von A‘
A  A‘  A‘‘
A‘‘  K  A  K
Finden einer möglichst genauen regulären Obermenge
einer kontextfreien Sprache?
Dr. Welf Löwe und Markus Noga
31
Reguläre Obermenge kontextfreier Sprachen
Grammatik in Greibach Normalform:
– Nt
– N t N‘
– N N‘N‘‘
Immer möglich für jede KfG
Konstruiere Endlichen Automaten
Jedem Nichtterminal N werden 2 Zustände zugeordnet:
SN (vor Akzeption), S‘N (nach Akzeption)
– Nt
SN t  S‘N
S‘N   SF
– N t N‘
SN t  SN‘
S‘N‘   S‘N
– N N‘N‘‘
SN   SN‘
S‘N‘   SN‘‘
S‘N‘‘   S‘N
Dr. Welf Löwe und Markus Noga
32
Eigenschaften
Ist regulär (per Konstruktion)
Akzeptiert Obermenge der Sprache
Ist nicht unnötig groß,
d.h., wenn die Sprache regulär ist (nur unglücklicher Weise
kontextfrei definiert), so wird der Automat konstruiert, der
die Sprache exakt akzeptiert
Dr. Welf Löwe und Markus Noga
33
Zustandsexplosion bei Nebenläufigkeit
read/
write
open
close
read/
write
open
read/
write
open
read/
write
read/
write
close
open
close
open
close
close
read/
write
Modellprüfung
Ursprung: Formale Logik
– Gegeben eine Formel  und
– ein mathematisches Modell M der Formel
– Wird  von M erfüllt?
Anwendung auf Software
– Formel  ist Spezifikation,
– Modell M ist Umsetzung:
– Erfüllt M seine Spezifikation ?
Ablaufaussagen erfordern Zeitbegriff
– Temporales Zeitmodell: (, )
– Quantitatives Zeitmodell: (, , |·|)
• für Echtzeitprobleme,
• reduzierbar auf temporales Zeitmodell
Dr. Welf Löwe und Markus Noga
35
Erreichbarkeitsanalyse
Aufgabe
– Gegeben ein Zustand
– Welche Zustände sind erreichbar?
Algorithmus
– Beginne mit Z={Start}
– Solange  z  Z, z nicht bearbeitet
Z := Z  {y | y ist von z direkt erreichbar}
– Terminiert, da Zustandsmenge endlich
Anwendung auf Modellprüfung
– Gegeben eine Formel  und einen Startzustand
– Gilt  auf allen Ausführungspfaden, auf einem Ausführungspfad ...
– Berechne erreichbare Zustände und prüfe !
Dr. Welf Löwe und Markus Noga
36
Grenzen der expliziten Darstellung
Berechnung der Erreichbarkeit ist linear in Größe
– des Zustandsraums
– der Übergangsrelation
– der zu beweisenden Formel
In der Praxis
– Systeme sind Komposition paralleler Komponenten
– Zustandsraum wächst exponentiell (Zustandsexplosion)
– In expliziter Darstellung nicht beherrschbar
Ausweg
– Implizite Darstellung mit booleschen Formeln (symbolisch)
– Zustandsraum ist n-dimensionaler boolescher Raum
– Kodierung als geordnete binäre Entscheidungsdiagramme (OBDD)
Dr. Welf Löwe und Markus Noga
37
Klammersprachen
Dycksprachen
Wohlgeformte Klammerausdrücke über einem Alphabet von
Klammern
Beispiel Warenkorb
– Paar: Auswahl (X) – Zurücklegen (X)
– Ware X beliebig
Inklusionsproblem entscheidbar
Dr. Welf Löwe und Markus Noga
38
Kontextfreie Sprachen
Inklusionsproblem unentscheidbar im allgemeinen
Ansatz: transformiere beide Grammatiken
–
–
–
–
Konstruiere Greibach Normalform
Eliminiere Kettenproduktionen
Eliminiere nicht erreichbare Produktionen
Eliminiere nicht terminierende produktionen
Vergleiche auf strukturelle Inklusion
Semientscheidbar
Dr. Welf Löwe und Markus Noga
39
Prädikatenlogik
Natürliche Form der Komponentenprotokollspezifikation
Jeder Dienst hat Vorbedingung (pre-condition)
– Prädikatenlogische Formel über dem Zustand der
Komponenteninstanz und den Parametern
Jeder Dienst garantiert Nachbedingung (post-condition)
– Prädikatenlogische Formel über dem Zustand der
Komponenteninstanz und den Parametern vor Dienstausführung
und über dem Zustand der Komponenteninstanz und dem Resultat
nach Dienstausführung
– Eigentlich Temporallogik
Nachbedingung impliziert die Gültigkeit von anderen
Vorbedingungen
Dr. Welf Löwe und Markus Noga
40
Beispiel
class Stack(T) {
pre: true;
push(T t);
post: Stack.count == Stack.count‘ +1
pre: Stack.count != 0;
pop(T t);
post: Stack.count == Stack.count‘ -1;
}
Dr. Welf Löwe und Markus Noga
41
Prädikatenlogik
Statisch unentscheidbar
Beobachtung in der Praxis:
– Teil des Zustandes, der relevant ist für korrekte Verwendung ist als
Dienst an der Schnittstelle verfügbar
– Bsp.: Funktion isEmpty() beim Stack
Lösung zur Laufzeit immer möglich
Dr. Welf Löwe und Markus Noga
42
Guarded Methods
Dienste sind durch Wächter (guards) geschützt
Garantieren, dass kein Dienst aufgerufen wird, wenn die
Komponente im falschen Zustand ist
Korrektheit dynamisch gesichert durch Umordnen von
Methodenaufrufen
Laufzeitprobleme
– Teuer Operationen (Kerneintritt notwendig)
– Verwaltung von Methodenwarteschlangen
Lebendigkeit (Verklemmungsfreiheit) offenes Problem
Dr. Welf Löwe und Markus Noga
43
Kriterien
Vollständige Spezifikation des Komponentenverhaltens?
Automatische Tests auf Konsistenz?
Verständlichkeit / Effizienz der Spezifikation?
Effizienz der Ausführung?
Dr. Welf Löwe und Markus Noga
44
Spezifikationstechniken im Vergleich
Vollständig
Test
Spec
Code
Sequence Diagrams
--
--
++
+
Endliche Automaten
-
+
+
+
-/+
+
+
+
Prädikatenlogische
Formeln
+
-
+
+
Guards
++
++
-
--
Modellprüfung
Dr. Welf Löwe und Markus Noga
45
Zusammenfassung
Alias-Problem (unentscheidbar)
Abstrakte Namen finden (exakt sein unmöglich,
exponentielles Wachstum der Datenstruktur mit der
Genauigkeit)
Aufrufprotokoll Finden (unentscheidbar auch ohne Aliasund Namensproblem)
Nebenläufige Aufrufer (exponentieles Wachstum möglicher
Sequenzen)
Kanäle, die die Ordnung nicht erhalten (exponentieles
Wachstum möglicher Sequenzen)
Sprachinklusion (unentscheidbar oberhalb von regulären
Sprachen)
Dr. Welf Löwe und Markus Noga
46
Warum geht alles gut
Komponenten in der Praxis haben einfache Schnittstellen
(sonst können die Dienste nicht verwendet werden)
– Einfache Protokolle
Komponenten in der Praxis grobgranular (sonst macht
Wiederverwendung keinen Sinn)
– Wenige Instanzen
Hierarchischer Aufbau von Systemen
– Aufrufer in lokalen Subsystemen zu finden
Gegenstand aktueller Forschung – richtige Mischung von
statischen und dynamischen Techniken wird gesucht
Dr. Welf Löwe und Markus Noga
47
Best practice
Garantiere Korrektheit durch guards
Analysiere (statisch), welche guards wegfallen dürfen
Analysiere (statisch oder dynamisch), ob System lebendig
– Verklemmungsvermeidung (statisch)
– Verklemmungsentdeckung (dynamisch)
Verweben von guards und Komponenten
Dr. Welf Löwe und Markus Noga
48
Herunterladen