Type Systems CSE 340 – Principles of Programming Languages Fall 2016

Slides:



Advertisements
Similar presentations
CH4.1 Type Checking Md. Fahim Computer Engineering Department Jamia Millia Islamia (A Central University) New Delhi –
Advertisements

Introduction to C Programming
Data Types in C. Data Transformation Programs transform data from one form to another –Input data  Output data –Stimulus  Response Programming languages.
Intermediate Code Generation
Chapter 6 Type Checking. The compiler should report an error if an operator is applied to an incompatible operand. Type checking can be performed without.
Programming Languages and Paradigms The C Programming Language.
Lecture # 21 Chapter 6 Uptill 6.4. Type System A type system is a collection of rules for assigning type expressions to the various parts of the program.
Overview of Previous Lesson(s) Over View  Front end analyzes a source program and creates an intermediate representation from which the back end generates.
Lecture # 20 Type Systems. 2 A type system defines a set of types and rules to assign types to programming language constructs Informal type system rules,
Compiler Construction
Type Checking- Contd Compiler Design Lecture (03/02/98) Computer Science Rensselaer Polytechnic.
Encapsulation by Subprograms and Type Definitions
Type Checking  Legality checks  Operator determination  Overload resolution.
1 Type Type system for a programming language = –set of types AND – rules that specify how a typed program is allowed to behave Why? –to generate better.
Fundamentals of Python: From First Programs Through Data Structures
Fundamentals of Python: First Programs
 Value, Variable and Data Type  Type Conversion  Arithmetic Expression Evaluation  Scope of variable.
Semantics CSE 340 – Principles of Programming Languages Fall 2015 Adam Doupé Arizona State University
COMPILERS Symbol Tables hussein suleman uct csc3003s 2007.
410/510 1 of 18 Week 5 – Lecture 1 Semantic Analysis Compiler Construction.
CSE 425: Data Types I Data and Data Types Data may be more abstract than their representation –E.g., integer (unbounded) vs. 64-bit int (bounded) A language.
Types(1). Lecture 52 Type(1)  A type is a collection of values and operations on those values. Integer type  values..., -2, -1, 0, 1, 2,...  operations.
Semantics CSE 340 – Principles of Programming Languages Fall 2015 Adam Doupé Arizona State University
ENEE150 – 0102 ANDREW GOFFIN Project 4 & Function Pointers.
1 Compiler Construction (CS-636) Muhammad Bilal Bashir UIIT, Rawalpindi.
Type Systems CSE 340 – Principles of Programming Languages Fall 2015 Adam Doupé Arizona State University
Data Types (3) 1 Programming Languages – Principles and Practice by Kenneth C Louden.
 Variables are nothing but reserved memory locations to store values. This means that when you create a variable you reserve some space in memory. 
Hindley-Milner Type Inference CSE 340 – Principles of Programming Languages Fall 2015 Adam Doupé Arizona State University
ADVANCED POINTERS. Overview Review on pointers and arrays Common troubles with pointers Multidimensional arrays Pointers as function arguments Functions.
C LANGUAGE UNIT 3. UNIT 3 Arrays Arrays – The concept of array – Defining arrays – Initializing arrays.
Lecture 9 Symbol Table and Attributed Grammars
ARRAYS (Extra slides) Arrays are objects that help us organize large amounts of information.
Dynamic Storage Allocation
Types CSCE 314 Spring 2016.
Semantic Analysis Type Checking
CSE 3302 Programming Languages
Objectives In this chapter, you will:
Constructing Precedence Table
Principles of programming languages 8: Types
Compilers Principles, Techniques, & Tools Taught by Jing Zhang
Programming Languages and Paradigms
Object Oriented Programming
UNIT-3 LINKED LIST.
Representation, Syntax, Paradigms, Types
A lightening tour in 45 minutes
Programming Paradigms
C Basics.
Prepared By: G.UshaRani B.Pranalini A.S.Lalitha
Agenda Warmup Lesson 2.5 (Ascii, Method Overloading)
Data Types.
Chapter 6: Programming Languages
Pointers, Dynamic Data, and Reference Types
Chapter 6 Intermediate-Code Generation
Arrays in Java What, why and how Copyright Curt Hill.
Representation, Syntax, Paradigms, Types
Sridhar Narayan Java Basics Sridhar Narayan
Representation, Syntax, Paradigms, Types
CS 363 – Chapter 7 Chapter 7 – type systems Types that are supported
Python Primer 1: Types and Operators
C++ Pointers and Strings
Representation, Syntax, Paradigms, Types
Compiler Construction
COMPILERS Semantic Analysis
Programming Languages and Paradigms
C++ Pointers and Strings
Compiler Construction
Lecture 7: Types (Revised based on the Tucker’s slides) 10/4/2019
CSE 3302 Programming Languages
Extra C Material Based on material in: The C Programming Language, Second Edition by Brian W. Kernighan and Dennis M. Ritchie. Prentice Hall, Inc., 1988. 
Presentation transcript:

