Scoping rules match identifier uses with identifier definitions. A type is a set of values coupled with a set of operations on those values.

Similar documents
Passing Out Review Forms

type environment updated subtype sound

type environment updated subtype sound

More Static Semantics. Static. One-Slide Summary. Lecture Outline. Typing Rules. Dispatch Rules SELF_TYPE

More Static Semantics

More Static Semantics

Lecture Outline. Type systems and their expressiveness. Type Checking in COOL (II) Type checking with SELF_TYPE in COOL

Type Checking in COOL (II) Lecture 10

Overview of Semantic Analysis. Lecture 9

Lecture Outline. Type systems and their expressiveness. Type Checking in COOL (II) Type checking with SELF_TYPE in COOL

Operational Semantics. One-Slide Summary. Lecture Outline

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

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

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

Operational Semantics of Cool

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

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

Semantic Analysis. Lecture 9. February 7, 2018

Operational Semantics

Grade Weights. Language Design and Overview of COOL. CS143 Lecture 2. Programming Language Economics 101. Lecture Outline

Cunning Plan. One-Slide Summary. Functional Programming. Functional Programming. Introduction to COOL #1. Classroom Object-Oriented Language

Type checking. Jianguo Lu. November 27, slides adapted from Sean Treichler and Alex Aiken s. Jianguo Lu November 27, / 39

CS558 Programming Languages

Compilers. Cool Semantics II. Alex Aiken

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

Functional Programming. Introduction To Cool

Operational Semantics of Cool

Announcements. Written Assignment 2 Due Monday at 5:00PM. Midterm next Wednesday in class, 11:00 1:00. Midterm review session next Monday in class.

Operational Semantics of Cool

CSCE 314 Programming Languages. Type System

CS558 Programming Languages

CoolAid: The Cool Reference Manual

Object-Oriented Design Lecture 14 CSU 370 Fall 2007 (Pucella) Friday, Nov 2, 2007

Scoping and Type Checking

From IMP to Java. Andreas Lochbihler. parts based on work by Gerwin Klein and Tobias Nipkow ETH Zurich

The Cool Reference Manual

Semantic Analysis Type Checking

CS152: Programming Languages. Lecture 11 STLC Extensions and Related Topics. Dan Grossman Spring 2011

Lecture 15 CIS 341: COMPILERS

Outline. Introduction Concepts and terminology The case for static typing. Implementing a static type system Basic typing relations Adding context

CS152: Programming Languages. Lecture 23 Advanced Concepts in Object-Oriented Programming. Dan Grossman Spring 2011

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

Pierce Ch. 3, 8, 11, 15. Type Systems

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

Midterm II CS164, Spring 2006

COMP520 - GoLite Type Checking Specification

CMSC 330: Organization of Programming Languages

Announcements. Written Assignment 2 due today at 5:00PM. Programming Project 2 due Friday at 11:59PM. Please contact us with questions!

CIS 341 Final Examination 4 May 2017

Lecture #23: Conversion and Type Inference

Implementing a VSOP Compiler. March 20, 2018

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

Tail Calls. CMSC 330: Organization of Programming Languages. Tail Recursion. Tail Recursion (cont d) Names and Binding. Tail Recursion (cont d)

Topic 6: Types COS 320. Compiling Techniques. Princeton University Spring Prof. David August. Adapted from slides by Aarne Ranta

Simply-Typed Lambda Calculus

CMSC 330: Organization of Programming Languages. Formal Semantics of a Prog. Lang. Specifying Syntax, Semantics

Recursive Types and Subtyping

CSE341: Programming Languages Lecture 17 Implementing Languages Including Closures. Dan Grossman Autumn 2018

Project 6 Due 11:59:59pm Thu, Dec 10, 2015

Written Assignment 5 Due??

CS 321 Homework 4 due 1:30pm, Thursday, March 15, 2012 This homework specification is copyright by Andrew Tolmach. All rights reserved.

Lecture 13: Subtyping

CS-XXX: Graduate Programming Languages. Lecture 9 Simply Typed Lambda Calculus. Dan Grossman 2012

UNIVERSITY OF CALIFORNIA Department of Electrical Engineering and Computer Sciences Computer Science Division. P. N. Hilfinger

Review. CS152: Programming Languages. Lecture 11 STLC Extensions and Related Topics. Let bindings (CBV) Adding Stuff. Booleans and Conditionals

n n Try tutorial on front page to get started! n spring13/ n Stack Overflow!

Programming Languages

