为什么 JavaScript 会被编译成机器码?
Why does JavaScript get compiled to machine code?
我最近开始了一些网络开发,有 ASP.NET 和一些 Javascript,但有些事情让我很困惑。
我总是读到 JavaScript 曾经被解释,直到 JIT 慢慢地把它编译成机器码(这使得浏览器更快)。
这对我来说毫无意义。如果传统的 JavaScript 应用程序不以 machine/CPU 为目标,JavaScript 如何编译为本机机器代码?
我了解 electron.js 应用程序是否使用 NodeJS 运行time 编译为机器代码。我明白了。因为它本机编译为机器代码,据我所知,不会在浏览器中运行。
如果浏览器中的传统 JavaScript 应用程序 运行,为什么必须将其编译为机器代码?浏览器负责 运行 代码,而不是 CPU。 CPU 运行 是浏览器本身。实际上,我根本看不出原生 OS 如何影响浏览器中发生的任何事情,反之亦然。似乎也是一个安全问题。
抱歉,如果这是一个愚蠢的问题,但我找不到任何可以超越说明的资源 "Javascript uses JIT"
谢谢!
劳伦
归根结底,CPU 必须 运行 代码。
JIT 将其编译为机器代码是加快速度的一种方法。
How can JavaScript compile to native machine code, if traditional JavaScript apps don't target the machine/CPU to begin with?
不是 "Javascript" 在做,而是浏览器(或者更确切地说,是浏览器内部的 Javascript 执行引擎),因为它是 "JIT" 它知道确切地指向哪个 CPU(这不是以通用方式完成的,这是针对浏览器当前 运行 正在打开的特定 CPU 完成的)。
所以,是的,有一些不匹配,因为 Javascript 不会使用 CPU 可以直接使用的低级原始类型,这就是为什么有很多间接和推测类型推理猜测工作。生成的机器代码与您从手工编码的汇编代码中获得的代码有很大不同,但它仍然可以是一个积极的结果。为了解决这个问题,开发了 WASM,它更接近 "normal" 机器代码。
其他中间的、非CPU特定格式,如 JVM 字节码或 CLR 字节码或 LLVM 位码处于类似情况(因为它们也可以编译为它们本身不直接针对的机器码)——但它们已经 "lowered" 从语言源代码到接近机器代码的东西。
Seems like a security issue as well.
是的,可以。浏览器必须小心它在这里做什么,OS 应该尽可能地沙盒浏览器。
执行指令比 运行 解释器更容易,JIT 试图利用这一点来提高性能。您计算机上的所有程序运行在某个时候都会变成机器代码,唯一的问题是执行了哪些指令。
let x=0;
for (let i=0;i<100;++i) {
x+=2;
}
由于很明显这样的代码块没有副作用,直接编译指令比解释每一行更快。
// NIOS 2 assembly, sorry its the only one i know
movi r2,0
movi r3,0
movi r4,100
loop:
addi r2,2
addi r3,1
blt r3,r4,loop
执行这个比为每个单独的指令执行解析逻辑要快。
TLDR:所有程序始终是 运行 CPU 指令,因此通过尽可能跳过解析阶段来最小化指令数量会更快
我最近开始了一些网络开发,有 ASP.NET 和一些 Javascript,但有些事情让我很困惑。
我总是读到 JavaScript 曾经被解释,直到 JIT 慢慢地把它编译成机器码(这使得浏览器更快)。
这对我来说毫无意义。如果传统的 JavaScript 应用程序不以 machine/CPU 为目标,JavaScript 如何编译为本机机器代码?
我了解 electron.js 应用程序是否使用 NodeJS 运行time 编译为机器代码。我明白了。因为它本机编译为机器代码,据我所知,不会在浏览器中运行。
如果浏览器中的传统 JavaScript 应用程序 运行,为什么必须将其编译为机器代码?浏览器负责 运行 代码,而不是 CPU。 CPU 运行 是浏览器本身。实际上,我根本看不出原生 OS 如何影响浏览器中发生的任何事情,反之亦然。似乎也是一个安全问题。
抱歉,如果这是一个愚蠢的问题,但我找不到任何可以超越说明的资源 "Javascript uses JIT"
谢谢!
劳伦
归根结底,CPU 必须 运行 代码。
JIT 将其编译为机器代码是加快速度的一种方法。
How can JavaScript compile to native machine code, if traditional JavaScript apps don't target the machine/CPU to begin with?
不是 "Javascript" 在做,而是浏览器(或者更确切地说,是浏览器内部的 Javascript 执行引擎),因为它是 "JIT" 它知道确切地指向哪个 CPU(这不是以通用方式完成的,这是针对浏览器当前 运行 正在打开的特定 CPU 完成的)。
所以,是的,有一些不匹配,因为 Javascript 不会使用 CPU 可以直接使用的低级原始类型,这就是为什么有很多间接和推测类型推理猜测工作。生成的机器代码与您从手工编码的汇编代码中获得的代码有很大不同,但它仍然可以是一个积极的结果。为了解决这个问题,开发了 WASM,它更接近 "normal" 机器代码。
其他中间的、非CPU特定格式,如 JVM 字节码或 CLR 字节码或 LLVM 位码处于类似情况(因为它们也可以编译为它们本身不直接针对的机器码)——但它们已经 "lowered" 从语言源代码到接近机器代码的东西。
Seems like a security issue as well.
是的,可以。浏览器必须小心它在这里做什么,OS 应该尽可能地沙盒浏览器。
执行指令比 运行 解释器更容易,JIT 试图利用这一点来提高性能。您计算机上的所有程序运行在某个时候都会变成机器代码,唯一的问题是执行了哪些指令。
let x=0;
for (let i=0;i<100;++i) {
x+=2;
}
由于很明显这样的代码块没有副作用,直接编译指令比解释每一行更快。
// NIOS 2 assembly, sorry its the only one i know
movi r2,0
movi r3,0
movi r4,100
loop:
addi r2,2
addi r3,1
blt r3,r4,loop
执行这个比为每个单独的指令执行解析逻辑要快。
TLDR:所有程序始终是 运行 CPU 指令,因此通过尽可能跳过解析阶段来最小化指令数量会更快