2009-05-20 5 views

答えて

33

ほとんどの通訳者は、コードを直接に直接翻訳することはほとんどありません。単純に非効率的です。ほぼすべてのインタプリタは、簡単に実行できる中間表現を使用しています。また、この中間コードでは小さな最適化を実行できます。

さらに、Pythonはこのコードを保存します。このコードは、次回このコードが実行されるときに大きな利点があります。Pythonはもうコードを解析する必要はありません。解析は、コンパイル処理の中で最も遅い部分です。したがって、バイトコード表現は、実行オーバーヘッドをかなり大幅に削減する。

+1

私のTRS-80上の古いMS BASICでも非常に単純なエンコーディングスキームが使用されていました。入力または編集するとすぐに、BASICキーワードは1バイトに崩壊しました。 –

+1

@DavidThornley:1980年代のコンピュータの多くは、キーワードをトークンに変換したものの、数字や変数名をテキスト形式にして、その値を計算したり、実行時にルックアップしたりするMS-basicの派生物を使用していました。 Atari BASICは、より多くの処理を行い、変数のテーブルを作成し、その名前をインデックスに置き換えました。また、数値をBCD浮動小数点数に変換しました。文字列リテラルとコメントだけがテキストとして保存されました。このようなことは、Atari BASICが他のものより優れた性能を発揮できるかもしれないが、各行の数値はバイナリとして保存されていたが、GOTOターゲット... – supercat

+1

...はBCD浮動小数点として格納されていたため、すべてのGOTOはBCDからバイナリへの変換。それでも、Atari BASICの作者が単にキーワードをトークンに置き換えるのではなく、プログラムを解析された表現に変換するのは面白いことです。 – supercat

7

バイトコードから直接解釈する方が高速です。それは、レクシングを行う必要性を回避します。

8

.pycにコンパイルして何度も解釈できるためです。

スクリプトを何度も実行している場合、ソースコードを一度解析するだけのオーバーヘッドがあります。

6

再字句と(最初のimport上で最も頻繁に)何度もソースコードを解析するのではなく、一度だけそれをやっては、明らかに努力の愚かなと無意味な無駄になります。

+0

".py"ファイルを実行するだけで、ソースコードを何度も何度も読み直して解析することになります。ファイルが大きい場合、これは重大なオーバーヘッドになります。私はなぜ輸入が特別扱いを受けているのか分かりません。私は本当に理解の助けに感謝します。 – batbrat

-1

私はその理由がパフォーマンスであることは間違いありませんが、それは素晴らしい副作用ではありますが。私はいくつかのソースコード文字列内のテキストを見つけて置き換えるよりも、いくつかの高水準アセンブリ言語を使って構築されたVMが実用的であると考えるのは当然のことです。

編集:これまでに説明するための合理的なコメントを残すことなく、私のポストに-1票を入れさて、はっきり

は、仮想マシン(実行時環境)についてはほとんど知っています。

http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Erik-Meijer-and-Lars-Bak-Inside-V8-A-Javascript-Virtual-Machine/

+1

私は-1ではありませんでしたが、私はあなたの主張、特にこの部分を理解していないことを正直に思っています: "一部のソースコード文字列のテキストを見つけて置き換えるよりも実用的でしょう" –

+0

チャンネル9を作成したり、独自のVMを作成すると、どちらか2つがおそらく全体のプロセスを詳細に説明するでしょう。その引用が意味することは、より高レベルの抽象化でアセンブリよりも最適化を実行する方が簡単な場合があることです。これを通常行うときは、AST(抽象構文ツリー)を使用して作業しますが、同じ最適化を実行することはできますが、ソースコードを移動、つまり検索して置き換える必要があります。この理由のために他の中間表現になる傾向があります(3アドレスコード参照)。 –

+0

バイトコードは、ASTのより効率的でコンパクトで実用的な表現です。 –

2

小さな効率のそれへの側面(あなたがディスク上またはメモリ内のバイトコードを格納することができます)、その大部分はエンジニアリングがありますが:それはあなたが解釈からパース分離できます。パーサーは、多くの場合、厄介な生き物であり、エッジケースでいっぱいであり、適切な量のルックアヘッドを使用してシフト削減問題を解決するといった難解なルールに従わなければなりません。対照的に、インタプリタはとてもシンプルです。バイトコードのオペコードを使用する大きなswitch文です。

関連する問題