LoginSignup
6
1

More than 3 years have passed since last update.

Ruby は 1 行ずつ読み込んで実行していく,わけじゃない

Last updated at Posted at 2020-12-22

Ruby の初心者向け記事によく

Ruby は C のようなコンパイラーではなくインタープリターです。プログラムを 1 行ずつ読み込んで実行していきます。

というような記述があります(記述のバリエーションはかなりある)。
間違いです。

正直なところ,この問題に関して私も完全に理解してるわけではありませんが,分かる範囲で誤解を解きたいと思います。

Ruby の処理系1がプログラムを実行する方式は,Ruby 1.9 以降とそれまでとで大きく違っています。

どちらも,Ruby の処理系は,プログラムを読み込むと構文解析を行って,「抽象構文木」(AST: Abstract Syntax Tree)というものを構築します。

Ruby 1.9 未満では,出来上がった抽象構文木のノードを辿りながら処理を実行していきます(知らんけど)。

Ruby 1.9 以降は,抽象構文木を RubyVM という仮想機械の命令列(バイトコードと呼ぶ)に変換し,それを実行していきます。バイトコードへの変換は一種のコンパイルですね。

ですから,昔も今も,Ruby の処理系は「スクリプトを 1 行読み込んでは解釈して実行し,次の行を読み込んでは解釈して実行し,を繰り返す」などということはやっていませんし,Ruby 1.9 以降は一種のコンパイルも行っています。

さらに,Ruby 2.6 になると,JIT コンパイルという技術も導入されました2
これは,RubyVM バイトコードの,頻繁に実行される箇所を実行中に C 言語に変換してコンパイルし,機械語にして実行する,という仕組みです(知らんけど)。

何だか難しいですね。私も分かりません。
ただ,「1 行ずつ読み込んで実行していく」が間違っていることだけ分かってもらえれば記事の目的は果たせました。
ついでに,近年,処理系の技術がものすごく向上・複雑化していて,何がインタープリターで何がコンパイラーか,素人には分からなくなっている,ということも言えそうです。

識者のツッコミ・助言を歓迎します。


  1. Ruby の処理系はいくつかありますが,ここでは最も普及している CRuby を前提とします。 

  2. JIT は just-in-time の頭字語。 

6
1
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
6
1