Tradeoffs. CSE 505: Programming Languages. Lecture 15 Subtyping. Where shall we add useful completeness? Where shall we add completeness?

7. Introduction to Denotational Semantics. Oscar Nierstrasz

COMP520 - GoLite Type Checking Specification

Late Binding; OOP as a Racket Pattern

Project 2 Due 11:59:59pm Wed, Mar 7, 2012

Second-Order Type Systems

Boolean expressions. Elements of Programming Languages. Conditionals. What use is this?

Implementing objects as in Javascript, Lua, 164 is expensive because object attributes are implemented as hashtable accesses:

CSEP505 Programming Languages, Autumn 2016, Final Exam December, Programming Languages for a World of Change

8 Understanding Subtyping

Reasoning About Imperative Programs. COS 441 Slides 10

Type Systems. Pierce Ch. 3, 8, 11, 15 CSE

Principles of Programming Languages

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

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

6. Asymptotics: The Big-O and Other Notations

Lecture 17 of 41. Clausal (Conjunctive Normal) Form and Resolution Techniques

CSCI-GA Scripting Languages

An Introduction to Subtyping

Software Design and Analysis for Engineers

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

Formal Semantics of Programming Languages

Polymorphism. Lecture 19 CS 565 4/17/08

Type Systems. Today. 1. Organizational Matters. 1. Organizational Matters. Lecture 1 Oct. 20th, 2004 Sebastian Maneth. 1. Organizational Matters

The Substitution Model

Softwaretechnik. Lecture 03: Types and Type Soundness. Peter Thiemann. University of Freiburg, Germany SS 2008

CS558 Programming Languages

Assistant for Language Theory. SASyLF: An Educational Proof. Corporation. Microsoft. Key Shin. Workshop on Mechanizing Metatheory

Formal Semantics of Programming Languages

Programming Languages Fall 2014

CS-XXX: Graduate Programming Languages. Lecture 23 Types for OOP; Static Overloading and Multimethods. Dan Grossman 2012

Topics Covered Thus Far. CMSC 330: Organization of Programming Languages. Language Features Covered Thus Far. Programming Languages Revisited

Harvard School of Engineering and Applied Sciences Computer Science 152

Transcription:

#1 Type Checking

Previously, in PL Scoping rules match identifier uses with identifier definitions. A type is a set of values coupled with a set of operations on those values. A type system specifies which operations are valid for which types. Type checking can be done statically (at compile time) or dynamically (at run time). #2

Today, in PL (one slide summary) A type environment gives types for free variables. You typecheck a let-body with an environment that has been updated to contain the new let-variable. If an object of type X could be used when one of type Y is acceptable then we say X is a subtype of Y, also written X Y. A type system is sound if E. dynamic_type(e) static_type(e)

Lecture Outline Typing Rules Typing Environments Let Rules Subtyping Wrong Rules #4

Type Checking Proofs A type checker s goal is to make sure that the program follows the rules for the given language s type system. Type checking proves facts e : T (read as: the expression e has type T). One type rule is used for each kind of expression In a type rule used for a node e: The hypotheses are the proofs of types of e s subexpressions The conclusion is the proof of the type of e itself (the fact that we re trying to prove, namely that e has type T). #5

Review Example: 1 + 2 ` 1 : Int ` 1 + 2 : Int ` 2 : Int #6

If we can prove it, then it's true! Soundness A type system is sound if Whenever ` e : T Then e evaluates to a value of type T We only want sound rules But some sound rules are better than others: (i is an integer) ` i : Object #7

Soundness: Why we care. If the type system is sound, then we can say that a well-typed program won t have runtime type mistakes. Completeness is the converse of soundness: A logical system is complete if Whenever e evaluates to a value of type T Then ` e : T There s a tug-of-war, here; we ll get back to this idea later. #8

Rules for Constants ` false : Bool [Bool] ` s : String [String] (s is a string constant) #9

Rule for New new T produces an object of type T Ignore SELF_TYPE for now... ` new T : T [New] #10

Two More Rules ` e : Bool ` not e : Bool [Not] ` e 1 : Bool ` e 2 : T ` while e 1 loop e 2 pool : Object [Loop] #11

Two More Rules ` e : Bool ` not e : Bool [Not] ` e 1 : Bool ` e 2 : T ` while e 1 loop e 2 pool : Object [Loop] #12

Typing: Example while not false loop 1 + 2 * 3 pool #13

Typing: Example while not false loop 1 + 2 * 3 pool while loop pool not + false 1 * 2 3 #14

Typing: Example while not false loop 1 + 2 * 3 pool Loop rule: ` e 1 : Bool ` e 2 : T ` while e 1 loop e 2 pool : Object while loop pool not + false 1 * 2 3 #15

