4

Ruby などの言語 (MRI を実行している場合、バイトコードにコンパイルされていないことを意味します) は、メソッドやループ本体などの実行が必要になるたびに実際に解析されますか? つまり、ループを実行するには、その本体をN回解析する必要がありますか?

私は常に、これらすべてのプログラムがブートストラップで一度に解析され、「厳密に型指定された」ステートメント ツリーなどに変換されると考えていました。そうではありませんか?

4

2 に答える 2

4

解釈されたというのは、定義が非常に緩い言葉です。機械語命令でさえ、プロセッサによって解釈されます。

一般に、実行前にコンパイルされる言語と、コンパイルプロセスを持たず、インタープリターと呼ばれる別のプログラム内で実行される言語とは区別されます。後者のタイプの言語は、インタープリター言語と呼ばれることがよくあります。

場合によっては、線が明確ではありません。

  • 一部の言語は、コンパイルまたは解釈することができます (PHP など)。
  • 一部の解釈されたコードは、実行時にネイティブ マシン命令にコンパイルされる場合があります ( JIT コンパイル)。
  • 一部のコンパイル済み言語にはexec、通常のコンパイル プロセスをバイパスして、実行時にコードを生成および実行できる機能がある場合があります。
于 2010-05-13T12:05:14.027 に答える
4

私は意地悪く言って、ソフトウェア (Ruby、Python、Java) であろうとハードウェア (C、C++) インタープリターであろうと、ほぼすべてのプログラミング言語がインタープリターされると言います :)

本当の答えとして、Rubyの内部実装については知りませんが、彼らは何度も何度もステートメントを解析しないと確信しています。元の実装ではバイトコードを使用していませんが (または既に移行したのでしょうか?)、何らかの中間表現を使用しているため (C 拡張を記述したい場合によくわかります)、それらを何度も実行するだけです。

于 2010-05-13T12:05:44.980 に答える