Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript是编译或解释语言,还是两者兼而有之?_Javascript - Fatal编程技术网

JavaScript是编译或解释语言,还是两者兼而有之?

JavaScript是编译或解释语言,还是两者兼而有之?,javascript,Javascript,我为这个愚蠢的问题感到抱歉,但我对此感到困惑 我一直在读一本你还不知道JS的书,书上说 JS最准确地描述为一种编译语言 他们用一些例子来解释,这对我来说很有意义 但是当我在网上搜索的时候。大多数人认为JS是一种解释语言。 我读到JS引擎使用多种技巧来处理JS程序,比如JIT、热重新编译 我是否认为JavaScript既是编译语言又是解释语言? < P> Update: 当JavaScript在1995-96年首次出现时,Brendan Eich创建了第一个JS引擎,名为spider monke

我为这个愚蠢的问题感到抱歉,但我对此感到困惑

我一直在读一本你还不知道JS的书,书上说

JS最准确地描述为一种编译语言

他们用一些例子来解释,这对我来说很有意义

但是当我在网上搜索的时候。大多数人认为JS是一种解释语言。 我读到JS引擎使用多种技巧来处理JS程序,比如JIT、热重新编译


我是否认为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.
}