解釈とコンパイルされた拘束と遅い結合
-
04-10-2019 - |
質問
Pythonは中間バイテコード(PYC)にコンパイルされ、実行されます。したがって、コンピレーションに続いて解釈が続きます。ただし、長年のPythonユーザーは、Pythonは「遅い拘束力のある」言語であり、解釈された言語と呼ばれるべきではないと言います。
Pythonは別の解釈言語とどのように異なりますか?
Pythonのコンテキストで、「遅いバインディング」の意味を教えてください。
Javaは、最初にソースコードをBytecodeにコンパイルし、次にBytecodeに解釈する別の言語です。
Javaは解釈/コンパイルされた言語ですか?
コンピレーション/実行に関してPythonとどう違うのですか?
Javaは「遅い拘束」を持っていないと言われています。これは、JavaプログラムがPythonよりも速くスリーになっていることと関係がありますか?
人々がすでにこれについて議論している場所へのリンクを私に与えることができれば、それは素晴らしいことです。これについてはもっと読みたいです。ありがとうございました。
解決
遅い結合は、解釈とは非常に異なる概念です。
厳密に言えば、解釈された言語はソースから直接実行されます。バイトコードコンピレーション段階を経ていません。 Pythonプログラムのために混乱が生じます は 通訳者ですが、バイトコードを解釈するため、「解釈」と表現するのはPythonのバイトコード言語です。 Python言語自体はコンパイルされた言語です。
対照的に、Java Bytecodeは、最近では解釈および編集されています。 JITコンパイラによってネイティブコードにコンパイルされ、ハードウェアで直接実行されます。
後期バインディングはタイプシステムの特性であり、それらが解釈またはコンパイルされているかどうかに関係なく、ほとんどの言語にある程度存在します。
他のヒント
Pythonは別の解釈言語とどのように異なりますか?
それには髪の毛が含まれます。解釈された言語とC#や仮想マシン言語(Javaなど)などの「コードの管理」言語は、奇妙な連続体を形成します。それを言う人がいます すべて 言語は「解釈」されます - 機械言語でさえ。結局のところ、CPUの電子回路は機械言語を「解釈」します。
あなたができる最善のことは、「解釈」とは、アプリケーションバイトコードを解釈するソフトウェアの目に見える層があることを意味することです。 「不変」とは、ソフトウェアが基礎となるハードウェアによって(多かれ少なかれ)直接実行されることを意味します。 「管理されたコード」は、この髪を自由に分割し続けることができます。
Pythonのコンテキストで、「遅いバインディング」の意味を教えてください。
変数にはタイプがあると宣言されていません。変数は、実際のオブジェクトの割り当てにより、可能な限り遅れて型にバインドされています。
Javaは解釈/コンパイルされた言語ですか?
はい。バイトコードにコンパイルされています。バイトコードが解釈されます。私はそれを解釈と呼ぶことを好みます。
しかし、人々は(本当にあいまいな理由で)同意しません。あらゆる種類の「コンパイル」ステップの存在は、最小限であっても、常に人々を混乱させます。バイトコードへの翻訳は、実行時にプログラムの実際の動作とほとんど関連していません。何人かはそれを言いたいです それだけ ある言語 完全に 前処理の「コンパイル」の汚れがないことは解釈できます。多くの言語が人間に優しいテキストから通訳に優しいバイトコードに翻訳されているため、これの多くの例はこれ以上ありません。 AppleSoft Basic(80年代に戻って)でさえ、コードを入力したときにこの種の翻訳パスが完了しました。
いくつかのJVMはjitです。いくつかはしません。いくつかは混合物です。 JVMはJITバイトコード変換のみが正しくないと言うことです。いくつかのJVMはそうです。いくつかはしません。
コンピレーション/実行に関してPythonとどう違うのですか?
全くない。 Java VMはPythonを実行できます。 [簡単に構成された人の場合、この文脈の「Python」という言葉は、「Python Source」を意味することはできません。 Python bytecodeを意味する必要があります。
Javaは「遅い拘束」を持っていないと言われています。これは、JavaプログラムがPythonよりも速くスリーになっていることと関係がありますか?
多分。 JAVAバイトコードを実行時にマシンコードに翻訳するJITコンパイラのため、Javaプログラムはしばしば高速です。
Static( "Early")バインディングは、CやC ++などの真にコンパイルされた言語であるJavaには、いかなる種類の実行時間チェックもほとんどない場合と同じ種類の利点がありません。 Javaは、Array Bounds Checkingなどのことを行います。これは、生の速度のために省略しています。
実際には、「遅い」バインディングに対するペナルティはほとんどありません。 Pythonの属性とメソッドは、単純な辞書の検索を使用して解決されます。辞書はハッシュです。パフォーマンスはかなり良いです。名前のハッシュは、ハッシュを計算するコストを償却する「インターンされた」文字列リテラルプールに入れることができます。
本当に楽しみにして、PypyとRpythonを見てください。これは、JITコンピレーションを行うことができるPython通訳です。あなたは2層の通訳で終わります。あなたのコードはPypyによって解釈されます。 PypyはRpythonによって解釈されます。 http://alexgaynor.net/2010/may/15/pypy-future-python/
私たちが呼んでいるものの間にはつながりがあります バインディング時間 との概念 解釈/編集.
結合時間は、象徴的な式がその具体的な価値に結合する時間です。これは、プログラミング言語の定義、たとえば変数の動的なスコープとより関連しています。または静的メソッド対仮想メソッドまたは動的タイピングと静的タイピング。
次に、言語の実装が行われます。より多くの情報が前もって静的に知られているほど、コンパイラを書きやすくなります。反比例すると、言語が遅くなるほど、それは難しくなります。したがって、時々解釈技術に依存する必要があります。
ただし、両方の区別は厳格ではありません。すべてが最終的に解釈されると考えることができるだけでなく(S.Lott Answerを参照)、コードの一部をコンパイル、逆コンパイル、または動的に再コンパイルすることができます(例:JITなど)、区別は非常にファジーになります。
たとえば、Javaでの動的クラスの読み込みは、カテゴリ「Late Binding」:クラスのセットはすべてのために一度固定されておらず、クラスは動的にロードできます。クラスのセットを知っている場合、いくつかの最適化を行うことができますが、新しいクラスがロードされたら無効にする必要があります。デバッグインフラストラクチャを使用してメソッドを更新する機能でも同じことが起こります。JVMは、すべてのコールサイトを除去する必要があります。
私はPythonについてあまり知りませんが、Pythonの開業医は、そのような混乱を避けるために「Late Bound」という用語を好むかもしれません。
Javaが明示的なコンピレーションステップを持っているため、Javaがコンパイルされている間にPythonが解釈されるという一般的な誤解は、.Javaソースファイルを実行できるようにJavacを実行する必要があるため、実行できる.class Bytecodeファイルに変換する必要があると思います。
Pythonが同様にソースファイルをBytecodeにコンパイルすることを正しく指摘しているように、それは透過的に実行されます - コンパイルと実行は通常1つのステップで行われるため、ユーザーにとってはそれほど明白ではありません。
重要な違いは、初期と後期の結合と動的&静的タイピングの間です。コンパイル/解釈された区別は無意味で無関係です。
バインディング時間とは、名前が物事に解決される場合です。より動的な言語は、遅延結合に向かう傾向があります。これは解釈/コンピレーションから分離できます。たとえば、Objective-Cメソッドは、C ++と比較して遅れて動的に解決されます。 Javaは、クラスの負荷時間でバインディングの多くを行います。Cよりも遅いが、Pythonよりも早い。
Stan Kelly-Bootleのコンピューター矛盾からの私のお気に入りの引用:
結合時間n。ハッシュテーブルが破損する瞬間。
==>コンピューティングの進歩は、「バインディングの遅れ」に対してマッピングできます。これは、Syngeの楽観主義の私のバージョンです。T= 0を除いて草は緑です。 EDSAC Iでは、入力の約2週間前に私の機能(5CHペーパーテープサブルーチン)をパンチ、スプライシング、およびバウンドしました。これは予測的な結合が知られており、弾性バンドとの巧妙さを求めています。 Fortranは次に、新しい種類のバインディングで来ました:シャッフルすることを拒否したカードの水浸しのデッキ。その後、AlgolとCを使用して、C ++がダイナミック(実行時間)結合の麻痺する喜びをもたらすまで、静的(コンパイル時間)結合を楽しんだ。私の現在の研究は、実行後までバインディングを遅らせることを目指しています。聖マタイの福音書で預言されたように、私はこの終わりの時間の結合と呼びます:「...そして、あなたが地球上で縛られているのは、天国で縛られるでしょう...」(マタイ16:19 kjv)。