Slide 1

Slide 1 text

Let's Write a Type Checker Ionuț G. Stan — I T.A.K.E. — May 2015

Slide 2

Slide 2 text

• Part 1 • Compilers Overview • Type Checking vs Type Inference • Vehicle Language • Wand's Type Inference Algorithm • Part 2 • Live Demonstration The Plan

Slide 3

Slide 3 text

Compilers Overview

Slide 4

Slide 4 text

Compiler Compilers Overview

Slide 5

Slide 5 text

Source Code Compiler Compilers Overview

Slide 6

Slide 6 text

Source Code Compiler (fn a => a) 2 Compilers Overview

Slide 7

Slide 7 text

Source Code Target Language Compiler (fn a => a) 2 Compilers Overview

Slide 8

Slide 8 text

Source Code Target Language Compiler (fn a => a) 2 (function(a){return a;})(2); Compilers Overview

Slide 9

Slide 9 text

Source Code Target Language Compiler (fn a => a) 2 (function(a){return a;})(2); Interpreter Compilers Overview

Slide 10

Slide 10 text

Source Code Target Language Compiler (fn a => a) 2 (function(a){return a;})(2); Source Code Interpreter Compilers Overview

Slide 11

Slide 11 text

Source Code Target Language Compiler (fn a => a) 2 (function(a){return a;})(2); Source Code Interpreter (fn a => a) 2 Compilers Overview

Slide 12

Slide 12 text

Source Code Target Language Compiler (fn a => a) 2 (function(a){return a;})(2); Source Code Evaluation Result Interpreter (fn a => a) 2 Compilers Overview

Slide 13

Slide 13 text

Source Code Target Language Compiler (fn a => a) 2 (function(a){return a;})(2); Source Code Evaluation Result Interpreter (fn a => a) 2 2 Compilers Overview

Slide 14

Slide 14 text