Typing: Example while not false loop 1 + 2 * 3 pool Loop rule: ` e 1 : Bool ` e 2 : T ` while e 1 loop e 2 pool : Object while loop pool not + false 1 * 2 3 #16

Typing: Example while not false loop 1 + 2 * 3 pool Loop rule: ` e 1 : Bool ` e 2 : T ` while e 1 loop e 2 pool : Object while loop pool not + false 1 * 2 3 #17

Typing: Example while not false loop 1 + 2 * 3 pool while loop pool not + false 1 * 2 3 #18

Typing: Example while not false loop 1 + 2 * 3 pool while loop pool not + false 1 * 2 3 #19

Typing: Example while not false loop 1 + 2 * 3 pool while loop pool not + false 1 * 2 3 #20

Typing: Example while not false loop 1 + 2 * 3 pool while loop pool not + ` false : Bool false 1 * 2 3 #21

Typing: Example while not false loop 1 + 2 * 3 pool while loop pool not + ` false : Bool false : Bool 1 * 2 3 #22

Typing: Example while not false loop 1 + 2 * 3 pool while loop pool ` e : Bool ` not e : Bool not + false : Bool 1 * 2 3 #23

Typing: Example while not false loop 1 + 2 * 3 pool while loop pool ` e : Bool ` not e : Bool not : Bool + false : Bool 1 * 2 3 #24

Typing: Example while not false loop 1 + 2 * 3 pool while loop pool not : Bool + false : Bool 1 * 2 3 #25

Typing: Example while not false loop 1 + 2 * 3 pool while loop pool not : Bool + false : Bool 1 : Int * 2 3 #26

Typing: Example while not false loop 1 + 2 * 3 pool while loop pool not : Bool + false : Bool 1 : Int * 2 : Int 3 #27

Typing: Example while not false loop 1 + 2 * 3 pool while loop pool not : Bool + false : Bool 1 : Int * 2 : Int 3 : Int #28

Typing: Example while not false loop 1 + 2 * 3 pool while loop pool not : Bool + false : Bool 1 : Int * : Int 2 : Int 3 : Int #29

Typing: Example while not false loop 1 + 2 * 3 pool while loop pool not : Bool + : Int false : Bool 1 : Int * : Int 2 : Int 3 : Int #30

Typing: Example while not false loop 1 + 2 * 3 pool while loop pool not : Bool + : Int false : Bool 1 : Int * : Int 2 : Int 3 : Int #31

Typing: Example while not false loop 1 + 2 * 3 pool Loop rule: ` e 1 : Bool ` e 2 : T ` while e 1 loop e 2 pool : Object while loop pool not : Bool + : Int false : Bool 1 : Int * : Int 2 : Int 3 : Int #32

Typing: Example while not false loop 1 + 2 * 3 pool Loop rule: ` e 1 : Bool ` e 2 : T ` while e 1 loop e 2 pool : Object while loop pool : Object not : Bool + : Int false : Bool 1 : Int * : Int 2 : Int 3 : Int #33

Typing: Example while not false loop 1 + 2 * 3 pool Loop rule: ` e 1 : Bool ` e 2 : T ` while e 1 loop e 2 pool : Object while loop pool : Object not : Bool + : Int false : Bool 1 : Int * : Int 2 : Int 3 : Int #34

Typing Derivations This typing reasoning can be expressed as a tree: ` false : Bool ` not false : Bool ` 1 : Int ` 2 : Int ` 2 * 3 : Int ` 1 + 2 * 3: Int ` while not false loop 1 + 2 * 3 : Object ` 3 : Int The root of the tree is the whole expression (while not false loop 1 + 2 * 3 pool). Each node is an instance of a typing rule. Leaves are the rules with no hypotheses #35

A Problem What is the type of a variable reference? ` x :? [Var] (x is an identifier) The local structural rule does not carry enough information to give x a type. #36

A Problem What is the type of a variable reference? ` x :? [Var] (x is an identifier) The local structural rule does not carry enough information to give x a type. #37

Solution: add information to the rules! A type environment gives types for free variables. It is a mapping from Object_Identifiers to Types A variable is free in an expression if the expression contains an occurrence of the variable that refers to a declaration outside the expression. Examples: in the expression x, the variable x is free in let x : Int in x + y only y is free in x + let x : Int in x + y both x, y are free #38

Type Environments Let O be a function from Object_Identifiers to Types The sentence O ` e : T is read: Under the assumption that variables have the types given by O, it is provable that the expression e has the type T. #39

