13

Pythonは中間バイトコード(pyc)にコンパイルされてから実行されます。したがって、コンパイルとそれに続く解釈があります。ただし、Pythonの長年のユーザーは、Pythonは「遅延バインディング」言語であり、通訳言語と呼ばれるべきではないと述べています。

  1. Pythonは他のインタプリタ言語とどう違うのでしょうか?

  2. Pythonのコンテキストで、「遅延バインディング」の意味を教えてください。

Javaは、最初にソースコードをバイトコードにコンパイルし、次にバイトコードに解釈する別の言語です。

  1. Javaはインタプリタ/コンパイルされた言語ですか?

  2. コンパイル/実行の点でPythonとどう違うのですか?

  3. Javaには「遅延バインディング」がないと言われています。これは、JavaプログラムがPythonよりもわずかに高速であることと関係がありますか?

人々がすでにこれについて話し合っている場所へのリンクも教えていただければ幸いです。これについてもっと読みたいです。ありがとうございました。

4

5 に答える 5

9

Pythonは他のインタプリタ言語とどう違うのでしょうか?

それは髪の分裂を含みます。インタプリタ言語とC#のような「マネージコード」言語や仮想マシン言語(Javaのような)は奇妙な連続体を形成します。機械語でさえ、すべての言語が「解釈されている」と言う人がいます。結局のところ、CPUの電子回路は機械語を「解釈」します。

あなたができる最善のことは、「解釈された」とは、アプリケーションのバイトコードを解釈するソフトウェアの目に見える層があることを意味すると言うことです。「解釈されない」とは、ソフトウェアが(多かれ少なかれ)基盤となるハードウェアによって直接実行されることを意味します。「マネージコード」の人々は、この髪を自由に分割し続けることができます。

Pythonのコンテキストで、「遅延バインディング」の意味を教えてください。

変数は型を持つように宣言されていません。変数は、実際のオブジェクトの割り当てにより、可能な限り遅く型にバインドされます。

Javaはインタプリタ/コンパイルされた言語ですか?

はい。バイトコードにコンパイルされます。バイトコードが解釈されます。私はそれを通訳と呼ぶことを好みます。

しかし、人々は(本当にあいまいな理由で)反対します。あらゆる種類の「コンパイル」ステップの存在は、たとえ最小限であっても、常に人々を混乱させます。バイトコードへの変換は、実行時のプログラムの実際の動作とはほとんど関係がありません。一部の人々は、前処理の「コンパイル」の汚染がまったくない言語だけが解釈できると言いたいです。多くの言語が人間にわかりやすいテキストからインタプリタにわかりやすいバイトコードに翻訳されているため、この例はもう多くありません。Applesoft Basic(80年代に遡る)でさえ、コードを入力したときにこの種の翻訳パスが実行されていました。

一部のJVMはJITを実行します。しない人もいます。いくつかは混合物です。JVMがJITバイトコード変換のみを行うと言うのは正しくありません。一部のJVMはそうします。しない人もいます。

コンパイル/実行の点でPythonとどう違うのですか?

全くない。JavaVMはPythonを実行できます。[簡単に混乱するために、この文脈での「python」という単語は、おそらく「pythonsource」を意味することはできません。Pythonバイトコードを意味する必要があります。]

Javaには「遅延バインディング」がないと言われています。これは、JavaプログラムがPythonよりもわずかに高速であることと関係がありますか?

多分。実行時にJavaバイトコードをマシンコードに変換するJITコンパイラがあるため、Javaプログラムは多くの場合高速です。

静的(「初期」)バインディングは、Javaにとって、CやC ++のような真にコンパイルされた言語で得られるのと同じ種類の利点はありません。この場合、実行時チェックはほとんどありません。Javaはまだ配列境界チェックのようなことをしますが、Cは生の速度のためにそれを省略します。

実際には、「遅延」バインディングに対するペナルティはほとんどありません。Pythonの属性とメソッドは、単純な辞書検索を使用して解決されます。辞書はハッシュです。パフォーマンスはかなり良いです。名前のハッシュは、ハッシュの計算コストを償却する「インターン」文字列リテラルプールに入れることができます。

本当の楽しみのために、PyPyとRPythonを見てください。これは、JITコンパイルを実行できるPythonインタープリターです。あなたは2層のインタプリタに行き着きます。あなたのコードはPyPyによって解釈されます。PyPyはRPythonによって解釈されます。 http://alexgaynor.net/2010/may/15/pypy-future-python/

于 2010-05-21T11:22:25.997 に答える
7

遅延バインディングは、解釈とは非常に異なる概念です。

