• Keine Ergebnisse gefunden

5 Erweiterungen von While

N/A
N/A
Protected

Academic year: 2022

Aktie "5 Erweiterungen von While"

Copied!
6
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

5 Erweiterungen von While

F¨ur die bisher betrachtete SpracheWhilegab es wegen der Einfachheit der Sprache bei der Modellierung der Semantik wenig Entscheidungsalternativen. Die entwickelten Semantiken bestehen aus

”nat¨urlichen“

Regeln, an denen wenig zu r¨utteln ist. Eine neue Semantik f¨ur eine Programmiersprache zu finden, hat aber viel mit Entwurfs- und Modellierungsentscheidungen zu tun. Deswegen werden in diesem Teil einige Erweiterungen f¨urWhile entwickelt, die auch einige Vor- und Nachteile von Big-Step- und Small-Step-Semantiken aufzeigen werden.

Definition 13 (Modulare Erweiterung). Eine Erweiterung heißt modular, wenn man lediglich neue Regeln zur Semantik hinzuf¨ugen kann, ohne die bisherigen Regeln anpassen zu m¨ussen. Mehrere modulare Erweiterungen k¨onnen normalerweise problemlos kombiniert werden.

5.1 Nichtdeterminismus WhileN D

Sowohl Big-Step- als auch Small-Step-Semantik f¨urWhilesind deterministisch (Thm. 2 und 4). Die erste (modulare) Erweiterung WhileN D f¨uhrt eine neue Anweisung c1 or c2 ein, die nichtdeterministisch

entwederc1 oder c2 ausf¨uhrt. WhileN D-Programme bestehen also aus folgenden Anweisungen:

Com c ::= skip |x := a|c0; c1 |if (b) then c1 else c2 |while (b) do c |c1 or c2

Beispiel 8. Das Programmx := 5 or x := 7 kann der Variablen xentweder den Wert 5 oder den Wert 7 zuweisen.

5.1.1 Big-Step-Semantik

Die Ableitungsregeln f¨urh , i ⇓ werden f¨ur das neue Konstruktc1 or c2 um die beiden folgenden erweitert:

Or1BS: hc1, σi ⇓σ

hc1 or c2, σi ⇓σ Or2BS: hc2, σi ⇓σ hc1 or c2, σi ⇓σ

Ubung:¨ Welche Ableitungsb¨aume hat das Programm P ≡(x := 5) or (while (true) do skip) in der Big-Step-Semantik?

5.1.2 Small-Step-Semantik

Die Small-Step-Semantikh , i →1 h , i muss ebenfalls um Regeln f¨ur c1 or c2 erg¨anzt werden:

Or1SS:hc1 or c2, σi →1hc1, σi Or2SS:hc1 or c2, σi →1hc2, σi

Beispiel 9. Das ProgrammP ≡(x := 5) or (while (true) do skip) hat zwei maximale Ablei-

(2)

tungsfolgen:

hP, σi →1 hx := 5, σi →1 hskip, σ[x7→5]i hP, σi →1 hwhile (true) do skip, σi

1 hif (true) then (skip; while (true) do skip) else skip, σi

1 hskip; while (true) do skip, σi →1 hwhile (true) do skip, σi →1 . . . Im Vergleich zur Small-Step-Semantik unterdr¨uckt die Big-Step-Semantik bei nichtdetermistischen Verzweigungen die nichtterminierenden Ausf¨uhrungen. Insofern sind f¨ur nichtdeterministische Sprachen Big-Step- und Small-Step-Semantik nicht ¨aquivalent: (Potenzielle) Nichttermination ist in der Big- Step-Semantik nicht ausdr¨uckbar.

Ubung:¨ Welche der Beweise ¨uber die Small-Step- bzw. Big-Step-Semantik f¨urWhilelassen sich auf WhileN D ubertragen?¨

• Determinismus von Big-Step- und Small-Step-Semantik (Thm. 2 und 4)

• Fortschritt der Small-Step-Semantik (Lem. 3)

• Aquivalenz von Big-Step- und Small-Step-Semantik (Kor. 10)¨

5.2 Parallelit¨at WhileP AR

