icfp 2011 "subtyping delimited continuations" slides

27
Subtyping delimited continuations Marek Materzok, Dariusz Biernacki Introduction Evaluation contexts Delimited control Shift 0 and reset 0 Type system Typing shift/reset Typing shift 0 /reset 0 CPS translation Untyped translation Type-directed translation Conclusions Subtyping delimited continuations Marek Materzok, Dariusz Biernacki Sep 19, 2011

Upload: marek-materzok

Post on 01-Dec-2014

378 views

Category:

Business


0 download

DESCRIPTION

Slides from my talk on ICFP 2011.

TRANSCRIPT

Page 1: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Subtyping delimited continuations

Marek Materzok, Dariusz BiernackiSep 19, 2011

Page 2: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Evaluation contexts

Evaluation context is a ,,term with a hole”:

if sq(2) = 4 then 1 else 0

I green part – evaluation context

Page 3: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Partial evaluation contexts

One can consider partial contexts:

if sq(2) = 4 then 1 else 0

I green part – evaluation context

I yellow part – partial evaluation context

Page 4: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Contexts can have types

if sq(2) = 4 then 1 else 0

I green part – int→ ⊥I yellow part – int→ bool

Page 5: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Delimited control operators

They allow to reify partial contexts as functions.Delimited control has lots of applications, includingasynchronous I/O, Web programming, mobile code,linguistics, and so on.

Page 6: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Delimited control operators

Delimited control operators usually come in pairs:

I the delimiter, which marks where a context begins,

I capture operator, which reifies the context up to thenearest delimiter.

Example:

1 + 〈2 + Sf.f(f 3) 〉

Page 7: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Delimited control operators shift/reset

The most known and well explored delimited controloperators are shift/reset. The shift operator captures thecontext up to (and including) the nearest delimiter andresumes execution in a empty context.

〈K[Sf.e]〉 〈e{f/λx.〈K[x]〉}〉〈v〉 v

They have many nice and desirable properties, including asimple CPS translation and a type system guaranteeingtermination.However, they feel very restrictive.

Page 8: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Delimited control operators shift0/reset0

A variant of shift/reset operators. The difference is thatwhen shift0 executes, the execution resumes in thesurrounding context. This allows the shift0 operator to,,reach” beyond the nearest surrounding delimiter.

1 + 〈2 + 〈3 + S0f.S0g.f (g (g 4)) 〉 〉

The term above evaluates to 12. (f gets theyellow context , g gets the cyan one .)

Formally:

〈K[S0f.e]〉 e{f/λx.〈K[x]〉}

Shift kept the enclosing delimiter:

〈K[Sf.e]〉 〈e{f/λx.〈K[x]〉}〉

Page 9: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Delimited control operators shift0/reset0

A variant of shift/reset operators. The difference is thatwhen shift0 executes, the execution resumes in thesurrounding context. This allows the shift0 operator to,,reach” beyond the nearest surrounding delimiter.

1 + 〈2 + 〈3 + S0f.S0g.f (g (g 4)) 〉 〉

The term above evaluates to 12. (f gets theyellow context , g gets the cyan one .)

Formally:

〈K[S0f.e]〉 e{f/λx.〈K[x]〉}

Shift kept the enclosing delimiter:

〈K[Sf.e]〉 〈e{f/λx.〈K[x]〉}〉

Page 10: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Delimited control operators shift0/reset0

But shift0/reset0 seemed not to be as nice as shift/reset, sothey didn’t get much interest.It turned out that they are in a sense more fundamental thanshift/reset; the type system and CPS translation forshift/reset are a fragment of our type system and CPStranslation, and can be derived from them.

Page 11: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Example program – partition

The following function partitions a list of numbers into threeparts with all numbers less than, equal to, and greater thanthe given number. The relative order within the partitionsremains the same.

let partition a l =