Type Systems CSE 340 – Principles of Programming Languages Fall 2016 Adam Doupé Arizona State University http://adamdoupe.com

Type Systems Informally, a type in a programming language specifies a set of values and operations that can be applied on those values A type can be associated with a variables or a constant Values are not necessarily numeric values, for example we can specify function types A type system consists of Basic types Type constructors Type inference Type compatibility

Type Declaration Programming language will typically include Basic types Included in the programming language and available to any program written in that language Type constructors Way for a programmer to define new types

Type Constructors Pointer to T, where T is a type struct { a1: T1; a2 : T2; …, ak: Tk; } Where ai is a field name and Ti is a previously defined type array range of T Where range can be single or multi dimensional function of T1, T2, ..., Tk returns T Type is a function, the types of the parameters are T1 ... Tk and the return type is T

Using Type Constructors Declaring Types Type cm : integer; Type RGBA : array [0..4] of int; Type png : array [0..256] of RGBA; Anonymous Types array [0..4] of int x; struct { int a; char b; } y;

Type Compatibility Which assignments are allowed by the type system? a = b;? int a; float b; float a; int b;

Type Inference Types of expressions or other constructs as a function of subexpression types a + b a int; b float Returns a float in C Error in ML a * b a string; b int Error in most languages Returns a string in Python

Type Compatibility Principally about type equivalence How to determine if two types are equal? Type cm : integer; Type inch : integer; cm x; inch y; x = y?

Name Equivalence Types must have the exact same name to be equivalent Type cm : integer; Type inch : integer; cm x; inch y; x = y? // ERROR

Name Equivalence a: array [0..4] of int; b: array [0..4] of int; a = b? Not allowed under name equivalence

Name Equivalence a, b: array [0..4] of int; a = b? Not allowed because array [0..4] of int is not named

Name Equivalence Type A: array [0..4] of int; a: A; b: A; a = b? Allowed, because both a and b have the same name

Internal Name Equivalence If the program interpreter gives the same internal name to two different variables, then they share the same type a, b: array [0..4] of int; c: array [0..4] of int; a = b? Yes, because interpreter/compiler gives the same internal name to a and b a = c? No, because interpreter/compiler gives different internal name to c than to a and b

Structural Equivalence Same built-in types Pointers to structurally equivalent types Type cm : integer; Type inch : integer; cm x; inch y; x = y? // Allowed!

Structural Equivalence int* a; float* b; a = b? Not structurally equivalent, because int and float are not structurally equivalent

Structural Equivalence Determining struct structural equivalence Two structures st1 { x1: W1, x2: W2, …, xk: Wk } st2 { y1: Q1, y2: Q2, ..., yk: Qk } st1 and st2 are structurally equivalent iff W1 structurally equivalent to Q1 W2 structurally equivalent to Q2 ... Wk structurally equivalent to Qk

Structural Equivalence struct A { a: int, b: float } struct B { b: int, a: float } A foo; B bar; foo = bar?

Structural Equivalence struct A { a: int, b: float } struct B { b: float, a: int } A foo; B bar; foo = bar?

