TruffleMate - A Reflective Execution Environment implemented using Oracle's Truffle Framework
Mate is an approach for building Virtual Machines that expose their whole structure and behavior to the language level Mate. A MOP then enables to adapt reflectively the Virtual Machine behavior at run time. TruffleMate is an implementation of the Mate approach in Truffle that started as a branch from the TruffleSOM VM.
Moreover, TruffleMATE implements an optimization model for making the VM not only reflective, but also efficient, presenting similar performance results than standard VMs when considering peak performance.
Obtaining and Running TruffleMate
To checkout the code:
git clone https://github.com/charig/TruffleMate.git
Then, TruffleMate can be build with Ant:
ant jar or ant compile
Afterwards, the tests can be executed with:
./som -G -cp Smalltalk:TestSuite TestHarness
A simple Hello World program is executed with:
./som -G -cp Smalltalk:Examples Hello
The --mate -activateMate options runs the system with the Mate MOP enabled. Note that the classpath must be also extended with the MOP classes found under Smalltalk/MATE. The -G runs TruffleMATE in interpreter mode. For running in combination with GRAAL install graal and remove the -G option.
When working on TruffleMate, for instance in Eclipse, it is helpful to download the source files for Truffle as well:
Information on previous authors are included in the AUTHORS file. This code is distributed under the MIT License. Please see the LICENSE file for details.
TruffleSOM implements a file-based Smalltalk with most of the language features common to other Smalltalks. This includes support for objects, classes, methods, closures/blocks/lambdas, non-local returns, and typical reflective operations, e.g., method invocation or object field access.
The implementation of TruffleSOM is about 3500 lines of code in size and is a concise but comprehensive example for how to use the Truffle framework to implement standard language features.
Its parser creates a custom AST that is geared towards representing the executable semantics. Thus, we did not include AST nodes that have structural purpose only. Instead, we concentrated on the AST nodes that are relevant to express Smalltalk language semantics.
Currently TruffleSOM demonstrates for instance:
- method invocation: som.interpreter.nodes.MessageSendNode
- usage of Truffle frames
- argument passing som.interpreter.nodes.ArgumentInitializationNode
- associating AST tree nodes with source code, e.g., som.compiler.Parser.unaryMessage(..)
- support for lexical scoping and access from nested blocks, cf. ContextualNode subclasses and som.interpreter.ContextualNode.determineContext(..)
- usage of control-flow exception for
- non-local returns, cf. som.interpreter.nodes.ReturnNonLocalNode.executeGeneric(..) as well as som.interpreter.nodes.ReturnNonLocalNode.CatchNonLocalReturnNode.executeGeneric(..)
- looping: som.interpreter.nodes.specialized.AbstractWhileNode as well as som.interpreter.nodes.specialized.IntToDoMessageNode