Modified Rules The type environment is added to the earlier rules: O ` i : Int [Int] (i is an integer) O ` e 1 : Int O ` e 2 : Int O ` e 1 + e 2 : Int [Add] #40

New Rules And we can write new rules: O ` x : T [Var] (O(x) = T) Equivalently: O(x) = T O ` x : T [Var] #41

Let O[T 0 /x] ` e 1 : T 1 [Let-No-Init] O ` let x : T 0 in e 1 : T 1 O[T 0 /x] means O modified to map x to T 0 and behaving as O on all other arguments : O[T 0 /x] (x) = T 0 O[T 0 /x] (y) = O(y) (You can write O[x/T 0 ] on tests/assignments.) #42

Let Example Consider the Cool expression let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) (where E x, y and F x, y are some Cool expression that contain occurrences of x and y ) Scope of y is E x, y of outer x is E x, y of inner x is F x, y This is captured precisely in the typing rule. #43

Example of Typing Let let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) #44

Example of Typing Let AST let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) let x : T 0 in + let y : T 1 in let x : T 2 in E x, y F x, y x #45

Example of Typing Let AST let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) Type env. O ` let x : T 0 in + let y : T 1 in let x : T 2 in E x, y F x, y x #46

Example of Typing Let AST let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) Type env. O ` let x : T 0 in O[T 0 /x] ` + let y : T 1 in let x : T 2 in E x, y F x, y x #47

Example of Typing Let AST let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) Type env. O ` let x : T 0 in O[T 0 /x] ` + O[T 0 /x] ` let y : T 1 in O[T 0 /x] ` let x : T 2 in E x, y x F x, y #48

Example of Typing Let AST let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) Type env. O ` let x : T 0 in O[T 0 /x] ` + O[T 0 /x] ` let y : T 1 in O[T 0 /x] ` let x : T 2 in (O[T 0 /x])[t 1 /y] ` E x, y F x, y x #49

Example of Typing Let AST let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) Type env. O ` let x : T 0 in O[T 0 /x] ` + O[T 0 /x] ` let y : T 1 in O[T 0 /x] ` let x : T 2 in (O[T 0 /x])[t 1 /y] ` E x, y F x, y (O[T 0 /x])[t 1 /y] ` x #50

Example of Typing Let AST let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) Type env. O ` let x : T 0 in O[T 0 /x] ` + O[T 0 /x] ` let y : T 1 in O[T 0 /x] ` let x : T 2 in (O[T 0 /x])[t 1 /y] ` E x, y (O[T 0 /x])[t 2 /x] ` F x, y (O[T 0 /x])[t 1 /y] ` x #51

Example of Typing Let AST let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) Type env. Types O ` let x : T 0 in O[T 0 /x] ` + O[T 0 /x] ` let y : T 1 in O[T 0 /x] ` let x : T 2 in (O[T 0 /x])[t 1 /y] ` E x, y (O[T 0 /x])[t 2 /x] ` F x, y (O[T 0 /x])[t 1 /y] ` x : T 0 #52

Example of Typing Let AST let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) Type env. Types O ` let x : T 0 in O[T 0 /x] ` + O[T 0 /x] ` let y : T 1 in O[T 0 /x] ` let x : T 2 in (O[T 0 /x])[t 1 /y] ` E x, y : int (O[T 0 /x])[t 2 /x] ` F x, y (O[T 0 /x])[t 1 /y] ` x : T 0 #53

Example of Typing Let AST let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) Type env. Types O ` let x : T 0 in O[T 0 /x] ` + O[T 0 /x] ` let y : T 1 in : int O[T 0 /x] ` let x : T 2 in (O[T 0 /x])[t 1 /y] ` E x, y : int (O[T 0 /x])[t 2 /x] ` F x, y (O[T 0 /x])[t 1 /y] ` x : T 0 #54

Example of Typing Let AST let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) Type env. Types O ` let x : T 0 in O[T 0 /x] ` + O[T 0 /x] ` let y : T 1 in : int O[T 0 /x] ` let x : T 2 in (O[T 0 /x])[t 1 /y] ` E x, y : int (O[T 0 /x])[t 2 /x] ` F x, y : int (O[T 0 /x])[t 1 /y] ` x : T 0 #55

Example of Typing Let AST let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) Type env. Types O ` let x : T 0 in O[T 0 /x] ` + O[T 0 /x] ` let y : T 1 in : int O[T 0 /x] ` let x : T 2 in : int (O[T 0 /x])[t 1 /y] ` E x, y : int (O[T 0 /x])[t 2 /x] ` F x, y : int (O[T 0 /x])[t 1 /y] ` x : T 0 #56

