GraalVMについて調べてみたくなったのでちょっと触ってみます。
getting started
とりあえずDockerで触ってみる
GraalVM公式のGetting Startedを見てみる。
https://www.graalvm.org/docs/getting-started/
Dockerで動かす方法がDocker Containersに書いてあるので、それを参考にとりあえずpullしてbash立ち上げてみる。
docker pull oracle/graalvm-ce:19.0.0
docker run -it oracle/graalvm-ce:19.0.0 bash
動いた
Rubyを使いたい
bashから
gu install ruby
したらインストールできるが、Rubyのインストールに非常に時間がかかるのでRubyをインストールしたimageをbuildしておきたい
Dockerfile
FROM oracle/graalvm-ce:19.0.0
RUN gu install ruby
buildして動かしてみる
docker build -t #{適当な名前} .
docker run -it #{上でつけた名前} bash
bash-4.2# irb
irb(main):001:0> RUBY_ENGINE
=> "truffleruby"
動いた。
Polyglotっぽいことをしてみる
ここを参考に
https://www.graalvm.org/docs/reference-manual/languages/ruby/
test.rb
require 'json'
obj = {
time: Time.now,
msg: 'Hello World',
payload: (1..10).to_a
}
encoded = JSON.dump(obj)
js_obj = Polyglot.eval('js', 'JSON.parse').call(encoded)
puts js_obj[:time]
puts js_obj[:msg]
puts js_obj[:payload].join(' ')
jsのオブジェクトをRubyでputsしています。
bash-4.2# ruby --jvm --polyglot test.rb
2019-05-11 07:31:35 +0000
Hello World
12345678910
動いた
普通のRubyでこのコードを動かすとPolyglotなんてクラスはないので当然コケる
$ ruby test.rb
Traceback (most recent call last):
test.rb:11:in `<main>': uninitialized constant Polyglot (NameError)
ただ、これだけだと「GraalVMであそんでみる」というより、「TruffleRubyのPolyglotクラスを使ってみた」という感じ。
もう少し違う実験をしてみたいと思ってRubyVM::InstructionSequenceで内部処理を覗けないかと思ったけど、さすがにTruffleRubyにはないみたい。
https://bugs.ruby-lang.org/issues/15743