backstage java - making a difference in metaprogrammingzpalmer/publications/bsj... · 2016. 1....

187
Backstage Java Making a Difference in Metaprogramming Zachary Palmer and Scott F. Smith The Johns Hopkins University October 27, 2011

Upload: others

Post on 19-Sep-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Backstage JavaMaking a Difference in Metaprogramming

Zachary Palmer and Scott F. Smith

The Johns Hopkins University

October 27, 2011

Page 2: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based Metaprogramming

• Introduction to Metaprogramming

• Compile-Time Metaprogramming in Java

• Traditional Metaprogramming Model

• Difference-Based Metaprogramming Model

Page 3: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based Metaprogramming

• Introduction to Metaprogramming

• Compile-Time Metaprogramming in Java

• Traditional Metaprogramming Model

• Difference-Based Metaprogramming Model

Page 4: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based Metaprogramming

• Introduction to Metaprogramming

• Compile-Time Metaprogramming in Java

• Traditional Metaprogramming Model

• Difference-Based Metaprogramming Model

Page 5: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based Metaprogramming

• Introduction to Metaprogramming

• Compile-Time Metaprogramming in Java

• Traditional Metaprogramming Model

• Difference-Based Metaprogramming Model

Page 6: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

What is metaprogramming?

Page 7: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Metaprogramming• Programs input data and output data.

Input ρ Output

• Metaprograms input programs (or programfragments) and output the same.

ρ φ ρ′

Page 8: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Metaprogramming• Programs input data and output data.

Input ρ Output

• Metaprograms input programs (or programfragments) and output the same.

ρ φ ρ′

Page 9: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Examples of Metaprogramming

• C Macros

• C++ Templates

• LISP Macros

• Template Haskell

• MetaOCaml

• Stratego

• Groovy

• etc. etc.

Page 10: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Classifying Metaprogramming

• When is it run?• Compile-time (static)• Runtime (dynamic)

• How are programs represented?• Textually (strings)• Lexically (tokens)• Structurally (ASTs)• Semantically (various structures)

• Which language is used to metaprogram?• Same language (homogenous)• Different language (heterogeneous)

from Accomplishments and Research Challenges in Metaprogramming (Tim Sheard)

Page 11: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Classifying Metaprogramming

• When is it run?• Compile-time (static)• Runtime (dynamic)

• How are programs represented?• Textually (strings)• Lexically (tokens)• Structurally (ASTs)• Semantically (various structures)

• Which language is used to metaprogram?• Same language (homogenous)• Different language (heterogeneous)

from Accomplishments and Research Challenges in Metaprogramming (Tim Sheard)

Page 12: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Haskell Example

$(

let mkExp n v =

if n == 0

then [| 1 |]

else [| $(v) * $(mkExp (n-1) v) |]

in

let f n =

let funNm = mkName ("exp" ++ (show n)) in

let params = [varP (mkName "x")] in

funD funNm $ [clause params

(normalB $ mkExp n (varE $ mkName "x")) []]

in

mapM f [2..50]

)

Page 13: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Haskell Example

exp2 x = x * x

exp3 x = x * x * x

exp4 x = x * x * x * x

exp5 x = x * x * x * x * x

exp6 x = x * x * x * x * x * x...

......

exp50 x =

50︷ ︸︸ ︷x * x * . . . * x * x

Page 14: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Haskell

• Programmatic code generation

• Literal syntax for AST construction

• Functional programming style

• Very limited ability to inspect environment

Page 15: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Haskell

• Programmatic code generation

• Literal syntax for AST construction

• Functional programming style

• Very limited ability to inspect environment

Page 16: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Haskell

• Programmatic code generation

• Literal syntax for AST construction

• Functional programming style

• Very limited ability to inspect environment

Page 17: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Haskell

• Programmatic code generation

• Literal syntax for AST construction

• Functional programming style

• Very limited ability to inspect environment

Page 18: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Why not Template Java?

Page 19: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Java?public class Location {

private int x;

public int getX() { return this.x; }

public void setX(int x) { this.x = x; }

private int y;

public int getY() { return this.y; }

public void setY(int y) { this.y = y; }

public Location(int x, int y) {

this.x = x;

this.y = y;

}

public String toString() {

return "("+this.x+","+this.y+")";

}

}

Page 20: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Java?public class Location {

private int x;

public int getX() { return this.x; }

public void setX(int x) { this.x = x; }

private int y;

public int getY() { return this.y; }

public void setY(int y) { this.y = y; }

public Location(int x, int y) {

this.x = x;

this.y = y;

}

public String toString() {

return "("+this.x+","+this.y+")";

}

}

