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


118

このテーマに関するいくつかの資料を読んだ後でも、コンパイルされた言語とインタープリター言語の違いが何であるかはまだわかりません。これはJavaとJavaScriptの違いの1つだと言われました。誰かがそれを理解するのを手伝ってくれませんか?

回答:


165

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

違いは言語ではありません。それはである実装

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

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

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

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

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

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

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

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


7
サー、私は次の質問をします。1.その「何か他のもの」はどの言語で書かれていますか?2.そして、JavaScriptのコンテキストでは、その「何か他のもの」はブラウザごとに異なりますか?3.スクリプトがGoogle ChromeとInternet Explorerで実行されていますが、両方のブラウザで同じように解釈されますか?
JavaHopper 2015

@ノーマンそれは素晴らしい説明でした。しかし、これは私がまだ持っているいくつかの混乱です。コンパイルされた実装では、元のプログラムはネイティブの機械語命令に変換されます。どうして?たとえば、Cはコンパイル後にアセンブリコードを生成するだろうと思いました。これもやはり、とにかくネイティブのアセンブラーによって、基礎となるマシンのマシンコードにアセンブルされる必要があります。それでは、インタプリタ言語の場合にVM(pythonまたはJVMなど)が同じことをするのとどう違うのですか?
qre0ct

58

JavaとJavaScriptはどちらもインタプリタ言語であるため、この違いを示すにはかなり悪い例です。Java (解釈済み)およびC(またはC ++)(コンパイル済み)は、より良い例でした。

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

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

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

言い換えると、解釈された言語は、プログラムの実行中にコードが機械命令に段階的に変換され、コンパイルされた言語はプログラムの実行前にコードが変換されているというものです。


8
Javaは解釈されますか?ウィキペディアから:「Javaアプリケーションは通常、バイトコード(クラスファイル)にコンパイルされ、コンピューターアーキテクチャに関係なく、Java仮想マシン(JVM)で実行できます。」
パーソンマン2010

6
@Personmanは、JVMがOS自体ではなくコードを実行しているときに技術的にまだ「解釈」されています。最近のOSの複雑さは、ほとんどの状況で基本的に無意味な違いであると言えるかもしれませんが、これは本当に意味的な違いです。アプリを実行しているOSと、コードを実行しているアプリを実行しているOSの違いについて話しています。
GrayWizardx 2010

5
クラスファイル自体がJava VMによって解釈されると思います。これはある程度妥当ですが、Javaソースは実際にはJava VMバイトコードにコンパイルされています。VMが別のアーキテクチャのマシンコードに解釈することを必要としない物理Javaマシンを構築できます。したがって、Javaがコンパイルされていると言う方がより正確に思えます。それでも、これは区別がわかりにくく、恣意的である方法の良い例です。結局のところ、コンパイルされたCはCPUによって解釈されますよね?
Personman 2010

13
Javaは本質的に両方であるため、コンパイル済み言語またはインタープリター言語のかなり悪い例です。比較する場合は、混乱を避けるためにCとLispを使用します。
リザードを請求する

7
@stakx-実際には、Javaバイトコードは通常、JITコンパイラーによってネイティブコードにコンパイルされます。純粋なインタープリターの動作を取得する唯一の方法は、JVMの起動時にJITコンパイラーを明示的にオフにすることです。
スティーブンC

15

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

コンパイラー言語

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

通訳言語:

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

5

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

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


3
ええと、最初の2つのステートメントを超えて、これがどこにあるのかわかりません。これは、数世代前に多くのインタープリター言語で技術的に当てはまりましたが、プラットフォームと細部への注意によっては、特定のアクティビティーに近い、またはコンパイルされたコードと同様に実行されるインタープリターコードを使用できる場合があります。
GrayWizardx 2010

Java、C#、JavaScriptのような言語が今日のプログラミング世界全体をほぼあふれさせていることを念頭に置いて、「コンパイルされたコードは深刻なアプリケーションに適している」と言っても不当です。
Sisir

2

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

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

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

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


Javaは最初にバイトコードに変換しますが、JVMの実行中にのみ、それをマシンコードに変換します。コンパイルされていて解釈されていないというのは正しいことですか?
Sisir

1
確かに、Javaバイトコードは解釈されますが、Javaバイトコードを書き込む人はいないと言えます。Java自体は通常、バイトコードにコンパイルされます。
Personman

2

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


0

他の人が言ったように、コンパイルおよび解釈はプログラミング言語の実装に固有です。言語固有のものではありません。たとえば、Cインタプリタがあります。

ただし、プログラミング言語は、最も一般的な(場合によっては正規の)実装に基づいて分類できます(実際には分類できます)。たとえば、Cがコンパイルされたとします。

まず、曖昧さのないインタプリタとコンパイラを定義する必要があります。

インタプリタ言語用のXは、任意のプログラムの実行プログラム(またはマシン、または一般に機構のちょうどいくつかの種類)であるP言語で書かれたX、それは効果を行い、仕様で規定されるような結果を評価するようにXを

コンパイラからXYは、任意のプログラム変換プログラム(またはマシン、または一般に機構のちょうどいくつかの種類)であるPいくつかの言語からXを意味的に等価なプログラムにP」一部の言語におけるY解釈するようにP 'のためのインタプリタとYと同じ結果をもたらすと解釈と同様の効果を有するであろうPのためのインタプリタとXを

プログラマーの観点から見ると、CPUはそれぞれのネイティブマシン言語のマシンインタープリターであることに注意してください。

これで、最も一般的な実装に応じて、プログラミング言語を3つのカテゴリに暫定的に分類できます。

  • ハードコンパイル言語:プログラムが完全に機械語にコンパイルされる場合。使用される唯一のインタプリタはCPUです。例:通常、プログラムをCで実行するには、ソースコードを機械語にコンパイルしてから、CPUで実行します。
  • 解釈される言語:元のプログラムのどの部分も機械語にコンパイルされていない場合。つまり、新しいマシンコードは生成されません。既存のマシンコードのみが実行されます。CPU以外のインタープリターも使用する必要があります(通常はプログラム)。例:Pythonの正規実装では、ソースコードが最初にPythonバイトコードにコンパイルされ、次にそのバイトコードがPythonバイトコードのインタープリタープログラムであるCPythonによって実行されます。
  • ソフトコンパイル言語:CPU以外のインタープリターが使用されている場合、元のプログラムの一部も機械語にコンパイルされる場合があります。これは、ソースコードが最初にバイトコードにコンパイルされ、次にバイトコードがJavaインタープリターによって解釈されたり、JITコンパイラーによってさらにコンパイルされたりするJavaの場合です。

時には、ソフトコンパイル言語とハードコンパイル言語は単にコンパイルされたと呼ばれ、C#、Java、C、C ++はコンパイルされたと言われます。

この分類では、JavaScriptは以前はインタプリタ言語でしたが、それは何年も前のことです。今日では、ほとんどの主要なJavaScript実装でネイティブマシン言語にJITコンパイルされているため、ソフトコンパイル言語に分類されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.