Compilers Overview de T Compiler ) 2 (functi

Slide 15

Slide 15 text

Parsing de T Compiler ) 2 (functi Parser

Slide 16

Slide 16 text

Abstract Syntax Tree de T Compiler ) 2 (functi Parser Abstract Syntax Tree (AST)

Slide 17

Slide 17 text

Abstract Syntax Tree de T Compiler ) 2 (functi Parser APP FUN a VAR a INT 2 Abstract Syntax Tree (AST)

Slide 18

Slide 18 text

Code Generation de T Compiler ) 2 (functi Parser CodeGen APP FUN a VAR a INT 2 Abstract Syntax Tree (AST)

Slide 19

Slide 19 text

Many Intermediate Phases de T Compiler ) 2 (functi Parser CodeGen ... AST

Slide 20

Slide 20 text

Type Checking de T Compiler ) 2 (functi Parser CodeGen Type Checker AST Typed AST ...

Slide 21

Slide 21 text

Today's Talk de T Compiler ) 2 (functi Parser CodeGen Type Checker AST Typed AST Today

Slide 22

Slide 22 text

Type Checking vs Type Inference

Slide 23

Slide 23 text

• Type Checking • Ensures declared types are used consistently • All types must be declared • Traverse AST and compare def site with use site • Type Inference • Ensures consistency as well • Types need not be declared, though; are deduced! • Two main classes of algorithms • We'll see one instance today Type Checking vs Inference

Slide 24

Slide 24 text

Vehicle Language

Slide 25

Slide 25 text

• Surface Syntax • What's the concrete syntax of the language • Type System • What types are supported by the language Vehicle Language

Slide 26

Slide 26 text

1. Numbers: 1, 2, 3, ... 2. Booleans: true and false 3. Function expressions: fn a => a 4. Function application: inc 42 or 2 + 3 5. If expressions: if cond then t else f Surface Syntax1 1 — a subset of Standard ML

Slide 27

Slide 27 text

1. Numbers: 1, 2, 3, ... 2. Booleans: true and false 3. Function expressions: fn a => a 4. Function application: inc 42 or 2 + 3 5. If expressions: if cond then t else f Surface Syntax1 1 — a subset of Standard ML

Slide 28

Slide 28 text

1. Numbers: 1, 2, 3, ... 2. Booleans: true and false 3. Anonymous functions (lambdas): fn a => a 4. Function application: inc 42 or 2 + 3 5. If expressions: if cond then t else f Surface Syntax1 1 — a subset of Standard ML

Slide 29

Slide 29 text

1. Numbers: 1, 2, 3, ... 2. Booleans: true and false 3. Anonymous functions (lambdas): fn a => a 4. Function application: inc 42 5. If expressions: if cond then t else f Surface Syntax1 1 — a subset of Standard ML

Slide 30

Slide 30 text

1. Numbers: 1, 2, 3, ... 2. Booleans: true and false 3. Anonymous functions (lambdas): fn a => a 4. Function application: inc 42 5. If expressions: if cond then t else f Surface Syntax1 1 — a subset of Standard ML

Slide 31

Slide 31 text

6. Let blocks/expressions:
 
 let
 val name = ...
 in
 name
 end Surface Syntax1 1 — a subset of Standard ML

Slide 32

Slide 32 text

Small Example let val inc = fn a => a + 1 in inc 42 end

Slide 33

Slide 33 text

1. Integer type: int 2. Boolean type: bool 3. Function type: int -> bool 4. Generic type variables: 'a, 'b, 'c, etc. Language Types

Slide 34

Slide 34 text

1. Integer type: int 2. Boolean type: bool 3. Function type: int -> bool 4. Generic type variables: 'a, 'b, 'c, etc. Language Types

Slide 35

Slide 35 text

1. Integer type: int 2. Boolean type: bool 3. Function type: int -> bool 4. Generic type variables: 'a, 'b, 'c, etc. Language Types

Slide 36

Slide 36 text

1. Integer type: int 2. Boolean type: bool 3. Function type: int -> bool 4. Generic type variables: 'a, 'b, 'c, etc. Language Types

Slide 37

Slide 37 text

Today's Algorithm Overview

Slide 38

Slide 38 text

Wand's Algorithm Overview

Slide 39

Slide 39 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST

Slide 40

Slide 40 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST fn isZero => if isZero 1 then 2 else 3

Slide 41

Slide 41 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUN isZero IF APP VAR isZero INT 1 INT 2 INT 3 fn isZero => if isZero 1 then 2 else 3

Slide 42

Slide 42 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUN isZero IF APP VAR isZero INT 1 INT 2 INT 3 fn isZero => if isZero 1 then 2 else 3

Slide 43

Slide 43 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUN isZero IF APP VAR isZero INT 1 INT 2 INT 3 fn isZero => if isZero 1 then 2 else 3

Slide 44

Slide 44 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUN isZero IF APP VAR isZero INT 1 INT 2 INT 3 fn isZero => if isZero 1 then 2 else 3

Slide 45

Slide 45 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUN isZero IF APP VAR isZero INT 1 INT 2 INT 3 fn isZero => if isZero 1 then 2 else 3

Slide 46

Slide 46 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUN isZero IF APP VAR isZero INT 1 INT 2 INT 3 fn isZero => if isZero 1 then 2 else 3

Slide 47

Slide 47 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUN isZero IF APP VAR isZero INT 1 INT 2 INT 3 fn isZero => if isZero 1 then 2 else 3

Slide 48

Slide 48 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUN isZero IF APP VAR isZero INT 1 INT 2 INT 3 fn isZero => if isZero 1 then 2 else 3

Slide 49

Slide 49 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUN isZero IF APP VAR isZero INT 1 INT 2 INT 3 fn isZero => if isZero 1 then 2 else 3

Slide 50

Slide 50 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUN isZero IF APP VAR isZero INT 1 INT 2 INT 3 fn isZero => if isZero 1 then 2 else 3

Slide 51

Slide 51 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUN IF APP AR ero INT 1 INT 2 INT 3 FUNt2 isZerot1 IFt3 APPt4 VARt1 isZero INTt5 1 INTt6 2 INTt7 3

Slide 52

Slide 52 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUN IF APP AR ero INT 1 INT 2 INT 3 FUNt2 isZerot1 IFt3 APPt4 VARt1 isZero INTt5 1 INTt6 2 INTt7 3

Slide 53

Slide 53 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUNt2 isZerot1 IFt3 APPt4 VARt1 isZero INTt5 1 INTt6 2 INTt7 3 Constraint Set

Slide 54

Slide 54 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUNt2 isZerot1 IFt3 APPt4 VARt1 isZero INTt5 1 INTt6 2 INTt7 3 ≡ t5 → t4 t1 Constraint Set

Slide 55

Slide 55 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUNt2 isZerot1 IFt3 APPt4 VARt1 isZero INTt5 1 INTt6 2 INTt7 3 ≡ t5 → t4 ≡ int t1 t5 Constraint Set

Slide 56

Slide 56 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUNt2 isZerot1 IFt3 APPt4 VARt1 isZero INTt5 1 INTt6 2 INTt7 3 ≡ t5 → t4 ≡ int ≡ bool t1 t5 t4 Constraint Set

Slide 57

Slide 57 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUNt2 isZerot1 IFt3 APPt4 VARt1 isZero INTt5 1 INTt6 2 INTt7 3 ≡ t5 → t4 ≡ int ≡ bool ≡ int t1 t5 t4 t6 Constraint Set

Slide 58

Slide 58 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUNt2 isZerot1 IFt3 APPt4 VARt1 isZero INTt5 1 INTt6 2 INTt7 3 ≡ t5 → t4 ≡ int ≡ bool ≡ int ≡ int t1 t5 t4 t6 t7 Constraint Set

Slide 59

Slide 59 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUNt2 isZerot1 IFt3 APPt4 VARt1 isZero INTt5 1 INTt6 2 INTt7 3 ≡ t5 → t4 ≡ int ≡ bool ≡ int ≡ int ≡ t3 t1 t5 t4 t6 t7 t6 Constraint Set

Slide 60

Slide 60 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUNt2 isZerot1 IFt3 APPt4 VARt1 isZero INTt5 1 INTt6 2 INTt7 3 ≡ t5 → t4 ≡ int ≡ bool ≡ int ≡ int ≡ t3 ≡ t3 t1 t5 t4 t6 t7 t6 t7 Constraint Set

Slide 61

Slide 61 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUNt2 isZerot1 IFt3 APPt4 VARt1 isZero INTt5 1 INTt6 2 INTt7 3 ≡ t5 → t4 ≡ int ≡ bool ≡ int ≡ int ≡ t3 ≡ t3 ≡ t1 → t3 t1 t5 t4 t6 t7 t6 t7 t2 Constraint Set

Slide 62

Slide 62 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUNt2 isZerot1 IFt3 APPt4 VARt1 isZero INTt5 1 INTt6 2 INTt7 3 ≡ t5 → t4 ≡ int ≡ bool ≡ int ≡ int ≡ t3 ≡ t3 ≡ t1 → t3 t1 t5 t4 t6 t7 t6 t7 t2 Constraint Set

Slide 63

Slide 63 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST ≡ t5 → t4 ≡ int ≡ bool ≡ int ≡ int ≡ t3 ≡ t3 ≡ t1 → t3 t1 t5 t4 t6 t7 t6 t7 t2 Constraint Set Solution Map

Slide 64

Slide 64 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST : t5 → t4 t1 ≡ int ≡ bool ≡ int ≡ int ≡ t3 ≡ t3 ≡ t1 → t3 t5 t4 t6 t7 t6 t7 t2 Constraint Set Solution Map

Slide 65

Slide 65 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST : t5 → t4 t1 ≡ int ≡ bool ≡ int ≡ int ≡ t3 ≡ t3 ≡ (t5 → t4) → t3 t5 t4 t6 t7 t6 t7 t2 Constraint Set Solution Map

Slide 66

Slide 66 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST : t5 → t4 : int t1 t5 ≡ bool ≡ int ≡ int ≡ t3 ≡ t3 ≡ (t5 → t4) → t3 t4 t6 t7 t6 t7 t2 Constraint Set Solution Map

Slide 67

Slide 67 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST : int → t4 : int t1 t5 ≡ bool ≡ int ≡ int ≡ t3 ≡ t3 ≡ (int → t4) → t3 t4 t6 t7 t6 t7 t2 Constraint Set Solution Map

Slide 68

Slide 68 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST : int → t4 : int : bool t1 t5 t4 ≡ int ≡ int ≡ t3 ≡ t3 ≡ (int → t4) → t3 t6 t7 t6 t7 t2 Constraint Set Solution Map

Slide 69

Slide 69 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST : int → bool : int : bool t1 t5 t4 ≡ int ≡ int ≡ t3 ≡ t3 ≡ (int → bool) → t3 t6 t7 t6 t7 t2 Constraint Set Solution Map

Slide 70

Slide 70 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST : int → bool : int : bool : int t1 t5 t4 t6 ≡ int ≡ t3 ≡ t3 ≡ (int → bool) → t3 t7 t6 t7 t2 Constraint Set Solution Map

Slide 71

Slide 71 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST : int → bool : int : bool : int t1 t5 t4 t6 ≡ int ≡ t3 ≡ t3 ≡ (int → bool) → t3 t7 int t7 t2 Constraint Set Solution Map

Slide 72

Slide 72 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST : int → bool : int : bool : int : int t1 t5 t4 t6 t7 ≡ t3 ≡ t3 ≡ (int → bool) → t3 int t7 t2 Constraint Set Solution Map

Slide 73

Slide 73 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST : int → bool : int : bool : int : int t1 t5 t4 t6 t7 ≡ t3 ≡ t3 ≡ (int → bool) → t3 int int t2 Constraint Set Solution Map

Slide 74

Slide 74 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST : int → bool : int : bool : int : int : int t1 t5 t4 t6 t7 t3 ≡ t3 ≡ (int → bool) → t3 int t2 Constraint Set Solution Map

Slide 75

Slide 75 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST : int → bool : int : bool : int : int : int t1 t5 t4 t6 t7 t3 ≡ int ≡ (int → bool) → int int t2 Constraint Set Solution Map

Slide 76

Slide 76 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST : int → bool : int : bool : int : int : int t1 t5 t4 t6 t7 t3 ≡ int ≡ (int → bool) → int int t2 Constraint Set Solution Map

Slide 77

Slide 77 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST : int → bool : int : bool : int : int : int t1 t5 t4 t6 t7 t3 ≡ (int → bool) → int t2 Constraint Set Solution Map

Slide 78

Slide 78 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST : int → bool : int : bool : int : int : int : (int → bool) → int t1 t5 t4 t6 t7 t3 t2 Constraint Set Solution Map

Slide 79

Slide 79 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST FUNt2 isZerot1 IFt3 APPt4 VARt1 isZero INTt5 1 INTt6 2 INTt7 3 : int → bool : int : bool : int : int : int : (int → bool) → int t1 t5 t4 t6 t7 t3 t2 Solution Map

Slide 80

Slide 80 text

Wand's Algorithm Overview Type Annotation Constraint Generation Constraint Solving Parsing AST fn isZero => if isZero 1 then 2 else 3 (int -> bool) -> int

Slide 81

Slide 81 text

• As I said, there are two main classes • Constraint-based ones. We've just seen one example — Wand's algorithm • Substitution-based ones, where constraint generation and solving are not two separate processes, they are interleaved. Example: the classic Hindley-Milner Algorithm W. Type Checking Algorithms

Slide 82

Slide 82 text

Live Demonstration

Slide 83

Slide 83 text

https://github.com/igstan/itake-2015

Slide 84

Slide 84 text

Thank You!

Slide 85

Slide 85 text

• Sunil Kothari and James L. Caldwell. Type Reconstruction Algorithms - A Survey • Mitchell Wand. A simple algorithm and proof for type inference. • Bastiaan Heeren, Jurriaan Hage and Doaitse Swierstra. Generalizing Hindley-Milner Type Inference Algorithms • Oleg Kiselyov and Chung-chieh Shan. Interpreting Types as Abstract Values • Shriram Krishnamurthi. Programming Languages: Application and Interpretation, chapter 15 • Shriram Krishnamurthi. Programming Languages: Application and Interpretation, lecture 24 • Shriram Krishnamurthi. Programming Languages: Application and Interpretation, lecture 25 • Bastiaan Heeren. Top Quality Type Error Messages • Stephen Diehl. Write You a Haskell, chapter 6 • Andrew Appel. Modern Compiler Implementation in ML, chapter 16 • Benjamin Pierce. Types and Programming Languages, chapter 22 • Martin Odersky. Scala by Example, chapter 16 • Danny Gratzer. https://github.com/jozefg/hm • Arlen Cox. ML Type Inference and Unification! • Radu Rugină. CS 312, Type Inference Resources