Als N¨achstes erweitern wir Whileum die Anweisungc1 || c2, die die Anweisungenc1 und c2 parallel ausf¨uhrt, d.h., sowohlc1 als auchc2 werden ausgef¨uhrt, die Ausf¨uhrungen k¨onnen dabei aber verzahnt (interleaved) ablaufen.

Beispiel 10. Am Ende der Ausf¨uhrung des Programmsx := 1 || (x := 2; x := x + 2) kannx drei verschiedene Werte haben: 4, 1 und 3. Die m¨oglichen verzahnten Ausf¨uhrungen sind:

x := 1

x := 2 x := x + 2

x := 2 x := x + 2 x := 1

x := 2 x := 1

x := x + 2

Diese Verzahnung l¨asst sich in der Small-Step-Semantik durch folgende neue Regeln modellieren:

Par1: hc1, σi →1 hc1, σi

hc1 || c2, σi →1 hc1 || c2, σi Par2: hc2, σi →1 hc2, σi hc1 || c2, σi →1 hc1 || c2, σi

ParSkip1:hskip || c, σi →1 hc, σi ParSkip2:hc || skip, σi →1 hc, σi

Bemerkung.Anstelle der RegelnParSkip1und ParSkip2k¨onnte man auch die kombinierte Regel ParSkip:hskip || skip, σi →1 hskip, σi

verwenden. Beide Varianten definieren die gleiche Semantik (im Sinne der Existenz unendlicher Ableitungsfolgen bzw. erreichbarer Endzust¨ande) f¨urWhileP AR-Programme, jedoch sind einige Beweise mit den Regeln ParSkip1undParSkip2 technisch einfacher (siehe ¨Ubung).

Versucht man, eine entsprechende Erweiterung f¨ur die Big-Step-Semantik zu finden, stellt man fest, dass dies nicht m¨oglich ist. Da c1 undc2 vonc1 || c2 mit den Regeln der Big-Step-Semantik nur immer vollst¨andig ausgewertet werden k¨onnen, kann eine verschr¨ankte Ausf¨uhrung nicht angegeben werden.

(3)

5.3 Bl¨ocke und lokale Variablen WhileB

Bisher waren alle Variablen eines Programms global. Guter Stil in modernen Programmiersprachen ist aber, dass Variablen nur in dem Bereich sichtbar und zugreifbar sein sollen, in dem sie auch ben¨otigt werden. Zum Beispiel werden Schleifenz¨ahler f¨urfor-Schleifen ¨ublicherweise im Schleifenkopf deklariert und sind nur innerhalb der Schleife zugreifbar.

Ein Block begrenzt den Sichtbarkeitsbereich einer lokalen Variablen x. Die Auswirkungen einer Zuweisung an xsollen sich auf diesen Block beschr¨anken. Die neue Erweiterung WhileB von Whileum Bl¨ocke mit Deklarationen von lokalen Variablen f¨uhrt die neue Block-Anweisung { var x = a; c } ein. Semantisch soll sich dieser Block wiec verhalten, nur dass zu Beginn die Variablex auf den Wert von ainitialisiert wird, nach Abarbeitung des Blocks aber immer noch den urspr¨unglichen Wert hat.

5.3.1 Big-Step-Semantik

Die Semantikh , i ⇓ wird mit folgender Regel erweitert:

BlockBS: hc, σ[x7→ AJaKσ]i ⇓σ

h{ var x = a; c }, σi ⇓σ[x7→σ(x)]

Beispiel 11. Ableitungsbaum zuP ≡{ var x = 0; { var y = 1; x := 5; y := x + y }; y := x } im Startzustandσ1 = [x7→10,y7→20]:

A hy := x, σ6i ⇓σ7

AssBS

h{ var y = 1; x := 5; y := x + y }; y := x, σ2i ⇓σ7

SeqBS

hP, σ1i ⇓σ8

BlockBS

A: hx := 5, σ3i ⇓σ4

AssBS

hy := x + y, σ4i ⇓σ5

AssBS

h{ var y = 1; x := 5; y := x + y }, σ2i ⇓σ6

BlockBS

x y