Example of Typing Let AST let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) Type env. Types O ` let x : T 0 in O[T 0 /x] ` + : int O[T 0 /x] ` let y : T 1 in : int O[T 0 /x] ` let x : T 2 in : int (O[T 0 /x])[t 1 /y] ` E x, y : int (O[T 0 /x])[t 2 /x] ` F x, y : int (O[T 0 /x])[t 1 /y] ` x : T 0 #57

Notes The type environment gives types to the free identifiers in the current scope The type environment is passed down the AST from the root towards the leaves Types are computed up the AST from the leaves towards the root #58

Example of Typing Let AST let x : T 0 in (let y : T 1 in E x, y ) + (let x : T 2 in F x, y ) Type env. Types O ` let x : T 0 in O[T 0 /x] ` + : int O[T 0 /x] ` let y : T 1 in : int O[T 0 /x] ` let x : T 2 in : int (O[T 0 /x])[t 1 /y] ` E x, y : int (O[T 0 /x])[t 2 /x] ` F x, y : int (O[T 0 /x])[t 1 /y] ` x : T 0 #59

Q: Movies (362 / 842) In this 1992 comedy Dana Carvey and Mike Myers reprise a Saturday Night Live skit, sing Bohemian Rhapsody and say of a guitar: "Oh yes, it will be mine."

Q: General (455 / 842) This numerical technique for finding solutions to boundary-value problems was initially developed for use in structural analysis in the 1940's. The subject is represented by a model consisting of a number of linked simplified representations of discrete regions. It is often used to determine stress and displacement in mechanical systems.

Q: Movies (377 / 842) Identify the subject or the speaker in 2 of the following 3 Star Wars quotes. "Aren't you a little short to be a stormtrooper?" "I felt a great disturbance in the Force... as if millions of voices suddenly cried out in terror and were suddenly silenced." "I recognized your foul stench when I was brought on board."

Let with Initialization Now consider let with initialization: O ` e 0 : T 0 O[T 0 /x] ` e 1 : T 1 [Let-Init] O ` let x : T 0 Ã e 0 in e 1 : T 1 This rule is weak. Why? #63

Let with Initialization Consider the example: class C inherits P { } let x : P Ã new C in The previous let rule does not allow this code The rule is too weak or incomplete. #64

Subtyping Define a relation X Y on classes to say that: An object of type X could be used when one of type Y is acceptable, or equivalently, X conforms with Y In Cool, this means that X is a subclass of Y Define a relation on classes such that: X X X Y if X inherits from Y X Z if X Y and Y Z #65

Let With Initialization (Better) O ` e 0 : T T T 0 O[T 0 /x] ` e 1 : T 1 [Let-Init] O ` let x : T 0 Ã e 0 in e 1 : T 1 Both rules for let are sound But more programs type check with this new rule (it is more complete). #66

Dynamic And Static Types The dynamic type of an object is the class C that is used in the new C expression that creates the object A run-time notion. Even languages that are not statically typed have the notion of dynamic type. The static type of an expression is a notation that captures all possible dynamic types the expression could take. A compile-time notion #67

Dynamic and Static Types. (Cont.) In early type systems, the set of static types correspond directly with the dynamic types. Soundness theorem: for all expressions E dynamic_type(e) = static_type(e) (in all executions, E evaluates to values of the type inferred by the compiler) This gets more complicated in advanced type systems (e.g., Java, Cool) #68

Type System Tug-of-War There is a tension between Flexible rules that do not constrain programming Restrictive rules that ensure safety of execution #69

Static Type System Expressiveness A static type system enables a compiler to detect many common programming errors The cost is that some correct programs are disallowed Some argue for dynamic type checking instead. others argue for more expressive static type checking. But more expressive type systems are also more complex #70

Dynamic and Static Types in COOL A variable of static type A can hold values of static type B, if B A x has static type A class A { } class B inherits A { } class Main { A x new A; x new B; } Here, x s value has dynamic type A Here, x s value has dynamic type B #71