let part l = case l {

Nil -> []

| Cons(h,t) ->

if h > a

then Cons(h, part t)

else if h == a

then @f. Cons(h, <f (part t)>)

else @f g. Cons(h, <g <f (part t)>>)

} in <<part l>>

Page 12: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Typing shift/reset

For shift/reset, we only need to maintain type informationabout the top context. This idea gives rise to the typesystem of Danvy and Filinski, with following judgements:

Γ; γ ` e : α; δ

Which mean that the expression e, when evaluated in acontext of type α→ γ, gives an answer of type δ.The function types are also annotated:

β; γ → α; δ

This type denotes a function which, when given a value oftype β and evaluated in a context of type α→ γ, gives ananswer of type δ.

Page 13: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Typing shift/reset

The subexpression of reset is run with an empty context,which has type α→ α. Requiring the final answer type γ ofthe subexpression to be equal to the surrounding context’sargument type enforces the composing requirement:

Γ;α ` e : α; γ

Γ; δ ` 〈e〉 : γ; δreset

The subexpression of shift is also run with an empty context(of type β → β). The enclosing context is captured, which isreflected in the type of f below:

Γ, f : (α; ρ→ γ; ρ);β ` e : β; δ

Γ; γ ` Sf.e : α; δshift

Page 14: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Anatomy of a typed context stack (shift/reset)

For shift/reset in the type system of Danvy and Filinski, forthe term typed:

; γ ` e : α; δ

The context stack looks like this:

βn−1 → βn

βn−2 → βn−1

. . .

β1 → β2

δ → β1

α→ γ context

metacontext

Page 15: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Typing shift0/reset0

Because the shift0 operator can access arbitrary contexts onthe stack, we need to maintain information about morecontexts than just the topmost one. Thus we introduceeffect annotations:

σ ::= ε | [α σ] α σ

We have typing judgements of the form:

Γ ` e : α σ

The meaning of e : β1 [α1 σ1] . . . βn [αn σn] β is that e givesa final answer of type β when evaluated in a context stackwith types βi

σi−→ αi. (Function types are also annotated.)

Page 16: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Typing shift0/reset0

Expressions with types annotated with ε (which we willomit) are pure (don’t have control effects). Thus thefollowing rules for variables and lambda abstractions:

Γ, x : α ` x : αvar

Γ, x : α ` e : β σ

Γ ` λx.e : ασ−→ β

abs

Shift0 and reset0 only eliminate or introduce a context:

Γ, f : ασ′−→ β ` e : γ σ

Γ ` S0f.e : α [β σ′] γ σshift0

Γ ` e : β [β] α σ

Γ ` 〈e〉 : α σreset0

But how to put a variable inside a reset0?

Page 17: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Typing shift0/reset0 – with subtyping!

We introduce subtyping on effect annotations. This allowsto ,,forget” about some contexts we know about, but onlywhen the context we forget can be composed with the onesbelow. This is formalized by the following rule:

α σ ≤ α′ σ′

ε ≤ [α σ] α′ σ′

We also have following structural rules:

ε ≤ εα2 σ2 ≤ α1 σ1 α′1 σ

′1 ≤ α′2 σ′2

[α1 σ1] α′1 σ′1 ≤ [α2 σ2] α

′2 σ′2

The notation α1 σ1 ≤ α2 σ2 is equivalent to α1 ≤ α2 andα2 ≤ σ2.

Page 18: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Success!

We can type all terms typable with Danvy and Filinski’s typesystem.And we can type many more, including partition!

a : int ` part : list(int) [list(int)] list(int) [list(int)] list(int)

The contexts on the stack are of type list(int)→ list(int).

Page 19: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Anatomy of a typed context stack (shift0/reset0)

For our type system, for the term typed:

` e : β1 [α1 σ1] . . . βn [αn σn] β

βn+m+1 → αn+m+1

βn+mσn+m−−−→ αn+m

. . .

βn+1σn+1−−−→ αn+1

βnσn−→ αn

. . .

β1σ1−→ α1

pure context

trail

