0% found this document useful (0 votes)
310 views

Type Checking: CS416 Compiler Design 1

The document discusses type checking in programming languages. It explains that type checking verifies that operations are being performed on values with compatible types. It describes different kinds of type checking like static and dynamic checking. It also discusses type systems, type expressions, and how a basic type checking system can verify types for declarations, expressions, statements and functions through structural equivalence of type expressions.

Uploaded by

muler_tesfa
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
310 views

Type Checking: CS416 Compiler Design 1

The document discusses type checking in programming languages. It explains that type checking verifies that operations are being performed on values with compatible types. It describes different kinds of type checking like static and dynamic checking. It also discusses type systems, type expressions, and how a basic type checking system can verify types for declarations, expressions, statements and functions through structural equivalence of type expressions.

Uploaded by

muler_tesfa
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 10

Type Checking

• A compiler has to do semantic checks in addition to syntactic checks.


• Semantic Checks
– Static – done during compilation
– Dynamic – done during run-time
• Type checking is one of these static checking operations.
– we may not do all type checking at compile-time.
– Some systems also use dynamic type checking too.
• A type system is a collection of rules for assigning type expressions to the parts of a
program.
• A type checker implements a type system.
• A sound type system eliminates run-time type checking for type errors.
• A programming language is strongly-typed, if every program its compiler accepts will
execute without type errors.
– In practice, some of type checking operations are done at run-time (so, most of the programming
languages are not strongly-typed).
– Ex: int x[100]; … x[i]  most of the compilers cannot guarantee that i will be between 0 and 99

CS416 Compiler Design 1


Type Expression
• The type of a language construct is denoted by a type expression.
• A type expression can be:
– A basic type
• a primitive data type such as integer, real, char, boolean, …
• type-error to signal a type error
• void : no type
– A type name
• a name can be used to denote a type expression.
– A type constructor applies to other type expressions.
• arrays: If T is a type expression, then array(I,T) is a type expression where I denotes index range.
Ex: array(0..99,int)
• products: If T1 and T2 are type expressions, then their cartesian product T1 x T2 is a type
expression. Ex: int x int
• pointers: If T is a type expression, then pointer(T) is a type expression. Ex: pointer(int)
• functions: We may treat functions in a programming language as mapping from a domain type D
to a range type R. So, the type of a function can be denoted by the type expression D→R where D
are R type expressions. Ex: int→int represents the type of a function which takes an int value as
parameter, and its return type is also int.

CS416 Compiler Design 2


A Simple Type Checking System
P → D;E

D → D;D
D → id:T { addtype(id.entry,T.type) }
T → char { T.type=char }
T → int { T.type=int }
T → real { T.type=real }
T → ↑T1 { T.type=pointer(T1.type) }
T → array[intnum] of T1 { T.type=array(1..intnum.val,T1.type) }

CS416 Compiler Design 3


Type Checking of Expressions
E → id{ E.type=lookup(id.entry) }
E → charliteral { E.type=char }
E → intliteral { E.type=int }
E → realliteral { E.type=real }
E → E1 + E2 { if (E1.type=int and E2.type=int) then E.type=int
else if (E1.type=int and E2.type=real) then E.type=real
else if (E1.type=real and E2.type=int) then E.type=real
else if (E1.type=real and E2.type=real) then E.type=real
else E.type=type-error }
E → E1 [E2] { if (E2.type=int and E1.type=array(s,t)) then E.type=t
else E.type=type-error }
E → E1 ↑ { if (E1.type=pointer(t)) then E.type=t
else E.type=type-error }
CS416 Compiler Design 4
Type Checking of Statements
S  id = E { if (id.type=E.type then S.type=void
else S.type=type-error }

S  if E then S1 { if (E.type=boolean then S.type=S1.type


else S.type=type-error }

S  while E do S1 { if (E.type=boolean then S.type=S1.type


else S.type=type-error }

CS416 Compiler Design 5


Type Checking of Functions
E  E1 ( E2 ) { if (E2.type=s and E1.type=st) then E.type=t
else E.type=type-error }

Ex: int f(double x, char y) { ... }

f: double x char  int

argument types return type

CS416 Compiler Design 6


Structural Equivalence of Type Expressions
• How do we know that two type expressions are equal?
• As long as type expressions are built from basic types (no type names),
we may use structural equivalence between two type expressions

Structural Equivalence Algorithm (sequiv):


if (s and t are same basic types) then return true
else if (s=array(s1,s2) and t=array(t1,t2)) then return (sequiv(s1,t1) and sequiv(s2,t2))
else if (s = s1 x s2 and t = t1 x t2) then return (sequiv(s1,t1) and sequiv(s2,t2))
else if (s=pointer(s1) and t=pointer(t1)) then return (sequiv(s1,t1))
else if (s = s1  s2 and t = t1  t2) then return (sequiv(s1,t1) and sequiv(s2,t2))
else return false

CS416 Compiler Design 7


Names for Type Expressions
• In some programming languages, we give a name to a type expression,
and we use that name as a type expression afterwards.

type link =  cell; ? p,q,r,s have same types ?


var p,q : link;
var r,s :  cell

• How do we treat type names?


– Get equivalent type expression for a type name (then use structural equivalence), or
– Treat a type name as a basic type.

CS416 Compiler Design 8


Cycles in Type Expressions
type link =  cell;
type cell = record
x : int,
next : link
end;

• We cannot use structural equivalence if there are cycles in type


expressions.
• We have to treat type names as basic types.
 but this means that the type expression link is different than the type expression cell.

CS416 Compiler Design 9


Type Conversions
x+y ? what is the type of this expression (int or double)?

• What kind of codes we have to produce, if the type of x is double and


the type of y is int?

inttoreal y,,t1
real+ t1,x,t2

CS416 Compiler Design 10

You might also like