Successfully reported this slideshow.

Declarative Semantics Definition - Static Analysis and Error Checking

3,155 views

Published on

Presentation slides of lecture 7 of course IN4303 on Compiler Construction at TU Delft.

Published in: Education, Technology
  • Be the first to comment

Declarative Semantics Definition - Static Analysis and Error Checking

  1. 1. IN4303 2014/15 Compiler Construction Declarative Semantics Definition static analysis and error checking Guido Wachsmuth
  2. 2. Static Analysis and Error Checking 2 source code
  3. 3. Static Analysis and Error Checking 2 source code parse
  4. 4. Static Analysis and Error Checking 2 source code errors parse check
  5. 5. parse generate Static Analysis and Error Checking 2 source code check errors machine code
  6. 6. Static Analysis and Error Checking 3 source code
  7. 7. Static Analysis and Error Checking 3 source code parse
  8. 8. Static Analysis and Error Checking 3 source code parse check
  9. 9. Static Analysis and Error Checking 3 source code parse check
  10. 10. Static Analysis and Error Checking 3 source code parse generate machine code check
  11. 11. Static Analysis and Error Checking 4 static checking name analysis name binding and scope
  12. 12. Static Analysis and Error Checking 4 static checking editor services name analysis name binding and scope
  13. 13. Static Analysis and Error Checking 4 static checking editor services transformation name analysis name binding and scope
  14. 14. Static Analysis and Error Checking 4 static checking editor services transformation refactoring name analysis name binding and scope
  15. 15. Static Analysis and Error Checking 4 static checking editor services transformation refactoring code generation name analysis name binding and scope
  16. 16. SDF3 NaBL TS Stratego ESV editor Static Analysis and Error Checking SPT tests 5 syntax definition concrete syntax abstract syntax static semantics name binding type system dynamic semantics translation interpretation
  17. 17. SDF3 NaBL TS Stratego ESV editor Static Analysis and Error Checking SPT tests 6 syntax definition concrete syntax abstract syntax static semantics name binding type system dynamic semantics translation interpretation
  18. 18. Static Analysis and Error Checking 7 formal semantics type system name binding testing name binding type system constraints specification name binding type system constraints
  19. 19. formal semantics Static Analysis and Error Checking 8 static semantics
  20. 20. theoretical computer science Static Analysis and Error Checking 9 word problem χL: Σ*→ {0,1} w → 1, if w∈L w → 0, else decidability & complexity
  21. 21. theoretical computer science decidability & complexity Static Analysis and Error Checking 9 word problem χL: Σ*→ {0,1} w → 1, if w∈L w → 0, else decidability type-0: semi-decidable type-1, type-2, type-3: decidable
  22. 22. theoretical computer science decidability & complexity Static Analysis and Error Checking 9 word problem χL: Σ*→ {0,1} w → 1, if w∈L w → 0, else decidability type-0: semi-decidable type-1, type-2, type-3: decidable complexity type-1: PSPACE-complete type-2, type-3: P
  23. 23. theoretical computer science decidability & complexity Static Analysis and Error Checking 9 word problem χL: Σ*→ {0,1} w → 1, if w∈L w → 0, else decidability type-0: semi-decidable type-1, type-2, type-3: decidable complexity type-1: PSPACE-complete type-2, type-3: P PSPACE⊇NP⊇P
  24. 24. theoretical computer science decidability & complexity Static Analysis and Error Checking 10 formal grammars context-sensitive context-free regular
  25. 25. theoretical computer science decidability & complexity Static Analysis and Error Checking 10 formal grammars context-sensitive context-free regular
  26. 26. theoretical computer science decidability & complexity Static Analysis and Error Checking 10 formal grammars context-sensitive context-free regular
  27. 27. /* factorial function */ ! let ! var x := 0 ! function fact(n : int) : int = if n < 1 then 1 else (n * fact(n - 1)) ! in ! for i := 1 to 3 do ( x := x + fact(i); printint(x); print(" ") ) ! end Static Analysis and Error Checking 11
  28. 28. #include <stio.h> ! /* factorial function */ ! int fac(int num) { if (num < 1) Static Analysis and Error Checking 12 return 1; else return num * fac(num - 1); } ! int main() { printf(“%d! = %dn”, 10, fac(10)); return 0; }
  29. 29. class Main { ! public static void main(String[] args) { System.out.println(new Fac().fac(10)); } } ! class Fac { ! public int fac(int num) { int num_aux; if (num < 1) num_aux = 1; else num_aux = num * this.fac(num - 1); return num_aux; } } Static Analysis and Error Checking 13
  30. 30. Static Analysis and Error Checking 14 static semantics restricting context-free languages context-sensitive language context-free grammar L(G) = {w∈Σ* | S ⇒G* w}
  31. 31. restricting context-free languages Static Analysis and Error Checking 14 static semantics context-free superset context-sensitive language context-free grammar L(G) = {w∈Σ* | S ⇒G* w}
  32. 32. restricting context-free languages Static Analysis and Error Checking 14 static semantics context-free superset context-sensitive language context-free grammar L(G) = {w∈Σ* | S ⇒G* w}
  33. 33. restricting context-free languages Static Analysis and Error Checking 14 static semantics context-free superset context-sensitive language context-free grammar L(G) = {w∈Σ* | S ⇒G* w} static semantics L = {w∈ L(G) | ⊢ w}
  34. 34. restricting context-free languages Static Analysis and Error Checking 14 static semantics context-free superset context-sensitive language context-free grammar L(G) = {w∈Σ* | S ⇒G* w} static semantics L = {w∈ L(G) | ⊢ w} judgements well-formed ⊢ w well-typed E ⊢ e : t
  35. 35. restricting context-free languages Static Analysis and Error Checking 14 static semantics context-free superset context-sensitive language context-free grammar L(G) = {w∈Σ* | S ⇒G* w} static semantics L = {w∈ L(G) | ⊢ w} judgements well-formed ⊢ w well-typed E ⊢ e : t
  36. 36. formal semantics Static Analysis and Error Checking 15 type systems
  37. 37. Tiger type system Static Analysis and Error Checking 16 E ⊢ i : int E ⊢ s : string E ⊢ nil : ⊥
  38. 38. Tiger type system Static Analysis and Error Checking 17 E ⊢ () : ∅ E ⊢ e1 : t1 E ⊢ e2 : t2 E ⊢ e1 ; e2 : t2
  39. 39. Tiger type system E ⊢ e1 : array of t E ⊢ e2 : int E ⊢ e1[e2] : t Static Analysis and Error Checking 18 E ⊢ e1 : int E ⊢ e2 : int E ⊢ e1 + e2 : int E ⊢ e1 : int E ⊢ e2 : int E ⊢ e1 < e2 : int E ⊢ e1 : string E ⊢ e2 : string E ⊢ e1 < e2 : int
  40. 40. Tiger type system E ⊢ e1 : t1 E ⊢ e2 : t2 t1 ≅ t2 E ⊢ e1 = e2 : int t1 <: t2 t1 ≅ t2 t2 <: t1 t1 ≅ t2 t ≠ ∅ t ≅ t Static Analysis and Error Checking 19 ⊥<: {f1, …, fn} ⊥<: array of t
  41. 41. Tiger type system Static Analysis and Error Checking 20 E ⊢ e1 : t1 E ⊢ e2 : t2 t1 ≅ t2 E ⊢ e1 := e2 : ∅ E ⊢ e1 : int E ⊢ e2 : t1 E ⊢ e3 : t2 E ⊢ if e1 then e2 else e3: sup<: {t1, t2}
  42. 42. formal semantics Static Analysis and Error Checking 21 name binding
  43. 43. Tiger scoping Static Analysis and Error Checking 22 let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := 42 end end
  44. 44. Tiger scoping Static Analysis and Error Checking 22 let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := 42 end end
  45. 45. Tiger scoping Static Analysis and Error Checking 22 let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := 42 end end
  46. 46. Tiger scoping Static Analysis and Error Checking 22 let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := 42 end end
  47. 47. Tiger scoping Static Analysis and Error Checking 22 let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := 42 end end
  48. 48. Tiger variable names E ⊢ e1 : t1 t ≅ t1 E ⊕ v ↦ t ⊢ e2 : t2 E ⊢ let var v : t = e1 in e2: t2 Static Analysis and Error Checking 23 E(v) = t E ⊢ v : t
  49. 49. Tiger function names E ⊕ v1 ↦ t1 ,…, vn ↦ tn ⊢ e1 : tf E ⊕ f ↦ t1 × … × tn → tf ⊢ e2 : t E ⊢ let function f (v1 : t1, …, vn : tn) = e1 in e2: t E(f) = t1 × … × tn → tf e1 : t1 … en : tn E ⊢ f (e1, …, en) : t Static Analysis and Error Checking 24
  50. 50. Static Analysis and Error Checking 25 testing
  51. 51. Static Analysis and Error Checking 26 test outer name [[ let type t = u Testing name binding type [[u]] = int var x: [[u]] := 0 in x := 42 ; let type u = t var y: u := 0 in y := 42 end end ]] resolve #2 to #1 test inner name [[ let type t = u type u = int var x: u := 0 in x := 42 ; let type [[u]] = t var y: [[u]] := 0 in y := 42 end end ]] resolve #2 to #1
  52. 52. Static Analysis and Error Checking 27 test integer constant [[ let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := [[42]] end Testing type system end ]] run get-type to IntTy() test variable reference [[ let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := [[x]] end end ]] run get-type to IntTy()
  53. 53. Static Analysis and Error Checking 28 Testing constraints test undefined variable [[ let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := [[z]] end end ]] 1 error test type error [[ let type t = u type u = string var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := [[x]] end end ]] 1 error
  54. 54. Static Analysis and Error Checking 29 testing static semantics context-free superset language
  55. 55. specification Static Analysis and Error Checking 30 name binding
  56. 56. Name Binding Language Static Analysis and Error Checking 31 concepts defines ! refers ! namespaces ! scopes ! imports
  57. 57. Name Binding Language definitions and references Static Analysis and Error Checking 32 TypeDec(t, _): defines Type t Tid(t) : refers to Type t let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := 42 end end
  58. 58. Name Binding Language Static Analysis and Error Checking 33 unique definitions TypeDec(t, _): defines unique Type t Tid(t) : refers to Type t let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := 42 end end
  59. 59. Name Binding Language Static Analysis and Error Checking 34 namespaces let type mt = int type rt = {f1: string, f2: int} type at = array of int ! var x := 42 var y: int := 42 ! function p() = print("foo") function sqr(x: int): int = x*x in … end namespaces Type Variable Function ! TypeDec(t, _): defines unique Type t ! FunDec(f, _, _): defines unique Function f FunDec(f, _, _, _): defines unique Function f Call(f, _) : refers to Function f ! VarDec(v, _): defines unique Variable v FArg(a, _): defines unique Variable a Var(v): refers to Variable v
  60. 60. Name Binding Language Static Analysis and Error Checking 35 scopes FunDec(f, _, _): defines unique Function f scopes Variable ! FunDec(f, _, _, _): defines unique Function f scopes Variable Let(_, _): scopes Type, Function, Variable let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := 42 end end
  61. 61. Name Binding Language Static Analysis and Error Checking 35 scopes FunDec(f, _, _): defines unique Function f scopes Variable ! FunDec(f, _, _, _): defines unique Function f scopes Variable Let(_, _): scopes Type, Function, Variable let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := 42 end end
  62. 62. Name Binding Language Static Analysis and Error Checking 35 scopes FunDec(f, _, _): defines unique Function f scopes Variable ! FunDec(f, _, _, _): defines unique Function f scopes Variable Let(_, _): scopes Type, Function, Variable let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := 42 end end
  63. 63. Name Binding Language Static Analysis and Error Checking 35 scopes FunDec(f, _, _): defines unique Function f scopes Variable ! FunDec(f, _, _, _): defines unique Function f scopes Variable Let(_, _): scopes Type, Function, Variable let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := 42 end end
  64. 64. Name Binding Language Static Analysis and Error Checking 35 scopes FunDec(f, _, _): defines unique Function f scopes Variable ! FunDec(f, _, _, _): defines unique Function f scopes Variable Let(_, _): scopes Type, Function, Variable let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := 42 end end
  65. 65. Name Binding Language Static Analysis and Error Checking 36 definition scopes For(v, start, end, body): for x := 0 to 42 do x; defines Variable v in body
  66. 66. Static Analysis and Error Checking 37 Spoofax bound renaming let type t = u type u = int var x: u := 0 in x := 42 ; let type u = t var y: u := 0 in y := 42 end end let type t0 = u0 type u0 = int var x: u0 := 0 in x := 42 ; let type u1 = t0 var y: u1 := 0 in y := 42 end end
  67. 67. Static Analysis and Error Checking 38 Spoofax annotated terms t{t1, ..., tn} ! ! ! add additional information to a term but preserve its signature
  68. 68. specification Static Analysis and Error Checking 39 type system
  69. 69. Static Analysis and Error Checking 40 TS axioms type rules ! Int(_) : IntTy() String(_): StringTy() ! signatures ! NilTy: Type type rules ! Nil(): NilTy() E ⊢ i : int E ⊢ s : string E ⊢ nil : ⊥
  70. 70. Static Analysis and Error Checking 41 TS inference rules type rules ! Add(e1,e2): IntTy() where e1: ty1 and ty1 == IntTy() and e2: ty2 and ty2 == IntTy() E ⊢ e1 : int E ⊢ e2 : int E ⊢ e1 + e2 : int
  71. 71. Static Analysis and Error Checking 42 TS inference rules type rules ! Lt(e1,e2): IntTy() where e1: ty1 and e2: ty2 and ( ( ty1 == IntTy() and ty2 == IntTy() ) or ( ty1 == StringTy() and ty2 == StringTy() ) ) E ⊢ e1 : int E ⊢ e2 : int E ⊢ e1 < e2 : int E ⊢ e1 : string E ⊢ e2 : string E ⊢ e1 < e2 : int
  72. 72. defines unique Variable x of type ty Static Analysis and Error Checking 43 NaBL and TS interaction binding rules ! VarDec(x, ty): type rules ! Var(x): ty where definition of x: ty
  73. 73. Static Analysis and Error Checking 44 NaBL and TS interaction FArg(a, t): defines unique Variable a of type t ! FunDec(f, a*, e): defines unique Function f of type (t*, t) where a* has type t* and e has type t ! Call(f, a*) : refers to Function f of type (t*, _) where a* has type t*
  74. 74. specification Static Analysis and Error Checking 45 constraints
  75. 75. Static Analysis and Error Checking 46 TS type errors type rules ! Add(e1,e2): IntTy() where e1: ty1 and ty1 == IntTy() else error "…" on e1 and e2: ty2 and ty2 == IntTy() else error "…" on e2 E ⊢ e1 : int E ⊢ e2 : int E ⊢ e1 + e2 : int
  76. 76. Static Analysis and Error Checking 47 TS missing definitions type rules ! Var(x): ty where definition of x: ty else error "…" on x
  77. 77. Static Analysis and Error Che4c8king 48 Spoofax origin tracking let var x := 21 in y * 2 end
  78. 78. Static Analysis and Error Che4c8king 48 Spoofax origin tracking let var x := 21 in y * 2 end Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))])
  79. 79. Static Analysis and Error Che4c8king 48 Spoofax origin tracking let var x := 21 in y * 2 end Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))]) desugar: Times(e1, e2) -> Bop(MUL(), e1, e2)
  80. 80. Static Analysis and Error Che4c8king 48 Spoofax origin tracking let var x := 21 in y * 2 end Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))]) desugar: Times(e1, e2) -> Bop(MUL(), e1, e2) Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
  81. 81. Static Analysis and Error Che4c8king 48 Spoofax origin tracking let var x := 21 in y * 2 end Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))]) desugar: Times(e1, e2) -> Bop(MUL(), e1, e2) Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
  82. 82. Static Analysis and Error Che4c8king 48 Spoofax origin tracking let var x := 21 in y * 2 end Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))]) desugar: Times(e1, e2) -> Bop(MUL(), e1, e2) Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Var(x): ty where definition of x: ty else error "…" on x
  83. 83. Static Analysis and Error Che4c8king 48 Spoofax origin tracking let var x := 21 in y * 2 end Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))]) desugar: Times(e1, e2) -> Bop(MUL(), e1, e2) Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Var(x): ty where definition of x: ty else error "…" on x
  84. 84. Static Analysis and Error Che4c8king 48 Spoofax origin tracking let var x := 21 in y * 2 end Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))]) desugar: Times(e1, e2) -> Bop(MUL(), e1, e2) Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Var(x): ty where definition of x: ty else error "…" on x
  85. 85. Static Analysis and Error Che4c8king 48 Spoofax origin tracking let var x := 21 in y * 2 end Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))]) desugar: Times(e1, e2) -> Bop(MUL(), e1, e2) Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Var(x): ty where definition of x: ty else error "…" on x
  86. 86. Static Analysis and Error Che4c8king 48 Spoofax origin tracking let var x := 21 in y * 2 end Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))]) desugar: Times(e1, e2) -> Bop(MUL(), e1, e2) Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Var(x): ty where definition of x: ty else error "…" on x
  87. 87. Static Analysis and Error Che4c8king 48 Spoofax origin tracking let var x := 21 in y * 2 end Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))]) desugar: Times(e1, e2) -> Bop(MUL(), e1, e2) Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Var(x): ty where definition of x: ty else error "…" on x
  88. 88. Static Analysis and Error Che4c8king 48 Spoofax origin tracking let var x := 21 in y * 2 end Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))]) desugar: Times(e1, e2) -> Bop(MUL(), e1, e2) Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Var(x): ty where definition of x: ty else error "…" on x
  89. 89. Static Analysis and Error Che4c8king 48 Spoofax origin tracking let var x := 21 in y * 2 end Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))]) desugar: Times(e1, e2) -> Bop(MUL(), e1, e2) Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Var(x): ty where definition of x: ty else error "…" on x
  90. 90. Static Analysis and Error Che4c8king 48 Spoofax origin tracking let var x := 21 in y * 2 end Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))]) desugar: Times(e1, e2) -> Bop(MUL(), e1, e2) Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))]) Var(x): ty where definition of x: ty else error "…" on x
  91. 91. Static Analysis and Error Checking 49 derivation of editor services error checking reference resolution code completion Spoofax static analysis
  92. 92. Static Analysis and Error Checking 49 derivation of editor services error checking reference resolution code completion multi-file analysis Spoofax static analysis
  93. 93. Static Analysis and Error Checking 49 derivation of editor services error checking reference resolution code completion multi-file analysis parallel analysis Spoofax static analysis
  94. 94. Static Analysis and Error Checking 49 derivation of editor services error checking reference resolution code completion multi-file analysis parallel analysis incremental analysis Spoofax static analysis
  95. 95. Except where otherwise noted, this work is licensed under Static Analysis and Error Checking 50
  96. 96. Static Analysis and Error Checking 51 attribution slide title author license 1 Inspection Kent Wien CC BY-NC 2.0 2, 3 PICOL icons Melih Bilgil CC BY 3.0 10 Noam Chomsky Maria Castelló Solbes CC BY-NC-SA 2.0 11, 16-20, 22-24 Tiger Bernard Landgraf CC BY-SA 3.0 12 The C Programming Language Bill Bradford CC BY 2.0 13 Italian Java book cover

×