【译】最近的V8带来了那些新变化!

531 阅读7分钟

本文源于翻译 Clean Code Applied to JavaScript — Part I. Before Your Start

  V8 是地球上最流行的 JavaScript 引擎,支持 Chrome 和 Node.js 等技术。V8 的开发速度令人印象深刻,每天都会提交多个代码,大约每个月都会发布主要版本。 跟上更新并不容易,但您来对地方了!在这里,我们将深入研究 Google 对 JavaScript 引擎所做的最新改进和补充。

了解 Web 开发的未来是什么样子!

什么是V8?

  V8是Google开发的高性能JavaScript引擎。其目的是将JavaScript代码转换为机器代码以供底层硬件执行。该引擎主要由 Google 的 V8 团队开发,专注于速度和效率。特别是,它依赖于即时编译并使用内联缓存来实现高性能。

  得益于 V8,基于 Chromium 的浏览器和 Node.js 可以运行 JavaScript 代码。 Deno还依赖它来执行 JavaScript,使 V8 成为现代软件开发的主要元素。

V8 JavaScript 引擎:最新更新

  正如您从V8 存储库中可以看出的那样,开发节奏很快,同一天内就有多次提交。这意味着每天都会推出错误修复、增强功能和新功能。

1. JavaScript 新特性

  JavaScript 不断发展以满足现代开发的需求。新的标准化功能经常被添加到语言中,JavaScript 引擎必须实现它们。

在最新的迭代中,V8 添加了对以下内容的支持:

  • toWellFormed() string 方法:返回一个字符串,其中所有单独的代理项均替换为 Unicode 替换字符U+FFFD
  • isWellFormed() string 方法:返回一个布尔值以指示字符串是否包含任何单独的代理项。
  • 可调整大小的ArrayBufferArrayBuffer()构造函数现在接受maxByteLength来定义其最大大小(以字节为单位)。ArrayBuffer然后,您可以使用该为可调整大小的对象分配新的大小resize()。这使得ArrayBuffer 更加高效并且更接近 WebAssembly。
  • ArrayBuffer传输现在可以通过结构化克隆算法ArrayBuffer在不同的执行上下文之间传输对象。
  • RegExp标志v 一种新模式,可解锁对扩展字符类(例如所有有效表情符号)的支持。
  • Object.groupBy() Arrays的静态方法:根据给定的回调函数对给定可迭代的元素进行分组。
  • Array.fromAsync() static 方法Array:从async可迭代、可迭代或类似数组的对象创建一个新的浅复制实例。
  • Promise.withResolvers() 静态方法:返回一个对象,其中包含一个新Promise对象和两个解析或拒绝它的函数。

另外,动态import()已更新为接受with指定导入属性的选项:

const jsonModule = await import("./data.json", {
  // specify some extra attributes with through
  // the "with" object
  with: { type: "json" },
});

2. 支持垃圾收集语言编译为WebAssembly

  WasmGC 是WebAssembly Garbage Collection的缩写,代表了 WebAssembly (Wasm) 领域的关键进步。它的目标是将垃圾收集(GC)语言编译为 WasmGC 构造,以使它们在网络上运行。

  经过几年的努力,WasmGC 终于准备好了。Wasm 现在有一种内置方法来分配由 V8 垃圾收集器管理的对象和数组。这使得能够将用 Java、Kotlin、Dart、Python、C# 和类似垃圾收集语言编写的应用程序编译为 Wasm。这是将 GC 语言高效引入网络的巨大飞跃!

3. 全新的优化编译器

  最近的 V8 更新引入了一个名为Maglev的全新优化编译器。该解决方案位于Sparkplug非优化 JavaScript 编译器和TurboFan顶级优化编译器之间。

  作为高速优化编译器,Maglev 介于两者之间。它生成代码的速度比 Sparkplug 慢近 20 倍,但比 TurboFan 快 10 到 100 倍。

有关更多信息,请阅读Maglev — V8 最快的优化 JIT

4. 优化编译器 Turbofan 的新架构

  Maglev并不是开发团队在编译器技术上进行的唯一投资。最新的 V8 更新还引入了 Turboshaft,这是高级优化编译器 Turbofan 的新内部架构。

  这种新的、现代的、设计更好的架构使 Turbofan 通过新的优化和更快的编译更容易扩展。事实上,在某些情况下,编译时间会快两倍。这还可以节省电量,为未来的其他性能提升铺平道路。

5. 通过控制流完整性提高安全性

  CFI 是控制流完整性的缩写,是一项重要的安全功能,旨在阻止旨在劫持程序控制流的攻击。通过对控制流指令的执行方式进行严格控制,CFI 可以防止攻击者利用内存损坏漏洞执行任意代码。因此,即使攻击者成功破坏了进程的内存,CFI 也会阻止他们执行未经授权的指令。

  V8 中采用 CFI 为安全环境带来了多项好处,显着降低了成功利用内存损坏漏洞的风险。这些通常是攻击者试图控制系统的主要目标。通过对正向和反向控制流传输应用完整性检查,CFI 降低了攻击者操纵程序执行以执行恶意代码的可能性。

6. 更快的 HTML 解析器和 DOM 分配

为了追求优化 Web 性能,最近的 V8 更新对 HTML 解析和 DOM 分配进行了重大改进。

  性能基准测试中很大一部分时间都花在解析 HTML 上。尽管这不是对 V8 的直接增强,但团队决定应用他们在性能优化方面的专业知识,为Blink添加更快的 HTML 解析器。如果您不熟悉,Blink 是 Chromium 使用的渲染引擎,基于WebKit 的WebCore组件。这些变化导致性能分数显着提高了3.4%。

  其他优化已应用于Oilpan(DOM 对象的 V8 分配器)内的 DOM 内存分配策略。通过引入页池机制并支持压缩和未压缩指针,内核往返成本已大大降低。此外,通过避免对高流量字段进行压缩,分配工作负载的速度提高了 3 倍。这些更新显着改进了 DOM 密集型基准测试,提供了更流畅、响应更灵敏的浏览体验。

7. 新的 WebAssembly 功能

就像 JavaScript 一样,Wasm 中不断添加新功能。最近的主要更新是:

8. 通过编译时常量地址优化内存处理

  最后,V8 最近在内存管理方面引入了革命性的改进。这个新功能称为静态根undefined,旨在优化基本 JavaScript 对象(例如和true)在内存中的管理方式。通过在编译时为这些对象分配固定的内存地址,V8 无需在运行时查找地址,从而显着提升性能。

由于静态根,对常用对象的访问变得快如闪电。这是因为 V8 现在可以在编译时准确预测它们的内存地址。这种优化不仅可以加快代码执行速度,还可以提高内置 C++ 函数的性能。

这些 V8 引擎更新带来了什么?

  最近的大多数 V8 更新都旨在实现相同的结果:提高性能和安全性。 正如 V8 官方网站所述,其一年内的性能提升令人印象深刻,JetStream 整体增长了 14%,Speedometer 增长了惊人的 34%。

  这意味着 V8 比以往更快、更安全。由于 WasmGC,在网络上运行 Python 和 Java 的可能性显然是巨大的。我们将看看网络开发者社区对这个好消息有何反应!

结论

  在整篇文章中我们了解了什么V8,以及关于JavaScript引擎的最新消息,当然如果能给你带来帮助!欢迎点赞收藏~