Programming Languages and Compilers (CS 421)

Slides:



Advertisements
Similar presentations
Compilers Course 379K, TTH 9:30-11:00 Instructor: Dr. Doron A. Peled Office Hours: Mon 11:00-12:00.
Advertisements

Programming Language Concepts
Type Checking, Inference, & Elaboration CS153: Compilers Greg Morrisett.
Getting started with ML ML is a functional programming language. ML is statically typed: The types of literals, values, expressions and functions in a.
Catriel Beeri Pls/Winter 2004/5 type reconstruction 1 Type Reconstruction & Parametric Polymorphism  Introduction  Unification and type reconstruction.
Chapter 3 Program translation1 Chapt. 3 Language Translation Syntax and Semantics Translation phases Formal translation models.
2.2 A Simple Syntax-Directed Translator Syntax-Directed Translation 2.4 Parsing 2.5 A Translator for Simple Expressions 2.6 Lexical Analysis.
9/18/20151 Programming Languages and Compilers (CS 421) Elsa L Gunter 2112 SC, UIUC Based in part on slides by Mattox.
Chapter 1 Introduction Dr. Frank Lee. 1.1 Why Study Compiler? To write more efficient code in a high-level language To provide solid foundation in parsing.
10/3/20151 Programming Languages and Compilers (CS 421) Choonghwan Lee Based in part on slides by Mattox Beckman,
CS 326 Programming Languages, Concepts and Implementation Instructor: Mircea Nicolescu Lecture 2.
10/14/20151 Programming Languages and Compilers (CS 421) Grigore Rosu 2110 SC, UIUC Slides by Elsa Gunter, based.
Chapter 6 Programming Languages (2) Introduction to CS 1 st Semester, 2015 Sanghyun Park.
10/25/20151 Programming Languages and Compilers (CS 421) Grigore Rosu 2110 SC, UIUC Slides by Elsa Gunter, based.
Introduction to Compiling
12/9/20151 Programming Languages and Compilers (CS 421) Elsa L Gunter 2112 SC, UIUC Based in part on slides by Mattox.
Compiler Design Introduction 1. 2 Course Outline Introduction to Compiling Lexical Analysis Syntax Analysis –Context Free Grammars –Top-Down Parsing –Bottom-Up.
10/16/081 Programming Languages and Compilers (CS 421) Elsa L Gunter 2112 SC, UIUC Based in part on slides by Mattox.
2/1/20161 Programming Languages and Compilers (CS 421) Grigore Rosu 2110 SC, UIUC Slides by Elsa Gunter, based in.
CS412/413 Introduction to Compilers Radu Rugina Lecture 13 : Static Semantics 18 Feb 02.
2/6/20161 Programming Languages and Compilers (CS 421) Elsa L Gunter 2112 SC, UIUC Based in part on slides by Mattox.
Programming Language Concepts (CIS 635) Elsa L Gunter 4303 GITC NJIT,
Programming Language Concepts (CIS 635) Elsa L Gunter 4303 GITC NJIT,
3/8/20161 Programming Languages and Compilers (CS 421) Reza Zamani Based in part on slides by Mattox Beckman, as updated.
Comp 311 Principles of Programming Languages Lecture 2 Syntax Corky Cartwright August 26, 2009.
CS 404Ahmed Ezzat 1 CS 404 Introduction to Compiler Design Lecture 1 Ahmed Ezzat.
3/20/20161 Programming Languages and Compilers (CS 421) Reza Zamani Based in part on slides by Mattox Beckman,
Lesson 10 Type Reconstruction
Chapter 3 – Describing Syntax
Describing Syntax and Semantics
Compiler Design (40-414) Main Text Book:
Programming Languages and Compilers (CS 421)
Programming Languages and Compilers (CS 421)
Principles of programming languages 12: Functional programming
Programming Languages and Compilers (CS 421)
Programming Languages and Compilers (CS 421)
A Simple Syntax-Directed Translator
CS510 Compiler Lecture 4.
SOFTWARE DESIGN AND ARCHITECTURE
Representation, Syntax, Paradigms, Types
Programming Languages and Compilers (CS 421)
PROGRAMMING LANGUAGES
Programming Languages and Compilers (CS 421)
Syntax versus Semantics
Compiler Lecture 1 CS510.
CS416 Compiler Design lec00-outline September 19, 2018
Programming Languages and Compilers (CS 421)
Programming Languages and Compilers (CS 421)
Programming Languages and Compilers (CS 421)
Syntax Questions 6. Define a left recursive grammar rule.
Introduction CI612 Compiler Design CI612 Compiler Design.
Programming Languages and Compilers (CS 421)
Programming Languages and Compilers (CS 421)
Programming Languages and Compilers (CS 421)
Programming Languages and Compilers (CS 421)
R.Rajkumar Asst.Professor CSE
Representation, Syntax, Paradigms, Types
Programming Languages and Compilers (CS 421)
Representation, Syntax, Paradigms, Types
CS416 Compiler Design lec00-outline February 23, 2019
Programming Languages and Compilers (CS 421)
Programming Languages and Compilers (CS 421)
Representation, Syntax, Paradigms, Types
Programming Languages and Compilers (CS 421)
Lec00-outline May 18, 2019 Compiler Design CS416 Compiler Design.
Programming Languages and Compilers (CS 421)
Programming Languages and Compilers (CS 421)
Programming Languages and Compilers (CS 421)
COMPILER CONSTRUCTION
Programming Languages and Compilers (CS 421)
Presentation transcript:

