【问题标题】:Has the V8 engine used C++ to replace parts of the codebase previously written in JavaScript?V8 引擎是否使用 C++ 替换了以前用 JavaScript 编写的部分代码库?
【发布时间】:2019-07-19 14:07:55
【问题描述】:

我之前读过V8引擎源代码。我可以在其中找到 JavaScript 实现的代码,例如Array.js

最近想再次查找数组排序的源码,发现JS部分已经去掉了。我只能找到array-sort.tq,它位于[v8/third_party/v8/builtins]。

我正在寻找的方法有问题吗?还是只是去掉了 JS 部分? JavaScript 开发人员很难知道实现的细节。

【问题讨论】:

  • 为什么想知道排序实现的细节?它可以随时更改,唯一的保证是规范中的保证(最近确实发生了变化——排序变得稳定)。
  • 我最近也注意到了这一点。从动机的角度来看,这似乎是一个不言而喻的问题:典型的 JS 开发人员希望查看实现以了解,例如,当 arr.length < 10 可能解释各种程序行为时,使用插入排序而不是快速排序,那种东西。至少,之前用 JS 编写的整个文件都不见了,这似乎有点令人惊讶,所以值得问一下为什么/在哪里/发生了什么?
  • @ggorlen:如果您的程序的行为因此而改变,那么您的程序就是错误的。
  • (但如果只是在学术上,这是一个有趣的问题)
  • 当然公平到想知道为什么 JavaScript 实现消失了。 :-) 和/或只是出于好奇和教育原因想查看实现细节。

标签: javascript c++ v8


【解决方案1】:

一些内置函数(例如Array.prototype.sort)现在是用Torque 编写的,而不是C++ 或JavaScript。 Torque 是为 V8 构建的语言:

该语言被设计得足够简单,可以很容易地直接将 ECMAScript 规范转换为 V8 中的实现,但也足够强大,可以以稳健的方式表达低级 V8 优化技巧,例如创建基于快速路径的关于特定对象形状的测试。

...

Torque 提供语言结构来表示 V8 实现的高级、语义丰富的花絮,并且 Torque 编译器使用 CodeStubAssembler 将这些小部分转换为高效的汇编代码。

(更多关于CodeStubAssemblerhere。)

更多内容请关注Torque builtins blog post

所以是的,Array.prototype.sort 和许多其他 Array 方法现在是用 Torque 编写的,它被编译成高效的汇编代码,供 V8 的 JavaScript 解释器 (Ignition) 和 JavaScript 编译器 (TurboFan) 使用。 (是的,V8 两者都有。:-) More here,但简而言之:V8 将 JavaScript 解析为字节码,然后用 Ignition 解释它。热点 [经常运行的区域] 在需要时通过 TurboFan 编译为本机代码。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2012-12-20
    • 1970-01-01
    • 2014-01-21
    • 2013-08-10
    相关资源
    最近更新 更多