2012-05-07 12 views

回答

3

沒錯,你不能將JavaScript編譯成其他任何東西。瀏覽器爲你編譯它,然後運行它。一些瀏覽器比其他瀏覽器有更復雜的JavaScript編譯器。

+0

@aviad:[V8](https://en.wikipedia.org/wiki/V8_(JavaScript_engine))和[SpiderMonkey]等作者的作者(https://en.wikipedia.org/wiki/SpiderMonkey_(JavaScript_engine))會不同意。 –

+0

@aviad他們大多數做JIT編譯(這是格雷格正在談論的) –

+0

@Greg Hewgill,在某些情況下,它是兩遍解釋而沒有編譯。它依賴於瀏覽器。查看WebKit的SquirrelFish Extreme和Google V8以查看最快的事情,並查看Mozilla的JaegerMonkey。 AFIAK V8和SFX是JIT,因此它們將JS代碼編譯爲本地代碼。 JaegerMonkey和TraceMonkey在Firefox中結合,形成一個系統,如果代碼被追蹤得更快,TraceMonkey就會執行它,如果代碼的本地速度更快,JaegerMonkey就會編譯它,就像SFX – aviad

2

每個瀏覽器窗口以及該窗口內的每個瀏覽器框架都是它自己的HTML/JavaScript執行引擎(類似於虛擬機)。它們並不是完全獨立的,因爲(受到一些安全限制),它們可以相互通信並且可以相互瞭解,但它們每個都有它們的執行狀態,它們自己的全局變量,它們自己的代碼,它們的自己的事件處理程序等...

Javascript代碼並沒有真正編譯C/C++代碼編譯的意義。瀏覽器只接受文本形式的javascript。瀏覽器然後解釋那個文本。不同的瀏覽器有不同的方式來解釋JavaScript文本,以儘可能快地執行。它不會像C/C++代碼那樣直接編譯爲純機器語言,而是編譯(或更改)爲解釋器可以比純文本更快地執行的東西。

+0

[V8引擎](https://en.wikipedia.org/wiki/V8_(JavaScript_engine))JIT編譯爲機器碼。 –

+1

@GregHewgill - 它不能被編譯成純機器代碼,除非幾乎每一個語句都只是對某個JS解釋器函數的函數調用,因爲JavaScript沒有像機器代碼那樣的硬類型。例如,當我在JS中寫入x + = 5時,編譯的結果不能是機器代碼,以便將某個寄存器或某個堆棧變量添加到像它的C/C++中。 – jfriend00

1

實際上,瀏覽器裏面有一個JavaScript Engine。該引擎讀取並執行JavaScript代碼。所以,這是一個​​(根本不編譯)

相關問題