2011-08-31 8 views
5

私は初心者のJavaScriptプログラマーです。詳しく知りたいです。だから、私はあなたにこの簡単な質問で助けを求めます:)。私が読んでいるO'Reillyの本は、JavaScriptコードのコンパイル時を参照し続けています。関数型プログラミング(スキームなど)についての私の知識は、JavaScriptが実際にブラウザによって解釈され、JavaScriptを2回通過する可能性が高いことを示しています。Javascriptをコンパイルするか2パスで解釈しますか?

私の評価は間違っていますか?あるいは、PerlやPythonがどのように機能するのかと同様に、ブックが実際にインタープリタの最初のパスを参照するコンパイル時ですか?ありがとう!

+0

ほとんどの動的言語実装は、まず、入力を抽象構文木のソートに「パース」します。これは、構文エラーが検出された部分です。その後、ASTは直接実行することができます。または、内部のバイトコードやJITに変換することができます。実行される「方法」は、ECMAScript仕様書では指定されておらず、実装形態によって大きく異なります。 –

答えて

11

ブラウザによって異なります。 WebKitのSquirrelFish ExtremeとGoogle V8を見て、最速のものを見て、MozillaのJaegerMonkeyを見てください。

AFIAK V8とSFXはJITであるため、JSコードをネイティブにコンパイルします。 JaegerMonkeyとTraceMonkeyはFirefoxで結合して、コードを高速にトレースするとTraceMonkeyが実行し、コードが高速であればSFaと同様にコンパイルします。

+0

確かに+1、[ECMAScript言語仕様](http://www.ecma-international.org/publications/standards/Ecma)で概説されているセマンティクスを除いて、ECMAScriptがどのように*実行されるかの義務はありません。 -262.htm)。 –

+0

javascriptをプリコンパイルし、受信したユーザーエージェントに応じてブラウザに送信できますか? – Ced

0

文脈を助けるために引用できる文章がありますか?

Javascriptはブラウザでコンパイルされます(ブラウザには簡単なソースで送信されます)。しかし、ロードされるとコンパイルされます。したがって、scriptタグの後ろにdivタグとそれに続くscriptタグがある場合、それはそれらのものを順番にロードします。ブラウザは、スクリプトがロードされるまで(これはスクリプト内に 'document.write'があるため)、ページ全体のロードを停止します(リソースをダウンロードし、HTMLはロードしません)。

<script> 
var someVariable = 'hello world'; 
alert(document.getElementById('someid')); //alerts undefined 
</script> 

<div id='someid'></div> 

<script> 
alert(document.getElementById('someid')); //alerts 'someid' 
alert(someVariable); //alerts 'hello world' 
</script> 
0

があり、時間を読んで、実行時のJSに(私はそれが実際にコンパイルされていないことから、それを考えるために好きなように、しかし解釈)です。 O'Reillyの本はコンパイル時を読み込み時の同義語として使用しているようです。

読み取り時間は、エンジンがすべてのコードを読み取り、グローバルスコープですべてを評価するときです。通常、これはコード実行を引き起こすイベントのフックを設定します。

実行時間は他のすべてです。