18

Javaで記述されたコードをJVMによって解釈されるバイトコードでコンパイルする必要があるのはなぜですか。JavaScriptなどの言語で記述されたコードはコンパイルする必要がなく、ブラウザーで直接実行できます。

これを理解する簡単な方法はありますか?

この動作を理解するのに役立つ可能性のある、これら2つの言語の記述方法の根本的な違いは何ですか?

私はCSの学生ではないので、質問の素朴な言い訳をしてください。

4

4 に答える 4

25

歴史的に、JavaScriptはインタプリタ言語でした。つまり、インタプリタはソースコードを受け入れ、すべてを1つのステップで実行します。ここでの利点は単純さと柔軟性ですが、インタプリタは非常に遅いです。コンパイラは、高水準言語を、ネイティブプロセッサまたはVM(この場合はJava VM)のいずれかが直接実行できる低水準言語に変換します。これははるかに高速です。

最新のブラウザのJavaScriptは、その場でコンパイルされるようになりました。したがって、スクリプトがロードされると、JavaScriptエンジンが最初に行うことは、スクリプトをバイトコードにコンパイルしてから実行することです。エンドユーザーの観点からコンパイル手順全体が欠落している理由は、ブラウザー開発者が(ありがたいことに)JavaScriptが明示的にコンパイルされないという要件を維持しているためです。

Javaは、getgoの言語であり、常に明示的なコンパイル手順がありました。しかし、多くの場合、それはもはや真実ではありません。IntelliJやEclipseのようなIDEは、Javaをその場でコンパイルでき、多くの場合、明示的なコンパイル手順を削除します。

于 2012-08-07T20:20:32.453 に答える
3

JavaScriptとJavaは同じものではありません。それらは同じような名前を共有しているかもしれませんが、JSの第一人者であるダグラス・クロックフォードを紹介して、それらが実際にはまったく関係がないという事実を明らかにするのを手伝ってください。

現実には、Javaがインタプリタ言語であることを止めるものはなく、JavaScriptがコンパイルされた言語であることを止めるものもありません(Chromeのjavascriptエンジンは、速度を向上させるためにコンパイルを行い、非常にうまく機能します)。

ブラウザのコンテキストでは、JavaはFlashまたはSilverlightと同じ方法で実行されます。プラグインが必要であり、ブラウザはそのプラグインのホストとして機能します。Javaランタイム環境をホストします。

Javascriptは、ブラウザのスクリプト言語として設計されているため、ブラウザはそれをネイティブに理解できます。 ただし、ブラウザが実際にそのコードの実行をどのように達成するかは、完全にブラウザ次第です。つまり、コードの次の行の知識がゼロであり、純粋にソフトウェアベースのスタックを実行していると仮定すると、純粋にスクリプトレベルで動作できます。または、JITを実行して、コードをハードウェアに近づけ、(うまくいけば)速度を向上させることができます。

于 2012-08-07T20:24:43.820 に答える
2

任意の言語をコンパイルして解釈できます。どちらの場合も、ソフトウェアはソースコードを読み取り、分割し、解析するなどして特定の要件を確認し、プログラムのすべての部分に意味を割り当てる必要があります。唯一の違いは、コンパイラが別の言語(JVMバイトコード、JavaScript、マシンコード、またはまったく別のもの)で(ほぼ)同じ意味のコードを生成し、インタプリタがプログラムの意味をすぐに実行することです。

さて、実際には、それはより単純でより複雑です。多くの言語でよりシンプルで、2つのうちの1つに適しています-Javaは静的に型付けされており、プログラムの意味については比較的動的ではないため、コンパイルして、そうでなければ実行する必要のある作業を実行できます。ランタイム。JavaScriptは動的に型付けされており、実行時まで多くのこと(+が加算か連結かなど)を決定できないため、コンパイルではパフォーマンスが低下します。ただし、コンパイラとインタプリタの組み合わせ(簡略化された中間表現にコンパイルしてから、それを解釈および/またはコンパイルする)は、動的言語の実装の間でますます人気があります。そして、最新のJavaScript実装コンパイルされるという事実があり、実際、V8は決してコンパイルされません。何でも解釈します。

于 2012-08-07T20:25:09.493 に答える
0

JavaとJavascriptの間のコンパイルレベルは複雑であるため、Javascriptにはいくつかの制限があります。バイトコードは特定のOS用に記述されたJVMプラットフォームで実行されるため、ハードウェアバイトコードの実行にはシステムリソースにアクセスするためのより多くの利点があります。CコードでさえJavaバイトコードに埋め込むことができます。一方、Javascriptはブラウザでのみ実行されるため、それとはあまり関係がありません。

Javaプラットフォームには2つの主要な部分があります。Javaプログラミング言語とJVM。これにより、各パーツはそれぞれの領域のみに焦点を合わせます。そのため、JVMはJavaプログラミング構文を使用しません。これは、Cコードを実行する場合のリンクと同様に、Cコードではなくアセンブリを処理します。

JVMプラットフォームのバイトコードは、Cのアセンブリである可能性があります。

最終的に、すべての表現はバイナリ表現に変換され、次に電気信号が何らかの形で変換されます。プログラミングレベルが必要であることを証明しています。

于 2012-08-07T20:27:33.633 に答える