Declarative Semantics Definition - Static Analysis and Error Checking

3,082 views

Published on

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

Published in: Education, Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,082
On SlideShare
0
From Embeds
0
Number of Embeds
1,488
Actions
Shares
0
Downloads
83
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • feedback loop\n
  • feedback loop\n
  • feedback loop\n
  • feedback loop\n
  • feedback loop\n
  • restrictions on production rules => grammar classes\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • round-up on every lecture\n\nwhat to take with you\n\ncheck yourself, pre- and post-paration\n
  • \n
  • \n
  • 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

    ×