Mini Erlang

Post on 09-Feb-2016

45 views 1 download

description

Christian Schulte cschulte@kth.se Software and Computer Systems School of Information and Communication Technology KTH – Royal Institute of Technology Stockholm, Sweden. Mini Erlang. ID1218 Lecture 032009-11-02. Reminder & Overview. Roadmap: MiniErlang. What to compute with - PowerPoint PPT Presentation

Transcript of Mini Erlang

MINI ERLANG

ID1218 Lecture 03 2009-11-02

Christian Schultecschulte@kth.se

Software and Computer SystemsSchool of Information and Communication

TechnologyKTH – Royal Institute of Technology

Stockholm, Sweden

Reminder & Overview

L03, 2009-11-02ID1218, Christian Schulte

2

Roadmap: MiniErlang What to compute with

MiniErlang expressions and programs What are the results

MiniErlang Values What are the instructions

for compound value construction and function call

How are functions called parameters are passed by substitution considers only matching clauses clauses have patterns (we ignore guards)L03, 2009-11-02ID1218, Christian Schulte

3

Evaluating Values

L03, 2009-11-02

4

ID1218, Christian Schulte

MiniErlang Values A MiniErlang value is an integer or a list

other values are similar In short notation

V := int | [] | [ V1 | V2 ] known as BNF notation: discussed later so: values are referred to by V (possibly

subscripted) can be: any integer, the empty list, a cons

consisting of two values V1 and V2

L03, 2009-11-02ID1218, Christian Schulte

5

MiniErlang Expressions A MiniErlang expression is a value, a

variable, or a function callE := int | [] | [ E1 |

E2 ] | X | F(E1,…, En)

expressions referred to by E variables referred to by X function names referred to by F

L03, 2009-11-02ID1218, Christian Schulte

6

MiniErlang Machine MiniErlang machine

Es ; Vs → Es’ ; Vs’transforms a pair (separated by ;) of

expression stack Es and value stack Vs

into a new pair of expression stack Es’ and value stack Vs’

Initial configuration: expression we want to evaluate on expression stack

Final configuration: single value as result on value stack

L03, 2009-11-02ID1218, Christian Schulte

7

Stacks We write stacks as

X1 … Xn Xr top of stack X1 n-th element Xn more elements Xr empty stack

Pushing X to stack Xr: X Xr Popping X from stack X Xr: Xr

L03, 2009-11-02ID1218, Christian Schulte

8

MiniErlang Execution Idea Simple case: an integer evaluates to

itself the result of an integer expression…

…is an integer value MiniErlang machine

i Er ; Vs → Er ; i Vs if the expression stack has the integer i as top

of stack… execution yields: the expression i is popped

from the expression stack and pushed on to the value stack

same for empty list L03, 2009-11-02ID1218, Christian Schulte

9

MiniErlang Instruction Idea How to evaluate a list expression [ E1 |

E2 ] first evaluate E1 , to a value V1, … then evaluate E2 , to a value V2, … then construct a new value [ V1 | V2 ]

Use an instruction that says: build a list makes the assumption that values needed are

on the value stack execution will pop two values, push a new list

value when [ E1 | E2 ] is executed, E1 and E2 and the

instruction CONS are pushed on the expression stack

L03, 2009-11-02ID1218, Christian Schulte

10

Evaluating a List Expression Evaluate a list expression

[E1|E2]Er ; Vs→ E1E2CONSEr ; Vs

Execute a CONS instructionCONSEr ; V1V2Vs

→ Er ; [V2|V1]Vs

L03, 2009-11-02ID1218, Christian Schulte

11

Example We want to evaluate the expression[1|[]] (that is, just the list [1])

Start configuration of our machine [1|[]] ;

expression stack: [1|[]] empty value stack:

What should be the end configuration: ; [1|[]]

empty expression stack: result on value stack: [1|[]]

L03, 2009-11-02ID1218, Christian Schulte

12

Let’s Do It![1|[]] ;

→ …

L03, 2009-11-02ID1218, Christian Schulte

13

[E1|E2]Er ; Vs→ E1E2CONSEr ; Vs

Let’s Do It![1|[]] ;

→ 1 []CONS ; → …

L03, 2009-11-02ID1218, Christian Schulte

14

i Er ; Vs → Er ; i Vs

Let’s Do It![1|[]] ;

→ 1 []CONS ; → []CONS ; 1→ …

L03, 2009-11-02ID1218, Christian Schulte

15

i Er ; Vs → Er ; i Vs

Let’s Do It![1|[]] ;

→ 1 []CONS ; → []CONS ; 1→ CONS ; []1→ …

L03, 2009-11-02ID1218, Christian Schulte

16

