Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Late Data Layout: Unifying Data Representation ...

Vlad Ureche
September 11, 2014

Late Data Layout: Unifying Data Representation Transformations

Late Data Layout presentation given at the Virtual Machines Meetup at ETH Zürich, Switzerland. Website: http://vmmeetup.github.io/2014/

Project website: http://scala-ldl.org

Vlad Ureche

September 11, 2014
Tweet

More Decks by Vlad Ureche

Other Decks in Programming

Transcript

  1. scala-miniboxing.org/ldl Late Data Layout: Unifying Data Representation Transformations 11th of

    September 2014 Virtual Machine Meetup ETH Zürich, Switzerland
  2. scala-miniboxing.org/ldl Vlad URECHE PhD student in the Scala Team @

    EPFL Miniboxing guy. Also worked on specialization, the backend and scaladoc. @ @VladUreche @VladUreche [email protected]
  3. scala-miniboxing.org/ldl Unboxing Primitive Types Specialization (Miniboxing) Value Classes Representation Transformations

    Staging (Multi-Stage Programming) Function Representation motivated by erased generics
  4. scala-miniboxing.org/ldl Unboxing Primitive Types Specialization (Miniboxing) Value Classes Representation Transformations

    Staging (Multi-Stage Programming) Function Representation motivated by erased generics
  5. 26 scala-miniboxing.org/ldl Unboxing Primitive Types Unboxing Primitive Types identity(5) identity(j.l.Integer.valueOf(5)).intValue

    scalac / javac produces garbage breaks locality guarantees inflates heap requirements indirect (slow) access to the value Object representation
  6. 28 scala-miniboxing.org/ldl Unboxing Primitive Types Unboxing Primitive Types val five:

    Int = 5 scala.Int behaves like an object (has methods, can be used with generics)
  7. 29 scala-miniboxing.org/ldl Unboxing Primitive Types Unboxing Primitive Types val five:

    Int = 5 scalac scala.Int behaves like an object (has methods, can be used with generics)
  8. 30 scala-miniboxing.org/ldl Unboxing Primitive Types Unboxing Primitive Types val five:

    Int = 5 val five: int = 5 scalac scala.Int behaves like an object (has methods, can be used with generics)
  9. 31 scala-miniboxing.org/ldl Unboxing Primitive Types Unboxing Primitive Types val five:

    Int = 5 val five: int = 5 scalac Unboxed integer scala.Int behaves like an object (has methods, can be used with generics)
  10. 35 scala-miniboxing.org/ldl Unboxing Primitive Types Unboxing Primitive Types val five:

    Int = identity(5) val five: int = identity(I.valueOf(5)).intValue scalac
  11. 36 scala-miniboxing.org/ldl Unboxing Primitive Types Unboxing Primitive Types val five:

    Int = identity(5) val five: int = identity(I.valueOf(5)).intValue scalac Boxing coercion
  12. 37 scala-miniboxing.org/ldl Unboxing Primitive Types Unboxing Primitive Types val five:

    Int = identity(5) val five: int = identity(I.valueOf(5)).intValue scalac Boxing coercion Unboxing coercion
  13. 41 scala-miniboxing.org/ldl Unboxing Primitive Types Unboxing Primitive Types scala.Int int

    • fast access • no garbage collection • locality • indirect access • object allocation • and thus garbage collection • no locality guarantees • compatible with erased generics java.lang.Integer
  14. 42 scala-miniboxing.org/ldl Unboxing Primitive Types Unboxing Primitive Types scala.Int int

    • fast access • no garbage collection • locality • indirect access • object allocation • and thus garbage collection • no locality guarantees • compatible with erased generics java.lang.Integer incompatible → coercions
  15. 47 scala-miniboxing.org/ldl Specialization Specialization def identity[T](t: T): T = t

    def identity(t: Object): Object = t specialization def identity_Z(t: bool): bool = t
  16. 48 scala-miniboxing.org/ldl Specialization Specialization def identity[T](t: T): T = t

    def identity(t: Object): Object = t specialization def identity_Z(t: bool): bool = t def identity_C(t: char): char = t
  17. 49 scala-miniboxing.org/ldl Specialization Specialization def identity[T](t: T): T = t

    def identity(t: Object): Object = t specialization def identity_Z(t: bool): bool = t def identity_C(t: char): char = t … (7 other variants)
  18. 64 scala-miniboxing.org/ldl Miniboxing Miniboxing def identity[T](t: T): T = t

    def identity(t: Object): Object = t miniboxing def identity_M(..., t: long): long = t
  19. 65 scala-miniboxing.org/ldl Miniboxing Miniboxing def identity[T](t: T): T = t

    def identity(t: Object): Object = t miniboxing def identity_M(..., t: long): long = t long encodes all primitive types
  20. 66 scala-miniboxing.org/ldl Miniboxing Miniboxing def identity[T](t: T): T = t

    def identity(t: Object): Object = t miniboxing def identity_M(..., t: long): long = t Only 2n variants long encodes all primitive types
  21. 75 scala-miniboxing.org/ldl Miniboxing Miniboxing T long • preferred encoding •

    fallback encoding • compatible with • virtual dispatch • subtyping • erased generics T (erased to Object)
  22. 76 scala-miniboxing.org/ldl Miniboxing Miniboxing T long • preferred encoding •

    fallback encoding • compatible with • virtual dispatch • subtyping • erased generics T (erased to Object) incompatible → coercions
  23. 80 scala-miniboxing.org/ldl Value Classes Value Classes def abs(c: Complex): Double

    = ... def abs(c_re: Double, c_im: Double): Double = ... value class transformation
  24. 81 scala-miniboxing.org/ldl Value Classes Value Classes def abs(c: Complex): Double

    = ... def abs(c_re: Double, c_im: Double): Double = ... value class transformation No object created!
  25. 84 scala-miniboxing.org/ldl Value Classes Value Classes val c: Complex =

    Complex(2,1) val c_re: Double = 2 val c_im: Double = 1 value class transformation
  26. 85 scala-miniboxing.org/ldl Value Classes Value Classes val c: Complex =

    Complex(2,1) val c_re: Double = 2 val c_im: Double = 1 value class transformation No object created!
  27. 88 scala-miniboxing.org/ldl Value Classes Value Classes val a: Any =

    c val a: Any = new Complex(c_re, c_im) value class transformation
  28. 89 scala-miniboxing.org/ldl Value Classes Value Classes val a: Any =

    c val a: Any = new Complex(c_re, c_im) value class transformation Coercion!
  29. 93 scala-miniboxing.org/ldl Value Classes Value Classes value class structure (by-val)

    • preferred encoding • fallback encoding • compatible with • subtyping • erased generics class (by-ref)
  30. 94 scala-miniboxing.org/ldl Value Classes Value Classes value class structure (by-val)

    • preferred encoding • fallback encoding • compatible with • subtyping • erased generics class (by-ref) incompatible → coercions
  31. 99 scala-miniboxing.org/ldl Staging Staging T T (direct) • executed in

    this stage • stores a value • executed in the next stage • stores the expression that produces the value Rep[T] (lifted)
  32. 100 scala-miniboxing.org/ldl Staging Staging T T (direct) • executed in

    this stage • stores a value • executed in the next stage • stores the expression that produces the value Rep[T] (lifted) incompatible → coercions
  33. 104 scala-miniboxing.org/ldl Function Representation Function Representation scala.FunctionX FunctionX • compatible

    with the library • does not have all specializations • slow when used by miniboxed code
  34. 105 scala-miniboxing.org/ldl Function Representation Function Representation scala.FunctionX FunctionX • compatible

    with the library • does not have all specializations • slow when used by miniboxed code • fast calling from miniboxed code • all specializations are there MbFunctionX
  35. 106 scala-miniboxing.org/ldl Function Representation Function Representation scala.FunctionX FunctionX • compatible

    with the library • does not have all specializations • slow when used by miniboxed code • fast calling from miniboxed code • all specializations are there MbFunctionX incompatible → coercions
  36. 115 scala-miniboxing.org/ldl Late Data Layout (LDL) Late Data Layout (LDL)

    concept repr. 1 … repr. n repr. 2 Constraints from the interaction with other language features: • generics • subtyping • virtual dispatch • DSL semantics (staging)
  37. 116 scala-miniboxing.org/ldl Late Data Layout (LDL) Late Data Layout (LDL)

    concept repr. 1 … repr. n repr. 2 Constraints from the interaction with other language features: • generics • subtyping • virtual dispatch • DSL semantics (staging) incompatible → coercions
  38. 119 scala-miniboxing.org/ldl Unboxing Primitive Types Unboxing Primitive Types scala.Int int

    • fast access • no garbage collection • locality • indirect access • object allocation • and thus garbage collection • no locality guarantees • compatible with erased generics java.lang.Integer
  39. 120 scala-miniboxing.org/ldl Unboxing Primitive Types Unboxing Primitive Types scala.Int int

    • fast access • no garbage collection • locality • indirect access • object allocation • and thus garbage collection • no locality guarantees • compatible with erased generics java.lang.Integer incompatible → coercions
  40. 122 scala-miniboxing.org/ldl Naive transformation Naive transformation val x: Int =

    List[Int](1, 2, 3).head val y: List[Int] = List[Int](x) naive unboxing
  41. 123 scala-miniboxing.org/ldl Naive transformation Naive transformation val x: Int =

    List[Int](1, 2, 3).head val y: List[Int] = List[Int](x) val x: int = List[Int](1, 2, 3).head val y: List[Int] = List[Int](x) naive unboxing
  42. 124 scala-miniboxing.org/ldl Naive transformation Naive transformation val x: Int =

    List[Int](1, 2, 3).head val y: List[Int] = List[Int](x) val x: int = List[Int](1, 2, 3).head val y: List[Int] = List[Int](x) naive unboxing representation mismatch: expected: int (unboxed) found: Int (boxed)
  43. 125 scala-miniboxing.org/ldl Naive transformation Naive transformation val x: Int =

    List[Int](1, 2, 3).head val y: List[Int] = List[Int](x) val x: int = List[Int](1, 2, 3).head val y: List[Int] = List[Int](x) naive unboxing representation mismatch: expected: int (unboxed) found: Int (boxed) representation mismatch: expected: Int (boxed) found: int (unboxed)
  44. 126 scala-miniboxing.org/ldl Naive transformation Naive transformation • naively replacing representations

    – leads to mismatches – which are hard to recover (impossible for value classes and miniboxing) • we need coercions between representations
  45. 128 scala-miniboxing.org/ldl Syntax-based Syntax-based • when transforming a value –

    coerce the definition right-hand side – coerce all references to it
  46. 132 scala-miniboxing.org/ldl Syntax-based Syntax-based val x: Int = List[Int](1, 2,

    3).head val x: int = unbox(List[Int](1, 2, 3).head) syntax-based unboxing
  47. 133 scala-miniboxing.org/ldl Syntax-based Syntax-based val x: Int = List[Int](1, 2,

    3).head val x: int = unbox(List[Int](1, 2, 3).head) syntax-based unboxing There are no references to x, so there's nothing else to do.
  48. 134 scala-miniboxing.org/ldl Syntax-based Syntax-based val x: Int = List[Int](1, 2,

    3).head val x: int = unbox(List[Int](1, 2, 3).head) syntax-based unboxing There are no references to x, so there's nothing else to do.
  49. 137 scala-miniboxing.org/ldl Syntax-based Syntax-based val x: Int = List[Int](1, 2,

    3).head val z: Int = x syntax-based unboxing Transform one by one
  50. 138 scala-miniboxing.org/ldl Syntax-based Syntax-based val x: Int = List[Int](1, 2,

    3).head val z: Int = x val x: int = unbox(List[Int](1, 2, 3).head) syntax-based unboxing Transform one by one
  51. 139 scala-miniboxing.org/ldl Syntax-based Syntax-based val x: Int = List[Int](1, 2,

    3).head val z: Int = x val x: int = unbox(List[Int](1, 2, 3).head) val z: Int = box(x) syntax-based unboxing Transform one by one
  52. 142 scala-miniboxing.org/ldl Syntax-based Syntax-based val x: int = unbox(List[Int](1, 2,

    3).head) val z: Int = box(x) val x: int = unbox(List[Int](1, 2, 3).head) val z: int = syntax-based unboxing
  53. 143 scala-miniboxing.org/ldl Syntax-based Syntax-based val x: int = unbox(List[Int](1, 2,

    3).head) val z: Int = box(x) val x: int = unbox(List[Int](1, 2, 3).head) val z: int = unbox(box(x)) syntax-based unboxing
  54. 144 scala-miniboxing.org/ldl Syntax-based Syntax-based val x: int = unbox(List[Int](1, 2,

    3).head) val z: Int = box(x) val x: int = unbox(List[Int](1, 2, 3).head) val z: int = unbox(box(x)) syntax-based unboxing suboptimal
  55. 149 scala-miniboxing.org/ldl Peephole Optimization Peephole Optimization val z: int =

    unbox(box(x)) val z: int = x peephole Okay, let's add the peephole transformation in the pipeline.
  56. 151 scala-miniboxing.org/ldl Syntax-based Syntax-based def choice(t1: Int, t2: Int): Int

    = if (Random.nextBoolean()) t1 else t2 Transform one by one
  57. 154 scala-miniboxing.org/ldl Syntax-based Syntax-based def choice(t1: int, t2: int): Int

    = if (Random.nextBoolean()) box(t1) else box(t2) Anything missing?
  58. 157 scala-miniboxing.org/ldl Syntax-based Syntax-based def choice(t1: int, t2: int): int

    = unbox(if (Random.nextBoolean()) box(t1) else box(t2)) new peephole rule
  59. 158 scala-miniboxing.org/ldl Syntax-based Syntax-based def choice(t1: int, t2: int): int

    = unbox(if (Random.nextBoolean()) box(t1) else box(t2)) new peephole rule sink outside coercions into the if branches
  60. 159 scala-miniboxing.org/ldl Syntax-based Syntax-based def choice(t1: int, t2: int): int

    = if (Random.nextBoolean()) unbox(box(t1)) else unbox(box(t2))
  61. 160 scala-miniboxing.org/ldl Syntax-based Syntax-based def choice(t1: int, t2: int): int

    = if (Random.nextBoolean()) unbox(box(t1)) else unbox(box(t2))
  62. 163 scala-miniboxing.org/ldl Syntax-based Syntax-based • peephole transformation does not scale

    – needs multiple rules for each node – needs stateful rewrites – leads to an explosion of rules x states Details in the paper
  63. 165 scala-miniboxing.org/ldl LDL Transformation LDL Transformation • propagate representation information

    – into the type system (based on annotated types) – allows selective marking of values to be unboxed
  64. 166 scala-miniboxing.org/ldl LDL Transformation LDL Transformation • re-typecheck the tree

    – exposes inconsistencies in the representation • based on backward type propagation • from local type inference – so we introduce coercions • optimally, only when representations don't match
  65. 167 scala-miniboxing.org/ldl LDL Transformation LDL Transformation • three-stage mechanism –

    inject annotate the values to be unboxed → – coerce introduce coercion markers → – commit commit to the alternative representations →
  66. 168 scala-miniboxing.org/ldl LDL Transformation LDL Transformation Warning! Throughout the presentation

    we'll be writing annotations written before types (e.g. “@unboxed Int”), although in the Scala syntax they are written after the type (e.g.“Int @unboxed”). This makes it easier to read the types aloud.
  67. 170 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: Int, t2:

    Int): Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit
  68. 171 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: Int, t2:

    Int): Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit
  69. 172 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit configurable introduction of annotations based on external constraints
  70. 173 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit
  71. 174 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit
  72. 175 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit the return type of choice is @unboxed Int
  73. 176 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit the return type of choice is @unboxed Int
  74. 177 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit : @unboxed Int the return type of choice is @unboxed Int
  75. 178 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit : @unboxed Int expected type (part of local type inference) the return type of choice is @unboxed Int
  76. 179 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit : @unboxed Int
  77. 180 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit : Boolean
  78. 181 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit : Boolean matches: expected: Boolean found: Boolean
  79. 182 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit : @unboxed Int
  80. 183 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit : @unboxed Int matches: expected: @unboxed Int found: @unboxed Int
  81. 184 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit : @unboxed Int
  82. 185 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit matches: ... : @unboxed Int
  83. 186 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit
  84. 187 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit all okay, next phase
  85. 188 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit
  86. 189 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: @unboxed Int,

    t2: @unboxed Int): @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit Replace: @unboxed Int → int (not showing Int → j.l.Integer)
  87. 190 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: int, t2:

    int): int = if (Random.nextBoolean()) t1 else t2 inject coerce commit
  88. 191 scala-miniboxing.org/ldl LDL Transformation LDL Transformation def choice(t1: int, t2:

    int): int = if (Random.nextBoolean()) t1 else t2 inject coerce commit that's it!
  89. 192 scala-miniboxing.org/ldl LDL Transformation LDL Transformation • three-stage mechanism –

    inject: add annotations – coerce: add coercions (based on the annotations) – commit: final representation semantics
  90. 193 scala-miniboxing.org/ldl LDL Transformation LDL Transformation • Scalac's erasure –

    similar transformation – less flexible (no annotations) – entangled with other transformations • we took what's good – and allowed the transformation to work on other use cases as well
  91. 195 scala-miniboxing.org/ldl Consistency Consistency inject coerce commit • representations become

    explicit in types – representation mismatches • become type mismatches • are exposed by the type system – mismatches lead to coercions • explicit bridges between representations • are introduced automatically – regardless of the representations • at a meta-level
  92. 197 scala-miniboxing.org/ldl Selectivity Selectivity inject coerce commit • annotations allow

    selectively picking the values to be transformed – value classes • cannot unbox multi-param values in return position (not supported by the JVM platform) • bridge methods – staging • annotations signal domain-specific knowledge – can occur inside generics (List[@staged Int])
  93. 198 scala-miniboxing.org/ldl Selectivity Selectivity def choice(t1: Int, t2: Int): Int

    = if (Random.nextBoolean()) t1 else t2 inject coerce commit
  94. 199 scala-miniboxing.org/ldl Selectivity Selectivity def choice(t1: Int, t2: Int): Int

    = if (Random.nextBoolean()) t1 else t2 inject coerce commit what if we did not annotate t1?
  95. 200 scala-miniboxing.org/ldl Selectivity Selectivity def choice(t1: Int, t2: @unboxed Int):

    @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit what if we did not annotate t1?
  96. 201 scala-miniboxing.org/ldl Selectivity Selectivity def choice(t1: Int, t2: @unboxed Int):

    @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit : @unboxed Int
  97. 202 scala-miniboxing.org/ldl Selectivity Selectivity def choice(t1: Int, t2: @unboxed Int):

    @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit : @unboxed Int
  98. 203 scala-miniboxing.org/ldl Selectivity Selectivity def choice(t1: Int, t2: @unboxed Int):

    @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit : @unboxed Int mismatch: expected: @unboxed Int found: Int
  99. 204 scala-miniboxing.org/ldl Selectivity Selectivity def choice(t1: Int, t2: @unboxed Int):

    @unboxed Int = if (Random.nextBoolean()) t1 else t2 inject coerce commit : @unboxed Int mismatch: expected: @unboxed Int found: Int coercion
  100. 205 scala-miniboxing.org/ldl Selectivity Selectivity def choice(t1: Int, t2: @unboxed Int):

    @unboxed Int = if (Random.nextBoolean()) unbox(t1) else t2 inject coerce commit
  101. 206 scala-miniboxing.org/ldl Selectivity Selectivity def choice(t1: Int, t2: @unboxed Int):

    @unboxed Int = if (Random.nextBoolean()) unbox(t1) else t2 inject coerce commit
  102. 207 scala-miniboxing.org/ldl Selectivity Selectivity def choice(t1: Int, t2: int): int

    = if (Random.nextBoolean()) t1.intValue else t2 inject coerce commit
  103. 209 scala-miniboxing.org/ldl Optimality Optimality def choice(t1: Int, t2: @unboxed Int):

    @unboxed Int = if (Random.nextBoolean()) unbox(t1) else t2 inject coerce commit
  104. 210 scala-miniboxing.org/ldl Optimality Optimality def choice(t1: Int, t2: @unboxed Int):

    @unboxed Int = if (Random.nextBoolean()) unbox(t1) else t2 inject coerce commit
  105. 211 scala-miniboxing.org/ldl Optimality Optimality def choice(t1: Int, t2: @unboxed Int):

    @unboxed Int = if (Random.nextBoolean()) unbox(t1) else t2 inject coerce commit Coercions are sunk in the tree → excute only if necessary
  106. 214 scala-miniboxing.org/ldl Conclusion Conclusion LDL is a LDL is a

    • compile-time transformation – compatible with separate compilation – compatible with partial transformation
  107. 215 scala-miniboxing.org/ldl Conclusion Conclusion LDL is a LDL is a

    • compile-time transformation – compatible with separate compilation – compatible with partial transformation – global scope (Graal/Truffle: local scope) • optimizes all data in a program
  108. 216 scala-miniboxing.org/ldl Conclusion Conclusion LDL is a LDL is a

    • compile-time transformation – compatible with separate compilation – compatible with partial transformation – global scope (Graal/Truffle: local scope) • optimizes all data in a program / containers – conservative (Graal/Truffle: speculative)
  109. 217 scala-miniboxing.org/ldl Conclusion Conclusion LDL is a LDL is a

    • compile-time transformation – compatible with separate compilation – compatible with partial transformation – global scope (Graal/Truffle: local scope) • optimizes all data in a program / containers – conservative (Graal/Truffle: speculative) Complementary optimizations
  110. 218 scala-miniboxing.org/ldl Conclusion Conclusion LDL allows LDL allows • splitting

    a high-level concept – into multiple representations – in a consistent way (through coercions) – in a selective way (through annotations) – in an optimal way (coerce only if necessary)
  111. 219 scala-miniboxing.org/ldl Conclusion Conclusion LDL is used in LDL is

    used in • the miniboxing plugin – for specialization – for function representation • other prototypes – value classes – staging
  112. 220 scala-miniboxing.org/ldl Conclusion Conclusion LDL is used in LDL is

    used in • the miniboxing plugin – for specialization – for function representation • other prototypes – value classes – staging Don't take my word for it
  113. 221 scala-miniboxing.org/ldl Conclusion Conclusion LDL is used in LDL is

    used in • the miniboxing plugin – for specialization – for function representation • other prototypes – value classes – staging Don't take my word for it Sources on github, artifact online.
  114. scala-miniboxing.org/ldl Credits and Thank you-s • Cristian Talau - developed

    the initial prototype, as a semester project • Eugene Burmako - the value class plugin based on the LDL transformation • Aymeric Genet - developing collection-like benchmarks for the miniboxing plugin • Martin Odersky, for his patient guidance • Eugene Burmako, for trusting the idea enough to develop the value-plugin based on the LDL transformation • Iulian Dragos, for his work on specialization and many explanations • Miguel Garcia, for his original insights that spawned the miniboxing idea • Michel Schinz, for his wonderful comments and enlightening ACC course • Andrew Myers and Roland Ducournau for the discussions we had and the feedback provided • Heather Miller for the eye-opening discussions we had • Vojin Jovanovic, Sandro Stucki, Manohar Jonalagedda and the whole LAMP laboratory in EPFL for the extraordinary atmosphere • Adriaan Moors, for the miniboxing name which stuck :)) • Thierry Coppey, Vera Salvisberg and George Nithin, who patiently listened to many presentations and provided valuable feedback • Grzegorz Kossakowski, for the many brainstorming sessions on specialization • Erik Osheim, Tom Switzer and Rex Kerr for their guidance on the Scala community side • OOPSLA paper and artifact reviewers, who reshaped the paper with their feedback • Sandro, Vojin, Nada, Heather, Manohar - reviews and discussions on the LDL paper • Hubert Plociniczak for the type notation in the LDL paper • Denys Shabalin, Dmitry Petrashko for their patient reviews of the LDL paper Special thanks to the Scala Community for their support! (@StuHood, @vpatryshev and everyone else!)