Javascript 为什么要在SpiderMonkey&;中转换字节码;JSC?

Javascript 为什么要在SpiderMonkey&;中转换字节码;JSC?,javascript,interpreter,bytecode,native-code,spidermonkey,Javascript,Interpreter,Bytecode,Native Code,Spidermonkey,Javascript引擎通常用于从源代码转换字节码。然后,字节码转换为本机代码 1) 为什么要转换字节码??直接转换本机代码的源代码性能差吗? 2) 如果源代码非常简单(例如a+b函数),那么直接转换本机代码的源代码是好的?复杂性和可移植性 从源代码到目标代码的类型转换,无论是虚拟机的字节码还是真实机器的机器代码,都是一个复杂的过程字节码更接近于大多数真实机器的功能,因此更易于使用:更好地优化代码以更快地运行,转换为机器代码以获得更大的提升,或者在情况需要时转换为其他格式 因此,编写一个前端(其

Javascript引擎通常用于从源代码转换字节码。然后,字节码转换为本机代码

1) 为什么要转换字节码??直接转换本机代码的源代码性能差吗?
2) 如果源代码非常简单(例如a+b函数),那么直接转换本机代码的源代码是好的?

复杂性和可移植性

从源代码到目标代码的类型转换,无论是虚拟机的字节码还是真实机器的机器代码,都是一个复杂的过程字节码更接近于大多数真实机器的功能,因此更易于使用:更好地优化代码以更快地运行,转换为机器代码以获得更大的提升,或者在情况需要时转换为其他格式

因此,编写一个前端(其唯一任务是将源代码转换为字节码(或其他中间语言),然后编写一个后端(在中间语言上工作):优化它、输出机器代码,等等,通常会更容易针对C等语言的更传统的编译器已经这样做了很长时间。Java可以被认为是这一原则的一个不同寻常的应用:它的构建过程通常以中间表示(即Java字节码)停止,然后开发人员将其发送出去,这样JVM就可以“完成任务”当用户运行它时

除了使代码更易于使用外,这种方式还有两大好处第一大优势是您可以重用后端来与其他语言一起工作。这对JavaScript(它没有标准化的后端)来说并不重要,但像LLVM和GCC这样的项目最终是如何发展到涵盖这么多不同的语言的。编写前端是一项艰苦的工作,但假设我为Mozilla的JavaScript后端制作了一个Lua前端。然后我就可以利用Mozilla在后端所做的所有优化工作。这节省了我很多工作

另一大优势是,您可以重用前端来处理更多的机器。这一点对JavaScript确实有实际意义。如果我要编写一个JavaScript解释器,我可能会为x86编写我的第一个后端——大多数PC使用的体系结构——因为我可能会在那里进行开发工作。但是大多数手机都不使用基于x86的架构——ARM现在更为常见——所以如果我想在手机上快速运行,我需要添加一个ARM后端。但我可以做到这一点,而不必重写整个前端,所以再一次,我为自己节省了很多工作。如果我想在Wii U(或上一代游戏机,或旧版Mac)上运行,那么我需要一个POWER后端,但同样,我可以在不重写前端的情况下实现这一点

底线是,虽然两个转换看起来更复杂,但从长远来看,实际上更容易实现。这是软件设计中有时会出现的奇怪和不直观的事情之一,但其好处是真实的