なぜPythonは解釈する前にソースをバイトコードにコンパイルするのですか?
ソースから直接解釈してみませんか?
なぜPythonは解釈する前にソースをバイトコードにコンパイルするのですか?
ソースから直接解釈してみませんか?
実際にコードを1行ずつ直接解釈するインタプリタはほとんどありません。単に非効率的すぎます。ほとんどすべてのインタプリタは、簡単に実行できる中間表現を使用します。また、この中間コードで小さな最適化を実行できます。
Pythonはさらにこのコードを保存します。これは、次にこのコードが実行されるときに大きな利点があります。Pythonはコードを解析する必要がなくなります。解析は、コンパイルプロセスで最も遅い部分です。したがって、バイトコード表現は実行オーバーヘッドを大幅に削減します。
一度コンパイルし.pycて何度も解釈できるからです。
したがって、スクリプトを何度も実行している場合は、ソースコードを1回解析するだけのオーバーヘッドがあります。
バイトコードから直接解釈する方が速いからです。一つには、字句解析を行う必要がなくなります。
ソースコードを1回だけ(ほとんどの場合は最初に)実行するのではなく、何度も何度も字句解析して解析することは、import明らかに愚かで無意味な労力の無駄になります。
効率の面はわずかですが(バイトコードをディスクまたはメモリに保存できます)、ほとんどがエンジニアリングです。解析とインタプリタを分離できます。パーサーは多くの場合、厄介な生き物であり、エッジケースでいっぱいであり、適切な量の先読みを使用したり、シフト削減の問題を解決したりするなどの難解なルールに準拠する必要があります。対照的に、解釈は非常に単純です。バイトコードのオペコードを使用した大きなswitchステートメントです。
良い副作用ではありますが、その理由がパフォーマンスであるかどうかは非常に疑わしいです。ソースコード文字列内のテキストを見つけて置き換えるよりも、高レベルのアセンブリ言語を中心に構築されたVMの方が実用的であると考えるのは当然だと思います。
編集:
わかりました。明らかに、説明するための合理的なコメントを残さずに私の投稿に-1票を投じた人は、仮想マシン(ランタイム環境)についてほとんど知りません。