質問

私の是非に解釈される言語の共通連結実績は遅いが、なぜプログラムで解釈される言語の遅?

役に立ちましたか?

解決

ネイティブプログラムは、彼らが上で実行プロセッサ用に書かれた指示を使用して実行します。

インタープリタ言語だけでは、「解釈」されています。命令のいくつかの他のフォームが読み込まれ、今度はネイティブマシン命令を実行するランタイムによって、解釈されます。

この方法だと考えて。あなたが誰かにあなたの母国語で話すことができれば、それは一般的にリスナーが理解するいくつかの他の言語にあなたの言語を翻訳する必要が通訳を持つよりも速く動作します。

私は上記の記述していますが、言語はインタプリタで実行されているときのためのものであることに注意してください。また、そのビルドネイティブマシン命令のネイティブリンカーが存在し、多くの言語のための通訳があります。減速(しかし、その大きさがあるかもしれないが)のみ解釈のコンテキストに適用されます。

だから、の言語が、むしろそれが遅い実行されている状況で、低速であること。

と言って少し間違っています

C#は、それが中間言語(IL)を用いても、インタプリタ言語ではなく、これが実行される前に、ネイティブ命令にJITコンパイルされているので、持っているの一部の同一の減速のではなくそのすべてが、私はあなたがC#やC ++のための本格的な通訳を構築した場合、それは同様遅くなるだろうと賭け思います。

そして、私は、それは当然の相対的な用語である。「遅い」と言うときだけで、明確にすること。

他のヒント

すべての答えはここに本当の重要なポイントを見逃しているようです。これは、「解釈」のコードの実装方法の詳細です。

その方法、オブジェクトとグローバル変数空間モデルは動的であるため、

解釈されるスクリプト言語が遅くなります。私の意見では、これは、スクリプト言語のの本当の定義ではない、それは解釈されているという事実です。これは、変数やメソッドの呼び出しへの各アクセスの多くの余分なハッシュテーブルのルックアップが必要です。そして、彼らはすべてマルチスレッドですごくGIL(グローバルインタプリタロック)を使用している理由は、その主な理由。ほとんどの時間を費やしている場合、このルックアップがあります。それはあなたがL1 / L2キャッシュミスを取得するときに、本当に痛い痛いランダムメモリ・ルックアップ、です。

GoogleのJavascriptのCore8は非常に高速かつ簡単な最適化のために、ほぼCスピードをターゲットである:彼らは、固定されたように、オブジェクトデータモデルを取り、ネイティブコンパイルされたプログラムのデータ構造のようにアクセスするための内部コードを作成します。新しい変数またはメソッドが追加または除去されるときに全体コンパイルされたコードを破棄し、再度コンパイルされます。

の技術はよくドイツ/シフマン紙「のSmalltalk-80システムの効率的な実装」で説明されています。

PHP、PythonとRubyは、これは非常に単純です行っていない理由の質問は答えるために:技術は、実装が非常に複雑である。

。 高速なブラウザベースのJavaScriptインタプリタはその数十億ドル規模のビジネスモデルの彼らの基本的な必要性であるため、

そして、GoogleだけではJavaScriptを支払うためにお金を持っています。

思い通りのinterpeterとしてのエミュレータのための機械できないという

その答えは、コンパイルされた言語で行いますので、機械指示のに対し、解釈されるものは実行されるプログラム(コンパ言語)の読み込みを行うのいずれかのソースbytecodeして本質的にemulates仮想機械 に対してプログラムの場合は直接機械に存在しています。

思い通りの解釈されるランタイムとしてのエミュレータのための機械のままでいることになっている。

これは明らかに複雑になりがちなのJIT(Just In Time)コンパイラでコンパイルするJavaコンポーネントは、シッピング、その他。理論的にも出てくる"AOT"("で")コンパイラが実際にその言語でのゆっくり動作、障害者による必要のコンパイラ周辺の使用メモリのプログラムを行います。だと言うのがこちらで用意する集rabid JIT擁護活動家た主張がないことを理論的に差JIT、AOT.ればお願いしている場合、JavaとC#の早CおよびC++、そのあと開始意味のような落ち着けます。:-)

