JRuby+Truffle - a High-Performance Truffle Backend for JRuby

The Truffle runtime of JRuby is an experimental implementation of an interpreter for JRuby using the Truffle AST interpreting framework and the Graal compiler. It’s an alternative to the IR interpreter and bytecode compiler. The goal is to be significantly faster, simpler and to have more functionality than other implementations of Ruby.

JRuby+Truffle is a project of Oracle Labs and academic collaborators at the Institut für Systemsoftware at Johannes Kepler University Linz.

Authors

The best way to get in touch with us is to join us in #jruby on Freenode, but you can also Tweet to @chrisgseaton, @nirvdrum or @eregontp, or email chris.seaton@oracle.com.

Using Truffle

To run JRuby in Truffle mode, pass the -X+T option.

JRuby+Truffle is designed to be run with a JVM that has the Graal compiler. The easiest way to get this is via the GraalVM, available from the Oracle Technology Network.

github.com/jruby/jruby/wiki/Downloading-GraalVM

But you can also build it yourself, which you will need to do if you are on the truffle-head branch.

github.com/jruby/jruby/wiki/Building-Graal

You then need to set the JAVACMD environment variable as described on those pages.

$ JAVACMD=... bin/jruby -X+T ...

What to expect

JRuby+Truffle is a research project and is not yet a finished product. Arbitrary programs are very unlikely to run due to missing functionality, and if they do run they are unlikely to run fast yet due to requiring new functionality to be tuned. We are at least a year away from being able to run significant programs without needing new methods to be implemented.

Windows is currently not supported.

How we benchmark

We use the bench9000 benchmarking tool. This includes classic synthetic benchmarks such as mandelbrot, n-body and fannkuch, and also kernels from two real-word Ruby gems, chunky_png and psd.rb.

Research

Also see the Ruby Bibliography, and publications specifically on Truffle and Graal.

Truffle-Specific Functionality

Options

There are runtime configuration options that can be set on the command line with -Xtrufle.option=value. To see a list of these run -Xtruffle....

Truffle Module

The Truffle, Truffle::Debug and Truffle::Interop modules include Truffle-specific functionality. They're documented for the current development version at lafo.ssw.uni-linz.ac.at/graalvm/jruby/doc/.

Debugger

See the documentation of the Truffle::Debug module at lafo.ssw.uni-linz.ac.at/graalvm/jruby/doc/. Truffle::Debug.break will enter a shell and allow to introspect the program.

If you don't want to modify the program to include a call to Truffle::Debug.break you can break the main thread externally. Run with the instrumentation server enabled, -Xtruffle.instrumentation_server_port=8080. Then you can send a message to the runtime to break at the current location:

curl http://localhost:8080/break

Stack Server

To dump the call stacks of a running Ruby program in Truffle, run with the instrumentation server enabled and the passalot option, -Xtruffle.instrumentation_server_port=8080 -Xtruffle.passalot=1. Then you can dump the current call stack of all threads:

curl http://localhost:8080/stacks

Workflow Tool

Truffle is built as part of JRuby, but if you are working on the Truffle code base you may appreciate the jt tool. To use it alias it in your shell function jt { ruby tool/jt.rb $@; }, then run jt --help to see the commands available. You need a standard ruby from your system to run the tool.

For example: