Type systems. Static typing

Similar documents
Type Checking. Error Checking

Computer Science Department Carlos III University of Madrid Leganés (Spain) David Griol Barres

Type checking of statements We change the start rule from P D ; E to P D ; S and add the following rules for statements: S id := E

Intermediate Code Generation Part II

Formal Languages and Compilers Lecture IX Semantic Analysis: Type Chec. Type Checking & Symbol Table

Compilerconstructie. najaar Rudy van Vliet kamer 124 Snellius, tel rvvliet(at)liacs.

PART 4 - SYNTAX DIRECTED TRANSLATION. F. Wotawa TU Graz) Compiler Construction Summer term / 309

Static Checking and Type Systems

Concepts Introduced in Chapter 6

Type Checking. CS308 Compiler Theory 1

Concepts Introduced in Chapter 6

PART 4 - SYNTAX DIRECTED TRANSLATION. F. Wotawa TU Graz) Compiler Construction Summer term / 264

Lecture 7: Type Systems and Symbol Tables. CS 540 George Mason University

The Compiler So Far. Lexical analysis Detects inputs with illegal tokens. Overview of Semantic Analysis

CA Compiler Construction

Symbol Tables. For compile-time efficiency, compilers often use a symbol table: associates lexical names (symbols) with their attributes

Semantic Analysis and Type Checking

Anatomy of a Compiler. Overview of Semantic Analysis. The Compiler So Far. Why a Separate Semantic Analysis?

Type Checking. Outline. General properties of type systems. Types in programming languages. Notation for type rules.

Principles of Programming Languages

Data Types. Every program uses data, either explicitly or implicitly to arrive at a result.

G Programming Languages Spring 2010 Lecture 6. Robert Grimm, New York University

Outline. General properties of type systems. Types in programming languages. Notation for type rules. Common type rules. Logical rules of inference

Semantic Analysis. How to Ensure Type-Safety. What Are Types? Static vs. Dynamic Typing. Type Checking. Last time: CS412/CS413

The compilation process is driven by the syntactic structure of the program as discovered by the parser

Intermediate Code Generation

Types. Type checking. Why Do We Need Type Systems? Types and Operations. What is a type? Consensus

Type Analysis. Type Checking vs. Type Inference

Symbol Table Information. Symbol Tables. Symbol table organization. Hash Tables. What kind of information might the compiler need?

Introduction to Programming Using Java (98-388)

Lecture 12: Data Types (and Some Leftover ML)

Type Conversion. and. Statements

Types. What is a type?