CONSEr ; V1V2Vs→ Er ; [V2|V1]Vs

Let’s Do It![1|[]] ;

→ 1 []CONS ; → []CONS ; 1→ CONS ; []1→ ; [1|[]]

L03, 2009-11-02ID1218, Christian Schulte

17

Summary MiniErlang

values expressions

MiniErlang machine operates on expression and value stack evaluates topmost expression on expr stack executes topmost instruction on expr stack

Start state: single expr on expr stack Final state: single value on value stack

L03, 2009-11-02ID1218, Christian Schulte

18

Executing Functions

L03, 2009-11-02

19

ID1218, Christian Schulte

Roadmap How to evaluate arguments before

executing function… shuffle arguments on expression stack have a call instruction executing call instruction picks values from

value stack How to find the right clause

explain matching How to pass parameters

replace variables by substitutionL03, 2009-11-02ID1218, Christian Schulte

20

Evaluating Function Call Evaluate call expression

F(E1, …, En)Er ; Vs→ E1…EnCALL(F/n)Er ; Vs

L03, 2009-11-02ID1218, Christian Schulte

21

MiniErlang Patterns Somehow: values + variables Or, crisply:

P := int | [] | [ P1 | P2 ] | X

L03, 2009-11-02ID1218, Christian Schulte

22

Pattern Matching Pattern matching takes a pattern P and a

value V and returns true, iff the value matches the pattern

If V matches P, a substitution is returned for each variable in the pattern P a matching

value Substitutions are applied to expressions

replacing variables by the respective values Details come later, just the big picture

nowL03, 2009-11-02ID1218, Christian Schulte

23

Pattern Matching Examples [X|Xr] matches [2|[1|[]]]

substitution { X 2, Xr [1|[]]}

[X|[X|Xr]] matches [2|[2|[]]] substitution { X 2, Xr []}

[X|[X|Xr]] does not match [2|[1|[]]]

no substitution, of course

L03, 2009-11-02ID1218, Christian Schulte

24

Substitution Examples Application of

substitution { X 2, Xr [1|[]]} to expression X+len(Xr) yields yields 2+len([1|[]])

We refer to substitutions by s application to expression E by s(E)

L03, 2009-11-02ID1218, Christian Schulte

25

Reminder: Call Expression Evaluate call expression

F(E1, …, En)Er ; Vs→ E1…EnCALL(F/n)Er ; Vs

L03, 2009-11-02ID1218, Christian Schulte

26

Executing CALLCALL(F/n)Er ; V1…VnVs

→ s(E)Er ; Vs

F(P1, …, Pn) -> E is the first clause of F/n such that

the pattern [P1, …, Pn] matches……the list value [Vn, …, V1]

with substitution s

L03, 2009-11-02ID1218, Christian Schulte

27

Example Assume we want to evaluate

f([1|[]])where f/1 is defined by the single clause

f([X|Xr]) -> [X|f(Xr)].

L03, 2009-11-02ID1218, Christian Schulte

28

Let’s Do It!f([1|[]]) ;

→ [1|[]]CALL(f/1) ; → 1[]CONSCALL(f/1) ; → []CONSCALL(f/1) ; 1→ CONSCALL(f/1) ; []1→ CALL(f/1) ; [1|[]]→ [1|f([])] ; → …

L03, 2009-11-02ID1218, Christian Schulte

29

What Do We Ignore? Runtime errors

what if no clause matches Simplistic values No un-nesting No guards

simple: just check guards on values No case and if expressions

rewrite to additional functions

L03, 2009-11-02ID1218, Christian Schulte

30

An Important Fact… The expressions on the expression stack

must have an essential property…

hmmm… Look to the example again!

L03, 2009-11-02ID1218, Christian Schulte

31

Last Call Optimization MiniErlang has last call optimization

(LCO) built in remember what to do next on stack do not remember where to return to

What effect for recursive programs?

L03, 2009-11-02ID1218, Christian Schulte

32

MiniErlang Full Picture

L03, 2009-11-02ID1218, Christian Schulte

33

Making MiniErlang More Realistic Substitution replaces variables in clause

bodies by values values will be deconstructed and reconstructed

over and over again Add single rule that optimizes values

an expression that is a value can be directly moved from the expression to the value stack

subsumes the rules for integers and the empty list

L03, 2009-11-02ID1218, Christian Schulte

34

MiniErlang: Values, Expressions, Instructions MiniErlang values

V := int | [] | [ V1 | V2 ] MiniErlang expressions

E := int | [] | [ E1 | E2 ] | X | F(E1,…, En)

where X stands for a variable MiniErlang instructions

CONS, CALL

L03, 2009-11-02ID1218, Christian Schulte

