独習mrubyバイトコード[GETSPECIAL][SETSPECIAL]

2018-07-14LearnByteCode, TechJapanese, mruby, mruby/c

GETSPECIAL,SETSPECIAL

Arguments

(現在使用されていない命令)

How it works?

(現在使用されていない命令)

When used?

(現在使用されていない命令)

Note

@miura1729さんのコメントによると、

実はこの2つの命令は今は使われていないのでした。

とあるけれど、もともとなんのためにあったのか?
検索してみるとYARV1のバイトコードにその名前があった。

これは、普通のグローバル変数ではなくて、特殊変数2を扱うために存在するらしい。

確かにmrubyはそのような変数を持っていないので、バイトコード命令が不要というのも理解できた。
命令が予約されているのは、何かmrubyでも元々使うユースケースがあったのだろうか?

githubのissueを検索してみると、まさにその質問があった。

“What are “special” variables? #2735”

まつもとさんの返答は下記の通り。

special variables are variables that look like global variables but have different semantics e.g. $1 or $~ etc.
And currently mruby does not support any special variables (yet).

(yet)というのがどういうニュアンスなのか難しいところだけど、もしかすると将来サポートされる可能性も無くは無い、のかもしれない。

しかし、@miura1729さんのコメントのニュアンスだと、過去には対応していたように読める。
試しに、mruby ver1.0.0を開いてみると、確かにこのときには存在していたようだ。

https://github.com/mruby/mruby/blob/1.0.0/src/vm.c

    CASE(OP_GETSPECIAL) {
      /* A Bx   R(A) := Special[Bx] */
      regs[GETARG_A(i)] = mrb_vm_special_get(mrb, GETARG_Bx(i));
      NEXT;
    }

    CASE(OP_SETSPECIAL) {
      /* A Bx   Special[Bx] := R(A) */
      mrb_vm_special_set(mrb, GETARG_Bx(i), regs[GETARG_A(i)]);
      NEXT;
    }

Reference

https://qiita.com/miura1729/items/256d205bc2a464bfb3c6
http://www.atdot.net/yarv/yarvarch.ja.html
https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#global


  1. YARVとは 
  2. https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#global
    特殊変数とは$&、$1のような変数のこと。Perlから受け継いだそうです。