Compilers. Type checking. Yannis Smaragdakis, U. Athens (original slides by Sam

COMP 181. Agenda. Midterm topics. Today: type checking. Purpose of types. Type errors. Type checking

Types and Type Inference

SEMANTIC ANALYSIS TYPES AND DECLARATIONS

Short Notes of CS201

Lecture Overview. [Scott, chapter 7] [Sebesta, chapter 6]

CS201 - Introduction to Programming Glossary By

CS558 Programming Languages

CS412/CS413. Introduction to Compilers Tim Teitelbaum. Lecture 17: Types and Type-Checking 25 Feb 08

Types and Type Inference

Static Semantics. Winter /3/ Hal Perkins & UW CSE I-1

Formal Languages and Compilers Lecture X Intermediate Code Generation

CSE P 501 Compilers. Static Semantics Hal Perkins Winter /22/ Hal Perkins & UW CSE I-1

There is a level of correctness that is deeper than grammar. There is a level of correctness that is deeper than grammar

Type Systems. Seman&cs. CMPT 379: Compilers Instructor: Anoop Sarkar. anoopsarkar.github.io/compilers-class

22c:111 Programming Language Concepts. Fall Types I

Semantic Analysis. Outline. The role of semantic analysis in a compiler. Scope. Types. Where we are. The Compiler Front-End

Question No: 1 ( Marks: 1 ) - Please choose one One difference LISP and PROLOG is. AI Puzzle Game All f the given

Algorithms & Data Structures

The role of semantic analysis in a compiler

TYPES, VALUES AND DECLARATIONS

Intermediate Code Generation

Type Systems, Type Inference, and Polymorphism

Operational Semantics of Cool

The Compiler So Far. CSC 4181 Compiler Construction. Semantic Analysis. Beyond Syntax. Goals of a Semantic Analyzer.

Semantic Processing (Part 2)

Type Checking. Chapter 6, Section 6.3, 6.5

Informatica 3 Syntax and Semantics

Fundamentals of Programming Languages

Some instance messages and methods

Semantic Analysis. Outline. The role of semantic analysis in a compiler. Scope. Types. Where we are. The Compiler so far

Note 3. Types. Yunheung Paek. Associate Professor Software Optimizations and Restructuring Lab. Seoul National University

Chapter 7:: Data Types. Mid-Term Test. Mid-Term Test (cont.) Administrative Notes

CSCI312 Principles of Programming Languages!

Semantic Analysis computes additional information related to the meaning of the program once the syntactic structure is known.

Intermediate Code Generation

The SPL Programming Language Reference Manual

Lexical Considerations

Motivation for typed languages

CS1622. Semantic Analysis. The Compiler So Far. Lecture 15 Semantic Analysis. How to build symbol tables How to use them to find

OBJECT ORIENTED PROGRAMMING USING C++ CSCI Object Oriented Analysis and Design By Manali Torpe

Operational Semantics. One-Slide Summary. Lecture Outline

5. Semantic Analysis!

Aryan College. Fundamental of C Programming. Unit I: Q1. What will be the value of the following expression? (2017) A + 9

Lecture Set 4: More About Methods and More About Operators

CS321 Languages and Compiler Design I Winter 2012 Lecture 13

Lexical Considerations

Type Checking and Type Inference

Lecture Outline. COOL operational semantics. Operational Semantics of Cool. Motivation. Lecture 13. Notation. The rules. Evaluation Rules So Far

Programming Languages and Compilers (CS 421)

Type Bindings. Static Type Binding

Lecture Set 4: More About Methods and More About Operators

Announcements. Working on requirements this week Work on design, implementation. Types. Lecture 17 CS 169. Outline. Java Types

CSC 467 Lecture 13-14: Semantic Analysis

Semantic analysis and intermediate representations. Which methods / formalisms are used in the various phases during the analysis?

Lecture #23: Conversion and Type Inference

Conversion vs. Subtyping. Lecture #23: Conversion and Type Inference. Integer Conversions. Conversions: Implicit vs. Explicit. Object x = "Hello";

Expressions and Casting

CS558 Programming Languages

3.Constructors and Destructors. Develop cpp program to implement constructor and destructor.

FORM 2 (Please put your name and form # on the scantron!!!!)

INF 212/CS 253 Type Systems. Instructors: Harry Xu Crista Lopes

INF 212 ANALYSIS OF PROG. LANGS Type Systems. Instructors: Crista Lopes Copyright Instructors.

Acknowledgement. CS Compiler Design. Semantic Processing. Alternatives for semantic processing. Intro to Semantic Analysis. V.

CS 112 Introduction to Computing II. Wayne Snyder Computer Science Department Boston University

intermediate-code Generation

Problems and Solutions to the January 1994 Core Examination

Transcription:

Type system A type is a set of values and operations on those values A language s type system specifies which operations are valid for a type The aim of type checking is to ensure that operations are used on the variable/expressions of the correct types 1

Type system Languages can be divided into three categories with respect to the type: untyped No type checking needs to be done Assembly languages Statically typed All type checking is done at compile time Algol class of languages Also, called strongly typed Dynamically typed Type checking is done at run time Mostly functional languages like Lisp, Scheme etc. 2

Type systems Static typing Catches most common programming errors at compile time Avoids runtime overhead May be restrictive in some situations Rapid prototyping may be difficult Most code is written using static types languages In fact, developers for large/critical system insist that code be strongly type checked at compile time even if language is not strongly typed (use of Lint for C code, code compliance checkers) 3

Type System A type system is a collection of rules for assigning type expressions to various parts of a program Different type systems may be used by different compilers for the same language In Pascal type of an array includes the index set. Therefore, a function with an array parameter can only be applied to arrays with that index set Many Pascal compilers allow index set to be left unspecified when an array is passed as a parameter 4

Type system and type checking If both the operands of arithmetic operators +, -, x are integers then the result is of type integer The result of unary & operator is a pointer to the object referred to by the operand. If the type of operand is X the type of result is pointer to X Basic types: integer, char, float, boolean Sub range type: 1 100 Enumerated type: (violet, indigo, red) Constructed type: array, record, pointers, functions 5

Type expression Type of a language construct is denoted by a type expression It is either a basic type OR it is formed by applying operators called type constructor to other type expressions A basic type is a type expression. There are two special basic types: type error: error during type checking void: no type value A type constructor applied to a type expression is a type expression 6

Type Constructors Array: if T is a type expression then array(i, T) is a type expression denoting the type of an array with elements of type T and index set I int A[10]; A can have type expression array(0.. 9, integer) C does not use this type, but uses equivalent of int* Product: if T1 and T2 are type expressions then their Cartesian product T1 * T2 is a type expression Pair/tuple 7

Type constructors Records: it applies to a tuple formed from field names and field types. Consider the declaration type row = record addr : integer; lexeme : array [1.. 15] of char end; var table: array [1.. 10] of row; The type row has type expression record ((addr * integer) * (lexeme * array(1.. 15, char))) and type expression of table is array(1.. 10, row) 8

Type constructors Pointer: if T is a type expression then pointer(t) is a type expression denoting type pointer to an object of type T Function: function maps domain set to range set. It is denoted by type expression D R For example % has type expression int * int int The type of function int* f(char a, char b) is denoted by char * char pointer(int) 9

Specifications of a type checker Consider a language which consists of a sequence of declarations followed by a single expression P D ; E D D ; D id : T T char integer T[num] T* E literal num E%E E [E] *E 10

Specifications of a type checker A program generated by this grammar is key : integer; key %1999 Assume following: basic types are char, int, type-error all arrays start at 0 char[256] has type expression array(0.. 255, char) 11

Rules for Symbol Table entry D id : T T char T integer T T 1 * T T 1 [num] addtype(id.entry, T.type) T.type = char T.type = int T.type = pointer(t 1.type) T.type = array(0..num-1, T 1.type) 12

Type checking of functions E E1 (E2) E. type = (E1.type == s t and E2.type == s)? t : type-error 13

Type checking for expressions E literal E num E id E E 1 % E 2 E E 1 [E 2 ] E *E 1 E.type = char E.type = integer E.type = lookup(id.entry) E.type = if E 1.type == integer and E 2.type==integer then integer else type_error E.type = if E 2.type==integer and E 1.type==array(s,t) then t else type_error E.type = if E 1.type==pointer(t) then t else type_error 14

Type checking for expressions E literal E num E id E E 1 % E 2 E E 1 [E 2 ] E *E 1 E.type = char E.type = integer E.type = lookup(id.entry) E.type = if E 1.type == integer and E 2.type==integer then integer else type_error E.type = if E 2.type==integer and E 1.type==array(s,t) then t else type_error E.type = if E 1.type==pointer(t) then t else type_error 15

Type checking for statements Statements typically do not have values. Special basic type void can be assigned to them. S id := E S if E then S1 S while E do S1 S S1 ; S2 S.Type = if id.type == E.type then void else type_error S.Type = if E.type == boolean then S1.type else type_error S.Type = if E.type == boolean then S1.type else type_error S.Type = if S1.type == void and S2.type == void then void else type_error 16

Type checking for statements Statements typically do not have values. Special basic type void can be assigned to them. S id := E S if E then S1 S while E do S1 S S1 ; S2 S.Type = if id.type == E.type then void else type_error S.Type = if E.type == boolean then S1.type else type_error S.Type = if E.type == boolean then S1.type else type_error S.Type = if S1.type == void and S2.type == void then void else type_error 17

Equivalence of Type expression Structural equivalence: Two type expressions are equivalent if either these are same basic types or these are formed by applying same constructor to equivalent types Name equivalence: types can be given names Two type expressions are equivalent if they have the same name 18

Function to test structural equivalence boolean sequiv(type s, type t) : If s and t are same basic types then return true elseif s == array(s1, s2) and t == array(t1, t2) then return sequiv(s1, t1) && sequiv(s2, t2) elseif s == s1 * s2 and t == t1 * t2 then return sequiv(s1, t1) && sequiv(s2, t2) elseif s == pointer(s1) and t == pointer(t1) then return sequiv(s1, t1) elseif s == s1 s2 and t == t1 t2 then return sequiv(s1,t1) && sequiv(s2,t2) else return false; 19

Efficient implementation Bit vectors can be used to represent type expressions. Refer to: A Tour Through the Portable C Compiler: S. C. Johnson, 1979. Basic type Encoding Boolean 0000 Char 0001 Integer 0010 real 0011 Type constructor encoding pointer 01 array 10 function 11 20

Efficient implementation Type expression Basic type Encoding Boolean 0000 Char 0001 Integer 0010 real 0011 Type constructor encoding char 000000 0001 function( char ) 000011 0001 pointer( function( char ) ) 000111 0001 array( pointer( function( char) ) ) 100111 0001 This representation saves space and keeps track of constructors 21 Encoding pointer 01 array 10 function 11

Checking name equivalence Consider following declarations typedef cell* link; link next, last; cell *p, *q, *r; Do the variables next, last, p, q and r have identical types? Type expressions have names and names appear in type expressions. Name equivalence views each type name as a distinct type 22

Name equivalence variable next last p q r type expression link link pointer(cell) pointer(cell) pointer(cell) Under name equivalence next = last and p = q = r, however, next p Under structural equivalence all the variables are of the same type 23

Name equivalence Some compilers allow type expressions to have names. However, some compilers assign implicit type names. A fresh implicit name is created every time a type name appears in declarations. Consider type link = ^ cell; var next : link; last : link; p, q : ^ cell; r : ^ cell; In this case type expression of q and r are given different implicit names and therefore, those are not of the same type 24

Name equivalence The previous code is equivalent to type link = ^ cell; np = ^ cell; nr = ^ cell; var next : link; last : link; p, q: np; r : nr; 25

Cycles in representation of types Data structures like linked lists are defined recursively Implemented through structures which contain pointers to structure Consider following code type link = ^ cell; cell = record info : integer; next : link end; The type name cell is defined in terms of link and link is defined in terms of cell (recursive definitions) 26

Cycles in representation of Recursively defined type names can be substituted by definitions However, it introduces cycles into the type graph record record link = ^ cell; cell = record info : integer; next : link end; X X X X info integer next pointer info integer next pointer cell 27

Cycles in representation of C uses structural equivalence for all types except records (struct) It uses the acyclic structure of the type graph Type names must be declared before they are used However, allow pointers to undeclared record types All potential cycles are due to pointers to records Name of a record is part of its type Testing for structural equivalence stops when a record constructor is reached 28

Type conversion Consider expression like x + i where x is of type real and i is of type integer Internal representations of integers and reals are different in a computer different machine instructions are used for operations on integers and reals The compiler has to convert both the operands to the same type Language definition specifies what conversions are necessary. 29

Type conversion Usually conversion is to the type of the left hand side Type checker is used to insert conversion operations: x + i x real+ inttoreal(i) Type conversion is called implicit/coercion if done by compiler. It is limited to the situations where no information is lost Conversions are explicit if programmer has to write something to cause conversion 30

Type checking for expressions E num E.type = int E num.num E.type = real E id E.type = lookup( id.entry ) E E 1 op E 2 E.type = if E 1.type == int && E 2.type == int then int elif E 1.type == int && E 2.type == real then real elif E 1.type == real && E 2.type == int then real elif E 1.type == real && E 2.type==real then real 31

Overloaded functions and operators Overloaded symbol has different meaning depending upon the context In math, + is overloaded; used for integer, real, complex, matrices In Ada, () is overloaded; used for array, function call, type conversion Overloading is resolved when a unique meaning for an occurrence of a symbol is determined 32

Overloaded functions and operators In Ada standard interpretation of * is multiplication of integers However, it may be overloaded by saying function * (i, j: integer) return complex; function * (i, j: complex) return complex; Possible type expression for * include: integer x integer integer integer x integer complex complex x complex complex 33

Overloaded function resolution Suppose only possible type for 2, 3 and 5 is integer Z is a complex variable 3*5 is either integer or complex depending upon the context in 2*(3*5): 3*5 is integer because 2 is integer in Z*(3*5) : 3*5 is complex because Z is complex 34

Type resolution Try all possible types of each overloaded function (possible but brute force method!) Keep track of all possible types Discard invalid possibilities At the end, check if there is a single unique type Overloading can be resolved in two passes: Bottom up: compute set of all possible types for each expression Top down: narrow set of possible types based on what could be used in an expression 35

Determining set of possible types E E E.types = E.types E id E.types = lookup(id) E E 1 (E 2 ) E.types = {t s in E 2.types && s t is in E 1.types} E {i,c} {i} {i} E * {ixi i E 3 ixi c cxc c} 5 {i} {i} 36

Narrowing the set of possible types Ada requires a complete expression to have a unique type Given a unique type from the context we can narrow down the type choices for each expression If this process does not result in a unique type for each sub expression then a type error is declared for the expression 37

Narrowing the set of E E E.types = E.types E.unique = if E.types=={t} then t else type_error E id E.types = lookup(id) E E 1 (E 2 ) E.types = { t s in E 2.types && s t is in E 1.types} t = E.unique S = {s s E2.types and (s t) E1.types} E 2.unique = if S=={s} then s else type_error E 1.unique = if S=={s} then s t else type_error 38

Narrowing the set of E E E.types = E.types E.unique = if E.types=={t} then t else type_error E id E.types = lookup(id) E E 1 (E 2 ) E.types = { t s in E 2.types && s t is in E 1.types} t = E.unique S = {s s E2.types and (s t) E1.types} E 2.unique = if S=={s} then s else type_error E 1.unique = if S=={s} then s t else type_error 39

Polymorphic functions A function can be invoked with arguments of different types Built in operators for indexing arrays, applying functions, and manipulating pointers are usually polymorphic Extend type expressions to include expressions with type variables Facilitate the implementation of algorithms that manipulate data structures (regardless of types of elements) Determine length of the list without knowing types of the elements 40

Polymorphic functions Strongly typed languages can make programming very tedious Consider identity function written in a language like Pascal function identity (x: integer): integer; This function is the identity on integers: int int If we want to write identity function on char then we must write function identity (x: char): char; This is the same code; only types have changed. However, in Pascal a new identity function must be written for each type Templates solve this problem somewhat, for endusers For compiler, multiple definitions still present! 41

Type variables Variables can be used in type expressions to represent unknown types Important use: check consistent use of an identifier in a language that does not require identifiers to be declared An inconsistent use is reported as an error If the variable is always used as of the same type then the use is consistent and has lead to type inference Type inference: determine the type of a variable/language construct from the way it is used Infer type of a function from its body 42

function deref(p) { return *p; } Initially, nothing is known about type of p Represent it by a type variable Operator * takes pointer to an object and returns the object Therefore, p must be pointer to an object of unknown type α If type of p is represented by β then β=pointer(α) Expression *p has type α Type expression for function deref is for any type α: pointer(α) α For identity function, the type expression is for any type α: α α 43

Reading assignment Rest of Section 6.6 and Section 6.7 of Old Dragonbook [Aho, Sethi and Ullman] 44