SlideShare ist ein Scribd-Unternehmen logo
1 von 50
Static Checking and Type Systems Chapter 6 COP5621 Compiler Construction Copyright Robert van Engelen, Florida State University, 2007-2009
The Structure of our Compiler Revisited Lexical analyzer Syntax-directed static checker Character stream Token stream Java bytecode Yacc specification JVM specification Lex specification Syntax-directed translator Type checking Code generation
Static versus Dynamic Checking ,[object Object],[object Object],[object Object],[object Object]
Static Checking ,[object Object],[object Object],[object Object],[object Object],[object Object]
Type Checks, Overloading, Coercion, and Polymorphism int op(int), op(float); int f(float); int a, c[10], d; d = c+d; // FAIL *d = a; // FAIL a = op(d); // OK: overloading (C++) a = f(d); // OK: coersion of d to float vector<int> v; // OK: template instantiation
Flow-of-Control Checks myfunc() { … break; // ERROR } myfunc() { … switch (a)   { case 0: …   break; // OK case 1: … } } myfunc() { … while (n) { … if (i>10) break; // OK } }
Uniqueness Checks myfunc() { int i, j, i; // ERROR    … } cnufym(int a, int a) // ERROR {  … } struct myrec { int name; }; struct myrec // ERROR { int id; };
Name-Related Checks LoopA: for (int I = 0; I < n; I++) { …   if (a[I] == 0)   break LoopB; // Java labeled loop   … }
One-Pass versus Multi-Pass Static Checking ,[object Object],[object Object],[object Object]
Type Expressions ,[object Object],[object Object],[object Object],[object Object]
Graph Representations for Type Expressions int *f(char*,char*) fun args pointer char int pointer char pointer Tree forms fun args pointer char int pointer DAGs
Cyclic Graph Representations struct Node { int val;   struct Node *next; }; struct val pointer int Internal compiler representation of the  Node  type: cyclic graph next Source program
Name Equivalence ,[object Object],[object Object],[object Object],type link = ^node; var next : link;   last : link;   p : ^node;   q, r : ^node; With name equivalence in Pascal: p  ≠  next p  ≠  last p  =  q  =  r next  =  last
Structural Equivalence of Type Expressions ,[object Object],[object Object],struct val next int pointer struct val int pointer = pointer next
Structural Equivalence of Type Expressions (cont’d) ,[object Object],struct val int pointer s p struct Node { int val;   struct Node *next; }; struct Node s, *p; …  p = &s; // OK … *p = s; // OK next &s *p
Constructing Type Graphs in Yacc Type *mkint() construct int node if not already   constructed Type *mkarr(Type*,int) construct array-of-type node   if not already constructed   Type *mkptr(Type*) construct pointer-of-type node   if not already constructed
Syntax-Directed Definitions for Constructing Type Graphs in Yacc %union { Symbol *sym;   int num;   Type *typ; } %token INT %token <sym> ID %token <int> NUM %type <typ> type %% decl : type ID  { addtype($2, $1); }   | type ID ‘[’ NUM ‘]’ { addtype($2, mkarr($1, $4)); }   ; type : INT  { $$ = mkint(); }   | type ‘*’  { $$ = mkptr($1); }   | /* empty */  { $$ = mkint(); }   ;
Type Systems ,[object Object],[object Object],[object Object]
Type Rules in Post System Notation     e 1  :  integer     e 2  :  integer     e 1   +   e 2  :  integer Type judgments e  :   where  e  is an expression and    is a type Environment     maps objects  v  to types   :  ( v ) =    ( v ) =         v  :       e  :       v  :=  e  :  void  ( v ) =  
Type System Example     y + 2  :  integer     x := y + 2  :  void Environment    is a set of   name ,  type   pairs, for example:    = {   x , integer  ,   y , integer  ,   z , char  ,   1, integer  ,   2, integer   } From    and rules we can check types: type checking = theorem proving The proof that  x := y + 2  is typed correctly:  ( y ) =  integer       y  :  integer  ( x ) =  integer    ( 2 ) =  integer       2  :  integer
A Simple Language Example P      D   ;   S D      D   ;   D      id :  T T      boolean      char      integer      array   [ num ] of   T      ^   T S      id :=   E      if   E   then   S      while   E   do   S      S   ;   S E      true      false        literal        num        id      E   and   E      E   +   E      E   [   E   ]      E   ^ Pascal-like pointer dereference operator Pointer to  T
Simple Language Example: Declarations D      id :  T {  addtype ( id .entry,  T .type) } T      boolean {  T .type :=  boolean  } T      char {  T .type :=  char  } T      integer {  T .type :=  integer  } T      array   [ num ] of   T 1 {  T .type :=  array (1.. num .val,  T 1 .type) } T      ^   T 1 {  T .type :=  pointer ( T 1 ) Parametric types: type constructor
Simple Language Example: Checking Statements S      id :=   E  {  S .type :=  if   id .type =  E .type  then   void   else   type_error  }     e  :       v  :=  e  :  void  ( v ) =     Note: the type of  id  is determined by scope’s environment: id .type =  lookup ( id .entry)
Simple Language Example: Checking Statements (cont’d) S      if   E   then   S 1 {  S .type :=  if   E .type =  boolean   then   S 1 .type   else   type_error  }      s  :       if  e  then  s  :      e  :  boolean    
Simple Language Example: Statements (cont’d) S      while   E   do   S 1 {  S .type :=  if   E .type =  boolean   then   S 1 .type   else   type_error  }      s  :       while  e  do  s  :      e  :  boolean    
Simple Language Example: Checking Statements (cont’d) S      S 1   ;   S 2 {  S .type :=  if   S 1 .type =  void  and  S 2 .type =  void  then  void   else   type_error  }      s 2  :  void     s 1   ;  s 2   :  void    s 1  :  void    
Simple Language Example: Checking Expressions E      true {  E .type =  boolean  } E      false   {  E .type =  boolean  } E      literal   {  E .type =  char  } E      num {  E .type =  integer  }  E      id {  E .type =  lookup ( id .entry) } …  ( v ) =         v  :  
Simple Language Example: Checking Expressions (cont’d) E      E 1   +   E 2 {  E .type :=  if   E 1 .type =  integer   and   E 2 .type =  integer     then   integer   else   type_error  }       e 1  :  integer     e 2  :  integer     e 1   +   e 2  :  integer
Simple Language Example: Checking Expressions (cont’d) E      E 1   and   E 2   {  E .type :=  if   E 1 .type =  boolean   and   E 2 .type =  boolean     then   boolean   else   type_error  }       e 1  :  boolean     e 2  :  boolean     e 1   and   e 2  :  boolean
Simple Language Example: Checking Expressions (cont’d) E      E 1   [   E 2   ]  {  E .type :=  if   E 1 .type =  array ( s ,  t )  and   E 2 .type =  integer     then   t   else   type_error  }       e 1  :  array ( s ,   )     e 2  :  integer     e 1 [ e 2 ]  :  
Simple Language Example: Checking Expressions (cont’d) E      E 1   ^ {  E .type :=  if   E 1 .type =  pointer ( t )  then   t   else   type_error  }       e  :  pointer (  )     e   ^  :  
A Simple Language Example: Functions T      T   ->   T E      E   (   E   ) Example: v : integer; odd : integer -> boolean; if odd(3) then   v := 1; Function type declaration Function call
Simple Language Example: Function Declarations T      T 1   ->  T 2 {  T .type :=  function ( T 1 .type,  T 2 .type) } Parametric type: type constructor
Simple Language Example: Checking Function Invocations E      E 1   (   E 2   )  {  E .type :=  if   E 1 .type =  function ( s ,  t )  and   E 2 .type =  s     then   t   else   type_error  }       e 1  :  function (  ,   )     e 2  :       e 1 ( e 2 )  :  
Type Conversion and Coercion ,[object Object],[object Object],[object Object]
Syntax-Directed Definitions for Type Checking in Yacc %{ enum Types {Tint, Tfloat, Tpointer, Tarray, … }; typedef struct Type { enum Types type;   struct Type *child; // at most one type parameter } Type; %} %union { Type *typ; } %type <typ> expr %% …
Syntax-Directed Definitions for Type Checking in Yacc (cont’d) … %% expr : expr ‘+’ expr { if ($1->type != Tint   || $3->type != Tint)   semerror(“non-int operands in +”);   $$ = mkint();   emit(iadd);   }
Syntax-Directed Definitions for Type Coercion in Yacc … %% expr : expr ‘+’ expr   { if ($1->type == Tint && $3->type == Tint)   { $$ = mkint(); emit(iadd);   } else if ($1->type == Tfloat && $3->type == Tfloat)   { $$ = mkfloat(); emit(fadd);   }   else if ($1->type == Tfloat && $3->type == Tint)   { $$ = mkfloat(); emit(i2f); emit(fadd);   }   else if ($1->type == Tint && $3->type == Tfloat)   { $$ = mkfloat(); emit(swap); emit(i2f); emit(fadd);   }   else semerror(“type error in +”);   $$ = mkint(); }
Checking L-Values and R-Values in Yacc %{ typedef struct Node { Type *typ;  // type structure   int islval; // 1 if L-value } Node; %} %union { Node *rec; } %type <rec> expr %% …
Checking L-Values and R-Values in Yacc expr : expr ‘+’ expr   { if ($1->typ->type != Tint || $3->typ->type != Tint)   semerror(“non-int operands in +”);   $$->typ = mkint();   $$->islval = FALSE;   emit(…);   }    | expr ‘=’ expr   { if (!$1->islval || $1->typ != $3->typ)   semerror(“invalid assignment”);   $$->typ = $1->typ;   $$->islval = FALSE;   emit(…);   }   | ID   { $$->typ = lookup($1);   $$->islval = TRUE;   emit(…);   }
Type Inference and Polymorphic Functions ,[object Object],[object Object],[object Object],[object Object],[object Object]
Type Inference and Polymorphic Functions ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Type Inference and Polymorphic Functions ,[object Object],[object Object],    e 1  : α   -> β     e 2  : α     e 1 ( e 2 )  : β     length  : ∀α.list(α) -> integer     [“a”, “b”] : list(string)     length ( [“a”, “b”] )  : integer …
Example Type Inference Append  concatenates two lists recursively: fun   append ( x, y ) = if   null ( x )  then   y else   cons ( hd ( x ) , append ( tl ( x ),  y ))  where null  : ∀α.list(α) -> bool hd  : ∀α.list(α) -> α tl  : ∀α.list(α) -> list(α) cons  : ∀α.(α  ×  list(α)) -> list(α)
Example Type Inference fun   append ( x, y ) = if   null ( x )  then   y else   cons ( hd ( x ) , append ( tl ( x ),  y ))  The type of  append  :   ∀ σ ,τ, φ . ( σ  × τ) ->  φ  is: type of  x  :   σ  =  list(α 1 ) from  null ( x ) type of  y  :   τ =  φ  from  append ’s return type return type of  append  : list(α 2 ) from return type of  cons and   α 1  = α 2  because     cons ( hd(x), append ( tl ( x ),  y )) : list(α 2 )     hd ( x ) : α 1     x  : list(α 1 )     append ( tl ( x ) , y ) : list(α 1 )     tl ( x ) : list(α 1 )     y  : list(α 1 )  x  : list(α 1 ) 
Example Type Inference fun   append ( x, y ) = if   null ( x )  then   y else   cons ( hd ( x ) , append ( tl ( x ),  y ))  The type of  append  :   ∀ σ ,τ, φ . ( σ  × τ) ->  φ  is: σ  =  list(α) τ =  φ  = list(α) Hence, append  : ∀α.(list(α)  ×  list(α)) -> list(α)
Example Type Inference     append ([1, 2], [3]) :  τ     append ([1, 2], [3]) : list( α )     ([1, 2],[3]) : list( α ) ×  list( α ) τ  = list( α ) α  = integer     append ([1], [“a”]) :  τ     append ([1], [“a”]) : list( α )     ([1],[“a”]) : list( α ) ×  list( α ) Type error
Type Inference: Substitutions, Instances, and Unification ,[object Object],[object Object],[object Object]
Unification An AST representation of  append ([], [1, 2])  apply append  : ∀α.(list(α)  ×  list(α)) -> list(α) [] : list( φ )  1 : integer (  ×  ) : ( σ ,  τ ) [  ,  ] : list( ψ ) 2 : integer
Unification An AST representation of  append ([], [1, 2])  apply append  : ∀α.(list(α)  ×  list(α)) -> list(α) (  ×  ) : ( σ ,  τ ) [] : list( φ )  [  ,  ] : list( ψ ) 1 : integer 2 : integer τ  =  list( ψ ) = list(integer) ⇒  φ  =  ψ  = integer σ  =  list( φ ) = list( ψ ) ⇒  φ  =  ψ Unify by the following substitutions: σ  =  τ  =  list( α ) ⇒  α  = integer

Weitere ähnliche Inhalte

Was ist angesagt?

Lecture 01 introduction to compiler
Lecture 01 introduction to compilerLecture 01 introduction to compiler
Lecture 01 introduction to compilerIffat Anjum
 
Parsing in Compiler Design
Parsing in Compiler DesignParsing in Compiler Design
Parsing in Compiler DesignAkhil Kaushik
 
Introduction to compiler
Introduction to compilerIntroduction to compiler
Introduction to compilerAbha Damani
 
compiler ppt on symbol table
 compiler ppt on symbol table compiler ppt on symbol table
compiler ppt on symbol tablenadarmispapaulraj
 
Compiler Design Lecture Notes
Compiler Design Lecture NotesCompiler Design Lecture Notes
Compiler Design Lecture NotesFellowBuddy.com
 
Symbol table in compiler Design
Symbol table in compiler DesignSymbol table in compiler Design
Symbol table in compiler DesignKuppusamy P
 
Common language runtime clr
Common language runtime clrCommon language runtime clr
Common language runtime clrSanSan149
 
Regular Expression to Finite Automata
Regular Expression to Finite AutomataRegular Expression to Finite Automata
Regular Expression to Finite AutomataArchana Gopinath
 
Intermediate code generation (Compiler Design)
Intermediate code generation (Compiler Design)   Intermediate code generation (Compiler Design)
Intermediate code generation (Compiler Design) Tasif Tanzim
 
Decision properties of reular languages
Decision properties of reular languagesDecision properties of reular languages
Decision properties of reular languagesSOMNATHMORE2
 

Was ist angesagt? (20)

Lecture 01 introduction to compiler
Lecture 01 introduction to compilerLecture 01 introduction to compiler
Lecture 01 introduction to compiler
 
Input-Buffering
Input-BufferingInput-Buffering
Input-Buffering
 
Parsing in Compiler Design
Parsing in Compiler DesignParsing in Compiler Design
Parsing in Compiler Design
 
Introduction to compiler
Introduction to compilerIntroduction to compiler
Introduction to compiler
 
compiler ppt on symbol table
 compiler ppt on symbol table compiler ppt on symbol table
compiler ppt on symbol table
 
Compiler Design Lecture Notes
Compiler Design Lecture NotesCompiler Design Lecture Notes
Compiler Design Lecture Notes
 
Introduction to Compiler design
Introduction to Compiler design Introduction to Compiler design
Introduction to Compiler design
 
pushdown automata
pushdown automatapushdown automata
pushdown automata
 
Code generation
Code generationCode generation
Code generation
 
Types of Compilers
Types of CompilersTypes of Compilers
Types of Compilers
 
Top down parsing
Top down parsingTop down parsing
Top down parsing
 
LR Parsing
LR ParsingLR Parsing
LR Parsing
 
Symbol table in compiler Design
Symbol table in compiler DesignSymbol table in compiler Design
Symbol table in compiler Design
 
Common language runtime clr
Common language runtime clrCommon language runtime clr
Common language runtime clr
 
Context free grammar
Context free grammarContext free grammar
Context free grammar
 
Regular Expression to Finite Automata
Regular Expression to Finite AutomataRegular Expression to Finite Automata
Regular Expression to Finite Automata
 
process control block
process control blockprocess control block
process control block
 
Intermediate code generation (Compiler Design)
Intermediate code generation (Compiler Design)   Intermediate code generation (Compiler Design)
Intermediate code generation (Compiler Design)
 
Decision properties of reular languages
Decision properties of reular languagesDecision properties of reular languages
Decision properties of reular languages
 
Role-of-lexical-analysis
Role-of-lexical-analysisRole-of-lexical-analysis
Role-of-lexical-analysis
 

Andere mochten auch

Ionuț G. Stan - Let’s write a type checker at I T.A.K.E. Unconference 2015
Ionuț G. Stan - Let’s write a type checker at I T.A.K.E. Unconference 2015Ionuț G. Stan - Let’s write a type checker at I T.A.K.E. Unconference 2015
Ionuț G. Stan - Let’s write a type checker at I T.A.K.E. Unconference 2015Mozaic Works
 
Data Type Conversion in C++
Data Type Conversion in C++Data Type Conversion in C++
Data Type Conversion in C++Danial Mirza
 
Type checking
Type checkingType checking
Type checkingrawan_z
 
Three address code In Compiler Design
Three address code In Compiler DesignThree address code In Compiler Design
Three address code In Compiler DesignShine Raj
 
Compiler Design
Compiler DesignCompiler Design
Compiler DesignMir Majid
 
Type conversions
Type conversionsType conversions
Type conversionssanya6900
 

Andere mochten auch (10)

Ionuț G. Stan - Let’s write a type checker at I T.A.K.E. Unconference 2015
Ionuț G. Stan - Let’s write a type checker at I T.A.K.E. Unconference 2015Ionuț G. Stan - Let’s write a type checker at I T.A.K.E. Unconference 2015
Ionuț G. Stan - Let’s write a type checker at I T.A.K.E. Unconference 2015
 
Data Type Conversion in C++
Data Type Conversion in C++Data Type Conversion in C++
Data Type Conversion in C++
 
Type checking
Type checkingType checking
Type checking
 
Compiler construction
Compiler constructionCompiler construction
Compiler construction
 
Three address code In Compiler Design
Three address code In Compiler DesignThree address code In Compiler Design
Three address code In Compiler Design
 
Lexical analyzer
Lexical analyzerLexical analyzer
Lexical analyzer
 
Compiler Design
Compiler DesignCompiler Design
Compiler Design
 
Compiler Chapter 1
Compiler Chapter 1Compiler Chapter 1
Compiler Chapter 1
 
Type Casting in C++
Type Casting in C++Type Casting in C++
Type Casting in C++
 
Type conversions
Type conversionsType conversions
Type conversions
 

Ähnlich wie Ch6

12TypeSystem.pdf
12TypeSystem.pdf12TypeSystem.pdf
12TypeSystem.pdfMdAshik35
 
02. chapter 3 lexical analysis
02. chapter 3   lexical analysis02. chapter 3   lexical analysis
02. chapter 3 lexical analysisraosir123
 
IMP PPT- Python programming fundamentals.pptx
IMP PPT- Python programming fundamentals.pptxIMP PPT- Python programming fundamentals.pptx
IMP PPT- Python programming fundamentals.pptxlemonchoos
 
ANSI C REFERENCE CARD
ANSI C REFERENCE CARDANSI C REFERENCE CARD
ANSI C REFERENCE CARDTia Ricci
 
Lecture 1 - Lexical Analysis.ppt
Lecture 1 - Lexical Analysis.pptLecture 1 - Lexical Analysis.ppt
Lecture 1 - Lexical Analysis.pptNderituGichuki1
 
Chapter Two(1)
Chapter Two(1)Chapter Two(1)
Chapter Two(1)bolovv
 
Declarative Semantics Definition - Static Analysis and Error Checking
Declarative Semantics Definition - Static Analysis and Error CheckingDeclarative Semantics Definition - Static Analysis and Error Checking
Declarative Semantics Definition - Static Analysis and Error CheckingGuido Wachsmuth
 
Compiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type CheckingCompiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type CheckingEelco Visser
 
12IRGeneration.pdf
12IRGeneration.pdf12IRGeneration.pdf
12IRGeneration.pdfSHUJEHASSAN
 
Crystal: tipos, peculiaridades y desafios
Crystal: tipos, peculiaridades y desafiosCrystal: tipos, peculiaridades y desafios
Crystal: tipos, peculiaridades y desafiosBrian Cardiff
 
Declare Your Language: Name Resolution
Declare Your Language: Name ResolutionDeclare Your Language: Name Resolution
Declare Your Language: Name ResolutionEelco Visser
 
Datatypes in Python.pdf
Datatypes in Python.pdfDatatypes in Python.pdf
Datatypes in Python.pdfking931283
 
Types and perl language
Types and perl languageTypes and perl language
Types and perl languageMasahiro Honma
 
compiler Design course material chapter 2
compiler Design course material chapter 2compiler Design course material chapter 2
compiler Design course material chapter 2gadisaAdamu
 

Ähnlich wie Ch6 (20)

Ch6.ppt
Ch6.pptCh6.ppt
Ch6.ppt
 
12TypeSystem.pdf
12TypeSystem.pdf12TypeSystem.pdf
12TypeSystem.pdf
 
Ch3
Ch3Ch3
Ch3
 
Ch5a
Ch5aCh5a
Ch5a
 
02. chapter 3 lexical analysis
02. chapter 3   lexical analysis02. chapter 3   lexical analysis
02. chapter 3 lexical analysis
 
IMP PPT- Python programming fundamentals.pptx
IMP PPT- Python programming fundamentals.pptxIMP PPT- Python programming fundamentals.pptx
IMP PPT- Python programming fundamentals.pptx
 
ANSI C REFERENCE CARD
ANSI C REFERENCE CARDANSI C REFERENCE CARD
ANSI C REFERENCE CARD
 
Lecture 1 - Lexical Analysis.ppt
Lecture 1 - Lexical Analysis.pptLecture 1 - Lexical Analysis.ppt
Lecture 1 - Lexical Analysis.ppt
 
Chapter Two(1)
Chapter Two(1)Chapter Two(1)
Chapter Two(1)
 
Declarative Semantics Definition - Static Analysis and Error Checking
Declarative Semantics Definition - Static Analysis and Error CheckingDeclarative Semantics Definition - Static Analysis and Error Checking
Declarative Semantics Definition - Static Analysis and Error Checking
 
Compiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type CheckingCompiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type Checking
 
12IRGeneration.pdf
12IRGeneration.pdf12IRGeneration.pdf
12IRGeneration.pdf
 
Crystal: tipos, peculiaridades y desafios
Crystal: tipos, peculiaridades y desafiosCrystal: tipos, peculiaridades y desafios
Crystal: tipos, peculiaridades y desafios
 
Declare Your Language: Name Resolution
Declare Your Language: Name ResolutionDeclare Your Language: Name Resolution
Declare Your Language: Name Resolution
 
Datatypes in Python.pdf
Datatypes in Python.pdfDatatypes in Python.pdf
Datatypes in Python.pdf
 
Types and perl language
Types and perl languageTypes and perl language
Types and perl language
 
C Tutorial
C TutorialC Tutorial
C Tutorial
 
compiler Design course material chapter 2
compiler Design course material chapter 2compiler Design course material chapter 2
compiler Design course material chapter 2
 
C# overview part 1
C# overview part 1C# overview part 1
C# overview part 1
 
C tutorial
C tutorialC tutorial
C tutorial
 

Mehr von kinnarshah8888 (15)

Yuva Msp All
Yuva Msp AllYuva Msp All
Yuva Msp All
 
Yuva Msp Intro
Yuva Msp IntroYuva Msp Intro
Yuva Msp Intro
 
Ch9c
Ch9cCh9c
Ch9c
 
Ch8a
Ch8aCh8a
Ch8a
 
Ch9b
Ch9bCh9b
Ch9b
 
Ch9a
Ch9aCh9a
Ch9a
 
Ch10
Ch10Ch10
Ch10
 
Ch7
Ch7Ch7
Ch7
 
Ch2
Ch2Ch2
Ch2
 
Ch4b
Ch4bCh4b
Ch4b
 
Ch4a
Ch4aCh4a
Ch4a
 
Ch8b
Ch8bCh8b
Ch8b
 
Ch5b
Ch5bCh5b
Ch5b
 
Ch4c
Ch4cCh4c
Ch4c
 
Ch1
Ch1Ch1
Ch1
 

Kürzlich hochgeladen

Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Principled Technologies
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesBoston Institute of Analytics
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 

Kürzlich hochgeladen (20)

Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 

Ch6

  • 1. Static Checking and Type Systems Chapter 6 COP5621 Compiler Construction Copyright Robert van Engelen, Florida State University, 2007-2009
  • 2. The Structure of our Compiler Revisited Lexical analyzer Syntax-directed static checker Character stream Token stream Java bytecode Yacc specification JVM specification Lex specification Syntax-directed translator Type checking Code generation
  • 3.
  • 4.
  • 5. Type Checks, Overloading, Coercion, and Polymorphism int op(int), op(float); int f(float); int a, c[10], d; d = c+d; // FAIL *d = a; // FAIL a = op(d); // OK: overloading (C++) a = f(d); // OK: coersion of d to float vector<int> v; // OK: template instantiation
  • 6. Flow-of-Control Checks myfunc() { … break; // ERROR } myfunc() { … switch (a) { case 0: … break; // OK case 1: … } } myfunc() { … while (n) { … if (i>10) break; // OK } }
  • 7. Uniqueness Checks myfunc() { int i, j, i; // ERROR … } cnufym(int a, int a) // ERROR { … } struct myrec { int name; }; struct myrec // ERROR { int id; };
  • 8. Name-Related Checks LoopA: for (int I = 0; I < n; I++) { … if (a[I] == 0) break LoopB; // Java labeled loop … }
  • 9.
  • 10.
  • 11. Graph Representations for Type Expressions int *f(char*,char*) fun args pointer char int pointer char pointer Tree forms fun args pointer char int pointer DAGs
  • 12. Cyclic Graph Representations struct Node { int val; struct Node *next; }; struct val pointer int Internal compiler representation of the Node type: cyclic graph next Source program
  • 13.
  • 14.
  • 15.
  • 16. Constructing Type Graphs in Yacc Type *mkint() construct int node if not already constructed Type *mkarr(Type*,int) construct array-of-type node if not already constructed Type *mkptr(Type*) construct pointer-of-type node if not already constructed
  • 17. Syntax-Directed Definitions for Constructing Type Graphs in Yacc %union { Symbol *sym; int num; Type *typ; } %token INT %token <sym> ID %token <int> NUM %type <typ> type %% decl : type ID { addtype($2, $1); } | type ID ‘[’ NUM ‘]’ { addtype($2, mkarr($1, $4)); } ; type : INT { $$ = mkint(); } | type ‘*’ { $$ = mkptr($1); } | /* empty */ { $$ = mkint(); } ;
  • 18.
  • 19. Type Rules in Post System Notation   e 1 : integer   e 2 : integer   e 1 + e 2 : integer Type judgments e :  where e is an expression and  is a type Environment  maps objects v to types  :  ( v ) =   ( v ) =    v :    e :    v := e : void  ( v ) = 
  • 20. Type System Example   y + 2 : integer   x := y + 2 : void Environment  is a set of  name , type  pairs, for example:  = {  x , integer  ,  y , integer  ,  z , char  ,  1, integer  ,  2, integer  } From  and rules we can check types: type checking = theorem proving The proof that x := y + 2 is typed correctly:  ( y ) = integer   y : integer  ( x ) = integer  ( 2 ) = integer   2 : integer
  • 21. A Simple Language Example P  D ; S D  D ; D  id : T T  boolean  char  integer  array [ num ] of T  ^ T S  id := E  if E then S  while E do S  S ; S E  true  false  literal  num  id  E and E  E + E  E [ E ]  E ^ Pascal-like pointer dereference operator Pointer to T
  • 22. Simple Language Example: Declarations D  id : T { addtype ( id .entry, T .type) } T  boolean { T .type := boolean } T  char { T .type := char } T  integer { T .type := integer } T  array [ num ] of T 1 { T .type := array (1.. num .val, T 1 .type) } T  ^ T 1 { T .type := pointer ( T 1 ) Parametric types: type constructor
  • 23. Simple Language Example: Checking Statements S  id := E { S .type := if id .type = E .type then void else type_error }   e :    v := e : void  ( v ) =  Note: the type of id is determined by scope’s environment: id .type = lookup ( id .entry)
  • 24. Simple Language Example: Checking Statements (cont’d) S  if E then S 1 { S .type := if E .type = boolean then S 1 .type else type_error }  s :    if e then s :   e : boolean  
  • 25. Simple Language Example: Statements (cont’d) S  while E do S 1 { S .type := if E .type = boolean then S 1 .type else type_error }  s :    while e do s :   e : boolean  
  • 26. Simple Language Example: Checking Statements (cont’d) S  S 1 ; S 2 { S .type := if S 1 .type = void and S 2 .type = void then void else type_error }  s 2 : void   s 1 ; s 2 : void  s 1 : void  
  • 27. Simple Language Example: Checking Expressions E  true { E .type = boolean } E  false { E .type = boolean } E  literal { E .type = char } E  num { E .type = integer } E  id { E .type = lookup ( id .entry) } …  ( v ) =    v : 
  • 28. Simple Language Example: Checking Expressions (cont’d) E  E 1 + E 2 { E .type := if E 1 .type = integer and E 2 .type = integer then integer else type_error }   e 1 : integer   e 2 : integer   e 1 + e 2 : integer
  • 29. Simple Language Example: Checking Expressions (cont’d) E  E 1 and E 2 { E .type := if E 1 .type = boolean and E 2 .type = boolean then boolean else type_error }   e 1 : boolean   e 2 : boolean   e 1 and e 2 : boolean
  • 30. Simple Language Example: Checking Expressions (cont’d) E  E 1 [ E 2 ] { E .type := if E 1 .type = array ( s , t ) and E 2 .type = integer then t else type_error }   e 1 : array ( s ,  )   e 2 : integer   e 1 [ e 2 ] : 
  • 31. Simple Language Example: Checking Expressions (cont’d) E  E 1 ^ { E .type := if E 1 .type = pointer ( t ) then t else type_error }   e : pointer (  )   e ^ : 
  • 32. A Simple Language Example: Functions T  T -> T E  E ( E ) Example: v : integer; odd : integer -> boolean; if odd(3) then v := 1; Function type declaration Function call
  • 33. Simple Language Example: Function Declarations T  T 1 -> T 2 { T .type := function ( T 1 .type, T 2 .type) } Parametric type: type constructor
  • 34. Simple Language Example: Checking Function Invocations E  E 1 ( E 2 ) { E .type := if E 1 .type = function ( s , t ) and E 2 .type = s then t else type_error }   e 1 : function (  ,  )   e 2 :    e 1 ( e 2 ) : 
  • 35.
  • 36. Syntax-Directed Definitions for Type Checking in Yacc %{ enum Types {Tint, Tfloat, Tpointer, Tarray, … }; typedef struct Type { enum Types type; struct Type *child; // at most one type parameter } Type; %} %union { Type *typ; } %type <typ> expr %% …
  • 37. Syntax-Directed Definitions for Type Checking in Yacc (cont’d) … %% expr : expr ‘+’ expr { if ($1->type != Tint || $3->type != Tint) semerror(“non-int operands in +”); $$ = mkint(); emit(iadd); }
  • 38. Syntax-Directed Definitions for Type Coercion in Yacc … %% expr : expr ‘+’ expr { if ($1->type == Tint && $3->type == Tint) { $$ = mkint(); emit(iadd); } else if ($1->type == Tfloat && $3->type == Tfloat) { $$ = mkfloat(); emit(fadd); } else if ($1->type == Tfloat && $3->type == Tint) { $$ = mkfloat(); emit(i2f); emit(fadd); } else if ($1->type == Tint && $3->type == Tfloat) { $$ = mkfloat(); emit(swap); emit(i2f); emit(fadd); } else semerror(“type error in +”); $$ = mkint(); }
  • 39. Checking L-Values and R-Values in Yacc %{ typedef struct Node { Type *typ; // type structure int islval; // 1 if L-value } Node; %} %union { Node *rec; } %type <rec> expr %% …
  • 40. Checking L-Values and R-Values in Yacc expr : expr ‘+’ expr { if ($1->typ->type != Tint || $3->typ->type != Tint) semerror(“non-int operands in +”); $$->typ = mkint(); $$->islval = FALSE; emit(…); } | expr ‘=’ expr { if (!$1->islval || $1->typ != $3->typ) semerror(“invalid assignment”); $$->typ = $1->typ; $$->islval = FALSE; emit(…); } | ID { $$->typ = lookup($1); $$->islval = TRUE; emit(…); }
  • 41.
  • 42.
  • 43.
  • 44. Example Type Inference Append concatenates two lists recursively: fun append ( x, y ) = if null ( x ) then y else cons ( hd ( x ) , append ( tl ( x ), y )) where null : ∀α.list(α) -> bool hd : ∀α.list(α) -> α tl : ∀α.list(α) -> list(α) cons : ∀α.(α × list(α)) -> list(α)
  • 45. Example Type Inference fun append ( x, y ) = if null ( x ) then y else cons ( hd ( x ) , append ( tl ( x ), y )) The type of append : ∀ σ ,τ, φ . ( σ × τ) -> φ is: type of x : σ = list(α 1 ) from null ( x ) type of y : τ = φ from append ’s return type return type of append : list(α 2 ) from return type of cons and α 1 = α 2 because   cons ( hd(x), append ( tl ( x ), y )) : list(α 2 )   hd ( x ) : α 1   x : list(α 1 )   append ( tl ( x ) , y ) : list(α 1 )   tl ( x ) : list(α 1 )   y : list(α 1 )  x : list(α 1 ) 
  • 46. Example Type Inference fun append ( x, y ) = if null ( x ) then y else cons ( hd ( x ) , append ( tl ( x ), y )) The type of append : ∀ σ ,τ, φ . ( σ × τ) -> φ is: σ = list(α) τ = φ = list(α) Hence, append : ∀α.(list(α) × list(α)) -> list(α)
  • 47. Example Type Inference   append ([1, 2], [3]) : τ   append ([1, 2], [3]) : list( α )   ([1, 2],[3]) : list( α ) × list( α ) τ = list( α ) α = integer   append ([1], [“a”]) : τ   append ([1], [“a”]) : list( α )   ([1],[“a”]) : list( α ) × list( α ) Type error
  • 48.
  • 49. Unification An AST representation of append ([], [1, 2]) apply append : ∀α.(list(α) × list(α)) -> list(α) [] : list( φ ) 1 : integer ( × ) : ( σ , τ ) [ , ] : list( ψ ) 2 : integer
  • 50. Unification An AST representation of append ([], [1, 2]) apply append : ∀α.(list(α) × list(α)) -> list(α) ( × ) : ( σ , τ ) [] : list( φ ) [ , ] : list( ψ ) 1 : integer 2 : integer τ = list( ψ ) = list(integer) ⇒ φ = ψ = integer σ = list( φ ) = list( ψ ) ⇒ φ = ψ Unify by the following substitutions: σ = τ = list( α ) ⇒ α = integer