contexts

metacontext

β ≤ βn+1 [αn+1 σn+1] . . . βn+m [αn+m σn+m] βn+m+1

Page 20: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

What properties does our type system have?

I Strong type soundness – progress and type preservation.

I Termination.

I Decidable type inference.

Page 21: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Standard CPS translation for shift/reset

JxK = λk.k x

Jλx.eK = λk.k (λx.JeK)Je1 e2K = λk.Je1K (λf.Je2K (λx.f x k))

J〈e〉K = λk.k (JeK (λx.x))

JSf.eK = λk.JeK{f/λx.λk′.k(k′x)} (λx.x)

Only one continuation available – this translation isunsuitable for shift0 and reset0.

Page 22: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

CPS translation for shift0/reset0

Use more lambdas to bind more of the context stack!

JxK =λk.k x

Jλx.eK =λk.k (λx.JeK)Je1e2K =λk.Je1K(λf.Je2K(λx.f x k))

J〈e〉K =JeK(λx.λk.k x)

JS0f.eK =λf.JeK

This translation preserves the semantics of the shift0/reset0control operators.

However, it doesn’t preserve types. The translation of thefollowing term (which is well-typed in our type system)cannot be given a type in the simply typed lambda calculus:

λx.S0f.f 〈f x〉

Page 23: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

CPS translation for shift0/reset0

Use more lambdas to bind more of the context stack!

JxK =λk.k x

Jλx.eK =λk.k (λx.JeK)Je1e2K =λk.Je1K(λf.Je2K(λx.f x k))

J〈e〉K =JeK(λx.λk.k x)

JS0f.eK =λf.JeK

This translation preserves the semantics of the shift0/reset0control operators.However, it doesn’t preserve types. The translation of thefollowing term (which is well-typed in our type system)cannot be given a type in the simply typed lambda calculus:

λx.S0f.f 〈f x〉

Page 24: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Type-directed CPS translation

The solution is to make the translation directed by types.We want to have the property that if

Γ ` e : β1 [α1 σ1] . . . βn [αn σn] β

Then

JΓK ` JeK : (Jβ1K→ Jα1σ1K)→ · · · → (JβnK→ JαnσnK)→ JβK

Subtyping will be translated as coercion functions, with thefollowing property:

` Jα ≤ α′K : JαK→ Jα′K` Jα σ ≤ α′ σ′K : Jα σK→ Jα′ σ′K

Page 25: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Type-directed CPS translation

We translate types and annotated types as follows:

JαK =α

Jτ1σ−→ τ2K =Jτ1K→ Jτ2 σK

Jτ εK =JτKJτ [τ1 σ1] τ2 σ2K =(JτK→ Jτ1 σ1K)→ Jτ2 σ2K

Page 26: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Type-directed CPS translation

JxKvar =x

JeKsub(D,τ σ≤τ ′ σ′) =Jτ σ ≤ τ ′ σ′KJeKDJλx.eKabs(D) =λx.JeKD

JfeKapp-pure(D1,D2) =JfKD1JeKD2

JfeKapp(D1,D2) =λk.JfKD1(λf.JeKD2(λe.fek))

JS0f.eKshift0(D) =λf.JeKDJ〈e〉Kreset0(D) =JeKD(λx.x)

Fun fact: from this definition one can reconstruct thestandard CPS translation for shift and reset.

Page 27: ICFP 2011 "Subtyping Delimited Continuations" slides

Subtypingdelimited

continuations

Marek Materzok,Dariusz Biernacki

Introduction

Evaluation contexts

Delimited control

Shift0 and reset0

Type system

Typing shift/reset

Typing shift0/reset0

CPS translation

Untyped translation

Type-directedtranslation

Conclusions

Conclusions

We have introduced a type system for shift0/reset0 operatorswith strong type soundness and termination, and two newCPS translations for these operators. These results provide asolid foundation for further research and for implementingthese operators in programming languages.Thank you for your attention!