Type Checking. Type Checking? Type checking is the process of verifying that each operation executed...

18
Type Checking

Transcript of Type Checking. Type Checking? Type checking is the process of verifying that each operation executed...

Page 1: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Type Checking

Page 2: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.
Page 3: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Type Checking?• Type checking is the process of verifying that

each operation executed in a program respects the type system of the language.

• This generally means that all operands in any expression are of appropriate types and

number.• Much of what we do in the semantic analysis

phase is type checking.

Page 4: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Designing a Type Checker

• When designing a type checker for a compiler, here’s the process:

1.Identify the types that are available in the language 2.Identify the language constructs that have types

associated with them 3. Identify the semantic rules for the language

Page 5: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Cond…

• If a problem is found, e.g., one tries to add a char to a double in C, we encounter a type error.

• A language is considered strongly- typed if each and every type error is detected during compilation.

• Type checking can be done compilation, during execution, or divided across both.

Page 6: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Static type checking

• Static type checking is done at compile-time. The information the type checker needs is obtained via declarations and stored in a master symbol table.

• After this information is collected, the types involved in each operation are checked.

Page 7: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Cont…

• For example, if a and b are of type int and we assign very large values to them, a * b may not be in the acceptable range of ints, or an attempt to compute the ratio between two integers may raise a division by zero. These kinds of type errors usually cannot be detected at compiler time.

Page 8: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Dynamic type checking• Dynamic type checking is implemented by

including type information for each data location at runtime.

• For example, a variable of type double would contain both the actual double value and some kind of tag indicating "double type".

• The execution of any operation begins by first checking these type tags. The operation is performed only if everything checks out. Otherwise, a type error occurs and usually halts execution.

Page 9: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Cont…

• For example, when an add operation is invoked, it first examines the type tags of the two operands to ensure they are compatible.

• LISP is an example of a language that relies on dynamic type checking.

Page 10: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Implicit type conversion

• Many compilers have built-in functionality for correcting the simplest of type errors.

• Implicit type conversion, or coercion, is when a compiler finds a type error and then changes the type of the variable to an appropriate type.

• Ada and Pascal, for example, provide almost no automatic coercions, requiring the programmer to take explicit actions to convert between various numeric types.

Page 11: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Where type checking is needed?

• Assignments: When a variable is given a value by an assignment, it must be verified that the type of the value is the same as the declared type of the variable.

• Overloading: The same name is used for several different operations over several different types.

Page 12: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Cont…

• Polymorphism / Generic types: Some languages allow a function to be poly-morphic or generic, that is, to be defined over a large class of similar types, e.g. over all arrays no matter what the types of the elements are.

Page 13: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Cont…

• Data structures: A data structure may define a value with several components(e.g., a struct, tuple or record), or a value that may be of different types at different times (e.g., a union, variant or sum). To type-check such structures, the type checker must be able to represent their types.

• The type checker may need a data structure that describes complex types.

Page 14: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Cont…

• Type conversion: A language may have operators for converting a value of one type to a value of another type, e.g. an integer to a floating point number. Some-times these operators are explicit in the program and hence easy to check.

• How-ever, many languages allow implicit conversion of integers to floats, such that, for example, 3+3.12 is well-typed with the implicit assumption that the integer 3 is converted to a float before the addition.

Page 15: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Cont…

• Implicit types: Some languages (like Standard ML and Haskell) require pro-grams to be well-typed, but do not require explicit type declarations for variables or functions. For such to work, a type inference algorithm is used.

• A type in-reference algorithm gathers information about uses of functions and variables and uses this information to infer the types of these. If there are inconsistent uses of a variable, a type error is reported.

Page 16: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Case Study: ML Data Type • ML, or Meta-Language, is an important functional

language developed in Edinburgh in the 1970’s. It was developed to implement a theorem prover, but recently, it has gained popularity as a general purpose language.

• ML deals with data types in a novel way. example: fun mult x = x * 10; • Requires no type information because ML infers that x is

an integer since it is being multiplied by an integer.

Page 17: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Cont..• The only time a programmer must supply a declaration

is if ML cannot infer the types. For example, fun sqr x = x * x; • Would result in a type error because the multiplication

operator is overloaded, i.e., there exist separate multiplication operations for reals and for integers.

• so the programmer would have to clarify:

fun sqr x:int = x * x;

Page 18: Type Checking. Type Checking? Type checking is the process of verifying that each operation executed in a program respects the type system of the language.

Type Checking Declarations

Type Checking Expressions