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

2024-05-04

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

我一直在读一本 you don't know JS yet书上说

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

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

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

那么我应该将 Javascript 视为编译型语言和解释型语言吗?


UPDATE:

当 JavaScript 在 1995-96 年首次出现时,Brendan Eich 创建了第一个 JS 引擎,称为 Spider-Monkey(至今仍在 Mozilla Firefox 中使用)。此时,JavaScript 的创建就考虑到了浏览器的需求。这样来自服务器的任何文件都会被浏览器快速解释和显示。

Interpreter 是这样做的最佳选择,因为 Interpreters 逐行执行代码并立即显示结果。

但随着时间的推移,性能成为一个问题,它变得越来越慢。解释器的问题在于,当您在像这样的循环中一遍又一遍地运行相同的代码时:

const someCalculation = (num1, num2) => {
  return num1 + num2;
};

for (let i = 0; i < 10000; i++) {
  someCalculation(5, 6); // 11
}

它可能会变得非常非常慢。

所以最好的选择是引入编译器,

这实际上对我们有帮助。启动需要多一点时间,因为它必须在开始时经历编译步骤 - 浏览我们的代码,理解它并将其吐出为另一种语言。但编译器足够聪明。当它看到像上面这样的代码时(我们循环它并且它具有相同的输入,返回相同的输出),它实际上可以简化这段代码,而不是多次调用这个函数,它可以用输出替换这个函数功能。像这样的东西。

const someCalculation = (num1, num2) => {
  return num1 + num2;
};

for (let i = 0; i < 10000; i++) {
  11; // And it will  not call someCalculation again and again.
}

由于编译器不会为该循环中的每次传递重复翻译,因此生成的代码实际上更快。

编译器所做的这些编辑称为优化

因此,Javascript 将解释器和编译器结合起来,以充分利用两者的优势。因此,浏览器开始混合称为 JIT 编译器的编译器进行即时编译,以使引擎更快。

在图像中你可以看到Profiler它会监视重复的代码并将其传递给编译器进行代码优化。

这意味着我们输入的Javascript代码的执行速度 进入发动机将会 逐渐完善,因为Profiler和Compiler不断 对我们的字节代码进行更新和更改,以便 尽可能高效。所以解释器可以让我们正确运行代码 而 Profiler 和 Compiler 允许我们优化此代码: 我们正在跑步。

现在让我们得出一些结论:

现在我们知道了 JS-Engine 的工作原理,作为程序员,我们可以编写更多优化代码 - 编译器可以比我们的常规 Javascript 更快地获取和运行代码。However,

我们需要确保我们不会混淆这个编译器 - 因为编译器并不完美,它可能会犯错误,并且它可能会尝试优化恰恰相反的代码。如果它犯了一个错误并且做了一些意想不到的事情,它就会做一些叫做去优化这需要更长的时间才能将其返回给口译员。

现在的大问题是: Javascript 是解释性语言吗?

ANSWER:是的,最初当 Javascript 首次出现时,您有一个 Javascript 引擎,例如 Brenden Eich 创建的 Spider-Monkey,它将 javascript 解释为字节码,并且该 Javascript 引擎能够在我们的浏览器内部运行,告诉我们的计算机要做什么。

但现在事情已经发生了变化,我们不仅有解释器,我们还使用编译器来优化我们的代码。所以,这是一个常见的误解。