35

MiniErlang: Expressions Evaluate values

V Er ; Vs → Er ; V Vs provided V is a value

Evaluate list expression[E1|E2]Er ; Vs→ E1E2CONSEr ; Vs

Evaluate function callF(E1, …, En)Er ; Vs→ E1…EnCALL(F/n)Er ; Vs

L03, 2009-11-02ID1218, Christian Schulte

36

MiniErlang: Instructions CONS instruction

CONSEr ; V1V2Vs→ Er ; [V2|V1]Vs

CALL instructionCALL(F/n)Er ; V1…VnVs

→ s(E)Er ; Vs F(P1, …, Pn) -> E first clause of F/n such that [P1, …, Pn] matches [Vn, …,V1] with substitution s

L03, 2009-11-02ID1218, Christian Schulte

37

MiniErlang Pattern Matching Patterns

P := int | [] | [ P1 | P2 ] | X match(P,V)

s:=try(P,V)if errors or XV1, XV2 s withV1≠V2 then no else s

wheretry(i,i) = try([],[]) = try([P1|P2],[V1|V2])= try(P1,V1)try(P2,V2)try(X,V) = {XV}otherwise = {error}

L03, 2009-11-02ID1218, Christian Schulte

38

Pattern Matching Example

match([A,A|[B|B]],[1,1,[]]) Uniform list notation

match([A|[A|[B|B]]],[1|[1|[[]|[]]]])

Evaluate trytry([A|[A|[B|B]]],[1|[1|[[]|[]]]])

L03, 2009-11-02ID1218, Christian Schulte

39

Evaluating trytry([A|[A|[B|B]]],[1|[1|[[]|[]]]]) =

try(A,1) try([A|[B|B]],[1|[[]|[]]]) ={A1} try(A,1) try([B|B],[[]|[]]) = {A1} {A1} try(B,[]) try(B,[]) ={A1} {B[]} {B[]} ={A1, B[]}

Matches with substitution: {A1, B[]}L03, 2009-11-02ID1218, Christian Schulte

40

Pattern Matching Example

match([A,A|[B|B]],[1,2,[]]) Uniform list notation

match([A|[A|[B|B]]],[1|[2|[[]|[]]]])

Evaluate trytry([A|[A|[B|B]]],[1|[2|[[]|[]]]])

L03, 2009-11-02ID1218, Christian Schulte

41

Evaluating trytry([A|[A|[B|B]]],[1|[2|[[]|[]]]]) =

try(A,1) try([A|[B|B]],[2|[[]|[]]]) ={A1} try(A,2) try([B|B],[[]|[]]) = {A1} {A2} try(B,[]) try(B,[]) ={A1, A2} {B[]} {B[]} ={A1, A2, B[]}

Does not match! L03, 2009-11-02ID1218, Christian Schulte

42

Substitution Defined over structure of expressions

s(i) = is([]) = []s([E1|E2]) = [s(E1)|s(E2)]s(F(E1, …, En)) = F(s(E1), …, s(En))s(X) = if XV s then V else X

L03, 2009-11-02ID1218, Christian Schulte

43

Matching and Substitutions If P matches V with substitution s

s=match(P,V)then

s(P)=V

L03, 2009-11-02ID1218, Christian Schulte

44

Substitution Assume s= {A1, B[]} s([A|[A|[B|B]]]) =

[s(A)|s([A|[B|B]])] =[1|[s(A)|s([B|B])]] =[1|[1|[s(B)|s(B)]]] =[1|[1|[[]|[]]]]

L03, 2009-11-02ID1218, Christian Schulte

45

Extending MiniErlang Built-in expressions, for example…

evaluate additionE1+E2Er ; Vs → E1E2ADDEr ; Vs

execute ADD instructionADDEr ; V1V2Vs → Er ; V2+V1Vs

Comma operator sequence of expressions replace substitution by environment lookup value for variable from environment

L03, 2009-11-02ID1218, Christian Schulte

46

What Did We Actually Do? Blueprint of MiniErlang implementation

operational semantics capable of explaining how calls are handelled stack machine

A real implementation would statically replace (compilation) call and

list construction to the respective instructions would replace substitution by environments

(registers) …of a stack machine is the JVM!

L03, 2009-11-02ID1218, Christian Schulte

47

What Can We Answer Faithful model for runtime

measure: number of function calls all remaining operations are constant wrt

function calls

Faithful model for memory MiniErlang does not use heap memory: value

stack stack space: number of entries on either stack space: size of entries on either stack

L03, 2009-11-02ID1218, Christian Schulte

48

Homework Hand execute app/2 in MiniErlang! Try all examples

L03, 2009-11-02ID1218, Christian Schulte

49