「コンパイルして、CPUが間違った処理を実行しないようにしたかった」という文の意味は何ですか。


10

この記事を読んでいました。次の段落があります。

そして、Scalaは高速であることが判明しましたか?さて、あなたの高速の定義は何ですか?ほぼJavaと同じくらい高速です。CやAssemblyほど高速である必要はありません。PythonはRubyよりも大幅に高速ではありません。同時実行性を活用して、より少ないマシンでより多くのことを実行したいと考えました。それをコンパイルして、間違った処理を行っているCPUを焼き付けないようにしたかったのです。

最後の文の意味を探しています。インタプリタ言語はCPUにどのようにして「間違った」処理をさせるのでしょうか?


3
コンパイルされてJVMバイトコードにコンパイルされるものを呼び出すことは、使用法に関しては少し自由です。
リグ

回答:


47

コードが言うなら

A = A + 1

コンパイルされたコードはこれを行います

add A, 1

解釈されたコードはこれを行います(またはいくつかのバリエーション)

look up the location of A in the symbol table
find the value of A
see that 1 is a constant
get its value
add the value of A and the value of 1
look up the location of A in the symbol table
store the new value of A

アイデアは?


3
時には、単純化は本当にない絵をより明確に;-)(ちょうど完全である:多くのよく知られた通訳は、最適化し、いくつかの彼らは途中でここに2つのサンプル「の実装」の間にあるので、離れてステップのを)。
Joachim Sauer

3
@JoachimSauer:もちろんです。コンパイルされたコードと比較して、インタープリターを10倍未満の速度のペナルティで実行することは依然として困難です。その言語が、数学ライブラリやI / Oのように、とにかく呼び出さなければならない下位のコンパイル済み関数に本当に時間を費やす言語である場合、解釈のコストは問題になりません。
Mike Dunlavey

1
これは素晴らしい説明です
ジェイミー・テイラー

13

それをコンパイルして、間違った処理を行っているCPUを焼き付けないようにしたかったのです。

彼らはコンパイルされたものと解釈されたものを指しているように聞こえます。最も可能性が高いのは、最初にRuby On Rails(解釈済み)で開発した後、Twitterがバックグラウンド処理タスクをScala(コンパイル済み)に移行するという話全体です。

コンパイル済みコードと解釈済みコードの説明はこちら

コンパイルされた言語では、入力するコードは、実行可能ファイルとして保存される前に、マシン固有の命令のセットに削減されます。インタプリタ言語では、コードは入力したのと同じ形式で保存されます。コンパイルされたプログラムは、解釈されたプログラムよりも実行速度が速くなります。解釈されたプログラムは、実行時に機械語命令に削減する必要があるためです。


最初の+1を差し上げます。P.SEへようこそ!
ヘイレム

4
(ScalaはJVM上にあるため、技術的にはバイトコンパイルのみであることを言及する価値があるかもしれません)。
ヘイレム

ScalaがJVMベースであることを知りませんでした。おそらくJITがコンパイルされたことを意味します。その場合、なぜTwitterはRuby on RailsからJRubyに移行しなかったのですか?あなたはそれがコンパイルされたという利点を持つより簡単な移行だと思うでしょう。
KrisG

3
彼らはまた、より優れた並行性モデルを探していて、Rubyのガベージコレクションに問題がありました。記事ではそれについて詳しく説明しています。
scrwtp

9

ここで「間違ったもの」とは、インタプリタがコードを解析して処理するのにかかるオーバーヘッドを意味します。これは、インタープリター言語とコンパイル済み言語の概念に関連しています。使用中のコード変換にはいくつかのモデルがあり、おおよそ次のカテゴリのいずれかに分類されます。

  • ネイティブコンパイル-ソースコードは直接マシンコードにコンパイルされます。移植性を犠牲にして最高のパフォーマンス。一般にCおよびC ++に関連付けられています。
  • 中間コンパイル-ソースコードは単純化された中間言語(バイトコード)にコンパイルされ、後で実行またはマシンコードに解釈またはコンパイル(ジャストインタイムコンパイル)されます。ネイティブコードよりも移植性が高く、純粋な解釈よりもパフォーマンスが優れていますが、解釈の利点(遅延バインディングなど)の一部は保持されます。例には、JVMおよび.NET CLRをターゲットとするC#、Javaおよびその他の言語が含まれます。
  • 解釈-ソースコードは直接マシンコードに変換されず、専用のインタープリタープログラムによって解釈および実行されます。インタプリタの洗練度はさまざまですが、単純な実装では、ソースコードを1行ずつ解析、分析、実行することになります。解釈はコンパイルよりも柔軟性が高いため、解釈された言語では、たとえば動的な型付けやリフレクションが広く使用されます。解釈された言語は、ボイラープレートコードが少なくて済み、ラピッドプロトタイピングに適しているため、開発者の生産性が向上するとしばしば見なされます。欠点は、パフォーマンスが低下することです。一般に、JavaScript、Ruby、Pythonに関連付けられています。

したがって、解釈された言語とコンパイルされた言語のどちらを選択するかは、開発者の生産性やパフォーマンスのどれを重視するかという問題に要約されます。記事で説明されている移行は同じ考え方に従っているようで、強力なプロトタイピング言語であるRubyが、パフォーマンスを考慮してJVMベースのScalaに置き換えられています。


-1回答の表現方法が単純すぎます。JIT(ジャストインタイムコンパイル)のようなものは完全に無視されます。これは、ScalaがJVM / CLR上で実行される方法によるものです
gnat

そうだね。答えを書き直したところ、このトピックにはほとんど追加されていませんでした。
scrwtp

-3

この場合、私はthe wrong stuff、コンパイルされていないコードの型安全性の欠如を意味していると考えています。

したがって、コードの解釈が遅くなるだけでなく、バ​​グも多くなります...


8
コンパイル済み言語はタイプセーフであり、インタープリター型言語はタイプセーフではないと想定しています。カウンタの例は多数あります。たとえば、lispはコンパイルでき、強く型付けされていませんが、Haskellは解釈でき、非常に型安全です
Zachary K

1
「タイプセーフではない」を「バギーが多い」と同等にすることは、販売する製品を持つ人々によって推進されるFUDです。
user16764

1
@ user16764:それが本当ならFUDではありません。IMEは、製品を販売するためにナンセンスを押し付けている人々であり、動的タイピングとエラーの間のリンクを軽視しようとします。(「エラー1種類のみです」など)
Mason Wheeler
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.