*.rbc の owner と permission

当然のように、Rubinius も調べてみる。


foo.rb:

def hello(name)
  puts "Hello #{name}!"
end


main.rb:

require 'foo'
hello('World')


result:

$ ls -l main.rb* foo.rb*   # 最初は *.rbc はない
-rw-r--r--   1 kwatch  kwatch  44 Feb 13 18:35 foo.rb
-rw-r--r--   1 kwatch  kwatch  29 Feb 13 18:36 main.rb
$ rubinius main.rb         # rubinius が *.rbc を生成
Hello World!
$ ls -l main.rb* foo.rb*   # *.rbc の permission は 0644
-rw-r--r--   1 kwatch  kwatch   44 Feb 13 18:35 foo.rb
-rw-r--r--   1 kwatch  kwatch  535 Feb 13 18:36 foo.rbc
-rw-r--r--   1 kwatch  kwatch   29 Feb 13 18:36 main.rb
-rw-r--r--   1 kwatch  kwatch  308 Feb 13 18:36 main.rbc
$ rm *.rbc                 # *.rbc を削除
$ chmod 400 main.rb        # owner の読み取り権限だけを設定
$ sudo chown root foo.rb   # owner を変更
$ sudo chmod u-w foo.rb    # owner の書き込み権限を削除
$ ls -l main.rb* foo.rb*   # 現在の状態を確認
-r--r--r--   1 root    kwatch  44 Feb 13 18:35 foo.rb
-r--------   1 kwatch  kwatch  29 Feb 13 18:36 main.rb
$ rubinius main.rb         # もう一度 *.rbc を生成
Hello World!
$ ls -l main.rb* foo.rb*   # *.rbc の permission は変わらず
-r--r--r--   1 root    kwatch   44 Feb 13 18:35 foo.rb
-rw-r--r--   1 kwatch  kwatch  535 Feb 13 18:44 foo.rbc
-r--------   1 kwatch  kwatch   29 Feb 13 18:36 main.rb
-rw-r--r--   1 kwatch  kwatch  308 Feb 13 18:44 main.rbc


というわけで、結論:

  • Rubinius では、require したファイルだけでなく、コマンドラインで指定したファイルもコンパイルされて *.rbc が作成される。
  • *.rbc ファイルでは、元ファイルである *.rb の owner や permission は考慮されない。


Rubinius と YARV って、バイトコードに互換性はないよね。Rubinius が .rbc という拡張子を使ったら、YARV はそれ以外の拡張子を使わないといけないじゃん! どんな拡張子にするんだろう。


・・・と、コンパイル機能が実装されてないのに心配してみた。