すべての実装がバイトコードにコンパイルされている場合、Rubyは本当に解釈された言語ですか?

StackOverflow https://stackoverflow.com/questions/717490

質問

選択した回答で 青いルビーについてのこの質問, 、チャックは言う:

現在のRuby実装はすべてByteCodeにコンパイルされています。 Ruby 1.9の時点でSAPの主張に反して、MRI自体にはバイトコードコンパイラが含まれていますが、コンパイルされたバイトコードをディスクに保存する機能は、YARV仮想マシンをマージする過程でどこかに消えました。 JrubyはJava .classファイルにコンパイルされます。 Maglevの詳細はあまりありませんが、その道が必要だと言っても安全だと思われます。

Rubyに関して、この編集/解釈の問題について混乱しています。

Rubyは解釈された言語であることを学びました。だからこそ、Rubyファイルに変更を保存すると、プロジェクトを再構築する必要はありません。

しかし、Rubyの実装がすべてコンパイルされている場合、Rubyは解釈された言語であると言うのはまだ公平ですか?それとも私は何かを誤解していますか?

役に立ちましたか?

解決

はい、Rubyはまだ解釈されている言語であり、より正確には、MatzのRuby通訳(MRI)は、Rubyについて話すときに人々が通常話すことですが、まだ通訳です。コンピレーションステップは、同じコードを何度も解釈して再解釈するよりも実行するのが速いものにコードを減らすために、単にそこにあります。

他のヒント

Bytecodeをコンパイルされているとカウントすると、ほぼすべての言語が「コンパイル」されています。 Emacs Lispもコンパイルされています。ルビーは特別なケースでした。最近まで、 そうではありませんでした bytecodeにコンパイルされました。

言語を特徴付ける有用性に「コンパイルされた」vs.「解釈」と疑問を呈するのは正しいと思います。ただし、有用な区別の1つは、言語がユーザーコードから直接マシンコード(x86アセンブラーなど)を作成するかどうかです。 c、c ++、多くのLISP、およびJITを有効にしたJavaはdoですが、Ruby、Python、およびPerlはそうではありません。

よく知らない人は、「コンパイルされた」個別のマニュアルコンピレーションステップがある言語と「解釈されない」言語を呼び出します。

確かに微妙な質問...それは以前は「解釈された」言語が解析され、実行がより速い中間形式に変換されていましたが、それらを実行する「マシン」はかなり言語固有のプログラムでした。 「コンパイルされた」言語は、代わりに、それが実行されたコンピューターによってサポートされているマシンコード命令に翻訳されました。初期の区別は非常に基本的なものでした。静的にタイプされた言語では、数マシンの指示で可変参照をメモリアドレスにほとんど解決できます。呼び出しフレーム内の変数が参照された場所を正確に知っていました。動的に型付けされた言語では、参照のために(aリストを上げるか、呼び出しフレームを上にする)必要がありました。オブジェクト指向プログラミングの出現により、参照の非即時性は、クラス(タイプ)、メソッド(関数)、さらには構文的な解釈(regexのような埋め込みDSL)など、より多くの概念に拡張されました。

実際、この区別は、70年代後半にさかのぼって、コンパイルされて解釈された間にそれほど多くはありませんでした 言語, 、しかし、それらがコンパイルされた環境または解釈された環境で実行されたかどうか。たとえば、パスカル(私が勉強した最初の高レベルの言語)は、ビルジョイズで最初にカリフォルニア州バークレーで実行されました PXP 通訳、そして後に彼が書いたコンパイラーで PCC. 。コンパイルされた環境と解釈された環境の両方で利用可能な同じ言語。

一部の言語は他の言語よりも動的であり、何かの意味(タイプ、方法、変数)は、実行時間環境に依存します。これは、プログラムの実行に関連する実質的な実行時間メカニズムがコンパイルされているかどうかを意味します。フォース、スモールトーク、ニュース、リスプ、すべてこの例でした。当初、これらの言語は、実行するために非常に多くのメカニズムを必要としていたため、(cまたはfortran)それらは解釈にとって自然でした。

Javaの前でさえ、トリック、スレッド付きのコンピレーション、ジャストインタイムコンピレーションなど、複雑で動的な言語の実行をスピードアップしようとする試みがありました。

しかし、それはJavaだったと思います。これは、コンパイラ/インタープリターのギャップを本当に泥だらけにした最初の広範な言語であり、皮肉なことに、より速く実行されるようにしませんでしたが、どこでも実行されるようにします。 Java BytecodeとVMを独自のマシン言語と「マシン」を定義することにより、Javaは基本的なマシンに近いものにまとめられた言語になろうとしましたが、実際には実際のマシンではありませんでした。

現代の言語は、これらすべての革新と結婚します。伝統的な解釈言語(Ruby、Lisp、Smalltalk、Python、Perl(!)の動的で、オープンエンドの、あなたが何をしていないことを知っていないことはありません。従来のコンパイルされた言語(Java、Scala)の深いタイプベースの静的エラー検出を可能にする仕様の厳密さを持っています。すべて実際のマシンに依存しない表現(JVM)にコンパイルして、1回の任意のセマンティクスを書きます。

それで、コンパイルされたvs.解釈?両方のベストだと思います。すべてのコードはソース(ドキュメント付き)にあり、何でも変更され、効果は即座に単純な操作ができるのとほぼ同じ速さで実行されます。複雑なものはサポートされ、十分に速く、ハードウェアとメモリモデルはプラットフォーム間で一貫しています。

今日の言語のより大きな論争は、おそらくそれらが静的であるか動的にタイプされているかどうかです。つまり、それらがどれだけ速く実行されるかということです。情報)またはテストと生産でエラーが発生しますか。

Rubyプログラムをインタラクティブに使用して実行できます IRB, 、インタラクティブなルビーシェル。中間バイテコードを生成する可能性がありますが、従来の意味では「コンパイラ」ではありません。

コンパイルされた言語は、通常、バイトコードとは対照的に、マシンコードにコンパイルされます。ただし、一部のバイトコードジェネレーターは、実際にバイトコードをマシンコードにさらにコンパイルできます。

BYTEコード自体は、ユーザーと仮想マシンによって書かれたリテラルコードの間の中間ステップにすぎませんが、仮想マシンで解釈する必要があります(JVMでJavaで行われ、PHPがオペコードキャッシュを使用して行われます)。

これはおそらく少し話題から外れていますが...

鉄ルビー Rubyの.NETベースの実装であるため、通常はBYTEコードにコンパイルされ、実行時に機械言語にコンパイルされます(つまり、解釈されません)。また(少なくとも他の.NET言語では、Rubyを使用すると思います) ngen コンパイルされたネイティブバイナリを事前に生成するために使用できるため、事実上、Rubyコードのマシンコードコンパイルされたバージョンです。

私が上海のRubyconf 2011から入手した情報については、Matzは埋め込みデバイスでのランニングをターゲットにする「Mruby」(Mruby」(Matz's Rubyの略)を開発しています。 Matz氏によると、The MrubyはRubyコードをマシンコードにコンパイルして、埋め込みデバイスでの(限られた)リソースの使用を削減する機能を提供します。したがって、さまざまな種類のRubyの実装があり、それらのすべてが実行時に解釈されるだけではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top