厳密に言えば、インタプリタ言語はソースから直接実行されます。バイトコードのコンパイル段階は通過しません。Pythonプログラムはインタプリタであるために混乱が生じますが、バイトコードを解釈するため、「解釈済み」と表現するのはPythonのバイトコード言語です。Python言語自体はコンパイルされた言語です。

対照的に、Javaバイトコードは、最近では解釈とコンパイルの両方が行われています。JITコンパイラによってネイティブコードにコンパイルされ、ハードウェア上で直接実行されます。

遅延バインディングは型システムのプロパティであり、解釈されるかコンパイルされるかに関係なく、ほとんどの言語である程度存在します。

于 2010-05-21T11:24:29.877 に答える
3

私たちが拘束時間と呼んでいるものと、解釈/編集の概念との間には関係があります。

バインディング時間は、シンボリック式がその具体的な値にバインドされる時間です。これは、変数の動的スコープと静的スコープなど、プログラミング言語の定義に関連しています。または、静的メソッドと仮想メソッド、または動的型付けと静的型付け。

次に、言語の実装です。より多くの情報が前もって静的に知られているほど、コンパイラーの作成が容易になります。逆に言えば、言語が遅刻するほど難しくなります。したがって、時には解釈技術に頼る必要があります。

ただし、両者の区別は厳密ではありません。すべてが最終的に解釈されると考えることができるだけでなく (S.Lott の回答を参照)、コードの一部を動的にコンパイル、逆コンパイル、または再コンパイル (JIT など) できるため、区別が非常に曖昧になります。

たとえば、Java での動的なクラスの読み込みは、「遅延バインディング」のカテゴリに分類されます。クラスのセットは完全に固定されるわけではなく、クラスを動的に読み込むことができます。クラスのセットがわかっている場合はいくつかの最適化を行うことができますが、新しいクラスがロードされると無効にする必要があります。デバッグ インフラストラクチャを使用してメソッドを更新する機能でも同じことが起こります。メソッドがインライン化されていた場合、JVM はすべての呼び出しサイトを最適化解除する必要があります。

私は Python についてあまり知りませんが、Python の専門家は、このような混乱を避けるために「遅延結合」という用語を好むかもしれません。

于 2010-05-21T11:48:51.203 に答える
2

Java がコンパイルされている間に Python が解釈されるという一般的な誤解は、Java には明示的なコンパイル手順があるため発生すると思います。javac を実行して、.java ソース ファイルを実行可能な .class バイトコード ファイルに変換する必要があります。

あなたが正しく指摘しているように、Python は同様にソース ファイルをバイトコードにコンパイルしますが、透過的に実行します。コンパイルと実行は通常 1 つのステップで行われるため、ユーザーにはあまりわかりません。

重要な違いは、アーリー バインディングとレイト バインディング、および動的タイピングと静的タイピングの違いです。コンパイル済み/解釈済みの区別は無意味であり、無関係です。

于 2010-05-21T15:34:26.270 に答える
0

結合時間は、名前が物事に解決されるときです。より動的な言語は、遅延バインディングに向かう傾向があります。これは、解釈/コンパイルとは別にすることができます。たとえば、Objective-C メソッドは、C++ と比較して遅く、動的に解決されます。Java は、クラスのロード時にそのバインディングの多くを行います。C よりは後ですが、Python よりは前です。

Stan Kelly-Bootle の Computer Contradictionary からの私のお気に入りの引用:

結合時間 n. ハッシュテーブルが壊れる瞬間。

==> コンピューティングの進歩は、「束縛の遅さ」に照らし合わせることができます。これは、私自身のいわゆる CS のいわゆるキャリア、つまり黄金の過去、灰色の現在、バラ色の未来について考えさせられます。これは Synge の楽観主義の私のバージョンです: 芝生は t=0 を除いてより緑です。EDSAC I では、入力の約 2 週間前に、関数 (5ch の紙テープのサブルーチン) がパンチされ、結合され、結合されました。これは時期尚早の結束として知られており、弾性バンドの器用さが要求されます。次に、FORTRAN が新しい種類のバインディングをもたらしました。それは、シャッフルを拒否する水浸しのカード デッキです。その後、Algol と C を使用して、静的 (コンパイル時) バインディングを楽しんでいましたが、C++ が動的 (実行時) バインディングの麻痺した喜びをもたらしました。私の現在の研究は、実行後までバインディングを遅らせることを目的としています。聖マタイの福音書で預言されているように、私はこの終末の束縛を次のように呼んでいます。

于 2010-05-21T15:34:10.787 に答える