なので、C++で完全にルールゲームの最大の量を計算しますので、実用化された。

デスクトップ、web、情報化タスクをもとに行われることがある言語でより抽象化は少なくとも以集では、コンピュータが非常に高速に問題はない演算集中型までの時の目標のような市場、プログラマーの生産性、信頼性メモリ-安全な環境の動的モジュール化、その他の強力なツールです。

これは、例えば、良い質問ですが、私の意見では少し異なる処方されるべきである:「なぜ解釈される言語のコンパイル言語より遅い」

私はそれは言語はそれ自体が低速であると解釈よくある誤解だと思います。インタプリタ言語は、ユースケースに応じて、コンパイルされたバージョンよりもを遅くのかもしれない、 に遅くはありませんが、。ほとんどの場合、言語は、十分な速の!

実際に解釈

「十分に速く」、プラス例えば、上のPythonのような言語を使用してから、生産性の向上を、Cは十分に正当化インタプリタ言語を考慮するべきです。あなたは本当にスピードが必要な場合も、あなたは常に、高速なCの実装を使用して解釈し、プログラムの特定の部品を交換することができます。しかし、その後、再び、最初に測定し、決定速度は本当に問題であれば、その後、最適化します。

ループの100倍の内容の解釈される100回低レベルのコードです。

キャッシュされません、再利用され、最適化された.

シンプル、コンパイラの解釈に一度の低レベルコード

編集後のコメント:

  • JITが コード,解釈されないようになります。でくださ降は前
  • 私の古典的な定義は現代の実用化

他の回答に加えて、最適化があります:あなたがプログラムをコンパイルしているとき、あなたは通常、それをコンパイルするのにかかる時間を気にしない - コンパイラは、コードを最適化するために多くの時間を持っています。あなたは、コードを解釈している場合は、より巧妙な最適化のいくつかを作ることができない可能性がありますので、それは非常に迅速に行う必要があります。

実在の単純な答えのない単純な質問、。一番下の行は、すべてのコンピュータが本当にCのような「速い」の言語がにコンパイルしているものであるバイナリ命令、である「理解」ということです。

そして、そこに(Javaと.NETのような)別のバイナリ命令を理解する仮想マシンは、ですが、それらは、ジャスト・イン・コンパイラ(JIT)によって機械語命令にその場で翻訳する必要があります。 (JITコードが使用されている方法の静的コンパイラよりも多くの情報を持っているので、さらに高速ないくつかの特定のケースでは)それがほぼ同じ速度である

すると、通常は、独自の中間バイナリ命令が、はるかにすべての命令に対する場合と、それには大きなswitch文とループのようなインタプリタの機能を持ち、どのようにそれを実行するためのインタプリタ言語は、あります。基本的なマシンコードの上に抽象化のレベルは遅いです。関係するより多くの命令がありますが、機能の長い鎖であっても、簡単な事をするインタプリタで呼び出し、メモリとキャッシュは次のように効果的に結果として使用されていないことを主張することができます。

しかし、インタプリタ言語は、多くの場合、彼らが使用している対象の目的のために十分に高速です。 Webアプリケーションは常に任意のインタプリタより遅い大きさのオーダーであるIO(通常はデータベース・アクセス)によって拘束されています。

インタプリタ言語のようなものはありません。任意の言語は、インタプリタやコンパイラによって実装することができます。このごろほとんどの言語は、コンパイラを使用して実装しています。

これは、彼らが実行時に言語やそれにかなり近いものを処理し、機械語命令にそれを翻訳必要があるため、通訳は、通常は遅い、と述べました。それらが直接実行され、その後、コンパイラは、一度だけ機械語命令にこの変換を行います。

から about.comするます:

  

