Ruby などの言語 (MRI を実行している場合、バイトコードにコンパイルされていないことを意味します) は、メソッドやループ本体などの実行が必要になるたびに実際に解析されますか? つまり、ループを実行するには、その本体をN回解析する必要がありますか?
私は常に、これらすべてのプログラムがブートストラップで一度に解析され、「厳密に型指定された」ステートメント ツリーなどに変換されると考えていました。そうではありませんか?
Ruby などの言語 (MRI を実行している場合、バイトコードにコンパイルされていないことを意味します) は、メソッドやループ本体などの実行が必要になるたびに実際に解析されますか? つまり、ループを実行するには、その本体をN回解析する必要がありますか?
私は常に、これらすべてのプログラムがブートストラップで一度に解析され、「厳密に型指定された」ステートメント ツリーなどに変換されると考えていました。そうではありませんか?
解釈されたというのは、定義が非常に緩い言葉です。機械語命令でさえ、プロセッサによって解釈されます。
一般に、実行前にコンパイルされる言語と、コンパイルプロセスを持たず、インタープリターと呼ばれる別のプログラム内で実行される言語とは区別されます。後者のタイプの言語は、インタープリター言語と呼ばれることがよくあります。
場合によっては、線が明確ではありません。
exec
、通常のコンパイル プロセスをバイパスして、実行時にコードを生成および実行できる機能がある場合があります。私は意地悪く言って、ソフトウェア (Ruby、Python、Java) であろうとハードウェア (C、C++) インタープリターであろうと、ほぼすべてのプログラミング言語がインタープリターされると言います :)
本当の答えとして、Rubyの内部実装については知りませんが、彼らは何度も何度もステートメントを解析しないと確信しています。元の実装ではバイトコードを使用していませんが (または既に移行したのでしょうか?)、何らかの中間表現を使用しているため (C 拡張を記述したい場合によくわかります)、それらを何度も実行するだけです。