Python がインタープリタ型の場合、.pyc ファイルとは何ですか? 質問する

Python がインタープリタ型の場合、.pyc ファイルとは何ですか? 質問する

Python はインタープリタ言語です。しかし、.pycWindows によって「コンパイルされた Python ファイル」として識別されるファイルがソース ディレクトリに含まれているのはなぜでしょうか?

ベストアンサー1

Python はインタープリタ型言語であると理解していますが...

この人気のミームは誤りです。むしろ、(自然) 言語レベルを誤解して作られたものです。同様の間違いは、「聖書はハードカバーの本である」と言うことです。この比喩を説明しましょう...

「聖書」は、書籍(書籍として識別される実際の物理的なオブジェクト)のクラスという意味での「書籍」です。「聖書のコピー」として識別される書籍には、基本的な共通点(内容、ただし、それらであっても異なる言語で書かれ、許容される翻訳、脚注やその他の注釈のレベルが異なる可能性があります)があるはずです。ただし、それらの書籍は、基本的とは見なされない無数の点で異なっていてもまったく問題ありません。たとえば、製本の種類、製本の色、印刷に使用されるフォント、イラスト(ある場合)、書き込み可能な広い余白の有無、組み込みブックマークの数と種類などです。

聖書の典型的な印刷物は、確かにハードカバー製本である可能性は十分にあります。結局のところ、聖書は、何度も読み返され、複数の場所にしおりが付けられ、特定の章や節のポインターを探しながらめくられるなど、さまざまな用途で使用される本であり、ハードカバー製本が優れていると、そのような使用状況でも特定のコピーを長持ちさせることができます。ただし、これらは日常的な(実用的な)問題であり、特定の実際の本が聖書のコピーであるかどうかを判断するために使用することはできません。ペーパーバック印刷は完全に可能です。

同様に、Python は、言語実装のクラスを定義するという意味で「言語」です。これらの実装は、いくつかの基本的な点 (構文、明示的に異なることが許可されている部分を除くほとんどのセマンティクス) ではすべて類似している必要がありますが、ほぼすべての「実装」の詳細 (指定されたソース ファイルの処理方法、ソースを低レベルの形式にコンパイルするかどうか (コンパイルする場合はどの形式か、コンパイルされた形式をディスクまたは他の場所に保存するかどうか)、その形式を実行する方法など) で完全に異なることが許可されています。

古典的な実装である CPython は、単に「Python」と略されることが多いのですが、これは Microsoft の IronPython (CLR コード、つまり「.NET」にコンパイルされます)、Jython (JVM コードにコンパイルされます)、PyPy (Python 自体で記述され、「ジャストインタイム」で生成されたマシン言語を含むさまざまな「バックエンド」形式にコンパイルできます) と並んで、製品品質の実装の 1 つにすぎません。これらはすべて Python (=="Python 言語の実装") であり、表面的に異なる多くの書籍オブジェクトがすべて聖書 (=="聖書のコピー") であるのと同じです。

CPython に特に興味があるなら、ソース ファイルを Python 固有の低レベル形式 (「バイトコード」と呼ばれる) にコンパイルし、必要に応じて自動的にコンパイルし (ソース ファイルに対応するバイトコード ファイルがない場合、またはバイトコード ファイルがソースよりも古いか、別の Python バージョンでコンパイルされている場合)、通常はバイトコード ファイルをディスクに保存します (将来再コンパイルしなくて済むようにするため)。一方、IronPython は通常 CLR コードにコンパイルし (ディスクに保存するかどうかは状況によって異なります)、Jython は JVM コードにコンパイルします (ディスクに保存するかどうかは状況によって異なります。.class保存する場合は拡張機能を使用します)。

これらの低レベルのフォームは、適切な「仮想マシン」(「インタープリター」とも呼ばれる) (CPython VM、.Net ランタイム、Java VM (別名 JVM) など) によって実行されます。

したがって、この意味 (一般的な実装では何が行われるか) では、C# と Java がそうである場合にのみ、Python は「インタープリタ型言語」です。つまり、これらはすべて、最初にバイトコードを生成し、次に VM/インタープリタを介してそれを実行するという一般的な実装戦略を持っています。

おそらく、コンパイル プロセスがいかに「重い」か、遅く、形式的なことかということに焦点が当てられているのでしょう。CPython は、可能な限り高速に、可能な限り軽量に、可能な限り形式的なことなしにコンパイルするように設計されています。コンパイラはエラー チェックや最適化をほとんど行わないため、高速かつ少量のメモリで実行できます。その結果、ほとんどの場合、コンパイルが行われていることをユーザーが意識する必要もなく、必要なときにいつでも自動的かつ透過的に実行できます。Java と C# は、通常、コンパイル中により多くの作業を受け入れます (したがって、自動コンパイルは実行しません)。これは、白か黒かの状況ではなく、グレー スケールの連続体であり、ある特定のレベルにしきい値を設定し、そのレベルを超える場合にのみ「コンパイル」と呼ぶのは完全に恣意的です。-)

おすすめ記事