ある教授が、解釈されたコードはコンパイルされたコードよりも約 10 倍遅いと言っていたのを覚えています。インタープリターとバイトコードの速度の違いは? (バイトコードが JIT コンパイルされていないと仮定します)
vim スクリプトをバイトコードにコンパイルするというアイデアを蹴散らしている人がいるからです。私は、それによってどのようなパフォーマンスが向上するのか疑問に思っています。
ある教授が、解釈されたコードはコンパイルされたコードよりも約 10 倍遅いと言っていたのを覚えています。インタープリターとバイトコードの速度の違いは? (バイトコードが JIT コンパイルされていないと仮定します)
vim スクリプトをバイトコードにコンパイルするというアイデアを蹴散らしている人がいるからです。私は、それによってどのようなパフォーマンスが向上するのか疑問に思っています。
物事をバイトコードにコンパイルするとき、最初に高価な高レベルの最適化を実行する機会があります。バイトコードは、マシンコードに非常に簡単にコンパイルできるように設計し、すべての最適化とフロー分析を事前に実行します。
したがって、速度の向上は潜在的に非常に重要です。実行時に字句解析/解析の段階全体をスキップするだけでなく、最適化を適用してより優れたマシンコードを生成する機会も増えます。
あなたはかなり良い後押しを見ることができました。ただし、多くの要因があります。コンパイルされたコードが常にインタプリタされたコードよりも約10倍速い、またはバイトコードがインタプリタされたコードよりもn倍速いと言うことはできません。
要因には、たとえば言語の複雑さと冗長性が含まれます。言語のキーワードが数文字で、バイトコードが1文字の場合、キーワード文字列を読み取ってから理解するよりも、バイトコードをロードしてそのバイトコードを処理するルーチンにジャンプする方がかなり高速です。どこへ行く。ただし、1バイトのキーワードを持つエキゾチックな言語の1つを解釈している場合は、違いが目立たない可能性があります。
私は実際にこのパフォーマンスの向上を見てきましたので、それはあなたにとって価値があるかもしれません。その上、そのようなものを書くのは楽しいです、あなたに言語通訳者とコンパイラーがどのように働くかについての感触を与えます、そしてそれはあなたをより良いコーダーにするでしょう。
最近、実際にコードをコンパイルしない主流の「インタープリター」は実際にありますか? (バイトコードまたは同様のもののいずれか。)
たとえば、Perl プログラムをソース コードから直接使用する場合、最初にソースを構文ツリーにコンパイルし、それを最適化してプログラムの実行に使用します。通常の状況では、実際にプログラムを実行する時間に比べて、コンパイルに費やされる時間はごくわずかです。
この例に固執すると、Perl は C で書かれているため、最適化された C コードよりも明らかに高速になることはありません。 Cで合理的にコーディングし、桁違いに簡単に記述できます。一方で、高性能の数学ルーチンを直接 Perl で書こうとは絶対に思いません。
また、多くの「クラシック」インタープリターには、実行とともに lex/parse フェーズも含まれています。
たとえば、Python スクリプトを実行するとします。これを行うと、プログラム テキストを内部インタープリター データ構造に変換してから実行することに関連するすべてのコストが発生します。
コンパイルされた Python スクリプト (.pyc ファイル) の実行とは対照的です。ここで、lex と parse フェーズが完了し、内部インタープリターのランタイムだけが得られます。
しかし、たとえば古典的な BASIC インタープリターを考えると、これらは通常、生のテキストを保存することはなく、トークン化された形式を保存し、"LIST" を実行するとプログラム テキストを再作成します。ここでは、バイト コードはかなり粗雑ですが (実際にはここに仮想マシンはありません)、実行によってテキスト処理の一部がスキップされます。行を入力して ENTER を押すと、これですべて完了です。
それはあなたの仮想マシンによるものです。より高速な仮想マシン (JVM) の一部は、C コードの速度に近づいています。解釈されたコードの実行速度は、C と比較してどれくらい速いでしょうか?
解釈されたコードを ByteCode に変換すると、Java と同じくらい速く (C の速度に近い) 実行されるとは思わないでください。何年にもわたってパフォーマンスが向上してきましたが、速度が大幅に向上するはずです。
Emacsがバイトコードに移植され、パフォーマンスが向上しました。一見の価値があるかもしれません。
気付くほど遅い Vim スクリプトに気付いたことはありません。スクリプトが、エディターのコアに実装されている組み込みのネイティブ コード操作 (正規表現、ブロック操作など) を主に呼び出すと仮定すると、スクリプトの「グルー ロジック」が 10 倍高速化されても、取るに足らないものになります。
それでも、プロファイリングは本当に確実な唯一の方法です。