Documente Academic
Documente Profesional
Documente Cultură
C11
Denisa Diaconescu
Traian S, erbănut, ă
1
Semantica limbajelor de
programare
Principalele paradigme de programare
• Orientată pe obiecte
• Functională
2
Ce înseamnă semantică formală?
3
La ce foloses, te semantica?
4
Problema corectitudinii programelor
• Avem nevoie de metode ce asigură! Has become a very important issue, not just in safety-crit
! Components with assured quality, being able to give a wa
"calitate", capabile să ofere "garant,!ii".
Being able to run untrusted code, certificate carrying cod
5
C
#include <iostream>
using namespace std;
int main()
{
int square;
for(int i = 1; i <= 5; ++i)
{
square = i * i;
cout << square << endl;
}
}
6
C
#include <iostream>
using namespace std;
• Este corect?
int main()
{
int square;
for(int i = 1; i <= 5; ++i)
{
square = i * i;
cout << square << endl;
}
}
6
C
#include <iostream>
using namespace std;
• Este corect? În raport cu ce?
int main()
{
int square;
for(int i = 1; i <= 5; ++i)
{
square = i * i;
cout << square << endl;
}
}
6
C
#include <iostream>
using namespace std;
• Este corect? În raport cu ce?
int main()
{ • Un formalism adecvat trebuie:
int square; • să permită descrierea
for(int i = 1; i <= 5; ++i) problemelor (specificat, ii), s, i
• să rat, ioneze despre
{
implementarea lor
square = i * i;
(corectitudinea programelor).
cout << square << endl;
}
}
6
Care este comportamentul corect?
int main(void) {
int x = 0;
return (x = 1) + (x = 2);
}
7
Care este comportamentul corect?
int main(void) {
int x = 0;
return (x = 1) + (x = 2);
}
7
Tipuri de semantică
Vom folosi ca exemplu un mic limbaj imperativ IMP care cont, ine:
• Expresii
• Aritmetice: x + 3
• Booleene: x >= 7
• Instruct, iuni
• De atribuire: x = 5
• Condit, ionale: if(x >= 7, x = 5, x = 0)
• De ciclare: while(x >= 7, x = x - 1)
• Compunerea instruct, iunilor: x=7; while(x>=0, x=x-1)
• Blocuri de instruct, iuni: {x=7; while(x>=0, x=x-1)}
9
Limbajul IMP
{ x = 10 ; sum = 0;
while(0 =< x,
{sum = sum + x; x = x-1}
)},
sum
10
Sintaxa BNF a limbajului IMP
E ::= n | x
| E+E | E-E | E*E
C ::= skip
| x=E
| if( B , C , C )
| while( B , C )
| {C}| C;C
P ::= { C }, E
11
Semantica operat, ională small-step
Imagine de ansamblu
12
Starea execut, iei
• Starea execut, iei unui program IMP la un moment dat este dată
de valorile det, inute în acel moment de variabilele declarate în
program.
• Formal, starea execut, iei unui program IMP la un moment dat este
o funct, ie part, ială (cu domeniu finit):
σ : Var ⇀ Int
• Notatii:
• Descrierea funct, iei prin enumerare: σ = n 7→ 10, sum 7→ 0
• Funct, ia vidă ⊥, nedefinită pentru nicio variabilă
• Obt, inerea valorii unei variabile: σ(x )
• Suprascrierea valorii unei variabile:
σ(y ), dacă y , x
σ x ←v ( y ) =
v, dacă y = x
13
Semantica small-step
15
Redex. Reguli structurale. Axiome
15
Redex. Reguli structurale. Axiome
15
Redex. Reguli structurale. Axiome
⟨b , σ⟩ → − ⟨b ′ , σ⟩
⟨if (b , bl 1 , bl 2 ) , σ⟩ →
− ⟨if (b ′ , bl 1 , bl 2 ) , σ⟩
15
Redex. Reguli structurale. Axiome
⟨b , σ⟩ → − ⟨b ′ , σ⟩
⟨if (b , bl 1 , bl 2 ) , σ⟩ →
− ⟨if (b ′ , bl 1 , bl 2 ) , σ⟩
• Axiome
• Realizează pasul computat, ional
15
Redex. Reguli structurale. Axiome
⟨b , σ⟩ → − ⟨b ′ , σ⟩
⟨if (b , bl 1 , bl 2 ) , σ⟩ →
− ⟨if (b ′ , bl 1 , bl 2 ) , σ⟩
• Axiome
• Realizează pasul computat, ional
⟨if (true, bl 1 , bl 2 ) , σ⟩ →
− ⟨bl 1 , σ⟩
15
Semantica expresiilor aritmetice
16
Semantica expresiilor booleene
⟨a1 , σ⟩ →
− ⟨a1′ , σ⟩ ⟨a2 , σ⟩ →
− ⟨a2′ , σ⟩
⟨a1 =< a2 , σ⟩ →
− ⟨a1′ =< a2 , σ⟩ ⟨a1 =< a2 , σ⟩ →
− ⟨a1 =< a2′ , σ⟩
⟨a , σ⟩ →− ⟨a ′ , σ⟩
⟨not (a ) , σ⟩ →
− ⟨not (a ′ ) , σ⟩
17
Semantica expresiilor booleene
• Semantica s, i-ului
⟨b1 , σ⟩ →− ⟨b1′ , σ⟩
⟨and (b1 , b2 ) , σ⟩ →
− ⟨and (b1′ , b2 ) , σ⟩
18
Semantica compunerii s, i a blocurilor
• Semantica blocurilor
(Block) ⟨{ s } , σ⟩ →
− ⟨s , σ⟩
(Asgn) ⟨x = i , σ⟩ →
− ⟨skip , σ′ ⟩ dacă σ′ = σx ←i
⟨a , σ⟩ →
− ⟨a ′ , σ⟩
⟨x = a , σ⟩ →
− ⟨x = a ′ , σ⟩
19
Semantica lui if
• Semantica lui if
(If-true) ⟨if (true, bl 1 , bl 2 ) , σ⟩ →− ⟨bl 1 , σ⟩
(If-false) ⟨if (false, bl 1 , bl 2 ) , σ⟩ → − ⟨bl 2 , σ⟩
⟨b , σ⟩ → − ⟨b , σ⟩
′
⟨if (b , bl 1 , bl 2 ) , σ⟩ →
− ⟨if (b ′ , bl 1 , bl 2 ) , σ⟩
• Semantica programelor
⟨a1 , σ1 ⟩ →− ⟨a2 , σ2 ⟩
(Pgm)
⟨(skip, a1 ) , σ1 ⟩ →
− ⟨(skip, a2 ) , σ2 ⟩
⟨s1 , σ1 ⟩ →− ⟨s2 , σ2 ⟩
⟨(s1 , a ) , σ1 ⟩ →
− ⟨(s2 , a ) , σ2 ⟩
20
Semantica small-step a lui IMP
21
Semantica small-step a lui IMP
21
Semantica small-step a lui IMP
21
Semantica small-step a lui IMP
21
Semantica small-step a lui IMP
21
Semantica small-step a lui IMP
21
Semantica small-step a lui IMP
21
Semantica axiomatică
Semantica Axiomatică
• P (precondit, ie), Q (postcondit, ie) sunt asert, iuni logice asupra stării
sistemului înaintea, respectiv după execut, ia lui C
22
Semantica Axiomatică
23
Semantica Axiomatică
Exemple:
23
Logica Hoare ne ajută să verificăm corectitudinea programelor
24
Sistem de reguli pentru logica Floyd-Hoare
{P1} C {Q } {P2} C {Q }
(∨)
{P1 ∨ P2} C {Q }
{P } C {Q1} {P } C {Q2}
(∧)
{P } C {Q1 ∧ Q2}
25
Logica Floyd-Hoare pentru IMP1
(Skip)
{P } {} {P }
{P } C1 {Q } {Q } C2 {R }
(Seq)
{P } C1 ; C2 {R }
(Asign)
{P [x /e ]} x = e {P }
{B ∧ P } C1 {Q } {¬B ∧ P } C2 {Q }
(If)
{P } if (B) C1 else C2 {Q }
{B ∧ P } C {P }
(While)
{P } while (B) C {¬B ∧ P }
26
Regula pentru atribuire
(Asign)
{P [x /e ]} x = e {P }
Exemplu:
{x + y = y + 10} x = x + y {x = y + 10}
27
Regula pentru condit, ii
{B ∧ P } C1 {Q } {¬B ∧ P } C2 {Q }
(If)
{P } if (B) C1 else C2 {Q }
Exemplu:
Pentru a demonstra
{⊤} if (x <= y) z = x; else z = y; {z = min(x, y)}
este suficient să demonstrăm
• {x ≤ y} z = x {z = min(x, y)}
• {¬(x ≤ y)} z = y {z = min(x, y)}
28
Invariant, i pentru while
29
Invariant, i pentru while
{x = 0 ∧ 0 ≤ n ∧ y = 1}
while (x < n) { x = x + 1; y = y * x}
{y = n!}
30
Invariant, i pentru while
{x = 0 ∧ 0 ≤ n ∧ y = 1}
while (x < n) { x = x + 1; y = y * x}
{y = n!}
• Invariantul I este y = x !
30
Invariant, i pentru while
{x = 0 ∧ 0 ≤ n ∧ y = 1}
while (x < n) { x = x + 1; y = y * x}
{y = n!}
• Invariantul I este y = x !
• (x = 0 ∧ 0 ≤ n ∧ y = 1) → I
• {I ∧ (x < n)} x = x + 1; y = y * x { I }
• I ∧ ¬(x < n) → (y = n!)
30
Pe data viitoare!
31