考虑到它运行在V8引擎上,将JavaScript编译成机器代码,那么它就是一个编译器。
但互联网上的数据(关于哈布雷的文章/哈布雷/其他网站上的问答)却另有说法:要么 严格是解释器,要么同时是编译器和解释器(这怎么可能?)。
经过上述,我不明白NodeJS是否可以完全自信地称为编译器?
考虑到它运行在V8引擎上,将JavaScript编译成机器代码,那么它就是一个编译器。
但互联网上的数据(关于哈布雷的文章/哈布雷/其他网站上的问答)却另有说法:要么 严格是解释器,要么同时是编译器和解释器(这怎么可能?)。
经过上述,我不明白NodeJS是否可以完全自信地称为编译器?
我们逐点来看:
:)
有关 JiT 编译模式的更多信息
通过代码执行的时间顺序来解释会更清楚:
最初,当执行一些 JS 代码时,它首先被翻译成未经优化但通用的字节码。该字节码在V8引擎上运行,但运行缓慢,因为不知道传入的参数类型,它们都被视为任何东西,需要广泛使用动态调度,即通过对象原型字典解析方法和运算符,这保证了条件下的多态性弱动态类型。
然后,通过收集统计数据,执行启发式规则来估计这些函数是否有效,例如,仅适用于数字,因此可以立即在此处调用算术运算,并在新函数中写入指向相应用户或内部函数的指针。优化的字节码。相应地,通过这种方式我们大大减少了去字典查找字符串属性名值的工作,从而导致性能的显着提升。
由此产生的新版本的字节码可以说是用与前一个版本相同的语言编写的,但它是它的更有效的实现(类似于冒泡排序和快速/合并排序)。新版本的函数字节码运行在同一个V8进程中,它只是替换了旧版本,后续对该函数的调用将更加高效。
顺便说一句,标准 Python 解释器CPython的工作方式与第一部分类似 - 它也将程序的源文本转换为字节码。还有一个包含 JIT 编译的替代实现:PyPy
编程语言长期以来被明确地分为解释型和编译型。同样,JS 也不能归入这些类别中的任何一个。
由于它接受人类可读语言的代码并且不会生成包含编译结果的文件,因此我认为它是一个解释器。
如果我没记错的话,对于执行中间字节码的语言(Java和C#)来说,这个执行器一般被称为虚拟机。但由于在 js 中输入的是源代码,而不是中间代码,所以我赞成解释器。
正如您正确指出的,Node.js使用 V8:
而V8是基于解释器和编译器的:
此外,TurboFan是一个真正的优化编译器,具有代码生成、寄存器分配和“普通”编译器(如 C 和 C++)的其他属性。