Python や Ruby などの動的言語が、その動的特性を失うことなく解釈する代わりにコンパイルすることを不可能にするいくつかの理由がありますか?
もちろん、その仮想コンパイラの要件の 1 つは、これらの言語が実行時にメタプログラミング、オブジェクトの拡張、コードの追加、型システムの変更などの特性を失わないことです。
要約すると、動的プログラミング言語としての特性を失うことなく、Ruby や Python のコンパイラを作成することは可能ですか?
Python や Ruby などの動的言語が、その動的特性を失うことなく解釈する代わりにコンパイルすることを不可能にするいくつかの理由がありますか?
もちろん、その仮想コンパイラの要件の 1 つは、これらの言語が実行時にメタプログラミング、オブジェクトの拡張、コードの追加、型システムの変更などの特性を失わないことです。
要約すると、動的プログラミング言語としての特性を失うことなく、Ruby や Python のコンパイラを作成することは可能ですか?
はい、動的言語用のコンパイラを作成することは間違いなく可能です。動的言語用のコンパイラの例は無数にあります。
一般に、すべての言語はコンパイラーによって実装でき、すべての言語はインタープリターによって実装できます。インタープリターからコンパイラーを自動的に派生させることも、その逆も可能です。
最新の言語実装のほとんどは、解釈とコンパイルの両方を使用し、時には複数のコンパイラーを使用することさえあります。Rubinius を例にとると、最初の Ruby コードは Rubinius バイトコードにコンパイルされます。その後、Rubinius バイトコードは Rubinius VM によって解釈されます。何度か解釈されたコードは、Rubinius Compiler IR にコンパイルされ、LLVM IR にコンパイルされます。さらに、LLVM IR にコンパイルされ、「ネイティブ コード」(それが何であれ) にコンパイルされます。したがって、Rubinius には 1 つのインタープリターと 3 つのコンパイラーがあります。
V8 は別の例です。実際にはインタープリターはありませんが、2 つの異なるコンパイラーがあります。1 つの非常に高速でメモリ効率の高いコンパイラーは、最適化されていない、やや遅いコードを生成します。その後、複数回実行されたコードは破棄され、2 番目のコンパイラで再度コンパイルされます。これにより、積極的に最適化されたコードが生成されますが、コンパイル中により多くの時間がかかり、より多くのメモリが使用されます。
ただし、最終的には、インタープリターなしでコードを実行することはできません。コンパイラはコードを実行できません。コンパイラは、プログラムをある言語から別の言語に翻訳します。それでおしまい。必要なものはすべて翻訳できますが、最終的には何かがコードを実行する必要があり、それがインタープリターです。ソフトウェアまたはシリコンに実装される可能性がありますが、それでもインタープリターです。
「コンパイル」とは、「ネイティブ マシン コードにコンパイルする」ことを意味すると想定し、他の人がこの非常に狭い定義に異議を唱えるに任せます。答えはイエスです。実際、人々は現在これを行っています:
ただし、そのようなコンパイラは多くの (事実上ゼロと言えます) 最適化を実行できないため、結果として得られるコードは、単純なインタプリタが実行するものと基本的に同等であり、解釈のオーバーヘッドを節約するだけです (そして、いくつかの優れたプロパティが失われます)。コンパクトなコードとより速いターンアラウンドを含むインタープリター)。言い換えれば、動的、正確、高速 - 2 つ選択してください (完全な開示: 受け入れられた答えは私のものです)。