JavaScript是编译或解释语言,还是两者兼而有之?
我为这个愚蠢的问题感到抱歉,但我对此感到困惑 我一直在读一本你还不知道JS的书,书上说 JS最准确地描述为一种编译语言 他们用一些例子来解释,这对我来说很有意义 但是当我在网上搜索的时候。大多数人认为JS是一种解释语言。 我读到JS引擎使用多种技巧来处理JS程序,比如JIT、热重新编译JavaScript是编译或解释语言,还是两者兼而有之?,javascript,Javascript,我为这个愚蠢的问题感到抱歉,但我对此感到困惑 我一直在读一本你还不知道JS的书,书上说 JS最准确地描述为一种编译语言 他们用一些例子来解释,这对我来说很有意义 但是当我在网上搜索的时候。大多数人认为JS是一种解释语言。 我读到JS引擎使用多种技巧来处理JS程序,比如JIT、热重新编译 我是否认为JavaScript既是编译语言又是解释语言? < P> Update: 当JavaScript在1995-96年首次出现时,Brendan Eich创建了第一个JS引擎,名为spider monke
我是否认为JavaScript既是编译语言又是解释语言?
< P> <强> Update: 当JavaScript在1995-96年首次出现时,Brendan Eich
创建了第一个JS引擎,名为spider monkey
(仍然在Mozilla Firefox中使用)。此时,JavaScript的创建考虑到了浏览器。因此,来自服务器的任何文件都将被浏览器快速解释和显示
解释器是这样做的最佳选择,因为
解释器
逐行执行代码并立即显示结果
但随着时间的推移,性能成了一个问题,速度越来越慢。解释器的问题在于,当您在这样的循环中反复运行相同的代码时:
const someCalculation = (num1, num2) => {
return num1 + num2;
};
for (let i = 0; i < 10000; i++) {
someCalculation(5, 6); // 11
}
因为编译器不会对循环中的每次传递重复转换,所以从中生成的代码实际上更快
编译器所做的这些编辑被称为优化
因此,Javascript将解释器
和编译器
结合起来,实现了两者的最佳结合。因此浏览器
开始为即时编译
混合称为JIT编译器的编译器
,以使引擎更快
在图像中,您可以看到一个分析器,它监视重复的代码,并将其传递给编译器
,以进行代码优化
这意味着我们输入的Javascript代码的执行速度
进入发动机后,发动机将
逐步改进,因为探查器
和编译器
不断更新
更新和更改我们的字节码
,以便
尽可能高效<代码>因此解释器允许我们立即运行代码,而分析器和编译器允许我们优化代码
我们正在跑步
现在让我们得出一些结论:
现在我们知道了JS引擎是如何工作的,作为程序员,我们可以编写更优化的代码,编译器可以使用这些代码,并比常规Javascript运行得更快但是
我们需要确保不要混淆这个编译器
——因为编译器不是完美的,它可能会出错,并且它可能会尝试优化代码,而这恰恰相反。如果它犯了一个错误,并且做了一些意想不到的事情,它会做一个叫做去优化的事情,这会花费更长的时间将其恢复到解释器
现在的大问题是:Javascript是一种解释语言吗?
答案:是的,最初Javascript问世时,您有一个Javascript引擎,如spider monkey,由Brenden Eich创建,它将Javascript解释为字节码,该Javascript引擎能够在浏览器内部运行,告诉我们的计算机该做什么
但现在事情已经发生了变化,我们不仅仅有解释器,我们还使用编译器来优化代码。所以,这是一个常见的误解
当有人说Javascript是一种解释语言时,是的
有些道理,但这取决于执行情况。你可以做一个
可能仅编译的Javascript引擎的实现。
从技术上讲,这一切都取决于实施情况
Javascript最初是一种解释语言。当它第一次遇到一位代码时,它会逐个读取令牌,并严格按照规范执行它们。这是0级
如果经常执行一段代码,比如说执行100次(具体数字取决于浏览器),则认为它是“热的”。浏览器将标记化和基本操作预计算为稍微快一点的字节码。在这个阶段,不做任何假设,字节码完全等同于原始代码。这是一级
如果代码执行得更频繁,比如10000次,并且参数的类型总是相同的,则可以执行进一步的编译步骤。许多javascript操作符根据不同的类型执行完全不同的操作。每个运算符都有一些逻辑来检查要执行的运算符变体(例如添加或串联)。另外,需要为不同类型的对象分配不同的内存量。在函数顶部执行一次类型检查,如果快得多,则立即分配所有内存。这是二级
根据浏览器的不同,可能会有更多的优化级别,通常是通过对参数进行更严格的假设。可能有一种更有效的整数加法。当然,如果使用不同的变量类型调用函数,浏览器必须再次执行未优化的原始JS
实用建议
这一切都是在幕后发生的,作为一名程序员,你很可能永远不必担心这一点。优化永远不会改变程序的大O速度,这通常是导致软件速度最慢的原因。通过确保最常调用的函数的参数类型保持一致,您可能可以稍微提高速度,但这还不够麻烦。检查MDN
这是您获得最准确信息的地方
引用以下主题:
JavaScri
const someCalculation = (num1, num2) => {
return num1 + num2;
};
for (let i = 0; i < 10000; i++) {
11; // And it will not call someCalculation again and again.
}