インタプリタ言語が処理され、   実行時に。すべての行が読み込まれ、   分析し、実行。を有します   ループ内でラインを毎回再処理   そのように解釈言語を作るものです   スロー。このオーバーヘッドは、ということを意味します   10 - 解釈コード5との間に実行され   コンパイルされたコードよりも遅く倍。ザ・   基本などの言語を解釈   JavaScriptが最も遅いです。彼らの   利点があることを必要とされていません   変更後に再コンパイルし、それがあります   便利なあなたがプログラムに学んでいるときます。

5-10倍遅くただし、JavaやC#などの言語については必ずしも真実ではありません。彼らは解釈されますが、ジャストインタイムコンパイラいくつかの操作のための指示、(時にはコンパイル言語の速度に近い)劇的に物事をスピードアップする。

インタプリタ言語は、実行時にソースコードを読んで解釈する必要があります。コンパイルされたコードとその解釈の多くは(コンパイル時に)事前に行われます。

非常に少数の現代的なスクリプト言語は、は、これらの日「解釈」されています。それらは典型的にはマシンコードにまたは仮想マシンで実行されるいくつかの中間バイトコード言語、(より効率的)にのいずれかで、オンザフライでコンパイルされています。

は、命令の多くは、コードを理解するのではなく行のセマンティクスが示唆何でもやって過ごしているので、あなたのCPUは、「コードの行」あたりより多くの命令を実行しているので、彼らは遅くしている、と述べた!

タグ
この解釈された言語のこのの長所と短所を読みます

これはあなたの問題へのポストに関連するアイデアです。

  

インタプリタによる実行です   通常はあまり効率的で、その後   通常のプログラムの実行。それは起こります   いずれかのすべての命令理由は   で解釈を渡す必要があります   実行時以降のように、   実装、コードがなければなりません   中間にコンパイル   すべての実行前に表現ます。

それは母国語に比べて翻訳者を経由して話をするより低速だと同じ理由。または、辞書を読んで。これは、変換に時間がかかります。

更新:いいえ、私は私の答えは程度に、受け入れられたものと同じであることがわかりませんでした; - )

うん、インタプリタ言語が遅い...

ただし、以下のことを考慮してください。私は解決する問題がありました。これは、Pythonで問題を解決するために私に4分かかったし、プログラムを実行するために0.15秒かかりました。それから私はC言語でそれを書くことを試みた、と私は0.12秒のランタイムを持って、そしてそれを書くために私に1時間かかりました。すべてのこの質問で問題を解決するための実用的な方法は、ハッシュテーブルを使用していた、とハッシュテーブルはとにかくランタイムを支配します。

ので、

ウィキペディアを言う、

  

の解釈コード、コンパイルされたコードは、ちょうど決定固定コンテキスト内でアクションを実行し、一方のインタプリタは、プログラムで実行されるたびに各ステートメントを分析し、次いで、所望のアクションを実行しなければならないので、コンパイルされたコードを実行するよりも遅いですのコンパイルによります。このランタイム分析は「解釈のオーバーヘッド」として知られています。保管場所への識別子のマッピングは実行時ではなくコンパイル時に繰り返し行わなければならないので、変数へのアクセスは、インタプリタでも遅くなります。

この IBMドキュメント、

  

解釈プログラムは、それが実行されるたびに変換する必要があり、より高いオーバーヘッドがあります。したがって、インタープリタ型言語は、一般的に事前に定義された要求よりアドホック要求に適している。

Javaでは、 JIT (ジャストインタイム)のコンパイル。

  

JITコンパイラは、多くのセクションのバイトコードを読み取っていない(またはフルで、めったに)及びプログラムを高速に実行できるように、マシンコードに動的にコンパイルします。これは、ファイルごと、機能ごとに、あるいは任意のコードフラグメントに行うことができます。 (「ジャストインタイム」の名前の由来)が実行されようとしている場合、コードはコンパイルすることができ、その後、再コンパイルする必要なしにキャッシュされ、後で再使用する。

scroll top