σ1 = [x7→10,y7→20] 10 20 σ21[x7→0] 0 20 σ32[y7→1] 0 1 σ43[x7→5] 5 1 σ54[y7→σ4(x) +σ4(y)] 5 6 σ65[y7→σ2(y)] 5 20 σ76[y7→σ6(x)] 5 5 σ87[x7→σ1(x)] 10 5

5.3.2 Small-Step-Semantik

Bl¨ocke sind in der Big-Step-Semantik sehr einfach, da der zus¨atzliche Speicherplatz, den man f¨ur die lokale Variable oder den urspr¨unglichen Wert ben¨otigt, in der Regel BlockBS versteckt werden kann.

Die Small-Step-Semantik beschreibt immer nur einzelne Schritte, muss also den alten oder neuen Wert an einer geeigneten Stelle speichern. Daf¨ur gibt es im Wesentlichen zwei M¨oglichkeiten:

(4)

1. Man ersetzt den Zustand durch einen Stack, der die vergangenen Werte speichert. Alle bisherigen Anweisungen ¨andern nur die obersten Werte, Bl¨ocke legen zu Beginn neue Werte auf den Stack und nehmen sie am Ende wieder herunter.

2. Man speichert einen Teil der Zustandsinformation in der Programmsyntax selbst.

Im Folgenden wird die zweite, modulare Variante vorgestellt. Die neuen Regeln sind:

Block1SS: hc, σ[x7→ AJaKσ]i →1hc, σi h{ var x = a; c }, σi →1 h{ var x = N1q

σ(x)y

; c }, σ[x7→σ(x)]i Block2SS:h{ var x = a; skip }, σi →1hskip, σi

Beispiel 12. Ableitungsfolge zuP ≡{ var x = 0; { var y = 1; x := 5; y := x + y }; y := x } im Startzustandσ= [x7→10,y7→20]:

hP, σi →1 h{ var x = 5; { var y = 1; y := x + y }; y := x }, σi

1 h{ var x = 5; { var y = 6; skip }; y := x }, σi

1 h{ var x = 5; skip; y := x }, σi →1 h{ var x = 5; y := x }, σi

1 h{ var x = 5; skip }, σ[y7→5]i →1 hskip, σ[y7→5]i

5.4 Ausnahmen WhileX

Die Sprache Whilesoll um Ausnahmen und deren Behandlung erweitert werden. Dazu werden zwei neue Anweisungen zuWhile hinzugef¨ugt:

raiseX und try c1 catch X c2

Dabei bezeichneX den Namen der ausgel¨osten bzw. behandelten Ausnahme undXcp die Menge aller Namen von Ausnahmen. Wie schon bei Variablennamen ist die konkrete Notation f¨ur diese Namen irrelevant, im Folgenden werden wieder alphanumerische Zeichenfolgen verwendet.

Wenn inc1 die AusnahmeXmittelsraiseXerzeugt wird, soll der Rest vonc1nicht mehr abgearbeitet, sondern der Exception-Handlerc2 der Anweisungtry c1 catch X c2 ausgef¨uhrt werden. Wird die ExceptionX nicht ausgel¨ost, wird c2 ignoriert.2

5.4.1 Small-Step-Semantik Neue Regeln der Small-Step-Semantik:

TrySS: hc1, σi →1 hc1, σi

htry c1 catch X c2, σi →1 htry c1 catch X c2, σi TryCatch:htry raise X catch X c, σi →1 hc, σi

2Dieser Mechanismus ¨ahnelt den Exceptions von Java, es gibt allerdings keine Subsumtionsbeziehung zwischen verschiedenen Ausnahmenamen wie in folgendem Beispiel: try { throw new FileNotFoundException(); } catch (IOException ) { ... }. Außerdem sind Exceptions in Java Werte, die mit allen anderen Sprachmitteln kombiniert wer- den k¨onnen, z. B. Exception e = (... ? new ArrayStoreException() : new NullPointerException()); throw e;.

InWhileX gibt es jede Exception nur einmal und der konkrete Name muss an der Ausl¨osestelle selbst stehen.

(5)

TryRaise: X6=X

htry raise X catch X c, σi →1 hraise X, σi

TrySkip:htry skip catch X c, σi →1hskip, σi SeqRaise:hraise X; c, σi →1hraiseX, σi

