backstage java - making a difference in metaprogrammingzpalmer/publications/bsj... · 2016. 1....
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/1.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/2.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/3.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/4.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/5.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/6.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/7.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/8.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/9.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/10.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/11.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/12.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/13.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/14.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/15.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/16.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/17.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/18.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/19.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/20.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/21.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/22.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/23.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/24.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/25.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/26.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/27.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/28.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/29.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/30.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/31.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/32.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/33.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/34.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/35.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/36.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/37.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/38.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/39.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/40.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/41.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/42.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/43.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/44.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/45.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/46.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/47.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/48.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/49.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/50.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/51.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/52.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/53.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/54.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/55.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/56.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/57.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/58.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/59.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/60.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/61.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/62.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/63.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/64.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/65.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/66.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/67.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/68.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/69.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/70.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/71.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/72.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/73.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/74.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/75.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/76.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/77.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/78.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/79.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/80.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/81.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/82.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/83.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/84.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/85.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/86.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/87.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/88.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/89.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/90.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/91.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/92.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/93.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/94.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/95.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/96.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/97.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/98.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/99.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/100.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/101.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/102.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/103.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/104.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/105.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/106.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/107.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/108.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/109.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/110.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/111.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/112.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/113.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/114.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/115.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/116.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/117.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/118.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/119.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/120.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/121.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/122.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/123.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/124.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/125.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/126.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/127.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/128.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/129.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/130.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/131.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/132.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/133.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/134.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/135.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/136.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/137.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/138.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/139.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/140.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/141.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/142.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/143.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/144.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/145.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/146.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/147.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/148.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/149.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/150.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/151.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/152.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/153.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/154.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/155.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/156.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/157.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/158.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/159.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/160.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/161.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/162.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/163.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/164.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/165.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/166.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/167.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/168.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/169.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/170.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/171.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/172.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/173.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/174.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/175.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/176.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/177.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/178.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/179.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/180.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/181.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/182.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/183.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/184.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/185.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/186.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022051907/5ff99a92acaabb32e30c1ced/html5/thumbnails/187.jpg)
Injection Conflicts
M1 M2 M3
M4 t