Share
Embed
Miniboxing: JVM Generics without the Overhead
Miniboxing presentation at PNWScala '14. Cool conference!! Website: http://pnwscala.org/2014/index.html
The recording is available on youtube:
https://www.youtube.com/watch?v=RnIupOJv_oM
Project website: http://scala-miniboxing.org
Vlad Ureche
November 15, 2014
Transcript
169 slides
-
scala-miniboxing.org Vlad URECHE PhD student in the Scala Team @
EPFL Miniboxing guy. Also worked on Scala specialization, the backend and scaladoc. @ @VladUreche @VladUreche [email protected] -
scala-miniboxing.org What is miniboxing? Why use it? Conclusion How to
use it? Benchmarks -
scala-miniboxing.org Erased Generics Erased Generics def identity[T](t: T): T =
t def identity(t: Object): Object = t scalac / javac -
scala-miniboxing.org Erased Generics Erased Generics identity(5) identity(java.lang.Integer.valueOf(5)) scalac / javac
inflates heap requirements Object representation -
scala-miniboxing.org Erased Generics Erased Generics identity(5) identity(java.lang.Integer.valueOf(5)) scalac / javac
produces garbage inflates heap requirements Object representation -
scala-miniboxing.org Erased Generics Erased Generics identity(5) identity(java.lang.Integer.valueOf(5)) scalac / javac
produces garbage inflates heap requirements indirect (slow) access to the value Object representation -
scala-miniboxing.org Erased Generics Erased Generics identity(5) identity(java.lang.Integer.valueOf(5)) scalac / javac
produces garbage breaks locality guarantees inflates heap requirements indirect (slow) access to the value Object representation -
scala-miniboxing.org Specialization Specialization def identity[T](t: T): T = t def
identity(t: Object): Object = t specialization -
scala-miniboxing.org Specialization Specialization def identity[T](t: T): T = t def
identity(t: Object): Object = t specialization def identity_Z(t: bool): bool = t -
scala-miniboxing.org 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 -
scala-miniboxing.org 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) -
scala-miniboxing.org Specialization Specialization identity(5) identity_I(5) specialization The variant of identity
specialized for int // no boxing! -
scala-miniboxing.org Specialization Specialization def tupled[T1, T2](t1: T1, t2: T2) ...
// 100 methods (102) specialization -
scala-miniboxing.org Specialization Specialization def tupled[T1, T2](t1: T1, t2: T2) ...
// 100 methods (102) specialization -
scala-miniboxing.org Specialization Specialization def tupled[T1, T2](t1: T1, t2: T2) ...
// 100 methods (102) specialization Can we do better? -
scala-miniboxing.org Specialization Specialization the insight the insight One day in
2012 Miguel Garcia walked into my office and said: “From a low-level perspective, there are only values and pointers. Maybe you can use that!” -
scala-miniboxing.org Specialization Specialization the insight the insight One day in
2012 Miguel Garcia walked into my office and said: “From a low-level perspective, there are only values and pointers. Maybe you can use that!” ... LONG DOUBLE INT FLOAT SHORT -
scala-miniboxing.org Specialization Specialization the insight the insight One day in
2012 Miguel Garcia walked into my office and said: “From a low-level perspective, there are only values and pointers. Maybe you can use that!” ... LONG DOUBLE INT FLOAT SHORT a long integer -
scala-miniboxing.org Miniboxing Miniboxing def identity[T](t: T): T = t def
identity(t: Object): Object = t miniboxing -
scala-miniboxing.org Miniboxing Miniboxing def identity[T](t: T): T = t def
identity(t: Object): Object = t miniboxing def identity_M(..., t: long): long = t -
scala-miniboxing.org 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 -
scala-miniboxing.org 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 -
scala-miniboxing.org Miniboxing Miniboxing identity(3) identity_M(..., int2minibox(3)) miniboxing The miniboxed variant
of identity inflates heap requirements -
scala-miniboxing.org Miniboxing Miniboxing identity(3) identity_M(..., int2minibox(3)) miniboxing The miniboxed variant
of identity inflates heap requirements produces garbage -
scala-miniboxing.org Miniboxing Miniboxing identity(3) identity_M(..., int2minibox(3)) miniboxing The miniboxed variant
of identity inflates heap requirements produces garbage indirect (slow) access to the value -
scala-miniboxing.org Miniboxing Miniboxing identity(3) identity_M(..., int2minibox(3)) miniboxing The miniboxed variant
of identity inflates heap requirements produces garbage breaks locality guarantees indirect (slow) access to the value -
scala-miniboxing.org What is miniboxing? Why use it? Conclusion How to
use it? Benchmarks -
scala-miniboxing.org PureImage PureImage • has very nice abstractions – generalizes
over input, output format – generalizes over pixel format – provides collection-like mapping over images • liked it a lot -
scala-miniboxing.org PureImage PureImage • took the usual path to using
miniboxing – code up a mock-up – become familiar with the problem – try out miniboxing on a small scale – then extend to the whole program [not yet] -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up abstract class Image[Repr: Pixel] {
def width: Int def height: Int def apply(x: Int, y: Int): Repr def map[Repr2: Pixel](f: Image[Repr] => Generator[Repr2]): Image[Repr2] } -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up abstract class Image[Repr: Pixel] {
def width: Int def height: Int def apply(x: Int, y: Int): Repr def map[Repr2: Pixel](f: Image[Repr] => Generator[Repr2]): Image[Repr2] } What's a generator? -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up abstract class Generator[Repr: Pixel] {
def width: Int def height: Int def generate(x: Int, y: Int): Repr } -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up abstract class Generator[Repr: Pixel] {
def width: Int def height: Int def generate(x: Int, y: Int): Repr } Why generic? What is pixel? -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up Image on disk Indexed colors
Loaded image 8-bit RGBA channels -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up Image on disk Indexed colors
Loaded image 8-bit RGBA channels Transformed image 8-bit RGBA channels -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up Image on disk Indexed colors
Loaded image 8-bit RGBA channels Transformed image 8-bit RGBA channels Transformed image 8-bit RGBA channels ... -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up Image on disk Indexed colors
Loaded image 8-bit RGBA channels Transformed image 8-bit RGBA channels Image on disk Indexed colors Transformed image 8-bit RGBA channels ... -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up Image on disk Indexed colors
Loaded image 8-bit RGBA channels Transformed image 8-bit RGBA channels Image on disk Indexed colors Transformed image 8-bit RGBA channels ... discretization after each filter => artifacts -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up Image on disk Indexed colors
Loaded image 8-bit RGBA channels Transformed image 8-bit RGBA channels Image on disk Indexed colors Transformed image 8-bit RGBA channels ... discretization after each filter => artifacts double precision RGBA double precision RGBA -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up Image on disk Indexed colors
Loaded image 8-bit RGBA channels Transformed image 8-bit RGBA channels Image on disk Indexed colors Transformed image 8-bit RGBA channels ... discretization after each filter => artifacts double precision RGBA double precision RGBA discretization only when saving the file => better quality -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up Image on disk Indexed colors
Loaded image 8-bit RGBA channels Transformed image 8-bit RGBA channels Image on disk Indexed colors Transformed image 8-bit RGBA channels ... discretization after each filter => artifacts double precision RGBA double precision RGBA discretization only when saving the file => better quality Pixel representation -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up abstract class Pixel[Repr: Manifest] {
def r(t: Repr): Double // red def g(t: Repr): Double // green def b(t: Repr): Double // blue def a(t: Repr): Double // alpha def pack(r: Double, g: Double, b: Double, a: Double): Repr ... } -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up abstract class Pixel[Repr: Manifest] {
def r(t: Repr): Double // red def g(t: Repr): Double // green def b(t: Repr): Double // blue def a(t: Repr): Double // alpha def pack(r: Double, g: Double, b: Double, a: Double): Repr ... } All transformations work on double precision FP numbers -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up abstract class Pixel[Repr: Manifest] {
def r(t: Repr): Double // red def g(t: Repr): Double // green def b(t: Repr): Double // blue def a(t: Repr): Double // alpha def pack(r: Double, g: Double, b: Double, a: Double): Repr ... } All transformations work on double precision FP numbers But the data can be encoded differently -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up object RGBA extends Pixel[Int] {
... } object RGBAExtended extends Pixel[Long] { ... } -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up object RGBA extends Pixel[Int] {
... } object RGBAExtended extends Pixel[Long] { ... } Encoding all channels -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up object RGBA extends Pixel[Int] {
... } object RGBAExtended extends Pixel[Long] { ... } Encoding all channels case class DiscreteChannels[T](r: T, g: T, b: T, a: T) object FullPixel extends FourChannelPixel[Double] object HalfPixel extends FourChannelPixel[Float] -
scala-miniboxing.org PureImage Mock-up PureImage Mock-up object RGBA extends Pixel[Int] {
... } object RGBAExtended extends Pixel[Long] { ... } Encoding all channels case class DiscreteChannels[T](r: T, g: T, b: T, a: T) object FullPixel extends FourChannelPixel[Double] object HalfPixel extends FourChannelPixel[Float] Storing channels individually -
scala-miniboxing.org What is miniboxing? Why use it? Conclusion How to
use it? Benchmarks -
scala-miniboxing.org build.sbt build.sbt resolvers += Resolver.sonatypeRepo("snapshots") libraryDependencies += "org.scala-miniboxing.plugins" %%
"miniboxing-runtime" % "0.4-SNAPSHOT" addCompilerPlugin("org.scala-miniboxing.plugins" %% "miniboxing-plugin" % "0.4-SNAPSHOT") -
scala-miniboxing.org build.sbt build.sbt resolvers += Resolver.sonatypeRepo("snapshots") libraryDependencies += "org.scala-miniboxing.plugins" %%
"miniboxing-runtime" % "0.4-SNAPSHOT" addCompilerPlugin("org.scala-miniboxing.plugins" %% "miniboxing-plugin" % "0.4-SNAPSHOT") Release 0.4 in the works now -
scala-miniboxing.org build.sbt build.sbt scalacOptions ++= "-P:minibox:hijack" :: // transform @specialized
into @miniboxed "-P:minibox:mark-all" :: // mark all type parameters as @miniboxed "-P:minibox:log" :: // explain how classes are transformed "-P:minibox:warn" :: // warn for suboptimal code "-P:minibox:warn-all" :: // warn for suboptimal code across projects Nil -
scala-miniboxing.org build.sbt build.sbt scalacOptions ++= "-P:minibox:hijack" :: // transform @specialized
into @miniboxed "-P:minibox:mark-all" :: // mark all type parameters as @miniboxed "-P:minibox:log" :: // explain how classes are transformed "-P:minibox:warn" :: // warn for suboptimal code "-P:minibox:warn-all" :: // warn for suboptimal code across projects Nil Huh? What's the difference? -
scala-miniboxing.org warn vs warn-all warn vs warn-all scala> 3 ::
Nil // under -P:minibox:warn res0: List[Int] = List(3) -
scala-miniboxing.org warn vs warn-all warn vs warn-all scala> 3 ::
Nil // under -P:minibox:warn res0: List[Int] = List(3) scala> 3 :: Nil // under -P:minibox:warn-all <console>:8: warning: The method List.:: would benefit from miniboxing type parameter B, since it is instantiated by a primitive type. 3 :: Nil ^ res0: List[Int] = List(3) -
scala-miniboxing.org warn vs warn-all warn vs warn-all scala> 3 ::
Nil // under -P:minibox:warn res0: List[Int] = List(3) scala> 3 :: Nil // under -P:minibox:warn-all <console>:8: warning: The method List.:: would benefit from miniboxing type parameter B, since it is instantiated by a primitive type. 3 :: Nil ^ res0: List[Int] = List(3) -
scala-miniboxing.org warn vs warn-all warn vs warn-all scala> 3 ::
Nil // under -P:minibox:warn res0: List[Int] = List(3) scala> 3 :: Nil // under -P:minibox:warn-all <console>:8: warning: The method List.:: would benefit from miniboxing type parameter B, since it is instantiated by a primitive type. 3 :: Nil ^ res0: List[Int] = List(3) Warning for the scala library :) -
scala-miniboxing.org warn vs warn-all warn vs warn-all scala> 3 ::
Nil // under -P:minibox:warn res0: List[Int] = List(3) scala> 3 :: Nil // under -P:minibox:warn-all <console>:8: warning: The method List.:: would benefit from miniboxing type parameter B, since it is instantiated by a primitive type. 3 :: Nil ^ res0: List[Int] = List(3) Warning for the scala library :) Across projects, not limited to the program being compiled. -
scala-miniboxing.org Alex Prokopec, axel22.github.io designer of the parallel collections •
performance (on the JVM) is magic -
scala-miniboxing.org Alex Prokopec, axel22.github.io designer of the parallel collections •
performance (on the JVM) is magic • specialization (in scalac) is black magic -
scala-miniboxing.org Alex Prokopec, axel22.github.io designer of the parallel collections •
performance (on the JVM) is magic • specialization (in scalac) is black magic – “know the conditions of specialization” – point n: “Use Traits” – point n+1: “Don't use Traits” – … and other 10 pieces of advice ... – is your code running at max performance? • who knows? -
scala-miniboxing.org Alex Prokopec, axel22.github.io designer of the parallel collections •
performance (on the JVM) is magic • specialization (in scalac) is black magic – “know the conditions of specialization” – point n: “Use Traits” – point n+1: “Don't use Traits” – … and other 10 pieces of advice ... – is your code running at max performance? • who knows? Can we do something about this? -
scala-miniboxing.org Guidance Guidance scala> def identity[@miniboxed T](t: T) = t
foo: [T](t: T)T let's see how miniboxed identity can be used... -
scala-miniboxing.org Guidance Guidance scala> identity(3) res1: Int = 3 scala>
identity("3") res2: String = 3 -
scala-miniboxing.org Guidance Guidance scala> identity(3) res1: Int = 3 scala>
identity("3") res2: String = 3 scala> identity[Any](3) <console>:9: warning: Using the type argument "Any" for the miniboxed type parameter T of method identity is not specific enough, as it could mean either a primitive or a reference type. Although method foo is miniboxed, it won't benefit from specialization: identity[Any](3) ^ res3: Any = 3 -
scala-miniboxing.org Guidance Guidance scala> identity(3) res1: Int = 3 scala>
identity("3") res2: String = 3 scala> identity[Any](3) <console>:9: warning: Using the type argument "Any" for the miniboxed type parameter T of method identity is not specific enough, as it could mean either a primitive or a reference type. Although method foo is miniboxed, it won't benefit from specialization: identity[Any](3) ^ res3: Any = 3 what if identity wasn't miniboxed? -
scala-miniboxing.org Guidance Guidance scala> def foo[T](t: T) = t foo:
[T](t: T)T scala> def bar[T](t: T) = foo(t) bar: [T](t: T)T -
scala-miniboxing.org Guidance Guidance scala> def foo[T](t: T) = t foo:
[T](t: T)T scala> def bar[T](t: T) = foo(t) bar: [T](t: T)T scala> bar(3) <console>:10: warning: The method bar would benefit from miniboxing type parameter T, since it is instantiated by a primitive type. bar(3) ^ res1: Int = 3 -
scala-miniboxing.org Guidance Guidance scala> def foo[T](t: T) = t foo:
[T](t: T)T bar is generic, let's add @miniboxed scala> def bar[T](t: T) = foo(t) bar: [T](t: T)T scala> bar(3) <console>:10: warning: The method bar would benefit from miniboxing type parameter T, since it is instantiated by a primitive type. bar(3) ^ res1: Int = 3 -
scala-miniboxing.org Guidance Guidance scala> def foo[T](t: T) = t foo:
[T](t: T)T scala> def bar[@miniboxed T](t: T) = foo(t) <console>:8: warning: The method foo would benefit from miniboxing type parameter T, since it is instantiated by miniboxed type parameter T of method bar. def bar[@miniboxed T](t: T) = foo(t) ^ bar: [T](t: T)T -
scala-miniboxing.org Guidance Guidance scala> def foo[T](t: T) = t foo:
[T](t: T)T scala> def bar[@miniboxed T](t: T) = foo(t) <console>:8: warning: The method foo would benefit from miniboxing type parameter T, since it is instantiated by miniboxed type parameter T of method bar. def bar[@miniboxed T](t: T) = foo(t) ^ bar: [T](t: T)T scala> bar(3) res1: Int = 3 -
scala-miniboxing.org Guidance Guidance scala> def foo[T](t: T) = t foo:
[T](t: T)T Why? Because the miniboxed bar should call miniboxed foo, but foo is not miniboxed... scala> def bar[@miniboxed T](t: T) = foo(t) <console>:8: warning: The method foo would benefit from miniboxing type parameter T, since it is instantiated by miniboxed type parameter T of method bar. def bar[@miniboxed T](t: T) = foo(t) ^ bar: [T](t: T)T scala> bar(3) res1: Int = 3 -
scala-miniboxing.org Guidance Guidance scala> def foo[@miniboxed T](t: T) = t
foo: [T](t: T)T scala> def bar[@miniboxed T](t: T) = foo(t) bar: [T](t: T)T -
scala-miniboxing.org Guidance Guidance scala> def foo[@miniboxed T](t: T) = t
foo: [T](t: T)T scala> def bar[@miniboxed T](t: T) = foo(t) bar: [T](t: T)T scala> bar(3) res1: Int = 3 -
scala-miniboxing.org Guidance Guidance scala> def foo[@miniboxed T](t: T) = t
foo: [T](t: T)T scala> def bar[@miniboxed T](t: T) = foo(t) bar: [T](t: T)T scala> bar(3) res1: Int = 3 no warning, everything is specialized -
scala-miniboxing.org Guidance Guidance • “optimized trace” – one miniboxed method
calling another • data uses miniboxing encoding – three patterns • initiator – starts an optimized trace • propagator – propagates it • inhibitor – goes back to boxed :( -
scala-miniboxing.org Guidance Guidance • “optimized trace” – one miniboxed method
calling another • data uses miniboxing encoding – three patterns • initiator – starts an optimized trace • propagator – propagates it • inhibitor – goes back to boxed :( Full tutorial on the website -
scala-miniboxing.org What is miniboxing? Why use it? Conclusion How to
use it? Benchmarks -
scala-miniboxing.org Benchmarks Benchmarks on the linked list on the linked
list • work with Aymeric Genet (github: @MelodyLucid) • mock-up of Scala linked list – Function1 / Function2 / Tuple2 – Traversable / TraversableLike – Iterator / Iterable / IterableLike – LinearSeqOptimized – Builder / CanBuildFrom -
scala-miniboxing.org Benchmarks Benchmarks on the linked list on the linked
list • work with Aymeric Genet (github: @MelodyLucid) • mock-up of Scala linked list – Function1 / Function2 / Tuple2 – Traversable / TraversableLike – Iterator / Iterable / IterableLike – LinearSeqOptimized – Builder / CanBuildFrom -
scala-miniboxing.org Benchmarks Benchmarks on the linked list on the linked
list • benchmark: Least Squares Method -
scala-miniboxing.org Benchmarks Benchmarks on the linked list on the linked
list • benchmark: Least Squares Method -
scala-miniboxing.org Benchmarks Benchmarks on the linked list (infinite heap) on
the linked list (infinite heap) -
scala-miniboxing.org Benchmarks Benchmarks on the linked list (infinite heap) on
the linked list (infinite heap) 1.7x faster with infinite heap -
scala-miniboxing.org Benchmarks Benchmarks on the linked list (limited heap) on
the linked list (limited heap) -
scala-miniboxing.org Benchmarks Benchmarks on the linked list (limited heap) on
the linked list (limited heap) 3x faster with limited heap -
scala-miniboxing.org Benchmarks Benchmarks on the Spire library (Complex) on the
Spire library (Complex) miniboxed specialized generic -
scala-miniboxing.org Benchmarks Benchmarks on the Spire library (RexBench) on the
Spire library (RexBench) miniboxed specialized generic -
scala-miniboxing.org Benchmarks Benchmarks on the linked list (bytecode) on the
linked list (bytecode) generic miniboxed specialized -
scala-miniboxing.org Benchmarks Benchmarks on the Spire library (bytecode) on the
Spire library (bytecode) generic miniboxed specialized -
scala-miniboxing.org What is miniboxing? Why use it? Conclusion How to
use it? Benchmarks -
scala-miniboxing.org 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 • Dmitry Petrashko, for the many cool discussions we had • Ilya Klyuchnikov and Pablo Guerrero - fixes and commits • 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!) -
scala-miniboxing.org Miniboxed Encoding • ScalaDays 2014 Talk https://www.parleys.com/play/53a7d 2d0e4b0543940d9e567 •
OOPSLA '13 Paper http://infoscience.epfl.ch/ record/188060 Clipart from www.clipartpanda.com -
scala-miniboxing.org Miniboxed Encoding • ScalaDays 2014 Talk https://www.parleys.com/play/53a7d 2d0e4b0543940d9e567 •
OOPSLA '13 Paper http://infoscience.epfl.ch/ record/188060 • OOPSLA Talk https://speakerdeck.com/vladureche/ late-data-layout-ooplsa-talk (or the Scala Bay talk) • OOPSLA '14 Paper http://infoscience.epfl.ch/ • record/200963 Code Transformation Related to value classes and multi-stage programming scala-ldl.org Clipart from www.clipartpanda.com -
scala-miniboxing.org Miniboxed Encoding • ScalaDays 2014 Talk https://www.parleys.com/play/53a7d 2d0e4b0543940d9e567 •
OOPSLA '13 Paper http://infoscience.epfl.ch/ record/188060 Other Considerations • Function Encoding (Bucharest FP) https://github.com/ miniboxing/miniboxing- plugin/blob/wip/docs/ 2014-08-miniboxing-bjug.pdf • The Quirks of Miniboxing (PDXScala) https://www.youtube.com/watch? v=g5yFlQySQ5k • OOPSLA Talk https://speakerdeck.com/vladureche/ late-data-layout-ooplsa-talk (or the Scala Bay talk) • OOPSLA '14 Paper http://infoscience.epfl.ch/ • record/200963 Code Transformation Related to value classes and multi-stage programming scala-ldl.org Clipart from www.clipartpanda.com -
scala-miniboxing.org Clipart from www.clipartpanda.com Miniboxed Encoding • ScalaDays 2014 Talk
https://www.parleys.com/play/53a7d 2d0e4b0543940d9e567 • OOPSLA '13 Paper http://infoscience.epfl.ch/ record/188060 Other Considerations • Function Encoding (Bucharest FP) https://github.com/ miniboxing/miniboxing- plugin/blob/wip/docs/ 2014-08-miniboxing-bjug.pdf • The Quirks of Miniboxing (PDXScala) https://www.youtube.com/watch? v=g5yFlQySQ5k • OOPSLA Talk https://speakerdeck.com/vladureche/ late-data-layout-ooplsa-talk (or the Scala Bay talk) • OOPSLA '14 Paper http://infoscience.epfl.ch/ • record/200963 Code Transformation Related to value classes and multi-stage programming scala-ldl.org scala-miniboxing.org -
scala-miniboxing.org ScalaTeam @ EPFL • YinYang frontend multi-stage execution –
based on macro transformations – Vojin Jovanovic, Sandro Stucki https://github.com/vjovanov/yin-yang -
scala-miniboxing.org ScalaTeam @ EPFL • Scala.js backend – compiles Scala
to JavaScript – Sébastien Doeraene, Tobias Schlatter http://www.scala-js.org/ www -
scala-miniboxing.org ScalaTeam @ EPFL • Lightweight Modular Staging – program
optimization – Tiark Rompf + pretty much everyone http://scala-lms.github.io/ www -
scala-miniboxing.org ScalaTeam @ EPFL • Dependent Object Types calculus –
core type system of the dotty compiler – Nada Amin, Tiark Rompf https://github.com/TiarkRompf/minidot https://github.com/lampepfl/dotty -
scala-miniboxing.org ScalaTeam @ EPFL • Pickling framework and Spores –
support for distributed programming – Heather Miller, Philipp Haller + others https://github.com/scala/pickling https://github.com/heathermiller/spores -
scala-miniboxing.org ScalaTeam @ EPFL • Staged Parser-combinators – fast parser
combinators through staging – Manohar Jonnalagedda + others https://github.com/manojo/experiments -
scala-miniboxing.org ScalaTeam @ EPFL • dotty compiler – compiler for
Scala but with the DOT type system – Martin Odersky, Dmitry Petrashko + many others https://github.com/lampepfl/dotty -
scala-miniboxing.org ScalaTeam @ EPFL • scala.meta metaprogramming support – Improved
reflection, macros, and many more – Eugene Burmako, Denys Shabalin + others http://scalameta.org/ www -
scala-miniboxing.org ScalaTeam @ EPFL • scaladyno plugin – giving Scala
a dynamic language look and feel – Cédric Bastin, Vlad Ureche https://github.com/scaladyno/scaladyno-plugin -
scala-miniboxing.org ScalaTeam @ EPFL • miniboxing specialization – LDL transformation
– Vlad Ureche, Aymeric Genêt + others http://scala-miniboxing.org/ www -
scala-miniboxing.org ScalaTeam @ EPFL • ScalaBlitz optimization framework – macro-based
collection optimization – Dmitry Petrashko, Aleksandar Prokopec http://scala-blitz.github.io/ www -
scala-miniboxing.org ScalaTeam @ EPFL • LMS-Kappa protein simulator – using
multi-stage programming for performance – Sandro Stucki https://github.com/sstucki/lms-kappa -
scala-miniboxing.org ScalaTeam @ EPFL • Odds probabilistic programming framework –
using scala-virtualized and macros – Sandro Stucki https://github.com/sstucki/odds -
scala-miniboxing.org ScalaTeam @ EPFL • Type debugger for Scala –
debugging aid for Scala type errors – Hubert Plociniczak http://lampwww.epfl.ch/~plocinic/ type-debugger-tutorial/ www -
scala-miniboxing.org ScalaTeam @ EPFL • ScalaMeter benchmarking framework – google
caliper for scala – Aleksandar Prokopec http://scalameter.github.io/ www -
scala-miniboxing.org ScalaTeam @ EPFL • Vector implementation using RRB trees
– improved performance for Scala collections – Nicolas Stucki https://github.com/nicolasstucki/scala-rrb-vector www