Please note: This master’s thesis presentation will take place in DC 3317.
Matt
D’Souza,
Master’s
candidate
David
R.
Cheriton
School
of
Computer
Science
Supervisor: Professor Ondřej Lhoták
Parametric polymorphism, also known as generics, is an abstraction that lets programmers define code that behaves independently of the types of values it operates on. Generics is a useful abstraction to enable code reuse and improve the maintainability of software projects.
The approach that a language implementation uses to support parametric polymorphism can have important performance implications. One such approach, erasure, converts generic code to non-generic code that uses a uniform representation for generic data. Erasure is notorious for introducing primitive boxing and other indirections that harm the performance of generic code. More generally, erasure destroys type information that could be used by the language implementation to optimize generic code.
This thesis presents TastyTruffle, a new interpreter for the Scala language. Whereas the standard Scala implementation executes erased Java Virtual Machine (JVM) bytecode, TastyTruffle interprets TASTy, a different representation that has precise type information. This thesis explores how the type information present in TASTy empowers TastyTruffle to implement generic code more effectively. In particular, TASTy’s type information allows TastyTruffle to reify types as objects that can be passed around the interpreter. These reified types are used to support heterogeneous box-free representations of generic values. Reified types also enable TastyTruffle to create specialized, monomorphic copies of generic code that can be easily and reliably optimized by its just-in-time (JIT) compiler.
Empirically, TastyTruffle is competitive with the standard JVM implementation. Both implementations perform similarly on monomorphic workloads, but when generic code is used with multiple types, TastyTruffle consistently outperforms the JVM. TASTy’s type information enables TastyTruffle to find additional optimization opportunities which could not be uncovered with erased JVM bytecode alone.