Page 21: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Java?public class Location {

$( property( [|private int x|] )

private int y;

public int getY() { return this.y; }

public void setY(int y) { this.y = y; }

public Location(int x, int y) {

this.x = x;

this.y = y;

}

public String toString() {

return "("+this.x+","+this.y+")";

}

}

Page 22: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Java?public class Location {

$( property( [|private int x|] )

private int y;

public int getY() { return this.y; }

public void setY(int y) { this.y = y; }

public Location(int x, int y) {

this.x = x;

this.y = y;

}

public String toString() {

return "("+this.x+","+this.y+")";

}

}

Page 23: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Java?public class Location {

$( property( [|private int x|] )

$( property( [|private int y|] )

public Location(int x, int y) {

this.x = x;

this.y = y;

}

public String toString() {

return "("+this.x+","+this.y+")";

}

}

Page 24: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Java?public class Location {

$( property( [|private int x|] )

$( property( [|private int y|] )

public Location(int x, int y) {

this.x = x;

this.y = y;

}

public String toString() {

return "("+this.x+","+this.y+")";

}

}

Page 25: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Java?public class Location {

$( property( [|private int x|] )

$( property( [|private int y|] )

$( makePropertyConstructor(

[|int x|], [|int y|]) )

public String toString() {

return "("+this.x+","+this.y+")";

}

}

Page 26: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Java?public class Location {

$( property( [|private int x|] )

$( property( [|private int y|] )

$( makePropertyConstructor(

[|int x|], [|int y|]) )

public String toString() {

return "("+this.x+","+this.y+")";

}

}

• Metaprograms can’t react to surrounding code• Metaprogrammers compensate by duplicating

information• Functional metaprogramming in a declarative

object-oriented language

Page 27: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Java?public class Location {

$( property( [|private int x|] )

$( property( [|private int y|] )

$( makePropertyConstructor(

[|int x|], [|int y|]) )

public String toString() {

return "("+this.x+","+this.y+")";

}

}

• Metaprograms can’t react to surrounding code

• Metaprogrammers compensate by duplicatinginformation

• Functional metaprogramming in a declarativeobject-oriented language

Page 28: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Java?public class Location {

$( property( [|private int x|] )

$( property( [|private int y|] )

$( makePropertyConstructor(

[|int x|], [|int y|]) )

public String toString() {

return "("+this.x+","+this.y+")";

}

}

• Metaprograms can’t react to surrounding code• Metaprogrammers compensate by duplicating

information

• Functional metaprogramming in a declarativeobject-oriented language

Page 29: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Template Java?public class Location {

$( property( [|private int x|] )

$( property( [|private int y|] )

$( makePropertyConstructor(

[|int x|], [|int y|]) )

public String toString() {

return "("+this.x+","+this.y+")";

}

}

• Metaprograms can’t react to surrounding code• Metaprogrammers compensate by duplicating

information• Functional metaprogramming in a declarative

object-oriented language

Page 30: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

What Do We Want?

• Object-oriented, declarative metaprogrammingstyle

• Awareness of surrounding code

• Modular, independent metaprograms

Page 31: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

What Do We Want?

• Object-oriented, declarative metaprogrammingstyle

• Awareness of surrounding code

• Modular, independent metaprograms

Page 32: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

What Do We Want?

• Object-oriented, declarative metaprogrammingstyle

• Awareness of surrounding code

• Modular, independent metaprograms

Page 33: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Backstage Java

How about some of this?

@@GenerateConstructorFromProperties

public class Location {

@@Property private int x;

@@Property private int y;

public String toString() {

return "("+this.x+","+this.y+")";

}

}

Harder than it looks...

Page 34: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Backstage Java

How about some of this?

@@GenerateConstructorFromProperties

public class Location {

@@Property private int x;

@@Property private int y;

public String toString() {

return "("+this.x+","+this.y+")";

}

}

Harder than it looks...

Page 35: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Traditional Metaprogramming

Page 36: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Traditional Metaprogramming

• Metaprograms are a series of programtransformations

• Each available transformation occurs exactlyonce

• True even for embedded syntax

Page 37: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Traditional Metaprogramming

• Metaprograms are a series of programtransformations

• Each available transformation occurs exactlyonce

• True even for embedded syntax

Page 38: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Traditional Metaprogramming

• Metaprograms are a series of programtransformations

• Each available transformation occurs exactlyonce

• True even for embedded syntax

Page 39: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Embedded Metaprogram Semantics

φ1 φ2

How do we pick?

Page 40: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Embedded Metaprogram Semantics

φ1 φ2

How do we pick?

Page 41: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Embedded Metaprogram Semantics

φ1 φ2

How do we pick?

Page 42: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Embedded Metaprogram Semantics

φ1

(φ2

( ))

φ1 φ2

How do we pick?

Page 43: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Embedded Metaprogram Semantics

φ2

(φ1

( ))

φ1 φ2

How do we pick?

Page 44: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Embedded Metaprogram Semantics

φ2

(φ1

( ))

φ1 φ2

How do we pick?

Page 45: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Ambiguity in Metaprogramming

Assuming three transformations φ1, φ2, φ3...

ρ

? ? ? ? ? ?

OpenJava, Groovy

Page 46: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Ambiguity in Metaprogramming

Assuming three transformations φ1, φ2, φ3...

ρ

? ? ? ? ? ?

OpenJava, Groovy

Page 47: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Total Ordering Solution

Declaring φ2 before φ1, which is before φ3.

ρ

ρ′

ROSE

Page 48: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Total Ordering Solution

Declaring φ2 before φ1, which is before φ3.

ρ

ρ′

ROSE

Page 49: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Necessary Commutation Solution

Requiring that φi ◦ φj = φj ◦ φi for all i and j

ρ

ρ′

Template Haskell, MetaOCaml, LISP, ...

Page 50: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Necessary Commutation Solution

Requiring that φi ◦ φj = φj ◦ φi for all i and j

ρ

ρ′

Template Haskell, MetaOCaml, LISP, ...

Page 51: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Hybrid Solution

Suppose that φ1 and φ2 commute.Suppose that φ3 must occur after them.

ρ

Backstage Java*

Page 52: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Hybrid Solution

Suppose that φ1 and φ2 commute.

Suppose that φ3 must occur after them.

ρ

Backstage Java*

Page 53: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Hybrid Solution

Suppose that φ1 and φ2 commute.

Suppose that φ3 must occur after them.

ρ

Backstage Java*

Page 54: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Hybrid Solution

Suppose that φ1 and φ2 commute.Suppose that φ3 must occur after them.

ρ

Backstage Java*

Page 55: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Hybrid Solution

Suppose that φ1 and φ2 commute.Suppose that φ3 must occur after them.

ρ

Backstage Java*

Page 56: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Hybrid Solution

Suppose that φ1 and φ2 commute.Suppose that φ3 must occur after them.

ρ

Backstage Java*

Page 57: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Hybrid Solution

Suppose that φ1 and φ2 commute.Suppose that φ3 must occur after them.

ρ

Backstage Java*

Page 58: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Hybrid Solution

Suppose that φ1 and φ2 commute.Suppose that φ3 must occur after them.

ρ

Backstage Java*

Page 59: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Commuting Transformations

How do we tell if φ1 and φ2 commute?

◦?

Determining whether or not two arbitrarytransformations commute is undecidable!

Page 60: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Commuting Transformations

How do we tell if φ1 and φ2 commute?

◦?

Determining whether or not two arbitrarytransformations commute is undecidable!

Page 61: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Commuting Transformations

How do we tell if φ1 and φ2 commute?

◦?

Determining whether or not two arbitrarytransformations commute is undecidable!

Page 62: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based Metaprogramming

Page 63: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingTreat metaprograms as transformation generators:

φ(ρ) = δ̄

Jδ̄K(ρ) = ρ′

Page 64: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingTreat metaprograms as transformation generators:

φ(ρ) = δ̄

Jδ̄K(ρ) = ρ′

Page 65: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingTreat metaprograms as transformation generators:

φ(ρ) = δ̄

Jδ̄K(ρ) = ρ′

Page 66: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingTreat metaprograms as transformation generators:

φ(ρ) = δ̄

Jδ̄K(ρ) = ρ′

• Language of δ̄ is not Turing-complete

• Each δ̄ is generated on a case-by-case basis

• No practically significant loss of expressiveness

Page 67: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingTreat metaprograms as transformation generators:

φ(ρ) = δ̄

Jδ̄K(ρ) = ρ′

• Language of δ̄ is not Turing-complete

• Each δ̄ is generated on a case-by-case basis

• No practically significant loss of expressiveness

Page 68: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingTreat metaprograms as transformation generators:

φ(ρ) = δ̄

Jδ̄K(ρ) = ρ′

• Language of δ̄ is not Turing-complete

• Each δ̄ is generated on a case-by-case basis

• No practically significant loss of expressiveness

Page 69: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingTreat metaprograms as transformation generators:

φ(ρ) = δ̄

Jδ̄K(ρ) = ρ′

δ̄ can express:

• Creation of a node

• Assignment to a node property

• Additions before or after an element in a list

• Removal of an element from a list

Page 70: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingTreat metaprograms as transformation generators:

φ(ρ) = δ̄

Jδ̄K(ρ) = ρ′

δ̄ can express:

• Creation of a node

• Assignment to a node property

• Additions before or after an element in a list

• Removal of an element from a list

Page 71: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingTreat metaprograms as transformation generators:

φ(ρ) = δ̄

Jδ̄K(ρ) = ρ′

δ̄ can express:

• Creation of a node

• Assignment to a node property

• Additions before or after an element in a list

• Removal of an element from a list

Page 72: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingTreat metaprograms as transformation generators:

φ(ρ) = δ̄

Jδ̄K(ρ) = ρ′

δ̄ can express:

• Creation of a node

• Assignment to a node property

• Additions before or after an element in a list

• Removal of an element from a list

Page 73: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingTreat metaprograms as transformation generators:

φ(ρ) = δ̄

Jδ̄K(ρ) = ρ′

Now, prove commutation over pairs of Jδ̄K.

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

Page 74: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingTreat metaprograms as transformation generators:

φ(ρ) = δ̄

Jδ̄K(ρ) = ρ′

Now, prove commutation over pairs of Jδ̄K.

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

Page 75: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

A Simple BSJ Examplepublic class Example {

public static void main(String[] arg) {

[:

BlockStatementListNode list = context.getAnchor().

getNearestAncestorOfType(

BlockStatementListNode.class);

list.addFirst(

<:System.out.println("Hello, world!");:>);

:]

[:

BlockStatementListNode list = context.getAnchor().

getNearestAncestorOfType(

BlockStatementListNode.class);

list.addLast(

<:System.out.println("How are you?");:>);

:]

}

}

Page 76: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

A Simple Examplepublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

M1

M2

System.out.println("How are you?");

}

}

• Replace metaprograms with anchors

• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” last)

• Prove that δ̄1 and δ̄2 commute.

• Execute δ̄1 and δ̄2 in some order.

Page 77: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

A Simple Examplepublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

M1

M2

System.out.println("How are you?");

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” last)

• Prove that δ̄1 and δ̄2 commute.

• Execute δ̄1 and δ̄2 in some order.

Page 78: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

A Simple Examplepublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

M1

M2

System.out.println("How are you?");

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)

• φ2(ρ) = δ̄2 (“How are you?” last)

• Prove that δ̄1 and δ̄2 commute.

• Execute δ̄1 and δ̄2 in some order.

Page 79: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

A Simple Examplepublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

M1

M2

System.out.println("How are you?");

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” last)

• Prove that δ̄1 and δ̄2 commute.

• Execute δ̄1 and δ̄2 in some order.

Page 80: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

A Simple Examplepublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

M1

M2

System.out.println("How are you?");

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” last)

• Prove that δ̄1 and δ̄2 commute.

• Execute δ̄1 and δ̄2 in some order.

Page 81: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

A Simple Examplepublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

M1

M2

System.out.println("How are you?");

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” last)

• Prove that δ̄1 and δ̄2 commute.

• Execute δ̄1 and δ̄2 in some order.

Page 82: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

A Simple Examplepublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

M1

M2

System.out.println("How are you?");

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” last)

• Prove that δ̄1 and δ̄2 commute.

• Execute δ̄1 and δ̄2 in some order.

Page 83: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

A Simple Examplepublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

M1

M2

System.out.println("How are you?");

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” last)

• Prove that δ̄1 and δ̄2 commute.

• Execute δ̄1 and δ̄2 in some order.

Page 84: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

A Simple Examplepublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

M1

M2

System.out.println("How are you?");

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” last)

• Prove that δ̄1 and δ̄2 commute.

• Execute δ̄1 and δ̄2 in some order.

Page 85: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

A Simple Examplepublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

M1

M2

System.out.println("How are you?");

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” last)

• Prove that δ̄1 and δ̄2 commute.

• Execute δ̄1 and δ̄2 in some order.

Page 86: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

A Simple Examplepublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

M1

M2

System.out.println("How are you?");

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” last)

• Prove that δ̄1 and δ̄2 commute.

• Execute δ̄1 and δ̄2 in some order.

Page 87: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

A Simple Examplepublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

;

;

System.out.println("How are you?");

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” last)

• Prove that δ̄1 and δ̄2 commute.

• Execute δ̄1 and δ̄2 in some order.

Page 88: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

An Example of Conflictpublic class Example {

public static void main(String[] arg) {

[:

BlockStatementListNode list = context.getAnchor().

getNearestAncestorOfType(

BlockStatementListNode.class);

list.addFirst(

<:System.out.println("Hello, world!");:>);

:]

[:

BlockStatementListNode list = context.getAnchor().

getNearestAncestorOfType(

BlockStatementListNode.class);

list. addFirst (

<:System.out.println("How are you?");:>);

:]

}

}

Page 89: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

An Example of Conflictpublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

System.out.println("Hello, world!");

M1

M2

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” first)

• Now, δ̄1 and δ̄2 do not commute!

• But we can detect this!

Page 90: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

An Example of Conflictpublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

System.out.println("Hello, world!");

M1

M2

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” first)

