如何将JavaScript代码转换为机器代码?或者为什么不是



我正在努力理解一段JavaScript代码是如何执行的。到目前为止,我已经把大部分布局都画出来了,但还有一些空白我想弥补。

我知道计算机的CPU只能理解0和1。因此,最终,我们(用高级语言(编写的任何代码都会被转换为0和1,然后由CPU执行。就JavaScript而言,使这段旅程成为可能的主要角色是JavaScript引擎。所以这就是我所研究的,我选择了chrome的V8来帮助我描绘整个事情。

因此,JavaScript引擎首先解析代码,并最终生成AST(抽象语法树(。Ignition是v8的字节码生成器,也是字节码解释器。接下来是代码实际执行的步骤,这里我很难理解发生了什么。我已经发现;执行字节码";同时,优化编译器Turbofan通过更好地处理重复代码,然后将优化后的代码作为机器代码返回,从而提高了执行速度。

我认为执行字节码意味着将它们转换为机器代码,然后CPU将运行这些代码,但事实并非如此。由于Turbofan只是一个优化编译器,我想知道是什么将字节码转换为机器码?然后我发现V8并没有将所有函数编译成机器代码,只有那些运行得足够热以进行优化编译的函数(可能(值得投入时间

那么,字节码成为"字节码"意味着什么呢;执行";?CPU不理解字节码,字节码也没有转换成机器代码。有人能简单地解释一下发生了什么吗?

解释器是执行另一个程序的程序;这不需要先将其他程序翻译成机器代码
V8中的字节码解释器由机器指令本身组成,因此CPU执行解释器。

举例来说,假设我们想要实现自己的编程语言。为了简单起见,假设这种语言的目的是执行用通俗英语编写的算术指令;我们正在用JavaScript为它编写一个解释器
在我们的语言中,一个有效的程序应该是"three plus two"。它的解释器的第一个版本可能类似于:

function interpret(program) {
let instructions = program.split(" ");
let current = 0;
function LiteralValue(inst) {
switch (inst) {
case "one": return 1;
case "two": return 2;
case "three": return 3;
// TODO: add other numbers
}
}
for (let i = 0; i < instructions.length; i++) {
switch (instructions[i]) {
case "one":
case "two":
case "three":
// TODO: add other numbers
current = LiteralValue(instructions[i]);
break;

case "plus":
current = current + LiteralValue(instructions[i+1]);
i++;  // We've just consumed the next instruction.
break;
// TODO: add support for "minus" etc.
}
}
return current;
}

这不是一个很好的解释器,但它通过解释程序来演示执行程序的原理:解释器";"看节目";,看到程序想要完成什么,并执行该操作。它不会先将程序转换为机器代码;它看到CCD_ 2并执行CCD_。

可以说CCD_ 4是我们的";字节码";(如此简单以至于它实际上与关键字相同(,并且片段current = current + ...是它的";字节码处理程序";。

由于我们在这个例子中使用了JavaScript,它本身是由解释器执行的(至少在优化开始之前(,我们甚至在这里得到了三个层次的堆叠:"five plus two"是我们自定义语言中的一个程序,由另一个程序(function interpret(...)(执行,该程序由另一程序(浏览器中的JS引擎(执行,最终由CPU执行。

相关内容

最新更新