aboutsummaryrefslogtreecommitdiffhomepage
path: root/content/posts/2021-10-02/ruby-detect-running-implementation.md
blob: 3826903cf9c4bdc945cef46d7cedcf4f5bd3f988 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
---
title: "[Ruby] 自身を実行している処理系の種類を判定する"
date: 2021-10-02T09:37:50+09:00
draft: false
tags: ["ruby"]
aliases: ['/posts/ruby-detect-running-implementation/']
summary: |
  Ruby には複数の実装があるが、自身を実行している処理系の種類をスクリプト上からどのように判定すればよいだろうか。
---

この記事は Qiita から移植してきたものです。
元 URL: https://qiita.com/nsfisis/items/74d7ffeeebc51b20d791


-----------------------------------



Ruby という言語には複数の実装があるが、それらをスクリプト上からどのようにして programmatically に見分ければよいだろうか。

`Object` クラスに定義されている `RUBY_ENGINE` という定数がこの用途に使える。

参考: [Object::RUBY_ENGINE](https://docs.ruby-lang.org/ja/latest/method/Object/c/RUBY_ENGINE.html)

上記ページの例から引用する:

```shell-session
$ ruby-1.9.1 -ve 'p RUBY_ENGINE'
ruby 1.9.1p0 (2009-03-04 revision 22762) [x86_64-linux]
"ruby"
$ jruby -ve 'p RUBY_ENGINE'
jruby 1.2.0 (ruby 1.8.6 patchlevel 287) (2009-03-16 rev 9419) [i386-java]
"jruby"
```

それぞれの処理系がどのような値を返すかだが、stack overflow に良い質問と回答があった。

[What values for RUBY_ENGINE correspond to which Ruby implementations?](https://stackoverflow.com/a/9894232) より引用:

> | RUBY_ENGINE | Implementation    |
> |:-----------:|:------------------|
> | \<undefined\> | MRI < 1.9         |
> | 'ruby'      | MRI >= 1.9 or REE |
> | 'jruby'     | JRuby             |
> | 'macruby'   | MacRuby           |
> | 'rbx'       | Rubinius          |
> | 'maglev'    | MagLev            |
> | 'ironruby'  | IronRuby          |
> | 'cardinal'  | Cardinal          |


なお、この質問・回答は 2014年になされたものであり、値は変わっている可能性がある。MRI (aka CRuby) については執筆時現在 (2020/12/8) も `'ruby'` が返ってくることを確認済み。

この表にない主要な処理系として、[mruby](https://mruby.org) は `'mruby'` を返す。

[mruby 該当部分のソース](https://github.com/mruby/mruby/blob/ed29d74bfd95362eaeb946fcf7e865d80346b62b/include/mruby/version.h#L32-L35) より引用:

```c
/*
 * Ruby engine.
 */
#define MRUBY_RUBY_ENGINE  "mruby"
```