Man braucht Exception-Propagationsregeln wie SeqRaiseundTryRaise f¨ur alle zusammengesetzten Ausdr¨ucke, f¨ur die man auch Teilausdruckreduktionsregeln hat. Im Falle vonWhileX ist dies nur die Sequenz.

Alle bisherigen Regeln gelten weiterhin und brauchen nicht angepasst zu werden. Damit ist diese Erweiterung modular.

Lemma 20 (Fortschrittslemma).

Wennc6=skip und ∀X. c6=raiseX, dann gibt es c und σ mithc, σi →1 hc, σi.

Beweis. Beweis durch Induktion ¨uber c:

• F¨alle skip,raise X: Explizit ausgeschlossen.

• F¨alle x := a,if (b) then c1 else c2,while (b) do c: Gleich wie im Fortschrittslemma 3 f¨ur While.

• Fallc1; c2: Induktionsannahme: Wenn c16=skipund ∀X. c1 6=raiseX, dann gibt es einc1 und σ mithc1, σi →1 hc1, σi.

Zu zeigen: Es gibt ein c und σ mit hc1; c2, σi →1 hc, σi. Fallunterscheidung nach c1 =skip oder c1 =raise X.

– Fall c1 =skip: (analog zum Beweis in Lem. 3)

Nach RegelSeq2SS gilthskip; c2, σi →1hc2, σi. W¨ahle alsoc =c2 und σ=σ.

– Fall c1 =raiseX: Nach RegelSeqRaise gilt hraiseX; c2, σi →1 hraise X, σi. W¨ahle also c =raiseX undσ =σ.

– Fall c1 6=skip und∀X. c16=raise X: Nach Induktionsannahme gibt es ein c1 und σ mit hc1, σi →1 hc1, σi. Nach RegelSeq1SS folgt damithc1; c2, σi →1 hc1; c2, σi.

• Falltry c1 catch Y c2: Induktionsannahme: Wenn c16=skipund ∀X. c1 6=raiseX, dann gibt esc1 und σ mithc1, σi →1 hc1, σi.

Zu zeigen: Es gibt ein c und σ mithtry c1 catch Y c2, σi →1 hc, σi.

Fallunterscheidung nachc1 =skip oder c1 =raiseX.

– Fall c1 =skip: Nach RegelTrySkipgilt htry skip catch Y c2, σi →1 hskip, σi. W¨ahle also c =skip undσ =σ.

– Fall c1 =raiseX:

Wenn X = Y, dann gilt nach Regel TryCatch, dass htry raiseX catch Y c2, σi →1 hc2, σi; w¨ahle also c =c2 und σ = σ. Wenn X 6=Y, dann gilt nach Regel TryRaise, dass htry raise X catch Y c2, σi →1hraiseX, σi; w¨ahle alsoc =raise X und σ=σ.

– Fall c1 6=skip und∀X. c16=raise X:

Nach Induktionsannahme gibt es einc1 und σ mithc1, σi →1hc1, σi.

Nach RegelTrySS folgt damithtry c1 catch Y c2, σi →1 htry c1 catch Y c2, σi.

5.4.2 Big-Step-Semantik

Um Exception-Handling als Big-Step-Semantik anzugeben, muss man in den Regeln die verschiedenen Terminationsarten einer Anweisung (skip undraise ) angeben k¨onnen. Dazu muss man den Typ der

(6)

Auswertungsrelationh , i ⇓ ¨andern auf

h , i ⇓ ⊆Com×(Xcp×Σ)×(Xcp×Σ)

wobei Xcp’ die Menge der Exceptionnamen Xcp um None erweitert. None bezeichne, dass gerade keine unbehandelte Exception vorliegt; ansonsten speichert das neue Exception-Flag im Zustand (Variablenkonventionξ), welche Exception ausgel¨ost wurde.

Damit ¨andern sich die bisherigen Regeln wie folgt:

SkipBS:hskip, (None, σ)i ⇓(None, σ) AssBS:hx := a, (None, σ)i ⇓(None, σ[x7→ AJaKσ])

SeqBS: hc0, (None, σ)i ⇓(ξ, σ)

