GraalVM promises to be “one VM to rule them all” – a way to “run code faster anywhere”.
The way it does this is using language interpreters written in a framework called Truffle:
Truffle is a framework for implementing languages using nothing more than a simple abstract syntax tree interpreter.
These interpreters turn your code into an AST which can be run on the GraalVM. This gives you:
- JIT compilation and debugging for free – use Chrome DevTools to debug running code.
- interoperability with other Truffle languages – because multiple languages can target the same VM, you can call code in one language from another with no performance penalty when crossing the language barrier.
This article is an amazing technical introduction to the platform. Below, I’ll walk you through getting GraalVM installed and running on your machine.
The community edition of Graal only runs on Linux, so if you’re using a Mac, you’ll need to emulate! Here’s how I did it.
- Download the latest release of Graal.
Install Docker, either by downloading it or using Homebrew (
brew install docker).
cdinto the Graal download directory and start a Docker container as follows:
$ docker run -i -t -v=`pwd`:/graal ubuntu /bin/bash
This will bind-mount your current directory to
/graalinside the container. When you’re in, you can run
cd /graaland use the binaries in there directly.
Installing language packs
GraalVM ships with a JVM and its own versions of
npm, but out of the box you won’t be able to run Ruby, Python, or R.
If you’re like me, the first thing you want to do is play around with Ruby on GraalVM. To do this, you need to install TruffleRuby. GraalVM comes with its own package management tool,
gu, which you can invoke from inside the container:
root# /graal/bin/gu install ruby Downloading: Component catalog Processing component archive: Component ruby Downloading: Component ruby Installing new component: TruffleRuby (org.graalvm.ruby, version 1.0.0-rc4)
Using the debugger
Graal comes with an awesome debugger that lets you step through your code in Chrome DevTools. To do this, you need to allow connections between your container and the host machine.
$ docker run -i -t -v=`pwd`:/graal \ -p 9229:9229/tcp ubuntu /bin/bash
-p flag opens a port on
9229 on both the container and the host. When you run a Graal command and invoke the debugger, you need to tell it to use that port, and to bind to 0.0.0.0 (as by default it binds to 127.0.0.1 which refuses incoming connections from outside the container):
root# /graal/bin/ruby --inspect="0.0.0.0:9229" mycode.rb Debugger listening on port 9229. To start debugging, open the following URL in Chrome: chrome-devtools://devtools/bundled/js_app.html?ws=0.0.0.0:9229/ffffffff84647ae2-ffffffa709c7325d
Graal will print out a URL that you can copy and paste into Chrome which will drop you into a debugger session.
Once you’re up and running, check out Chris Seaton’s excellent Top 10 Things To Do With GraalVM for more cool things to try out.