• Now, δ̄1 and δ̄2 do not commute!

• But we can detect this!

Page 91: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

An Example of Conflictpublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

System.out.println("How are you?");

M1

M2

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” first)

• Now, δ̄1 and δ̄2 do not commute!

• But we can detect this!

Page 92: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

An Example of Conflictpublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

System.out.println("How are you?");

M1

M2

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” first)

• Now, δ̄1 and δ̄2 do not commute!

• But we can detect this!

Page 93: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

An Example of Conflictpublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

System.out.println("Hello, world!");

M1

M2

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” first)

• Now, δ̄1 and δ̄2 do not commute!

• But we can detect this!

Page 94: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

An Example of Conflictpublic class Example {

public static void main(String[] arg) {

System.out.println("Hello, world!");

System.out.println("Hello, world!");

M1

M2

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” first)

• Now, δ̄1 and δ̄2 do not commute!

• But we can detect this!

Page 95: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

An Example of Conflictpublic class Example {

public static void main(String[] arg) {

System.out.println("How are you?");

System.out.println("Hello, world!");

M1

M2

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” first)

• Now, δ̄1 and δ̄2 do not commute!

• But we can detect this!

Page 96: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

An Example of Conflictpublic class Example {

public static void main(String[] arg) {

System.out.println("How are you?");

System.out.println("Hello, world!");

;

;

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” first)

• Now, δ̄1 and δ̄2 do not commute!

• But we can detect this!

Page 97: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

An Example of Conflictpublic class Example {

public static void main(String[] arg) {

System.out.println("How are you?");

System.out.println("Hello, world!");

;

;

}

}

• Replace metaprograms with anchors• Run each metaprogram to collect its changes

• φ1(ρ) = δ̄1 (“Hello, world!” first)• φ2(ρ) = δ̄2 (“How are you?” first)

• Now, δ̄1 and δ̄2 do not commute!

• But we can detect this!

Page 98: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Conflict DetectionRecord Node Creation Ruleη 7→ v̂ /∈ ρ ρJη 7→ {l 7→ v̂}K⇒ ρ

(+R η(l = v̂)) ρ⇒ ρ′

List Node Creation Ruleη 7→ v̂ /∈ ρ

ρJη 7→ [(.,M, ∅), (/,M, ∅)]K⇒ ρ′

(M � +Lη) ρ⇒ ρ′

Record Assignment Ruleη 7→ R ∈ ρ ρJη 7→ RJl 7→ v̂KK⇒ ρ

(η.l ← v̂) ρ⇒ ρ′

List Add Before RuleMη3 6= . η1 7→ L ∈ ρ

◦η3 = Σ(Mη3,M,L) L = [◦η′, ◦η3,

◦η′′]

L′ = [◦η′, (η2,M, ∅), ◦η3,◦η′′]

ρJη1 7→ L′K⇒ ρ

(M � η1 : η2 " Mη3) ρ⇒ ρ

List Add After RuleMη3 6= / η1 7→ L ∈ ρ

◦η3 = Σ(Mη3,M,L) L = [◦η′, ◦η3,

◦η′′]

L′ = [◦η′, ◦η3, (η2,M, ∅), ◦η′′]

ρJη1 7→ L′K⇒ ρ

(M � η1 :Mη3 # η2) ρ⇒ ρ

List Remove Ruleη1 7→ L ∈ ρ◦η2 = (η2,M

′,S) = Σ(η2,M,L)

L = [◦η′, ◦η2,◦η′′]

L′ = [◦η′, (η2,M′,S ∪ {M}), ◦η′′]

ρJη1 7→ L′K⇒ ρ

(M � η1 : ↓ η2) ρ⇒ ρ′

Recursive Application Ruleδ′ e ⇒ ρ δ ρ⇒ ρ

δ (δ′ e)⇒ ρ′

Value Rule

v̂ ⇒ v̂

Record Assignment Conflict Rulev̂ 6= v̂′

η.l ← v̂ = η.l ← v̂′

Add Before Conflict Ruleω(η2) ω(η′2)

η1 : η2 " Mη3 = η1 : η′2 " M

η3

Add After Conflict Ruleω(η2) ω(η′2)

η1 :Mη3 # η2 = η1 :

Mη3 # η

′2

Unordered Creation Conflict Ruleδ = +R η(l 7→ v̂) ∨ δ = +Lη η ∈ δ′

δ = δ′

Page 99: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Conflict DetectionRecord Node Creation Ruleη 7→ v̂ /∈ ρ ρJη 7→ {l 7→ v̂}K⇒ ρ

(+R η(l = v̂)) ρ⇒ ρ′

List Node Creation Ruleη 7→ v̂ /∈ ρ

ρJη 7→ [(.,M, ∅), (/,M, ∅)]K⇒ ρ′

(M � +Lη) ρ⇒ ρ′

Record Assignment Ruleη 7→ R ∈ ρ ρJη 7→ RJl 7→ v̂KK⇒ ρ

(η.l ← v̂) ρ⇒ ρ′

List Add Before RuleMη3 6= . η1 7→ L ∈ ρ

◦η3 = Σ(Mη3,M,L) L = [◦η′, ◦η3,

◦η′′]

L′ = [◦η′, (η2,M, ∅), ◦η3,◦η′′]

ρJη1 7→ L′K⇒ ρ

(M � η1 : η2 " Mη3) ρ⇒ ρ

List Add After RuleMη3 6= / η1 7→ L ∈ ρ

◦η3 = Σ(Mη3,M,L) L = [◦η′, ◦η3,

◦η′′]

L′ = [◦η′, ◦η3, (η2,M, ∅), ◦η′′]

ρJη1 7→ L′K⇒ ρ

(M � η1 :Mη3 # η2) ρ⇒ ρ

List Remove Ruleη1 7→ L ∈ ρ◦η2 = (η2,M

′,S) = Σ(η2,M,L)

L = [◦η′, ◦η2,◦η′′]

L′ = [◦η′, (η2,M′,S ∪ {M}), ◦η′′]

ρJη1 7→ L′K⇒ ρ

(M � η1 : ↓ η2) ρ⇒ ρ′

Recursive Application Ruleδ′ e ⇒ ρ δ ρ⇒ ρ

δ (δ′ e)⇒ ρ′

Value Rule

v̂ ⇒ v̂

Record Assignment Conflict Rulev̂ 6= v̂′

η.l ← v̂ = η.l ← v̂′

Add Before Conflict Ruleω(η2) ω(η′2)

η1 : η2 " Mη3 = η1 : η′2 " M

η3

Add After Conflict Ruleω(η2) ω(η′2)

η1 :Mη3 # η2 = η1 :

Mη3 # η

′2

Unordered Creation Conflict Ruleδ = +R η(l 7→ v̂) ∨ δ = +Lη η ∈ δ′

δ = δ′

Page 100: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Huzzah!

• Metaprogram conflicts are detected at compiletime

• Metaprograms are still aware of theirsurroundings

,

Page 101: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Huzzah!

• Metaprogram conflicts are detected at compiletime

• Metaprograms are still aware of theirsurroundings

,

Page 102: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Huzzah!

• Metaprogram conflicts are detected at compiletime

• Metaprograms are still aware of theirsurroundings

,

Page 103: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependencies

So how do we resolve the conflict?

Page 104: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependenciespublic static void main(String[] arg) {

[:

#depends foo; ← Declare target dependency

BlockStatementListNode list = context.getAnchor().

getNearestAncestorOfType(

BlockStatementListNode.class);

list.addFirst(

<:System.out.println("Hello, world!");:>);

:]

[:

#target foo; ← Declare target membership

BlockStatementListNode list = context.getAnchor().

getNearestAncestorOfType(

BlockStatementListNode.class);

list.addFirst(

<:System.out.println("How are you?");:>);

:]

}

Page 105: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependenciespublic static void main(String[] arg) {

[:

#depends foo; ← Declare target dependency

BlockStatementListNode list = context.getAnchor().

getNearestAncestorOfType(

BlockStatementListNode.class);

list.addFirst(

<:System.out.println("Hello, world!");:>);

:]

[:

#target foo; ← Declare target membershipBlockStatementListNode list = context.getAnchor().

getNearestAncestorOfType(

BlockStatementListNode.class);

list.addFirst(

<:System.out.println("How are you?");:>);

:]

}

Page 106: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependenciespublic static void main(String[] arg) {

[:

#depends foo; ← Declare target dependencyBlockStatementListNode list = context.getAnchor().

getNearestAncestorOfType(

BlockStatementListNode.class);

list.addFirst(

<:System.out.println("Hello, world!");:>);

:]

[:

#target foo;

← Declare target membership

BlockStatementListNode list = context.getAnchor().

getNearestAncestorOfType(

BlockStatementListNode.class);

list.addFirst(

<:System.out.println("How are you?");:>);

:]

}

Page 107: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependenciespublic static void main(String[] arg) {

[:

#depends foo;

← Declare target dependency

BlockStatementListNode list = context.getAnchor().

getNearestAncestorOfType(

BlockStatementListNode.class);

list.addFirst(

<:System.out.println("Hello, world!");:>);

:]

[:

#target foo;

← Declare target membership

BlockStatementListNode list = context.getAnchor().

getNearestAncestorOfType(

BlockStatementListNode.class);

list.addFirst(

<:System.out.println("How are you?");:>);

:]

}

Page 108: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependency Graph

M1 M2

foo

• One node per metaprogram

• M2 is a member of target “foo”

• M1 depends on the target “foo”

• Therefore, M1 depends on M2 (M1 M2)

• No more requirement for them to commute!

Page 109: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependency Graph

M1 M2

foo

• One node per metaprogram

• M2 is a member of target “foo”

• M1 depends on the target “foo”

• Therefore, M1 depends on M2 (M1 M2)

• No more requirement for them to commute!

Page 110: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependency Graph

M1 M2

foo

• One node per metaprogram

• M2 is a member of target “foo”

• M1 depends on the target “foo”

• Therefore, M1 depends on M2 (M1 M2)

• No more requirement for them to commute!

Page 111: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependency Graph

M1 M2foo

• One node per metaprogram

• M2 is a member of target “foo”

• M1 depends on the target “foo”

• Therefore, M1 depends on M2 (M1 M2)

• No more requirement for them to commute!

Page 112: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependency Graph

M1 M2foo

• One node per metaprogram

• M2 is a member of target “foo”

• M1 depends on the target “foo”

• Therefore, M1 depends on M2 (M1 M2)

• No more requirement for them to commute!

Page 113: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependency Graph

M1 M2foo

• One node per metaprogram

• M2 is a member of target “foo”

• M1 depends on the target “foo”

• Therefore, M1 depends on M2 (M1 M2)

• No more requirement for them to commute!

Page 114: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependency Graph

M1 M2foo

• One node per metaprogram

• M2 is a member of target “foo”

• M1 depends on the target “foo”

• Therefore, M1 depends on M2 (M1 M2)

• No more requirement for them to commute!

Page 115: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependency Graph

M1 M2foo

• One node per metaprogram

• M2 is a member of target “foo”

• M1 depends on the target “foo”

• Therefore, M1 depends on M2 (M1 M2)

• No more requirement for them to commute!

Page 116: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependency Graph

M1 M2foo

• One node per metaprogram

• M2 is a member of target “foo”

• M1 depends on the target “foo”

• Therefore, M1 depends on M2 (M1 M2)

• No more requirement for them to commute!

Page 117: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependency Graph

M1 a M4 c M6

M2 M3 b M5 M7

/* M1 */ [: #target a; :]

/* M2 */ [: #target a; :]

/* M3 */ [: #target a, b; :]

/* M4 */ [: #target c; #depends a; :]

/* M5 */ [: #target c; #depends b; :]

/* M6 */ [: #depends c; :]

/* M7 */ [: :]

Page 118: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependency Graph

M1 a M4 c M6

M2 M3 b M5 M7

• M6 depends on M2 - no obligation to commute

• No path between M5 and M4 - must commute

• No path to M7 - must always commute

• More paths means less obligation to provecommutativity

Page 119: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependency Graph

M1 a M4 c M6

M2 M3 b M5 M7

• M6 depends on M2 - no obligation to commute

• No path between M5 and M4 - must commute

• No path to M7 - must always commute

• More paths means less obligation to provecommutativity

Page 120: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependency Graph

M1 a M4 c M6

M2 M3 b M5 M7

• M6 depends on M2 - no obligation to commute

• No path between M5 and M4 - must commute

• No path to M7 - must always commute

• More paths means less obligation to provecommutativity

Page 121: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Dependency Graph

M1 a M4 c M6

M2 M3 b M5 M7

• M6 depends on M2 - no obligation to commute

• No path between M5 and M4 - must commute

• No path to M7 - must always commute

• More paths means less obligation to provecommutativity

Page 122: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

A more practical example...

...but first, a new feature

Page 123: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

A more practical example...

...but first, a new feature

Page 124: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Meta-Annotations

@@Property private int x;

• Declarative metaprogramming abstraction

• Specifies metaprogram code and dependencies

• Can annotate any declaration or blockstatement

• Allows easy reuse of metaprogrammingconstructs

• Here defined by user class named Property

Page 125: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Meta-Annotations

@@Property private int x;

• Declarative metaprogramming abstraction

• Specifies metaprogram code and dependencies

• Can annotate any declaration or blockstatement

• Allows easy reuse of metaprogrammingconstructs

• Here defined by user class named Property

Page 126: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Meta-Annotations

@@Property private int x;

• Declarative metaprogramming abstraction

• Specifies metaprogram code and dependencies

• Can annotate any declaration or blockstatement

• Allows easy reuse of metaprogrammingconstructs

• Here defined by user class named Property

Page 127: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Meta-Annotations

@@Property private int x;

• Declarative metaprogramming abstraction

• Specifies metaprogram code and dependencies

• Can annotate any declaration or blockstatement

• Allows easy reuse of metaprogrammingconstructs

• Here defined by user class named Property

Page 128: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Meta-Annotations

@@Property private int x;

• Declarative metaprogramming abstraction

• Specifies metaprogram code and dependencies

• Can annotate any declaration or blockstatement

• Allows easy reuse of metaprogrammingconstructs

• Here defined by user class named Property

Page 129: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Meta-Annotation Dependencies@@GenerateConstructorFromProperties

public class Location {

@@Property private int x;

@@Property private int y;

public String toString() {

return "("+this.x+","+this.y+")";

}

}

• Meta-annotation defns. include dependencies• @@Property is a member of target “property”• @@GenerateConstructorFromProperties

depends on “property”

Page 130: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Meta-Annotation Dependencies@@GenerateConstructorFromProperties

public class Location {

@@Property private int x;

@@Property private int y;

public String toString() {

return "("+this.x+","+this.y+")";

}

}

• Meta-annotation defns. include dependencies

• @@Property is a member of target “property”• @@GenerateConstructorFromProperties

depends on “property”

Page 131: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Meta-Annotation Dependencies@@GenerateConstructorFromProperties

public class Location {

@@Property private int x;

@@Property private int y;

public String toString() {

return "("+this.x+","+this.y+")";

}

}

• Meta-annotation defns. include dependencies• @@Property is a member of target “property”

• @@GenerateConstructorFromProperties

depends on “property”

Page 132: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Meta-Annotation Dependencies@@GenerateConstructorFromProperties

public class Location {

@@Property private int x;

@@Property private int y;

public String toString() {

return "("+this.x+","+this.y+")";

}

}

• Meta-annotation defns. include dependencies• @@Property is a member of target “property”• @@GenerateConstructorFromProperties

depends on “property”

Page 133: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Dependency Graph

@@Property @@Property

@@GenerateConstructorFromProperties

φ1

φ3

φ2

property

• One node per metaprogram

• @@Property participates in “property” target

• @@GenerateConstructorFromProperties

depends on “property”

Page 134: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Dependency Graph

@@Property @@Property

@@GenerateConstructorFromProperties

φ1

φ3

φ2

property

• One node per metaprogram

• @@Property participates in “property” target

• @@GenerateConstructorFromProperties

depends on “property”

Page 135: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Dependency Graph

@@Property @@Property

@@GenerateConstructorFromProperties

φ1

φ3

φ2

property

• One node per metaprogram

• @@Property participates in “property” target

• @@GenerateConstructorFromProperties

depends on “property”

Page 136: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Dependency Graph

@@Property @@Property

@@GenerateConstructorFromProperties

φ1

φ3

φ2

property

• One node per metaprogram

• @@Property participates in “property” target

• @@GenerateConstructorFromProperties

depends on “property”

Page 137: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Dependency Graph

@@Property @@Property

@@GenerateConstructorFromProperties

φ1

φ3

φ2

property

• One node per metaprogram

• @@Property participates in “property” target

• @@GenerateConstructorFromProperties

depends on “property”

Page 138: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Dependency Graph

@@Property @@Property

@@GenerateConstructorFromProperties

φ1

φ3

φ2

property

• One node per metaprogram

• @@Property participates in “property” target

• @@GenerateConstructorFromProperties

depends on “property”

Page 139: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Dependency Graph

@@Property @@Property

@@GenerateConstructorFromProperties

φ1

φ3

φ2

property

• One node per metaprogram

• @@Property participates in “property” target

• @@GenerateConstructorFromProperties

depends on “property”

Page 140: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Dependency Graph

@@Property @@Property

@@GenerateConstructorFromProperties

φ1

φ3

φ2

property

• φ3 depends on φ1

• φ3 depends on φ2

ρ

Page 141: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Dependency Graph

@@Property @@Property

@@GenerateConstructorFromProperties

φ1

φ3

φ2

property

• φ3 depends on φ1

• φ3 depends on φ2

ρ

Page 142: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Dependency Graph

@@Property @@Property

@@GenerateConstructorFromProperties

φ1

φ3

φ2

property

• φ3 depends on φ1

• φ3 depends on φ2

ρ

Page 143: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Dependency Graph

@@Property @@Property

@@GenerateConstructorFromProperties

φ1

φ3

φ2

property

• φ3 depends on φ1

• φ3 depends on φ2

ρ

Page 144: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Execute φ1 obtaining δ̄1.

• Execute φ2 obtaining δ̄2.

• Prove Jδ̄1K and Jδ̄2K commute.

Page 145: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Execute φ1 obtaining δ̄1.

• Execute φ2 obtaining δ̄2.

• Prove Jδ̄1K and Jδ̄2K commute.

Page 146: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

+getX

+setX

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Execute φ1 obtaining δ̄1.

• Execute φ2 obtaining δ̄2.

• Prove Jδ̄1K and Jδ̄2K commute.

Page 147: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Execute φ1 obtaining δ̄1.

• Execute φ2 obtaining δ̄2.

• Prove Jδ̄1K and Jδ̄2K commute.

Page 148: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2 +getY

+setY

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Execute φ1 obtaining δ̄1.

• Execute φ2 obtaining δ̄2.

• Prove Jδ̄1K and Jδ̄2K commute.

Page 149: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Execute φ1 obtaining δ̄1.

• Execute φ2 obtaining δ̄2.

• Prove Jδ̄1K and Jδ̄2K commute.

Page 150: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Execute φ1 obtaining δ̄1.

• Execute φ2 obtaining δ̄2.

• Prove Jδ̄1K and Jδ̄2K commute.

Page 151: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Execute φ1 obtaining δ̄1.

• Execute φ2 obtaining δ̄2.

• Prove Jδ̄1K and Jδ̄2K commute.

Page 152: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Execute φ1 obtaining δ̄1.

• Execute φ2 obtaining δ̄2.

• Prove Jδ̄1K and Jδ̄2K commute.

Page 153: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Apply Jδ̄1K and Jδ̄2K to ρ.

• Execute φ3 on the result to get δ̄3.

• Apply Jδ̄3K to get the final object program.

Page 154: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Apply Jδ̄1K and Jδ̄2K to ρ.

• Execute φ3 on the result to get δ̄3.

• Apply Jδ̄3K to get the final object program.

Page 155: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Apply Jδ̄1K and Jδ̄2K to ρ.

• Execute φ3 on the result to get δ̄3.

• Apply Jδ̄3K to get the final object program.

Page 156: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Apply Jδ̄1K and Jδ̄2K to ρ.

• Execute φ3 on the result to get δ̄3.

• Apply Jδ̄3K to get the final object program.

Page 157: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Apply Jδ̄1K and Jδ̄2K to ρ.

• Execute φ3 on the result to get δ̄3.

• Apply Jδ̄3K to get the final object program.

Page 158: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Apply Jδ̄1K and Jδ̄2K to ρ.

• Execute φ3 on the result to get δ̄3.

• Apply Jδ̄3K to get the final object program.

Page 159: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Apply Jδ̄1K and Jδ̄2K to ρ.

• Execute φ3 on the result to get δ̄3.

• Apply Jδ̄3K to get the final object program.

Page 160: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Apply Jδ̄1K and Jδ̄2K to ρ.

• Execute φ3 on the result to get δ̄3.

• Apply Jδ̄3K to get the final object program.

Page 161: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Execution Example

ρ

δ̄1

φ1

δ̄2

φ2

+getX

+setX

+getY

+setY

+getY

+setY

+getX

+setX

∼=

Jδ̄1K Jδ̄2K

Jδ̄2K Jδ̄1K

δ̄3

φ3

ρ′

Jδ̄3K

• Apply Jδ̄1K and Jδ̄2K to ρ.

• Execute φ3 on the result to get δ̄3.

• Apply Jδ̄3K to get the final object program.

Page 162: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingSummary

• Ambiguities detected at compile-time

• Metaprograms can inspect their environments

• Modular, declarative metaprogramming style

• Suitable for OO languages like Java

Page 163: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingSummary

• Ambiguities detected at compile-time

• Metaprograms can inspect their environments

• Modular, declarative metaprogramming style

• Suitable for OO languages like Java

Page 164: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingSummary

• Ambiguities detected at compile-time

• Metaprograms can inspect their environments

• Modular, declarative metaprogramming style

• Suitable for OO languages like Java

Page 165: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingSummary

• Ambiguities detected at compile-time

• Metaprograms can inspect their environments

• Modular, declarative metaprogramming style

• Suitable for OO languages like Java

Page 166: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Backstage Java Implementation

• Working reference implementation available

• Includes source (∼50k SLOC)

• Full superset of Java 1.6

Page 167: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Backstage Java Implementation

• Working reference implementation available

• Includes source (∼50k SLOC)

• Full superset of Java 1.6

Page 168: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Backstage Java Implementation

• Working reference implementation available

• Includes source (∼50k SLOC)

• Full superset of Java 1.6

Page 169: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Standard Library – @@Memoized

@@Memoized

• Class for generating images

• Each image is generated from pair of Colors

• Memoizing image generation routine forperformance

• Store cached images in a private Map keyed byinput to generation method

Page 170: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Standard Library – @@Memoized

@@Memoized

• Class for generating images

• Each image is generated from pair of Colors

• Memoizing image generation routine forperformance

• Store cached images in a private Map keyed byinput to generation method

Page 171: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Standard Library – @@Memoized

@@Memoized

• Class for generating images

• Each image is generated from pair of Colors

• Memoizing image generation routine forperformance

• Store cached images in a private Map keyed byinput to generation method

Page 172: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Standard Library – @@Memoized

@@Memoized

• Class for generating images

• Each image is generated from pair of Colors

• Memoizing image generation routine forperformance

• Store cached images in a private Map keyed byinput to generation method

Page 173: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Standard Library – @@Memoized

@@Memoized

• Class for generating images

• Each image is generated from pair of Colors

• Memoizing image generation routine forperformance

• Store cached images in a private Map keyed byinput to generation method

Page 174: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Standard Library – @@Memoized

public class ImageGenerator {

@@Memoized

public Image gen(Color a, Color b) {· · · }}

Page 175: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Standard Library – @@Memoized

public class ImageGenerator {

@@Memoized

public Image gen(Color a, Color b) {· · · }}

Page 176: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Standard Library – @@Memoized

public class ImageGenerator {

private static class Key {

private Color a;

private Color b;

· · ·}

public Image gen(Color a, Color b) {· · · }

public Image gen(Color a, Color b) {

/* return cache value, igen as needed */

}

}

Page 177: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Standard Library – @@Memoized

public class ImageGenerator {

private static class Key {

private Color a;

private Color b;

· · ·}

private Map<???,Image> cache = new · · ·public Image gen(Color a, Color b) {· · · }

public Image gen(Color a, Color b) {

/* return cache value, igen as needed */

}

}

Page 178: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Standard Library – @@Memoized

public class ImageGenerator {

private static class Key {

private Color a;

private Color b;

· · ·}

private Map<???,Image> cache = new · · ·public Image gen(Color a, Color b) {· · · }

public Image gen(Color a, Color b) {

/* return cache value, igen as needed */

}

}

Page 179: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Standard Library – @@Memoized

public class ImageGenerator {

private static class Key {

private Color a;

private Color b;

· · ·}

private Map<Key,Image> cache = new · · ·public Image gen(Color a, Color b) {· · · }

public Image gen(Color a, Color b) {

/* return cache value, igen as needed */

}

}

Page 180: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Standard Library – @@Memoized

public class ImageGenerator {

private static class Key {

private Color a;

private Color b;

· · ·}

private Map<Key,Image> cache = new · · ·private Image igen(Color a, Color b) {· · · }

public Image gen(Color a, Color b) {

/* return cache value, igen as needed */

}

}

Page 181: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Standard Library – @@Memoized

public class ImageGenerator {

private static class Key {

private Color a;

private Color b;

· · ·}

private Map<Key,Image> cache = new · · ·private Image igen(Color a, Color b) {· · · }public Image gen(Color a, Color b) {

/* return cache value, igen as needed */

}

}

Page 182: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

BSJ Standard Library – @@Memoized

public class ImageGenerator {

@@Memoized

public Image gen(Color a, Color b) {· · · }}

Page 183: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based Metaprogramming

Questions?

Page 184: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Difference-Based MetaprogrammingQuestions?

Page 185: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Expressiveness

Difference-based metaprogramming separatesanalysis from modification.

public class Example {

private int x = 0;

private int y = 0;

@@LogAndCount

public void foo() { · · · }

@@LogAndCount

public void bar() { · · · }

}

Page 186: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Injection Conflicts

M1 M2 M3

M4

t

Page 187: Backstage Java - Making a Difference in Metaprogrammingzpalmer/publications/bsj... · 2016. 1. 22. · Compile-Time Metaprogramming in Java Traditional Metaprogramming Model Di erence-Based

Injection Conflicts

M1 M2 M3

M4 t