Structural Equivalence Determining array structural equivalence Two Arrays T1 = array range1 of t1 T2 = array range2 of t2 T1 and T2 are structurally equivalent iff: range1 and range2 have (1) the same number of dimensions and (2) the same number of entries in each dimension t1 and t2 are structurally equivalent

Structural Equivalence Determining function structural equivalence Two functions T1 = function of (t1, t2, t3, …, tk) returns t T2 = function of (v1, v2, v3, ..., vk) returns v T1 and T2 are structurally equivalent iff: For all i from 1 to k, ti is structurally equivalent to vi t is structurally equivalent to v

Determining Structural Equivalence The goal is to determine, for every pair of types in the program, if they are structurally equivalent Seems fairly simple, just keep applying the previous 5 rules until the base case 1 is reached How to handle the following case: T1 = struct { a: int; p: pointer to T2; } T2 = struct { a: int; p: pointer to T1; } Applying the rules states that T1 is structurally equivalent to T2 iff pointer to T1 is structurally equivalent to pointer to T2, which is true iff T1 is structurally equivalent to T2 …

Structural Equivalence Algorithm The way to break the stalemate is to assume that T1 and T2 are structurally equivalent because no rule contradicts them being structurally equivalent Our goal is to create an n X n table, where n is the number of types in the program, and each entry in the table is true if the types are structurally equivalent and false otherwise

Structural Equivalence Algorithm To support cyclical definitions, we first initialize all entries in the table to true We assume that types are structurally equivalent unless we have proof otherwise Algorithm is fairly simple Set the n X n table to have each entry as true While table has not changed Check each entry i, j in the table, and if Ti and Tj are not structurally equivalent, then set the entry i, j in the table to false Note that Ti and Tj are the ith and jth types in the program

T1 = struct { a: int, p: pointer to T2 } T2 = struct { c: int, q: pointer to T3 } T3 = struct { a: float, p: pointer to T1 } T1 T2 T3 true

T1 = struct { a: int, p: pointer to T2 } T2 = struct { c: int, q: pointer to T3 } T3 = struct { a: float, p: pointer to T1 } T1 T2 T3 true

T1 = struct { a: int, p: pointer to T2 } T2 = struct { c: int, q: pointer to T3 } T3 = struct { a: float, p: pointer to T1 } T1 T2 T3 true

T1 = struct { a: int, p: pointer to T2 } T2 = struct { c: int, q: pointer to T3 } T3 = struct { a: float, p: pointer to T1 } T1 T2 T3 true false

T1 = struct { a: int, p: pointer to T2 } T2 = struct { c: int, q: pointer to T3 } T3 = struct { a: float, p: pointer to T1 } T1 T2 T3 true false

T1 = struct { a: int, p: pointer to T2 } T2 = struct { c: int, q: pointer to T3 } T3 = struct { a: float, p: pointer to T1 } T1 T2 T3 true false

T1 = struct { a: int, p: pointer to T2 } T2 = struct { c: int, q: pointer to T3 } T3 = struct { a: float, p: pointer to T1 } T1 T2 T3 true false

T1 = struct { a: int, p: pointer to T2 } T2 = struct { c: int, q: pointer to T3 } T3 = struct { a: float, p: pointer to T1 } T1 T2 T3 true false

T1 = struct { a: int, p: pointer to T2 } T2 = struct { c: int, q: pointer to T3 } T3 = struct { a: float, p: pointer to T1 } T1 T2 T3 true false

T1 = struct { a: int, p: pointer to T2 } T2 = struct { c: int, q: pointer to T3 } T3 = struct { a: float, p: pointer to T1 } T1 T2 T3 true false

T1 = struct { a: int, p: pointer to T2 } T2 = struct { c: int, q: pointer to T3 } T3 = struct { a: float, p: pointer to T1 } T1 T2 T3 true false

T1 = struct { a: int, p: pointer to T2 } T2 = struct { c: int, q: pointer to T3 } T3 = struct { a: float, p: pointer to T1 } T1 T2 T3 true false