LoginSignup
1
0

More than 3 years have passed since last update.

GraalVMであそんでみる

Last updated at Posted at 2019-05-11

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0