12

私は、GoogleのJavascriptエンジンであるV8に関するこの優れた記事を読んでいました:https ://developers.google.com/v8/design#mach_code 。

ある時点で、彼らはJavascriptがバイトコードやインタプリタなしで直接機械語にコンパイルされると言います。

引用するには:

V8は、JavaScriptソースコードを最初に実行されたときにマシンコードに直接コンパイルします。中間バイトコードやインタプリタはありません。

では、(少なくともV8では)明確にコンパイルされているのに、なぜJavascriptが「スクリプト」および「インタープリター」言語とともにリストされているのでしょうか。



編集:コンパイルされている場合、Javascriptから実行可能ファイルを作成できますか?それにはどういうわけかそれをV8にリンクする必要がありますか?

その質問を考慮して、私はこの引用を見つけました:

V8はスタンドアロンで実行することも、任意のC++アプリケーションに組み込むこともできます。

ここ:http ://code.google.com/p/v8/ 。

4

3 に答える 3

19

これが、「解釈言語」と「コンパイル言語」がずさんな用語の例である理由です。言語がコンパイルされるか解釈されるかは、言語自体ではなく、実装の属性です。

多くの人が「動的型付けされた言語」(JavaScriptなど)を「解釈された」と混同し、「静的に型付けされた言語」を「コンパイルされた」と混同しますが、これらは絶対的なものではなく単なる相関関係です。動的言語をコンパイルすることは可能であり(静的言語をコンパイルするよりも一般的にトリッキーですが)、静的言語を解釈することも可能です(例:HugsはHaskellのインタープリターです)。

于 2012-07-10T20:11:23.440 に答える
3

JSコードはソースコードとして提供および実行されることを目的としているため、これはスクリプト言語です。

コーダーが実行するためにコンパイルされたバイナリを提供する場合、それはスクリプトではありません。

また、Chromeで何をするにしても、同じJavascriptソースコードを他のプラットフォームでも実行する必要があります。これは、多かれ少なかれ従来のスクリプト環境である可能性があります。これは、スクリプトであるというコード自体の性質も変更しません。

極端にコンパイルしたとしても、JSは依然として本質的にスクリプト言語です。考えられるほぼすべてのスクリプト言語(Perl、PHP ....)で利用できる適切な従来のコンパイラがあります。それは彼らがスクリプト言語であること、あるいは彼らのソースコードがスクリプトであることを妨げるものではありません。

同様に、伝統的にコンパイルされている多くの言語の通訳がいます。

最後に、この問題は、ある言語を別の言語に「コンパイル」するという概念によってさらに混乱しています。これはしばらく前からありましたが、Javascriptにコンパイルすることを目的としたCoffeescriptのような言語でアイデアが実際に広まりました。では、コンパイルされたCoffeescriptコードを何と呼びますか?

用語は、特に今ではそれほど役に立ちませんが、あなたが質問している文脈でのあなたの質問に対する最終的な答えは、そうです、Javascriptはまだスクリプト言語であるということです。

于 2012-07-10T20:15:04.987 に答える
0

ここで、コードのデモを行います。

exeFuncDefinedLater(100); // prove that js is a compiling language
  
function exeFuncDefinedLater(num) {
  console.log("Your number is: " + num);
}

このコードは、ChromeブラウザとNodejsの両方で実行できます。

jsが解釈された言語であると誰かが言うと、このコードはクラッシュします。uがlater()を実行すると、後の関数本体を認識できないはずです。

これは、jsがコンパイルされた言語であることを証明する可能性があります。これは、後で関数をコンパイルして(マシンがそれを認識できるように)、実行するためです。

于 2016-08-03T01:17:36.443 に答える