Dynamic and Static Types Soundness theorem for the Cool type system: E. dynamic_type(e) static_type(e) Why is this Ok? For E, compiler uses static_type(e) All operations that can be used on an object of type C can also be used on an object of type C C Examples: fetching the value of an attribute, or invoking a method on the object Subclasses can only add attributes or methods Methods can be redefined, but with the same types! #72

Subtyping Example Consider the following Cool class definitions Class A { a() : int { 0 }; } Class B inherits A { b() : int { 1 }; } An instance of B has methods a and b An instance of A has method a A type error occurs if we try to invoke method b on an instance of A #73

Example of Wrong Let Rule (1) Now consider a hypothetical wrong let rule: O ` e 0 : T T T 0 O ` e 1 : T 1 O ` let x : T 0 Ã e 0 in e 1 : T 1 How is it different from the correct rule? #74

Example of Wrong Let Rule (1) Now consider a hypothetical wrong let rule: O ` e 0 : T T T 0 O ` e 1 : T 1 O ` let x : T 0 à e 0 in e 1 : T 1 How is it different from the correct rule? The following good program does not typecheck let x : Int à 0 in x + 1 Why? #75

Example of Wrong Let Rule (2) Now consider a hypothetical wrong let rule: O ` e 0 : T T 0 T O[T 0 /x] ` e 1 : T 1 O ` let x : T 0 Ã e 0 in e 1 : T 1 How is it different from the correct rule? #76

Example of Wrong Let Rule (2) Now consider another hypothetical wrong let rule: O ` e 0 : T T 0 T O[T 0 /x] ` e 1 : T 1 O ` let x : T 0 Ã e 0 in e 1 : T 1 How is it different from the correct rule? The following bad program is well typed let x : B Ã new A in x.b() Why is this program bad? #77

Example of Wrong Let Rule (3) Now consider a third hypothetical wrong let rule: O ` e 0 : T T T 0 O[T/x] ` e 1 : T 1 O ` let x : T 0 Ã e 0 in e 1 : T 1 How is it different from the correct rule? #78

Example of Wrong Let Rule (3) Now consider a third hypothetical wrong let rule: O ` e 0 : T T T 0 O[T/x] ` e 1 : T 1 O ` let x : T 0 à e 0 in e 1 : T 1 How is it different from the correct rule? The following good program is not well typed let x : A à new B in { x à new A; x.a(); } Why is this program not well typed? #79

Upshot: Typing Rule Notation The typing rules use very concise notation They are very carefully constructed Virtually any change in a rule either: Makes the type system unsound (i.e., bad programs are accepted as well typed) Or, makes the type system less usable or incomplete (i.e. good programs are rejected) But some good programs will always be rejected, because the notion of a good program is undecidable #80

Assignment More uses of subtyping: O(id) = T 0 O ` e 1 : T 1 T 1 T 0 [Assign] O ` id à e 1 : T 1 #81

Initialized Attributes Let O C (x) = T for all attributes x:t in class C O C represents the class-wide scope Attribute initialization is similar to let, except for the scope of names O C (id) = T 0 O C ` e 1 : T 1 T 1 T 0 O C ` id : T 0 Ã e 1 ; [Attr-Init] #82

If-Then-Else Consider: if e 0 then e 1 else e 2 fi The result can be either e 1 or e 2 ; the dynamic type is therefore either e 1 s or e 2 s type. The best we can do statically is the smallest supertype larger than both the types of e 1 and e 2 #83

If-Then-Else example Consider the class hierarchy P A B and the expression if then new A else new B fi Its type should allow for the dynamic type to be both A or B Smallest supertype is P #84

Least Upper Bounds Define: lub(x,y) to be the least upper bound of X and Y. lub(x,y) is Z if X Z Æ Y Z Z is an upper bound X Z Æ Y Z Z Z Z is least among upper bounds In Cool, the least upper bound of two types is their least common ancestor in the inheritance tree #85

If-Then-Else Revisited O ` e 0 : Bool O ` e 1 : T 1 O ` e 2 : T 2 O ` if e 0 then e 1 else e 2 fi : lub(t 1, T 2 ) [If-Then-Else] #86

Case The rule for case expressions takes a lub over all branches O ` e 0 : T 0 O[T 1 /x 1 ] ` e 1 : T 1 O[T n /x n ] ` e n : T n [Case] O ` case e 0 of x 1 :T 1 ) e 1 ; ; x n : T n ) e n ; esac : lub(t 1,,T n ) #87

Next Time Type checking method dispatch Type checking with SELF_TYPE in COOL #88

Homework Get started on PA4 Checkpoint due March 19 Before Next Class: Read Chapter 7.2 #89