Ubuntu 20.04 LTSにtruffleruby 21.1.0をインストールする

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

Ruby好きです。あまり得意ではないのですが、Ruby好きです。
しかし、ここ6年ほど触ってきませんでした。
特段、必要なかったというのもありますが、簡単なスクリプトを書くにはBashで十分だったのとディストリビューションに入っているRubyが古かったりして使いづらくなったり、スピード的に満足できなかったりして使わなくなっていました。一時期JRubyも使ってみようとしましたが、1回目の起動時間の重さに使わなくなっていました。

しかし、GraalVMで動く[truffleruby](https://www.graalvm.org/ruby/)というのがあると知りました。
パフォーマンスがよかったりするらしいので久しぶりに使ってみるかと思ったのが発端です。

Ruby
https://www.graalvm.org/ruby/

# 1. 環境とインストールするtrufflerubyのバージョン

- OS
    - Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-74-generic x86_64)
- truffleruby
    - 21.1.0


# 2. 必要なパッケージをインストール

```shell-session
$ sudo apt update && sudo apt upgrade 
$ sudo apt install -y build-essential curl file git libssl-dev zlib1g-dev
```

# 3. brewをインストール

```shell-session
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)" 
$ test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv) 
$ test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv) 
$ echo "eval $($(brew --prefix)/bin/brew shellenv)" >>~/.profile 
```

# 4. ruby-buildをインストール

ruby-build は --HEADでインストールしないと途中でエラーが出ます。

```shell-session
$ brew install ruby-build --HEAD
```

# 5. rbenvをインストール
同時にruby-buildのpluginもいれておきます。

```
$ brew install rbenv 
$ mkdir -p "$(rbenv root)"/plugins 
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
```

# 6. trufflerubyをインストール

```
$ rbenv install --list | grep truffleruby 
$ rbenv install truffleruby-21.1.0 
```

## 6-1. trufflerubyの動作確認

```shell-session
$ ls -la /home/ubuntu/.rbenv/versions/truffleruby-21.1.0/bin/ruby
$ /home/ubuntu/.rbenv/versions/truffleruby-21.1.0/bin/ruby --version
truffleruby 21.1.0, like ruby 2.7.2, GraalVM CE Native [x86_64-linux]
$ /home/ubuntu/.rbenv/versions/truffleruby-21.1.0/bin/ruby -e 'print RbConfig::CONFIG["prefix"]'
/home/ubuntu/.rbenv/versions/truffleruby-21.1.0
```

# 7. rbenvの設定

```shell-session
$ ruby_home=$(/home/ubuntu/.rbenv/versions/truffleruby-21.1.0/bin/ruby -e 'print RbConfig::CONFIG["prefix"]') 
$ echo $RBENV_ROOT 
$ rbenv root 
$ RBENV_ROOT=$(rbenv root)
$ eval "$(rbenv init -)" 
$ rbenv init
$ ln -s "$ruby_home" "$RBENV_ROOT/versions/truffleruby" 
$ echo "eval \"$(rbenv init -)\"" >> ~/.profile
```



# 7-1. 確認

```shell-session
$ rbenv shell truffleruby
$ ruby --version 
truffleruby 21.1.0, like ruby 2.7.2, GraalVM CE Native [x86_64-linux]
```

# 8. trufflerubyをデフォルトのrubyに設定

```shell-session
$ rbenv local truffleruby
```

# 9. ベンチマークテスト

こちらのベンチマークをやってみる

[TruffleRubyを動かしてみた - Qiita](https://qiita.com/aosho235/items/e96303c5370cf365c102)

以下のファイルを作成

```hoge.rb
#!/usr/bin/env ruby

require 'benchmark/ips'

def call
  i = 0
  while i < 1000
    i += 1
  end
end

call; call; call; call; call # JITを効かせたいがために複数回呼び出す

Benchmark.ips do |x|
  x.report('call') { call }
  x.compare!
end
```

gemで`benchmark-ips`をインストール

```shell-session
$ gem install benchmark-ips
```

## 9-1. ベンチマーク結果


```shell-session
ubuntu@tuffleruby:~$ ruby ./hoge.rb
Warming up --------------------------------------
                call   306.675k i/100ms
Calculating -------------------------------------
                call      3.147M (±14.4%) i/s -     15.334M in   5.063475s
```

■ベンチマーク環境

- CPU:
    - model name: AMD Ryzen Embedded V1605B with Radeon Vega Gfx
    - number: 4 CPU
- Memory 
    - Total: 4G

# 10. まとめ

Rubyは生産性の高い言語だと思います。

死んだとかなんだか言われることもありますが、JavaもGraalVMで起動時間が短くなりシングルバイナリーで動くCloud Nativeな時代にフィットするものとして復活してきました。
Rubyもtrufflerubyにより起動時間が短くてシングルバイナリーで使いやすくなれば逆転のチャンスがあると思います。