RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1603193
Accepted
Yulia
Yulia
Asked:2024-12-24 00:55:55 +0000 UTC2024-12-24 00:55:55 +0000 UTC 2024-12-24 00:55:55 +0000 UTC

NodeJS 是解释器还是编译器?

  • 772

考虑到它运行在V8引擎上,将JavaScript编译成机器代码,那么它就是一个编译器。

但互联网上的数据(关于哈布雷的文章/哈布雷/其他网站上的问答)却另有说法:要么 严格是解释器,要么同时是编译器和解释器(这怎么可能?)。

经过上述,我不明白NodeJS是否可以完全自信地称为编译器?

javascript
  • 3 3 个回答
  • 101 Views

3 个回答

  • Voted
  1. Best Answer
    AivanF.
    2024-12-24T03:31:47Z2024-12-24T03:31:47Z

    我们逐点来看:

    • Node.js是 JavaScript 语言程序的运行时、运行时环境,其中包含V8引擎。
    • V8是一个 JavaScript 解释器,采用 JIT 技术、即时编译和VM(执行生成的字节码的虚拟机)。然而,这主要是一个解释器;不会生成独立的二进制/字节文件,该文件可以在 V8 及其嵌入的运行时(无论是 Node.js)之外单独启动。或浏览器。
    • 可以与Java语言进行比较,其中的程序以类似的方式进行处理并翻译成字节码,但这个过程称为编译,因为生成的文件虽然只运行在Java虚拟机JVM上,但不再需要源代码可以工作。原则上,JS 也可以做同样的事情,但它并不是为此目的。
    • 此外,JiT 编译的工作方式很巧妙,专为弱类型和动态类型的语言而设计——在程序执行期间,分析所使用的函数参数的类型,并通过适当的统计,针对特定参数类型重新编译部分代码提高性能(在 V8 中,这些方法称为Ignition和TurboFan)。同意,这显然不是经典编译,我们一次获取输出程序并静态执行它不变:)
    • 我还想提请大家注意一个事实,也许有人不知道,语言本身不是编译或解释的,因为编程语言是抽象的规则集,理论上,既是解释器又是解释器。可以为任何语言开发编译器,尽管需要付出不同的努力,具体取决于语言规范中抽象的数量。

    有关 JiT 编译模式的更多信息

    通过代码执行的时间顺序来解释会更清楚:

    最初,当执行一些 JS 代码时,它首先被翻译成未经优化但通用的字节码。该字节码在V8引擎上运行,但运行缓慢,因为不知道传入的参数类型,它们都被视为任何东西,需要广泛使用动态调度,即通过对象原型字典解析方法和运算符,这保证了条件下的多态性弱动态类型。

    然后,通过收集统计数据,执行启发式规则来估计这些函数是否有效,例如,仅适用于数字,因此可以立即在此处调用算术运算,并在新函数中写入指向相应用户或内部函数的指针。优化的字节码。相应地,通过这种方式我们大大减少了去字典查找字符串属性名值的工作,从而导致性能的显着提升。

    由此产生的新版本的字节码可以说是用与前一个版本相同的语言编写的,但它是它的更有效的实现(类似于冒泡排序和快速/合并排序)。新版本的函数字节码运行在同一个V8进程中,它只是替换了旧版本,后续对该函数的调用将更加高效。

    顺便说一句,标准 Python 解释器CPython的工作方式与第一部分类似 - 它也将程序的源文本转换为字节码。还有一个包含 JIT 编译的替代实现:PyPy

    • 4
  2. Qwertiy
    2024-12-24T04:38:42Z2024-12-24T04:38:42Z

    编程语言长期以来被明确地分为解释型和编译型。同样,JS 也不能归入这些类别中的任何一个。

    由于它接受人类可读语言的代码并且不会生成包含编译结果的文件,因此我认为它是一个解释器。

    如果我没记错的话,对于执行中间字节码的语言(Java和C#)来说,这个执行器一般被称为虚拟机。但由于在 js 中输入的是源代码,而不是中间代码,所以我赞成解释器。

    • 4
  3. Stanislav Volodarskiy
    2024-12-24T06:44:00Z2024-12-24T06:44:00Z

    正如您正确指出的,Node.js使用 V8:

    Node.js 在V8 JavaScript 引擎上运行...

    而V8是基于解释器和编译器的:

    2017年,V8发布了全新的编译器管道,由Ignition(解释器)和TurboFan(优化编译器)组成。

    此外,TurboFan是一个真正的优化编译器,具有代码生成、寄存器分配和“普通”编译器(如 C 和 C++)的其他属性。

    • 4

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5