Programming Languages and Compilers (CS 421) Sasa Misailovic 4110 SC, UIUC https://courses.engr.illinois.edu/cs421/fa2017/CS421A Based on slides by Elsa Gunter, which were inspired by earlier slides by Mattox Beckman, Vikram Adve, and Gul Agha 2/25/2019

Two Problems Type checking Typability Question: Does exp. e have type  in env ? Answer: Yes / No Method: Type derivation Typability Question Does exp. e have some type in env. ? If so, what is it? Answer: Type  / error Method: Type inference 2/25/2019

Type Inference - Outline Begin by assigning a type variable as the type of the whole expression Decompose the expression into component expressions Use typing rules to generate constraints on components and whole Recursively find substitution that solves typing judgment of first subcomponent Apply substitution to next subcomponent and find substitution solving it; compose with first, etc. Apply composition of all substitutions to original type variable to get answer

Type Inference - Example What type can we give to (fun x -> fun f -> f (f x)) Start with a type variable and then look at the way the term is constructed 2/25/2019

Type Inference - Example First approximate: Give type to full expr { }|- (fun x -> fun f -> f (f x)) :  Second approximate: use fun rule {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :  Remember constraint   (  ) 2/25/2019

Type Inference - Example Third approximate: use fun rule {f :  ; x : } |- f (f x) :  {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f(f x)) :    (  );   (  ) 2/25/2019

Type Inference - Example Fourth approximate: use app rule {f:; x:}|- f :    {f:; x:}|- f x :  {f :  ; x : } |- (f (f x)) :  {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :    (  );   (  ) 2/25/2019

Type Inference - Example Fifth approximate: use var rule, get constraint   , Solve with same Apply to next sub-proof {f:; x:}|- f :    {f:; x:}|- f x :  {f :  ; x : } |- (f (f x)) :  {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :    (  );   (  ) 2/25/2019

Type Inference - Example Current subst: {  } … {f:  ; x:}|- f x :  {f :  ; x : } |- (f (f x)) :  {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :    (  );   (  ) 2/25/2019

Type Inference - Example Current subst: {  } Use App Rule {f:; x:}|- f:z {f:; x:}|- x:z … {f:  ; x:}|- f x :  {f :  ; x : } |- (f (f x)) :  {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :    (  );   (  ) 2/25/2019

Type Inference - Example Current subst: {  } Var rule: Solve z  Unification {f:; x:}|- f:z {f:; x:}|- x:z … {f:  ; x:}|- f x :  {f :  ; x : } |- (f (f x)) :  {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :    (  );   (  ) 2/25/2019

Type Inference - Example Current subst: {z, } o {  } Var rule: Solve z  Unification {f:; x:}|- f:z {f:; x:}|- x:z … {f:  ; x:}|- f x :  {f :  ; x : } |- (f (f x)) :  {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :    (  );   (  ) 2/25/2019

Type Inference - Example Current subst: {z, , } Apply to next sub-proof (done)… {f:; x:}|- x:z … {f:  ; x:}|- f x :  {f :  ; x : } |- (f (f x)) :  {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :    (  );   (  ) 2/25/2019

Type Inference - Example Current subst: {z, , } Apply to next sub-proof (done)… {f:; x:}|- x: … {f:  ; x:}|- f x :  {f :  ; x : } |- (f (f x)) :  {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :    (  );   (  ) 2/25/2019

Type Inference - Example Current subst: {z, , } Var rule:  … {f:; x:}|- x: … {f:  ; x:}|- f x :  {f :  ; x : } |- (f (f x)) :  {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :    (  );   (  ) 2/25/2019

Type Inference - Example Current subst: {}o{z, , } Solves subproof; return one layer … {f:; x:}|- x: … {f:  ; x:}|- f x :  {f :  ; x : } |- (f (f x)) :  {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :    (  );   (  ) 2/25/2019

Type Inference - Example Current subst: {, z, , } Solves this subproof; return one layer … … {f:  ; x:}|- f x :  {f :  ; x : } |- (f (f x)) :  {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :    (  );   (  ) 2/25/2019

Type Inference - Example Current subst: {, z, , } Need to satisfy constraint   (  ), given subst, becomes:   (()  ) … {f :  ; x : } |- (f (f x)) :  {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :    (  );   (  ) 2/25/2019

Type Inference - Example Current subst: {  (()  ),, z, , } Solves subproof; return one layer … {f :  ; x : } |- (f (f x)) :  {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :    (  );   (  ) 2/25/2019

Type Inference - Example Current subst: {  (()  ),, z, , } Need to satisfy constraint   (  ) given subst:   (  (()  )) … {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :    (  ); 2/25/2019

Type Inference - Example Current subst: {  (  (()  )),   (()  ),, z, , } Solves subproof; return on layer {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f (f x)) :  2/25/2019

Type Inference - Example Current subst: {  (  (()  )),   (()  ),, z, , } Done:   (  (()  )) { } |- (fun x -> fun f -> f (f x)) :  2/25/2019

Type Inference Algorithm Let infer (, e, ) = s  is a typing environment (giving polymorphic types to expression variables) e is an expression  is a type (with type variables), s is a substitution of types for type variables Idea: s represents the constraints on type variables necessary for  |- e :  Should have s() |- e : s() valid Slight abuse of notation: s() is substitution s applied to all terms in the environment  = {x: …} (i.e., s()= {x: s () …}). 2/25/2019

Type Inference Algorithm (All in one!) 2/25/2019

Type Inference Algorithm infer (, exp, ) = Case exp of Var v --> return Unify{  freshInstance((v))} Replace all quantified type vars by fresh ones Const c --> return Unify{  freshInstance  } where  |- c :  by the constant rules fun x -> e --> Let ,  be fresh variables Let s = infer ({x: } + , e, ) Return Unify({s()  s(  )}) o s 2/25/2019

Inference Example (Repeat) Fifth approximate: use var rule, get constraint   , Solve with same Apply to next sub-proof {f:; x:} |- f :    2/25/2019

Inference Example (Repeat) What do we do here? {f:  .    ; x:} |- f :    And here? {f:  .    ; x:} |- f :    2/25/2019

Inference Example (Repeat) Third approximate: use fun rule … {x : } |- (fun f -> f (f x)) :  { } |- (fun x -> fun f -> f(f x)) :    (  ); 2/25/2019

Type Inference Algorithm (cont) Case exp of App (e1 e2) --> Let  be a fresh variable Let s1 = infer(, e1,   ) Let s2 = infer(s1(), e2, s1()) Return s2 o s1 2/25/2019

Type Inference - Example Fourth approximate: use app rule {f:; x:}|- f :    {f:; x:}|- f x :  {f :  ; x : } |- (f (f x)) :  2/25/2019

Type Inference Algorithm (cont) Case exp of If e1 then e2 else e3 --> Let s1 = infer(, e1, bool) Let s2 = infer(s1(), e2, s1()) Let s3 = infer(s2 o s1(),e2,s2 o s()) Return s3 o s2 o s1 2/25/2019

Type Inference Algorithm (cont) Case exp of let x = e1 in e2 --> Let  be a fresh variable Let s1 = infer(, e1, ) Let s2 = infer({x:GEN(s1(), s1())} + s1(), e2, s1()) Return s2 o s1 2/25/2019

Type Inference Algorithm (cont) Case exp of let rec x = e1 in e2 --> Let  be a fresh variable Let s1 = infer({x: } + , e1, ) Let s2 = infer({x:GEN(s1(), s1())} + s1(), e2, s1()) Return s2 o s1 2/25/2019

Type Inference Algorithm (cont) To infer a type, introduce type_of Let  be a fresh variable type_of (, e) = let  be a fresh variable in let s = infer (, e, ) in s () Need substitution! Need an algorithm for Unif! 2/25/2019

Reminder: Type Terms Terms made from constructors and variables 2/25/2019

Reminder: Type Terms Terms made from constructors and variables Constructors may be applied to arguments (other terms) to make new terms Variables and constructors with no arguments are base cases Constructors applied to different number of arguments (arity) considered different Substitution of terms for variables 2/25/2019

Substitution Implementation type term = Variable of string | Constructor of (string * term list) let rec subst var_name residue term = match term with Variable name -> if var_name = name then residue else term | Constructor (c, tys) -> let newt = List.map (subst var_name residue) tys in Constructor (c, newt);; 2/25/2019

(si) is the same as (ti), Unification Problem Given a set of pairs of terms (“equations”) {(s1, t1), (s2, t2), …, (sn, tn)} * (the unification problem) does there exist a substitution  (the unification solution) of terms for variables such that (si) is the same as (ti), for all i = 1, …, n? Think of these pairs as {(“s1= t1”), (“s2= t2”), …, (“sn= tn”)} This is the notation we’re going to use in the example 2/25/2019

Type Inference and type checking Pattern matching as in OCaml Uses for Unification Type Inference and type checking Pattern matching as in OCaml Can use a simplified version of algorithm Logic Programming - Prolog Simple parsing 2/25/2019

Unification Algorithm Let S = {(s1= t1), (s2= t2), …, (sn= tn)} be a unification problem. Unif(S) returns a substitution Case S = { }: Unif(S) = Identity function (i.e., no substitution) Case S = {(s = t)}  S’: Four main steps Delete, Decompose, Orient, Eliminate 2/25/2019

Unification Algorithm for S = {(s = t)}  S’ Delete: if s is t (s and t are the same term) then Unif(S) = Unif(S’) Decompose: if s is f (q1, … , qm) and t is f (r1, … , rm) (same f, same m!), then Unif(S) = Unif({(q1= r1), …, (qm=rm)}  S’) Orient: if t is x (a variable), and s is not a variable, Unif(S) = Unif ({(x = s)}  S’) 2/25/2019

Unification Algorithm for S = {(s = t)}  S’ Eliminate: if s is x (a variable), and x does not occur in t (use “occurs (x, t)” check!) then Let  = {x  t} Let  = Unif(  (S’) ) Unif(S) = {x  (t)} o  Be careful when composing substitutions: {x  a} o {y  b} = {y  ({x  a}(b))} o {x  a} if y not in a So we can also write the last step as Unif(S) =  o {x  t} 2/25/2019

Tricks for Efficient Unification Don’t return substitution, rather do it incrementally Make substitution be constant time Requires implementation of terms to use mutable structures (or possibly lazy structures) We won’t discuss these 2/25/2019

Example x,y,z variables, f,g constructors Unify {(f(x) = f(g(f(z),y))), (g(y,y) = x)} = ? 2/25/2019

Example x,y,z variables, f,g constructors Unify {(f(x) = f(g(f(z),y))), (g(y,y) = x)} = ? For example: X list = (Z list * Y) list (Y * Y) = X F : _ list G : _ * _ Z : int Y : int list X : int list * int list 2/25/2019

Example x,y,z variables, f,g constructors S = {(f(x) = f(g(f(z),y))), (g(y,y) = x)} is nonempty Unify {(f(x) = f(g(f(z),y))), (g(y,y) = x)} = ? 2/25/2019

Example x,y,z variables, f,g constructors Pick a pair: (g(y,y) = x) Unify {(f(x) = f(g(f(z),y))), (g(y,y) = x)} = ? 2/25/2019

Example x,y,z variables, f,g constructors Pick a pair: (g(y,y) = x) Orient: (x = g(y,y)) Unify {(f(x) = f(g(f(z),y))), (g(y,y) = x)} = Unify {(f(x) = f(g(f(z),y))), (x = g(y,y))} by Orient 2/25/2019

Example x,y,z variables, f,g constructors Unify {(f(x) = f(g(f(z),y))), (x = g(y,y))} = ? 2/25/2019

Example x,y,z variables, f,g constructors {(f(x) = f(g(f(z),y))), (x = g(y,y))} is non-empty Unify {(f(x) = f(g(f(z),y))), (x = g(y,y))} = ? 2/25/2019

Example x,y,z variables, f,g constructors Pick a pair: (x = g(y,y)) Unify {(f(x) = f(g(f(z),y))), (x = g(y,y))} = ? 2/25/2019

Example x,y,z variables, f,g constructors Pick a pair: (x = g(y,y)) Eliminate x with substitution {x g(y,y)} Check: x not in g(y,y) . Unify {(f(x) = f(g(f(z),y))), (x = g(y,y))} = ? 2/25/2019

Example x,y,z variables, f,g constructors Pick a pair: (x = g(y,y)) Eliminate x with substitution {x g(y,y)} Unify {(f(x) = f(g(f(z),y))), (x = g(y,y))} = Unify {(f(g(y,y)) = f(g(f(z),y)))} o {x g(y,y)} 2/25/2019

Example x,y,z variables, f,g constructors Unify {(f(g(y,y)) = f(g(f(z),y)))} o {x g(y,y)} = ? 2/25/2019

Example x,y,z variables, f,g constructors {(f(g(y,y)) = f(g(f(z),y)))} is non-empty Unify {(f(g(y,y)) = f(g(f(z),y)))} o {x g(y,y)} = ? 2/25/2019

Example x,y,z variables, f,g constructors Pick a pair: (f(g(y,y)) = f(g(f(z),y))) Unify {(f(g(y,y)) = f(g(f(z),y)))} o {x g(y,y)} = ? 2/25/2019

Example x,y,z variables, f,g constructors Pick a pair: (f(g(y,y)) = f(g(f(z),y))) Decompose:(f(g(y,y)) = f(g(f(z),y))) becomes {(g(y,y) = g(f(z),y))} Unify {(f(g(y,y)) = f(g(f(z),y)))} o {x g(y,y)} = Unify {(g(y,y) = g(f(z),y))} o {x g(y,y)} 2/25/2019

Example x,y,z variables, f,g constructors {(g(y,y) = g(f(z),y))} is non-empty Unify {(g(y,y) = g(f(z),y))} o {x g(y,y)} = ? 2/25/2019

Example x,y,z variables, f,g constructors Pick a pair: (g(y,y) = g(f(z),y)) Unify {(g(y,y) = g(f(z),y))} o {x g(y,y)} = ? 2/25/2019

Example x,y,z variables, f,g constructors Pick a pair: (f(g(y,y)) = f(g(f(z),y))) Decompose: (g(y,y)) = g(f(z),y)) becomes {(y = f(z)); (y = y)} Unify {(g(y,y) = g(f(z),y))} o {x g(y,y)} = Unify {(y = f(z)); (y = y)} o {x g(y,y)} 2/25/2019

Example x,y,z variables, f,g constructors Unify {(y = f(z)); (y = y)} o {x g(y,y)} = ? 2/25/2019

Example x,y,z variables, f,g constructors {(y = f(z)); (y = y)} o {x g(y,y)} is non-empty Unify {(y = f(z)); (y = y)} o {x g(y,y)} = ? 2/25/2019

Example x,y,z variables, f,g constructors Pick a pair: (y = f(z)) Unify {(y = f(z)); (y = y)} o {x g(y,y)} = ? 2/25/2019

Example x,y,z variables, f,g constructors Pick a pair: (y = f(z)) Eliminate y with {y  f(z)} Unify {(y = f(z)); (y = y)} o {x g(y,y)} = Unify {(f(z) = f(z))} o {y  f(z)} o {x g(y,y)}= Unify {(f(z) = f(z))} o {y  f(z); x g(f(z), f(z))} 2/25/2019

Example x,y,z variables, f,g constructors Unify {(f(z) = f(z))} o {y  f(z); x g(f(z), f(z))} = ? 2/25/2019

Example x,y,z variables, f,g constructors {(f(z) = f(z))} is non-empty Unify {(f(z) = f(z))} o {y  f(z); x g(f(z), f(z))} = ? 2/25/2019

Example x,y,z variables, f,g constructors Pick a pair: (f(z) = f(z)) Unify {(f(z) = f(z))} o {y  f(z); x g(f(z), f(z))} = ? 2/25/2019

Example x,y,z variables, f,g constructors Pick a pair: (f(z) = f(z)) Delete Unify {(f(z) = f(z))} o {y  f(z); x g(f(z), f(z))} = Unify {} o {y  f(z); x g(f(z), f(z))} 2/25/2019

Example x,y,z variables, f,g constructors Unify {} o {y  f(z); x g(f(z), f(z))} = ? 2/25/2019

{y  f(z); x g(f(z), f(z))} Example x,y,z variables, f,g constructors {} is empty Unify {} = identity function Unify {} o {y  f(z); x g(f(z), f(z))} = {y  f(z); x g(f(z), f(z))} F : _ list G : _ * _ Z : int Y : int list X : int list * int list 2/25/2019

Example Unify {(f(x) = f(g(f(z),y))), (g(y,y) = x)} = {y  f(z); x g(f(z), f(z))} f( x ) = f(g(f(z), y ))  f(g(f(z), f(z))) = f(g(f(z), f(z))) . g( y , y ) = x .  g(f(z),f(z)) = g(f(z), f(z)) . 2/25/2019

Example Unify {(f(x) = f(g(f(z),y))), (g(y,y) = x)} = {y  f(z); x g(f(z), f(z))} y  int list, x (int list * int list) f( x ) = f(g(f(z), y ))  f(g(f(z), f(z))) = f(g(f(z), f(z))) . (int list * int list) list = (int list * int list) list g( y , y ) = x .  g(f(z),f(z)) = g(f(z), f(z)) . (int list * int list) = (int list * int list) 2/25/2019

Example of Failure: Decompose Unify{(f(x,g(y)) = f(h(y),x))} Decompose: (f(x,g(y)) = f(h(y),x)) = Unify {(x = h(y)), (g(y) = x)} Orient: (g(y) = x) = Unify {(x = h(y)), (x = g(y))} Eliminate: (x = h(y)) = Unify {(h(y) = g(y))} o {x  h(y)} No rule to apply! Decompose fails! 2/25/2019

Example of Failure: Occurs Check Unify{(f(x,g(x)) = f(h(x),x))} Decompose: (f(x,g(x)) = f(h(x),x)) = Unify {(x = h(x)), (g(x) = x)} Orient: (g(y) = x) = Unify {(x = h(x)), (x = g(x))} No rules apply. 2/25/2019

Course Objectives New programming paradigm Functional programming Environments and Closures Patterns of Recursion Continuation Passing Style Phases of an interpreter / compiler Lexing and parsing Type systems Interpretation Programming Language Semantics Lambda Calculus Operational Semantics Axiomatic Semantics 2/25/2019

Major Phases of a Compiler Analyze + Transform Source Program Lex Optimized IR Assembler Tokens Instruction Selection Parse Relocatable Object Code Abstract Syntax Unoptimized Machine-Specific Assembly Language Linker Instruction Optimize Machine Code Semantic Analysis Optimized Machine-Specific Assembly Language Environment Translate Emit code Intermediate Representation Assembly Language Modified from “Modern Compiler Implementation in ML”, by Andrew Appel

Programming Languages & Compilers Three Main Topics of the Course I New Programming Paradigm II Language Translation III Language Semantics Add roman numerals, make each a different color 2/25/2019

Programming Languages & Compilers Order of Evaluation I New Programming Paradigm II Language Translation III Language Semantics Specification to Implementation Add roman numerals, make each a different color 2/25/2019

Programming Languages & Compilers   I : New Programming Paradigm   Functional Programming Environments and Closures Continuation Passing Style Patterns of Recursion 2/25/2019

Programming Languages & Compilers  II : Language Translation Lexing and Parsing Type Systems Interpretation 2/25/2019

Programming Languages & Compilers III : Language Semantics Operational Semantics Lambda Calculus Axiomatic Semantics 2/25/2019

Meta-discourse Language Syntax and Semantics Syntax - Regular Expressions, DFSAs and NDFSAs - Grammars Semantics - Natural Semantics - Transition Semantics 2/25/2019

Language Syntax Syntax is the description of which strings of symbols are meaningful expressions in a language It takes more than syntax to understand a language; need meaning (semantics) too Syntax is the entry point 2/25/2019

Syntax of English Language Pattern 1 Pattern 2 2/25/2019

Elements of Syntax Character set – previously always ASCII, now often 64 character sets Keywords – usually reserved Special constants – cannot be assigned to Identifiers – can be assigned to Operator symbols Delimiters (parenthesis, braces, brackets) Blanks (aka white space) 2/25/2019

Elements of Syntax Expressions Type expressions if ... then begin ... ; ... end else begin ... ; ... end Type expressions typexpr1 ->  typexpr2 Declarations (in functional languages) let pattern1 =  expr1 in  expr Statements (in imperative languages) a = b + c Subprograms let pattern1 =  let rec inner = … in  expr 2/25/2019

Classes (for object-oriented languages) Elements of Syntax Modules Interfaces Classes (for object-oriented languages) 2/25/2019

Lexing and Parsing Converting strings to abstract syntax trees done in two phases Lexing: Converting string (or streams of characters) into lists (or streams) of tokens (the “words” of the language) Specification Technique: Regular Expressions Parsing: Convert a list of tokens into an abstract syntax tree Specification Technique: BNF Grammars 2/25/2019

Formal Language Descriptions Regular expressions, regular grammars, finite state automata Context-free grammars, BNF grammars, syntax diagrams Whole family more of grammars and automata – covered in automata theory 2/25/2019

Grammars Grammars are formal descriptions of which strings over a given character set are in a particular language Language designers write grammar Language implementers use grammar to know what programs to accept Language users use grammar to know how to write legitimate programs 2/25/2019