c1, (ξ, σ)

⇓(ξ′′, σ′′) hc0; c1, (None, σ)i ⇓(ξ′′, σ′′)

IfTTBS: BJbKσ =tt hc0, (None, σ)i ⇓(ξ, σ) hif (b) then c0 else c1, (None, σ)i ⇓(ξ, σ)

IfFFBS: BJbKσ =ff hc1, (None, σ)i ⇓(ξ, σ) hif (b) then c0 else c1, (None, σ)i ⇓(ξ, σ)

WhileFFBS: BJbKσ=ff

hwhile (b) do c, (None, σ)i ⇓(ff, σ)

WhileTTBS: BJbKσ =tt hc, (None, σ)i ⇓(ξ, σ)

while (b) do c, (ξ, σ)

⇓(ξ′′, σ′′) hwhile (b) do c, (None, σ)i ⇓(ξ′′, σ′′)

Neue Regeln:

Raise:hraiseX, (None, σ)i ⇓(X, σ) Propagate:hc, (X, σ)i ⇓(X, σ)

TryBS: hc1, (None, σ)i ⇓(ξ, σ) ξ 6=X htry c1 catch X c2, (None, σ)i ⇓(ξ, σ)

Catch: hc1, (None, σ)i ⇓(X, σ) hc2, (None, σ)i ⇓(ξ′′, σ′′) htry c1 catch X c2, (None, σ)i ⇓(ξ′′, σ′′)

Einzig die RegelPropagatel¨asst sich bei gesetztem Exception-Flag anwenden. Alle anderen sind so formuliert, dass sie sich nur anwenden lassen, wenn das Exception-Flagξ nicht gesetzt ist. Dadurch ist offensichtlich, dass die Big-Step-Semantik weiterhin deterministisch ist.

Bemerkung: Big-Step- und Small-Step-Semantik sind weiterhin in folgendem Sinne ¨aquivalent:

1. Gelte hc, (None, σ)i ⇓(ξ, σ). Falls ξ = None, dann hc, σi→ 1 hskip, σi. Falls ξ =X, dann hc, σi→1 hraiseX, σi.

2. Wennhc, σi → 1 hskip, σi, dann hc, (None, σ)i ⇓ (None, σ). Wenn hc, σi →1 hraise X, σi, dann hc, (None, σ)i ⇓(X, σ).

Die Beweise verlaufen ¨ahnlich wie f¨ur Thm. 8 und 9.

Referenzen

ÄHNLICHE DOKUMENTE

Zwar sind dem Mittelstand die Möglichkeiten des BRSG oft noch nicht bewusst, doch können diese eine Option für die Neu- ausrichtung der bAV sein.. Zudem können

politik Die vier Bereiche Verkehr, Energie, Telekommunika¬ tion und, etwas weniger eindeutig, Post lassen sich unter der Bezeichnung Netzinfrastruktur zusammen¬ zu unterscheiden ist

Der Stadtrat hat auf Antrag von Verwaltungsstellen die Verordnungen zum Reglement über die öffentliche Sicherheit und Ordnung sowie zum Gebührentarif für Dienstleis-

Da der bislang kostenlose Park- platz ab 2019 bewirtschaftet wird, werden die Preise der Einzeleintritte und der 10er- Punktekarten für das Strandbad gesenkt, um

Damit nicht jeder macht, was er will, werden Regeln für alle auf- erlegt – Spielräume werden dadurch begrenzt und durch Strafen/Sanktionen Menschen möglichst davon abgehalten, sich

Der Baukostenzuschuss (BKZ) für Kundenanlagen, die an eine Verteilungsanlage angeschlossen werden, mit deren Errichtung nach Inkrafttreten der Ver- ordnung (1. April 1980)

in Deutschland dem Leibniz-Institut Deutsche Sammlung von Mikroorganismen und Zellkulturen (DSMZ) 1 , bezogen, können bei der Gefährdungsbeurteilung die mitgelieferten Angaben zu

Deshalb lassen wir nicht zu, dass Kinder und ihre Familien, Mitarbeitende oder Gäste herabgesetzt oder angegriffen werden – nicht wegen.. •