当有人说 Javascript 是一种解释语言时,是的,确实如此 这有一定道理,但这取决于实施情况。你可以做一个 可能只能编译的 Javascript 引擎的实现。 从技术上讲,这一切都取决于实施。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 是编译型语言还是解释型语言,还是两者兼而有之? 的相关文章

  • 在 config() 模块中注入依赖项 - AngularJS

    目前在 app js 中我有以下路线 var gm angular module gm gm services gm directives gm filters gm controllers ngSanitize gm config rou
  • Vue.js + Element UI:在更改时获取“event.target”

    我无法获取在事件处理程序中触发事件的 html 字段 在 javascript 中是event target 我有一个表格 附加到更改事件函数的输入元素 管理更改事件的函数 我的代码如下 var Main methods change pa
  • Safari 不触发表单提交

    对于一个项目 我有两个选择表单字段 它们通过 jquery 触发器 提交 发送 这在 Firefox 和 Chrome 中运行良好 但在 Safari 中没有任何反应 这是 HTML 代码
  • 禁用 chrome React DevTools 以进行生产

    我正在尝试使用 gulp 和 envify 对我的 React 应用程序进行浏览器化以设置 NODE ENV 因此 我可以删除反应警告 控制台中的错误报告 甚至我的代码来禁用某些功能 例如react addons perf的要求 而且效果很
  • JQuery UI Draggable - 如何知道元素是否可拖动初始化?

    我的逻辑是 if this draginited a drag disabled element shouldn t get pass here as it is inited this draggable 我搜索了很多 找不到实现这个逻辑
  • 如何在 的每四个循环项之后添加

    我想在循环中的每第四个数字项之后退出循环 我想创建一个二十人的名单 在每一个tr应该是4个人 So I want to break from the loop after every 4th number of loop My one tr
  • 优化重叠矩形的绘制

    我有很多矩形 有些与其他矩形重叠 每个矩形都有一个绝对 z 顺序和一个colour 每个 矩形 实际上是粒子效果 网格或纹理的轴对齐边界框 并且可能是半透明的 但只要您不尝试剔除其他矩形后面的矩形 就更容易抽象地思考彩色矩形 所以我将在问题
  • 检测 JavaScript 版本

    如何检测浏览器支持的 JavaScript 版本 如果有 我想检查 ECMAScript 3 ECMAScript 5 和 ECMAScript 6 注意 我想避免已弃用的language tag 这里有一个很好的参考给你 http www
  • 节省页面加载时间的提示[重复]

    这个问题在这里已经有答案了 我的问题 削减那些不必要的 kb 并使页面加载速度更快的最佳方法是什么 全部是什么优化实践 编码实践 在js php中 如果执行可以使您的页面更轻 为什么我问这个 我读了这篇关于 jquery js 与 jque
  • 无法将中间件与 Firebase 和 NuxtJS 3 一起使用

    我正在尝试在示例项目中使用 Firebase 身份验证 身份验证按预期工作 但是一旦我想使用中间件来阻止用户访问管理页面或在已经登录的情况下访问登录页面 这是不可能的 我已经尝试了几个小时 但没有任何效果 这是我的package json
  • ES6 Promises/在满足多个 Promise 后调用函数(不能使用 Promises.all)[重复]

    这个问题在这里已经有答案了 我正在编写 Javascript 它需要这些事件按以下顺序发生 同时触发多个 API 调用 所有调用完成且响应返回后 执行一行代码 听起来很简单 但棘手的部分是我不能使用 Promises all 因为我仍然希望
  • 在javascript中通过window.location传递数据

    我试图通过 window location 传递数据 数据在 del id img album 中可用 我想通过 window location 发送多个值 window location save php type deldownload
  • Immutable.js 推入嵌套对象中的数组

    假设有一个对象 const object foo bar 1 2 3 我需要推动4 to object foo bar array 现在我正在这样做 const initialState Immutable fromJS object co
  • 如何在 Vue.js 2 中使用事件总线通过自定义事件传递数据

    我在用着Vue js 2 5 x 在我的玩具项目中 我实现了一个事件总线 类似于所示的here https alligator io vuejs global event bus 事件总线在 Vue 原型中全局注册为 eventBus 然后
  • 脚本标签内的 Razor RenderSection - 如何将脚本从视图插入模板函数

    我正在使用 MVC 3 和 Razor 视图引擎 我想将多个视图中的脚本注入到一个集中定义的视图中 document ready 母版页中的功能 我已经尝试过以下方法 在我的大师看来 然后 section DocumentReady ale
  • 如何防止 CSS 或 jQuery 中单词和标点符号之间的换行

    我在一个段落中有一些文字 我的问题是 当标点符号位于单词末尾时 有时可以换行到下一行 像这样 This is the text This is a new line 我可以用 CSS 或 jQuery 解决这个问题吗 如果您不在单词和标点符
  • IE 开发工具断点不起作用

    我正在尝试在 IE 11 中调试一些 javascript 但无法强制它在断点处停止 debugger 行工作正常 停止该行中的调试器 相同的文件没有debugger 行但在同一位置设置断点不会执行任何操作 功能正常 但调试器不会在断点处停
  • 401 未经授权的帖子回复

    我一直在使用 Angular 模板制作 Node js 网站 但我无法在 DB Mongo 上创建数据 这是代码 节点路由 var Property mongoose model Property var jwt require expre
  • 检测未定义的对象属性

    如何检查 JavaScript 中的对象属性是否未定义 检查属性值是否为特殊值的常用方法undefined is if o myProperty undefined alert myProperty value is the special
  • 带有 'as' 属性的通用 React TypeScript 组件(能够渲染任何有效的 dom 节点)

    我在下面的示例中按预期工作 我的问题是 无论如何我可以重写它 这样我就不必传递通用的T和as支柱 理想情况下我想通过asprop 并让组件的 prop 接口使用它 这在 TypeScript 中可能吗 export type Props l

随机推荐