0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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

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 の頭字語。 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?