Processing math: 100%

Monday, July 09, 2012

Closure Conversion, with Polymorphism

In the last post, we discussed closure conversion applied to the Simply-Typed Lambda Calculus (STLC), perhaps the simplest language with lexical scoping and first-class functions. Now we turn to closure conversion applied to a richer language, one that includes generics.

The Polymorphic Lambda Calculus (aka. System F)

System F extends the STLC with first-class generics: the Λ expression and an expression for instantiating a generic. typesT::=αα.Texpressionse::=Λα.ee[T]valuesv::=Λα.eframesF::=[T]

The expression Λα.e creates a generic expression parametrized by the type variable α. The type of such a generic expression is α.T, where T is the type of the inner expression e. The expression e[T] instantiates the generic e, replacing its type parameter with type T.

The typing rules for System F are those of the STLC plus the following: Γ,αe:TΓΛα.e:α.TΓe:α.T2Γe[T1]:[α:=T1]T2

Also, there is one new reduction rule: (Λα.e)[T][α:=T]e

Updating the Intermediate Language: IL2

With the introduction of generics, we not only worry about lexically scoped term variables but we are also concerned with lexically scoped type variables. So the δ and γ functions must be updated to include type variables and their bindings. Furthermore, the closure operator must be extended with type arguments to bind the new type variables. expressionse::=δ¯y:T,¯α,x:T.eγx:T,¯y=v,α=T.ee{¯e,¯T}

The following are the reduction rules for the functions of IL2. (δ¯y:T,¯α,x:T.e){¯e,¯T}γx:T,¯y=v,α=T.e(γx:T,¯y=v,α=T.e)v[¯α:=T]{¯y:=v}{x:=v}e

Next we turn to the Λ. We'll need to translate Λ to something in IL2, and in the spirit of closure conversion, it should be something that does not support lexical scoping. Inspired by the δ and γ functions, we create analogous things for generics. expressionse::=Φ¯y:T,¯α,α.eΥα,¯y=v,α=T.e

The following are the reduction rules for the generics of IL2. (Φ¯y:T,¯α,α.e){¯e,¯T}Υα,¯y=v,α=T.e(Υα,¯y=v,α=T.e)[T][¯α:=T]{¯y:=v}[α:=T]e

Closure conversion for System F

With IL2 in place, the definition of closure conversion for System F is relatively straightforward. The case for λ computes the free type variables (FTV) and includes them in the δ function. The new case for Λ is analogous to the case for λ.

ClosureConversion(e)=let(e,¯f)=C(e)in(globals¯fine)

C(x)=(x,ϵ)C(c)=(c,ϵ)C(op(¯e))=let(¯e,¯f)=¯C(¯e)in(op(¯e),¯f)C(λx:T.e)=let(e,¯f)=C(e)¯y:T=FV(e){x}¯α=FTV(e)g=freshname()in(g{¯y,¯α},(g=(δ¯y:T,α,x:T.e),¯f))C(e1e2)=let(e1,¯f1)=C(e1)(e2,¯f2)=C(e2)in(e1e2,(¯f1,¯f2))C(Λα.e)=let(e,¯f)=C(e)¯y:T=FV(e)¯α=FTV(e){α}g=freshname()in(g{¯y,¯α},(g=(Φ¯y:T,α,α.e),¯f))C(e[T])=let(e,¯f)=C(e)in(e[T],¯f)

No comments:

Post a Comment