web-dev-qa-db-ja.com

コンパイル言語とインタープリター言語の違いは何ですか?

このテーマに関するいくつかの資料を読んだ後、コンパイルされた言語と解釈された言語の違いはまだわかりません。これはJavaとJavaScriptの違いの1つだと言われました。誰かがそれを理解するのを助けてくれますか?

110
SIr Codealot

コンパイルされた言語と解釈された言語の違いは何ですか?

言語の違いはnotであり、実装にあります

私のシステムからそれを取得したので、ここに答えがあります:

  • コンパイルされた実装では、元のプログラムはネイティブマシン命令に変換され、ハードウェアによって直接実行されます。

  • 解釈された実装では、元のプログラムは別のものに変換されます。 「インタープリター」と呼ばれる別のプログラムは、「他の何か」を調べ、必要なアクションを実行します。言語とその実装に応じて、「その他」のさまざまな形式があります。人気の高いものからあまり人気のないものまで、「何か他のもの」は

    • Lua、Python、Ruby、Smalltalk、および他の多くのシステムで行われているように、多くの場合bytecodeと呼ばれる仮想マシンのバイナリ命令(アプローチが普及しました1970年代にUCSD PシステムとUCSD Pascalにより)

    • 多くのプロトタイプまたは教育通訳で行われているように、抽象構文ツリーなど、元のプログラムのツリーのような表現

    • Tclに似た、ソースプログラムのトークン化された表現

    • MINTおよびTRACで行われたソースプログラムの文字

問題を複雑にしていることの1つは、バイトコードをネイティブマシン命令に変換(コンパイル)できることです。したがって、解釈された実装が成功すると、最終的にコンパイラが取得される可能性があります。コンパイラがバックグラウンドで動的に実行される場合、ジャストインタイムコンパイラまたはJITコンパイラと呼ばれることがよくあります。 JITはJava、JavaScript、Lua向けに開発されており、私は他の多くの言語に挑戦しています。その時点で、一部のコードが解釈され、一部のコードがコンパイルされるハイブリッド実装を使用できます。

153
Norman Ramsey

JavaとJavaScriptは、この違いを示すにはかなり悪い例です、両方とも解釈された言語であるため。 Java (解釈済み) およびC(またはC++) (編集済み) より良い例だったかもしれません。

取り消し線付きテキストはなぜですか?この回答 が正しく指摘しているように、解釈/コンパイルは言語の具体的な実装に関するものです、言語そのものではなく。 「Cはコンパイルされた言語です」などのステートメントは一般的にtrueですが、誰かがC言語インタープリターを書くのを止めるものは何もありません。実際、 Cのインタープリターは存在します

基本的に、コンパイルされたコードは、コンピューターのCPUによって直接実行できます。つまり、実行可能コードはCPUの「ネイティブ」言語(Assembly language)で指定されます。

ただし、インタープリタ言語のコードは、実行時に任意の形式からCPUマシン命令に翻訳する必要があります。この翻訳は通訳によって行われます。

それを置く別の方法は解釈される 言語は コードはステップバイステップで機械命令に変換されますwhileコンパイル中にプログラムが実行されます 言語が持っています コードは、プログラムの実行前に変換されています。

55
stakx

コンパイラ言語とインタープリター言語の基本的な違いは次のとおりです。

コンパイラ言語

  • プログラム全体を単一の入力として受け取り、それをファイルに保存されるオブジェクトコードに変換します。
  • 中間オブジェクトコードが生成されます
  • 例:C、C++
  • コンパイルは実行前に行われるため、コンパイルされたプログラムはより速く実行されます。
  • メモリ要件は、オブジェクトコードの作成によるものです。
  • プログラム全体がコンパイルされた後にエラーが表示されます
  • ソースコード---コンパイラ---マシンコード---出力

通訳言語:

  • 単一の命令を単一の入力として受け取り、命令を実行します。
  • 中間オブジェクトコードは生成されません
  • 例:Perl、Python、Matlab
  • 解釈されたプログラムは、コンパイルと実行が同時に行われるため、実行速度が遅くなります。
  • 必要なメモリは少ないです。
  • エラーはすべての命令ごとに表示されます。
  • ソースコード---インタープリター---出力
14
PGOEL

一般に、コンパイラは高レベル言語のコンピューターコードを読み取り、pコードまたはネイティブマシンコードに変換します。インタープリターは、pコードまたはBasicやLISPなどのインタープリターコードから直接実行されます。通常、コンパイルされたコードははるかに高速に実行され、よりコンパクトであり、すべての構文エラーと多くの違法参照エラーをすでに発見しています。解釈されたコードは、アプリケーションが影響を受けるコードの解釈を試みた後にのみ、このようなエラーを検出します。解釈されたコードは、1回または多くても数回しか使用されない単純なアプリケーションに適している場合が多く、さらにはプロトタイピングにも適しています。コンパイルされたコードは、深刻なアプリケーションに適しています。コンパイラは最初にプログラム全体を取り込み、エラーをチェックし、コンパイルしてから実行します。一方、インタープリターはこの行を1行ずつ実行するため、1行を取得し、エラーをチェックしてから実行します。

さらに情報が必要な場合は、「コンパイラーとインタープリターの違い」をGoogleで調べてください。

4
Salil

これは非常に曖昧な区別であり、実際には一般に言語自体のプロパティではなく、その言語でコードを実行するために使用しているプログラムのプロパティです。

ただし、ほとんどの言語は主にいずれかの形式で使用され、はい、Javaは基本的に常にコンパイルされますが、javascriptは基本的に常に解釈されます。

ソースコードをコンパイルするとは、実行時にソースによって定義された動作を行うバイナリの実行可能ファイルを生成するプログラムを実行することです。たとえば、javacは人間が読むことができる.Javaファイルをマシンが読み取り可能な.classファイルにコンパイルします。

ソースコードを解釈するには、中間ファイルを生成せずに、定義された動作をすぐに生成するプログラムを実行します。たとえば、Webブラウザーがstackoverflow.comを読み込むと、多数のjavascript(ページのソースを表示することで確認できます)を解釈し、これらのページが持つ多くの素晴らしい効果を生成します。上部のバー。

2
Personman

解釈された言語は、シェルスクリプトなどの指示に従って実行時に実行され、コンパイルされた言語はコンパイルされ(CPUが理解できるアセンブリ言語に変更され)、C++のように実行されます。

1
Praveen Kishor