浏览器是javascript虚拟机的一种吗?

浏览器是javascript虚拟机的一种吗?,javascript,browser,compilation,virtual-machine,Javascript,Browser,Compilation,Virtual Machine,是的,这是一个内在的问题:我看到javascript在浏览器中运行。那么,每个浏览器都是一种虚拟机(就像java中的一样),可以在上面运行javascript代码吗?我不能以任何形式“编译”javascript?对,你不能提前将javascript“编译”成任何其他形式。浏览器会为您编译它,然后运行它。一些浏览器的Javascript编译器比其他浏览器更复杂。每个浏览器窗口,甚至该窗口中的每个浏览器框架都是自己的HTML/Javascript执行引擎(类似于虚拟机) 它们并不是完全独立的,因为(

是的,这是一个内在的问题:我看到javascript在浏览器中运行。那么,每个浏览器都是一种虚拟机(就像java中的一样),可以在上面运行javascript代码吗?我不能以任何形式“编译”javascript?

对,你不能提前将javascript“编译”成任何其他形式。浏览器会为您编译它,然后运行它。一些浏览器的Javascript编译器比其他浏览器更复杂。

每个浏览器窗口,甚至该窗口中的每个浏览器框架都是自己的HTML/Javascript执行引擎(类似于虚拟机)

它们并不是完全独立的,因为(受某些安全限制的限制),它们可以相互通信并相互了解,但它们都有自己的执行状态、自己的全局变量、自己的代码、自己的事件处理程序等


Javascript代码的编译方式与C/C++代码的编译方式不同。浏览器只接受文本形式的javascript。然后浏览器解释该文本。不同的浏览器有不同的解释javascript文本的方法,以便尽可能快地执行。它不像C/C++代码那样直接编译成纯机器语言,而是编译(或更改)成解释器可以比纯文本执行快得多的东西。

实际上,浏览器内部有一个运行程序。该引擎读取并执行JavaScript代码。因此,它相当于一个(完全没有编译)

@aviad:这类事情的作者们都不同意。@aviad他们中的大多数人都进行JIT编译(这就是greg所说的)@greg Hewgill,在某些情况下,没有编译的解释是两遍的。它依赖于浏览器。查看WebKit的squirrefishextreme和googlev8,看看什么是最快的,看看Mozilla的JaegerMonkey实现了什么。AFIAK V8和SFX是JIT,因此它们将JS代码编译为本机代码。JaegerMonkey和TraceMonkey在Firefox中结合形成一个系统,在这个系统中,如果代码的跟踪速度更快,TraceMonkey将执行它,如果代码的本地速度更快,JaegerMonkey将编译它,就像SFX@Matt布里格斯,请参见上面的JIT编译成机器代码。@GregHewgill-它不能编译成纯机器代码,除非几乎每一条语句都只是对某个JS解释器函数的函数调用,因为javascript不像机器代码那样具有硬类型。例如,当我在JS中编写x++=5时,编译的结果不能是机器代码,以将5添加到某个寄存器或某个堆栈变量,就像它可以在C/C++中一样。