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

Late Data Layout: Unifying Data Representation Transformations

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

    View Slide

  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]

    View Slide

  3. scala-miniboxing.org/ldl
    Late Data Layout:
    Unifying Data Representation Transformations

    View Slide

  4. 4
    scala-miniboxing.org/ldl

    View Slide

  5. 5
    scala-miniboxing.org/ldl
    OOPSLA 2014, Portland, OR

    View Slide

  6. scala-miniboxing.org/ldl
    Late Data Layout:
    Unifying Data Representation Transformations

    View Slide

  7. scala-miniboxing.org/ldl
    Late Data Layout:
    Unifying Data Representation Transformations

    compiler transformations

    separate compilation

    global scope

    View Slide

  8. scala-miniboxing.org/ldl
    Late Data Layout:
    Unifying Data Representation Transformations

    unboxing, value classes

    how data is represented

    View Slide

  9. scala-miniboxing.org/ldl
    Late Data Layout:
    Unifying Data Representation Transformations

    what is there to unify?

    why bother?

    View Slide

  10. scala-miniboxing.org/ldl
    Motivation
    Transformation
    Conclusion

    View Slide

  11. scala-miniboxing.org/ldl
    Representation Transformations

    View Slide

  12. scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Representation Transformations

    View Slide

  13. scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Specialization (Miniboxing)
    Representation Transformations

    View Slide

  14. scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Specialization (Miniboxing)
    Value Classes
    Representation Transformations

    View Slide

  15. scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Specialization (Miniboxing)
    Value Classes
    Representation Transformations
    motivated by
    erased generics

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  19. 19
    scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Unboxing Primitive Types
    def identity[T](t: T): T = t

    View Slide

  20. 20
    scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Unboxing Primitive Types
    def identity[T](t: T): T = t
    scalac / javac

    View Slide

  21. 21
    scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Unboxing Primitive Types
    def identity[T](t: T): T = t
    def identity(t: Object): Object = t
    scalac / javac

    View Slide

  22. 22
    scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Unboxing Primitive Types
    identity(5)

    View Slide

  23. 23
    scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Unboxing Primitive Types
    identity(5)
    scalac / javac

    View Slide

  24. 24
    scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Unboxing Primitive Types
    identity(5)
    identity(j.l.Integer.valueOf(5)).intValue
    scalac / javac

    View Slide

  25. 25
    scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Unboxing Primitive Types
    identity(5)
    identity(j.l.Integer.valueOf(5)).intValue
    scalac / javac
    Object representation

    View Slide

  26. 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

    View Slide

  27. 27
    scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Unboxing Primitive Types
    val five: Int = 5

    View Slide

  28. 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)

    View Slide

  29. 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)

    View Slide

  30. 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)

    View Slide

  31. 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)

    View Slide

  32. 32
    scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Unboxing Primitive Types
    val five: Int = identity(5)

    View Slide

  33. 33
    scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Unboxing Primitive Types
    val five: Int = identity(5)
    scalac

    View Slide

  34. 34
    scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Unboxing Primitive Types
    val five: Int = identity(5)
    val five: int =
    scalac

    View Slide

  35. 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

    View Slide

  36. 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

    View Slide

  37. 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

    View Slide

  38. 38
    scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Unboxing Primitive Types
    scala.Int

    View Slide

  39. 39
    scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Unboxing Primitive Types
    scala.Int

    View Slide

  40. 40
    scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Unboxing Primitive Types
    scala.Int
    int

    fast access

    no garbage collection

    locality

    View Slide

  41. 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

    View Slide

  42. 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

    View Slide

  43. scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Specialization (Miniboxing)
    Value Classes
    Representation Transformations
    Staging (Multi-Stage Programming)
    Function Representation

    View Slide

  44. 44
    scala-miniboxing.org/ldl
    Specialization
    Specialization
    def identity[T](t: T): T = t

    View Slide

  45. 45
    scala-miniboxing.org/ldl
    Specialization
    Specialization
    def identity[T](t: T): T = t
    specialization

    View Slide

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

    View Slide

  47. 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

    View Slide

  48. 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

    View Slide

  49. 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)

    View Slide

  50. 50
    scala-miniboxing.org/ldl
    Specialization
    Specialization
    identity(5)

    View Slide

  51. 51
    scala-miniboxing.org/ldl
    Specialization
    Specialization
    identity(5)
    specialization

    View Slide

  52. 52
    scala-miniboxing.org/ldl
    Specialization
    Specialization
    identity(5)
    identity_I(5)
    specialization

    View Slide

  53. 53
    scala-miniboxing.org/ldl
    Specialization
    Specialization
    identity(5)
    identity_I(5)
    specialization
    The variant of identity
    specialized for int

    View Slide

  54. 54
    scala-miniboxing.org/ldl
    Specialization
    Specialization
    identity(5)
    identity_I(5)
    specialization
    The variant of identity
    specialized for int
    // no boxing!

    View Slide

  55. 55
    scala-miniboxing.org/ldl
    Specialization
    Specialization
    def tupled[T1, T2](t1: T1, t2: T2) ...

    View Slide

  56. 56
    scala-miniboxing.org/ldl
    Specialization
    Specialization
    def tupled[T1, T2](t1: T1, t2: T2) ...
    specialization

    View Slide

  57. 57
    scala-miniboxing.org/ldl
    Specialization
    Specialization
    def tupled[T1, T2](t1: T1, t2: T2) ...
    // 100 methods (102)
    specialization

    View Slide

  58. 58
    scala-miniboxing.org/ldl
    Specialization
    Specialization
    def tupled[T1, T2](t1: T1, t2: T2) ...
    // 100 methods (102)
    specialization

    View Slide

  59. 59
    scala-miniboxing.org/ldl
    Specialization
    Specialization
    def tupled[T1, T2](t1: T1, t2: T2) ...
    // 100 methods (102)
    specialization
    Can we do
    better?

    View Slide

  60. 60
    scala-miniboxing.org/ldl
    Specialization
    Specialization
    def tupled[T1, T2](t1: T1, t2: T2) ...
    // 100 methods (102)
    specialization
    Can we do
    better?

    View Slide

  61. 61
    scala-miniboxing.org/ldl
    Miniboxing
    Miniboxing
    def identity[T](t: T): T = t

    View Slide

  62. 62
    scala-miniboxing.org/ldl
    Miniboxing
    Miniboxing
    def identity[T](t: T): T = t
    miniboxing

    View Slide

  63. 63
    scala-miniboxing.org/ldl
    Miniboxing
    Miniboxing
    def identity[T](t: T): T = t
    def identity(t: Object): Object = t
    miniboxing

    View Slide

  64. 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

    View Slide

  65. 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

    View Slide

  66. 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

    View Slide

  67. 67
    scala-miniboxing.org/ldl
    Miniboxing
    Miniboxing
    identity(3)

    View Slide

  68. 68
    scala-miniboxing.org/ldl
    Miniboxing
    Miniboxing
    identity(3)
    miniboxing

    View Slide

  69. 69
    scala-miniboxing.org/ldl
    Miniboxing
    Miniboxing
    identity(3)
    identity_M(..., int2minibox(3))
    miniboxing

    View Slide

  70. 70
    scala-miniboxing.org/ldl
    Miniboxing
    Miniboxing
    identity(3)
    identity_M(..., int2minibox(3))
    miniboxing
    The miniboxed
    variant of identity

    View Slide

  71. 71
    scala-miniboxing.org/ldl
    Miniboxing
    Miniboxing
    identity(3)
    identity_M(..., int2minibox(3))
    miniboxing
    Coercion
    The miniboxed
    variant of identity

    View Slide

  72. 72
    scala-miniboxing.org/ldl
    Miniboxing
    Miniboxing
    T

    View Slide

  73. 73
    scala-miniboxing.org/ldl
    Miniboxing
    Miniboxing
    T

    View Slide

  74. 74
    scala-miniboxing.org/ldl
    Miniboxing
    Miniboxing
    T
    long

    preferred encoding

    View Slide

  75. 75
    scala-miniboxing.org/ldl
    Miniboxing
    Miniboxing
    T
    long

    preferred encoding ●
    fallback encoding

    compatible with

    virtual dispatch

    subtyping

    erased generics
    T (erased to Object)

    View Slide

  76. 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

    View Slide

  77. scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Specialization (Miniboxing)
    Value Classes
    Representation Transformations
    Staging (Multi-Stage Programming)
    Function Representation

    View Slide

  78. 78
    scala-miniboxing.org/ldl
    Value Classes
    Value Classes
    def abs(c: Complex): Double = ...

    View Slide

  79. 79
    scala-miniboxing.org/ldl
    Value Classes
    Value Classes
    def abs(c: Complex): Double = ...
    value class transformation

    View Slide

  80. 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

    View Slide

  81. 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!

    View Slide

  82. 82
    scala-miniboxing.org/ldl
    Value Classes
    Value Classes
    val c: Complex = Complex(2,1)

    View Slide

  83. 83
    scala-miniboxing.org/ldl
    Value Classes
    Value Classes
    val c: Complex = Complex(2,1)
    value class transformation

    View Slide

  84. 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

    View Slide

  85. 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!

    View Slide

  86. 86
    scala-miniboxing.org/ldl
    Value Classes
    Value Classes
    val a: Any = c

    View Slide

  87. 87
    scala-miniboxing.org/ldl
    Value Classes
    Value Classes
    val a: Any = c
    value class transformation

    View Slide

  88. 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

    View Slide

  89. 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!

    View Slide

  90. 90
    scala-miniboxing.org/ldl
    Value Classes
    Value Classes
    value class

    View Slide

  91. 91
    scala-miniboxing.org/ldl
    Value Classes
    Value Classes
    value class

    View Slide

  92. 92
    scala-miniboxing.org/ldl
    Value Classes
    Value Classes
    value class
    structure (by-val)

    preferred encoding

    View Slide

  93. 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)

    View Slide

  94. 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

    View Slide

  95. scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Specialization (Miniboxing)
    Value Classes
    Representation Transformations
    Staging (Multi-Stage Programming)
    Function Representation

    View Slide

  96. 96
    scala-miniboxing.org/ldl
    Staging
    Staging
    T

    View Slide

  97. 97
    scala-miniboxing.org/ldl
    Staging
    Staging
    T

    View Slide

  98. 98
    scala-miniboxing.org/ldl
    Staging
    Staging
    T
    T (direct)

    executed in this stage

    stores a value

    View Slide

  99. 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)

    View Slide

  100. 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

    View Slide

  101. scala-miniboxing.org/ldl
    Unboxing Primitive Types
    Specialization (Miniboxing)
    Value Classes
    Representation Transformations
    Staging (Multi-Stage Programming)
    Function Representation

    View Slide

  102. 102
    scala-miniboxing.org/ldl
    Function Representation
    Function Representation
    scala.FunctionX

    View Slide

  103. 103
    scala-miniboxing.org/ldl
    Function Representation
    Function Representation
    scala.FunctionX

    View Slide

  104. 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

    View Slide

  105. 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

    View Slide

  106. 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

    View Slide

  107. scala-miniboxing.org/ldl
    Motivation
    Transformation
    Conclusion

    View Slide

  108. scala-miniboxing.org/ldl
    Motivation
    Transformation
    Conclusion

    View Slide

  109. 109
    scala-miniboxing.org/ldl
    Late Data Layout (LDL)
    Late Data Layout (LDL)

    View Slide

  110. 110
    scala-miniboxing.org/ldl
    Late Data Layout (LDL)
    Late Data Layout (LDL)
    concept

    View Slide

  111. 111
    scala-miniboxing.org/ldl
    Late Data Layout (LDL)
    Late Data Layout (LDL)
    concept

    View Slide

  112. 112
    scala-miniboxing.org/ldl
    Late Data Layout (LDL)
    Late Data Layout (LDL)
    concept
    repr. 1

    View Slide

  113. 113
    scala-miniboxing.org/ldl
    Late Data Layout (LDL)
    Late Data Layout (LDL)
    concept
    repr. 1 repr. 2

    View Slide

  114. 114
    scala-miniboxing.org/ldl
    Late Data Layout (LDL)
    Late Data Layout (LDL)
    concept
    repr. 1 … repr. n
    repr. 2

    View Slide

  115. 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)

    View Slide

  116. 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

    View Slide

  117. scala-miniboxing.org/ldl
    How to transform a program?

    View Slide

  118. scala-miniboxing.org/ldl
    How to transform a program?
    We'll use primitive unboxing
    as the running example,
    to keep things simple

    View Slide

  119. 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

    View Slide

  120. 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

    View Slide

  121. scala-miniboxing.org/ldl
    Naive transformation
    Syntax-based transformation
    Type-based LDL transformation

    View Slide

  122. 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

    View Slide

  123. 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

    View Slide

  124. 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)

    View Slide

  125. 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)

    View Slide

  126. 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

    View Slide

  127. scala-miniboxing.org/ldl
    Naive transformation
    Syntax-based transformation
    Type-based LDL transformation

    View Slide

  128. 128
    scala-miniboxing.org/ldl
    Syntax-based
    Syntax-based

    when transforming a value
    – coerce the definition right-hand side
    – coerce all references to it

    View Slide

  129. 129
    scala-miniboxing.org/ldl
    Syntax-based
    Syntax-based
    val x: Int = List[Int](1, 2, 3).head

    View Slide

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

    View Slide

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

    View Slide

  132. 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

    View Slide

  133. 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.

    View Slide

  134. 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.

    View Slide

  135. 135
    scala-miniboxing.org/ldl
    Syntax-based
    Syntax-based
    val x: Int = List[Int](1, 2, 3).head
    val z: Int = x

    View Slide

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

    View Slide

  137. 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

    View Slide

  138. 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

    View Slide

  139. 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

    View Slide

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

    View Slide

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

    View Slide

  142. 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

    View Slide

  143. 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

    View Slide

  144. 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

    View Slide

  145. 145
    scala-miniboxing.org/ldl
    Peephole Optimization
    Peephole Optimization
    val z: int = unbox(box(x))

    View Slide

  146. 146
    scala-miniboxing.org/ldl
    Peephole Optimization
    Peephole Optimization
    val z: int = unbox(box(x))
    peephole

    View Slide

  147. 147
    scala-miniboxing.org/ldl
    Peephole Optimization
    Peephole Optimization
    val z: int = unbox(box(x))
    val z: int = x
    peephole

    View Slide

  148. 148
    scala-miniboxing.org/ldl
    Peephole Optimization
    Peephole Optimization
    val z: int = unbox(box(x))
    val z: int = x
    peephole

    View Slide

  149. 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.

    View Slide

  150. 150
    scala-miniboxing.org/ldl
    Syntax-based
    Syntax-based
    def choice(t1: Int, t2: Int): Int =
    if (Random.nextBoolean())
    t1
    else
    t2

    View Slide

  151. 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

    View Slide

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

    View Slide

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

    View Slide

  154. 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?

    View Slide

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

    View Slide

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

    View Slide

  157. 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

    View Slide

  158. 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

    View Slide

  159. 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))

    View Slide

  160. 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))

    View Slide

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

    View Slide

  162. 162
    scala-miniboxing.org/ldl
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): int =
    if (Random.nextBoolean())
    t1
    else
    t2
    complicated

    View Slide

  163. 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

    View Slide

  164. scala-miniboxing.org/ldl
    Naive transformation
    Syntax-based transformation
    Type-based LDL transformation

    View Slide

  165. 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

    View Slide

  166. 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

    View Slide

  167. 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

    View Slide

  168. 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.

    View Slide

  169. 169
    scala-miniboxing.org/ldl
    LDL Transformation
    LDL Transformation inject
    coerce
    commit

    View Slide

  170. 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

    View Slide

  171. 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

    View Slide

  172. 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

    View Slide

  173. 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

    View Slide

  174. 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

    View Slide

  175. 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

    View Slide

  176. 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

    View Slide

  177. 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

    View Slide

  178. 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

    View Slide

  179. 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

    View Slide

  180. 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

    View Slide

  181. 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

    View Slide

  182. 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

    View Slide

  183. 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

    View Slide

  184. 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

    View Slide

  185. 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

    View Slide

  186. 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

    View Slide

  187. 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

    View Slide

  188. 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

    View Slide

  189. 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)

    View Slide

  190. 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

    View Slide

  191. 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!

    View Slide

  192. 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

    View Slide

  193. 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

    View Slide

  194. scala-miniboxing.org/ldl
    Consistency
    Selectivity
    Optimality (not formally proven yet)
    Properties
    Type-based LDL transformation

    View Slide

  195. 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

    View Slide

  196. scala-miniboxing.org/ldl
    Consistency
    Selectivity
    Optimality (not formally proven yet)
    Properties
    Type-based LDL transformation

    View Slide

  197. 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])

    View Slide

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

    View Slide

  199. 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?

    View Slide

  200. 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?

    View Slide

  201. 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

    View Slide

  202. 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

    View Slide

  203. 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

    View Slide

  204. 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

    View Slide

  205. 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

    View Slide

  206. 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

    View Slide

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

    View Slide

  208. scala-miniboxing.org/ldl
    Consistency
    Selectivity
    Optimality (not formally proven yet)
    Properties
    Type-based LDL transformation

    View Slide

  209. 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

    View Slide

  210. 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

    View Slide

  211. 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

    View Slide

  212. scala-miniboxing.org/ldl
    Motivation
    Transformation
    Conclusion

    View Slide

  213. scala-miniboxing.org/ldl
    Motivation
    Transformation
    Conclusion

    View Slide

  214. 214
    scala-miniboxing.org/ldl
    Conclusion
    Conclusion
    LDL is a
    LDL is a

    compile-time transformation
    – compatible with separate compilation
    – compatible with partial transformation

    View Slide

  215. 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

    View Slide

  216. 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)

    View Slide

  217. 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

    View Slide

  218. 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)

    View Slide

  219. 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

    View Slide

  220. 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

    View Slide

  221. 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.

    View Slide

  222. 222
    scala-miniboxing.org/ldl

    View Slide

  223. 223
    scala-miniboxing.org/ldl
    Conclusion
    Conclusion
    What's your use-case?
    What's your use-case?
    concept
    repr. 1 … repr. n
    repr. 2

    View Slide

  224. 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!)

    View Slide

  225. scala-miniboxing.org/ldl
    Thank you!
    concept
    repr. 1 … repr. n
    repr. 2

    View Slide