答えて
ほとんどの通訳者は、コードを直接に直接翻訳することはほとんどありません。単純に非効率的です。ほぼすべてのインタプリタは、簡単に実行できる中間表現を使用しています。また、この中間コードでは小さな最適化を実行できます。
さらに、Pythonはこのコードを保存します。このコードは、次回このコードが実行されるときに大きな利点があります。Pythonはもうコードを解析する必要はありません。解析は、コンパイル処理の中で最も遅い部分です。したがって、バイトコード表現は、実行オーバーヘッドをかなり大幅に削減する。
私のTRS-80上の古いMS BASICでも非常に単純なエンコーディングスキームが使用されていました。入力または編集するとすぐに、BASICキーワードは1バイトに崩壊しました。 –
@DavidThornley:1980年代のコンピュータの多くは、キーワードをトークンに変換したものの、数字や変数名をテキスト形式にして、その値を計算したり、実行時にルックアップしたりするMS-basicの派生物を使用していました。 Atari BASICは、より多くの処理を行い、変数のテーブルを作成し、その名前をインデックスに置き換えました。また、数値をBCD浮動小数点数に変換しました。文字列リテラルとコメントだけがテキストとして保存されました。このようなことは、Atari BASICが他のものより優れた性能を発揮できるかもしれないが、各行の数値はバイナリとして保存されていたが、GOTOターゲット... – supercat
...はBCD浮動小数点として格納されていたため、すべてのGOTOはBCDからバイナリへの変換。それでも、Atari BASICの作者が単にキーワードをトークンに置き換えるのではなく、プログラムを解析された表現に変換するのは面白いことです。 – supercat
バイトコードから直接解釈する方が高速です。それは、レクシングを行う必要性を回避します。
.pyc
にコンパイルして何度も解釈できるためです。
スクリプトを何度も実行している場合、ソースコードを一度解析するだけのオーバーヘッドがあります。
再字句と(最初のimport
上で最も頻繁に)何度もソースコードを解析するのではなく、一度だけそれをやっては、明らかに努力の愚かなと無意味な無駄になります。
".py"ファイルを実行するだけで、ソースコードを何度も何度も読み直して解析することになります。ファイルが大きい場合、これは重大なオーバーヘッドになります。私はなぜ輸入が特別扱いを受けているのか分かりません。私は本当に理解の助けに感謝します。 – batbrat
私はその理由がパフォーマンスであることは間違いありませんが、それは素晴らしい副作用ではありますが。私はいくつかのソースコード文字列内のテキストを見つけて置き換えるよりも、いくつかの高水準アセンブリ言語を使って構築されたVMが実用的であると考えるのは当然のことです。
編集:これまでに説明するための合理的なコメントを残すことなく、私のポストに-1票を入れさて、はっきり
は、仮想マシン(実行時環境)についてはほとんど知っています。
私は-1ではありませんでしたが、私はあなたの主張、特にこの部分を理解していないことを正直に思っています: "一部のソースコード文字列のテキストを見つけて置き換えるよりも実用的でしょう" –
チャンネル9を作成したり、独自のVMを作成すると、どちらか2つがおそらく全体のプロセスを詳細に説明するでしょう。その引用が意味することは、より高レベルの抽象化でアセンブリよりも最適化を実行する方が簡単な場合があることです。これを通常行うときは、AST(抽象構文ツリー)を使用して作業しますが、同じ最適化を実行することはできますが、ソースコードを移動、つまり検索して置き換える必要があります。この理由のために他の中間表現になる傾向があります(3アドレスコード参照)。 –
バイトコードは、ASTのより効率的でコンパクトで実用的な表現です。 –
小さな効率のそれへの側面(あなたがディスク上またはメモリ内のバイトコードを格納することができます)、その大部分はエンジニアリングがありますが:それはあなたが解釈からパース分離できます。パーサーは、多くの場合、厄介な生き物であり、エッジケースでいっぱいであり、適切な量のルックアヘッドを使用してシフト削減問題を解決するといった難解なルールに従わなければなりません。対照的に、インタプリタはとてもシンプルです。バイトコードのオペコードを使用する大きなswitch文です。
- 1. するにはアンドロイドでアニメーションを翻訳アプリ翻訳の翻訳
- 2. Python辞書をC++に翻訳する
- 3. RubyをPythonに翻訳する
- 4. LispコードをPythonに翻訳するツールはありますか?
- 5. Python - ログプロットでベストフィットラインを翻訳する
- 6. Python 2.5のバイトコードを2.7に再コンパイルするには?
- 7. cURLをPythonの要求言語に翻訳するには?
- 8. Pythonの:あなたは、モジュールからコンパイルPythonバイトコードを見れば、なぜ `return`モジュール
- 9. djangoでフォームを翻訳するには?
- 10. Python 2.7のサブプロセスを使ってPython 2.3に翻訳する
- 11. 翻訳をトリガーするGoogle翻訳リンクを追加するには?
- 12. Google翻訳者なしで翻訳する
- 13. 探ると逆コンパイルPythonバイトコード
- 14. PerlをPythonに翻訳する:これを行うか死ぬ
- 15. 翻訳元から翻訳元へ翻訳者を作成する
- 16. Google翻訳は私のソフトウェアの翻訳には良い仕事ですか?
- 17. Google翻訳する - テキストの一部の翻訳を無効にする
- 18. 翻訳値を認識しないPoedit - なぜですか?
- 19. Firefoxアドオンを翻訳するには?
- 20. Google翻訳Pythonから
- 21. 部分的に翻訳されたサイトの翻訳は可能ですか?
- 22. PythonからPerlへの翻訳、pythonインデント
- 23. Rails:ページに翻訳を追加すると、JavaScriptのスクリプトタグが文字化けするのはなぜですか?
- 24. tcshからbashに翻訳する
- 25. 「翻訳エディター」が翻訳ジョブを見るために必要なアクセス権は何ですか?
- 26. css3%で翻訳する
- 27. PHPをPythonに翻訳する(Rest-API接続)
- 28. 読み込み時にウェブページに翻訳キーを表示する角度翻訳を修正するには?
- 29. バイトコードにコンパイルする動機は何ですか?
- 30. Luaバイトコードを逆コンパイルするのに最適なツールは?
私には宿題が好きです。 –