概述
本文的主要内容如标题所示。v8.dev是V8引擎的官方网站,主要发布和V8引擎相关的内容。其中有一个部分就是V8技术发展和开发相关的内容,以博客的形式进行发表。鉴于V8本身的技术特性和位置,这些博客的内容,其实是非常技术化的。
这里需要强调,笔者并非资深的系统级软件开发者,只是对技术比较感兴趣,很多情况下并没有能力深入到这些技术的内部和细节中,只是从普通应用开发者的角度努力进行自己的理解和解读,来大概了解V8技术发展的概况和全貌,从而有一个相对感性的认知,解读角度和内容非权威仅供参考。
而且,在阅读的过程中,非常感谢Bard提供的建议,让笔者能够相对快速深入的了解相关的技术材料和信息。
内容
在2023年12月5日,v8.dev这个网站首页上的技术博客的列表和简单如下(图,文中编号是原始博客文章编号):
186. A new way to bring garbage collected programming languages efficiently to WebAssembly
日期:231101
类别:WebAssembly
主题:为WebAssembly编程语言中垃圾回收带来更高效的新方法
摘要:
在2017年推出的WebAssembly最小可行产品中,GC的实现方案是将现有GC的实现和代码编译成为WasmMVP。文章中提出了一个新的技术方案WasmGC,并和WasmMVP进行了对比。V8团队希望WasmGC端口将成为一种流行技术,因为其优势包括更小的端口,在循环收集、内存使用、开发人员工具等方面与Web集成得更好,并可以提供显著的速度优势以及在语言之间共享更多工具链工作的机会。
185. Control-flow Integrity in V8
日期:231009
类别:安全
主题:V8中的控制流程完整性
摘要:
Chrome的流行使其作为一个重要的网络基础设施,成为网络攻击的一个重要目标。很多外部攻击的攻击都试图利用V8的漏洞,在初始执行时遵循类似的模式:初始错误会导致内存损坏,但初始损坏通常是有限的,攻击者必须找到一种在整个地址空间中任意读/写的方法。这使得他们能够劫持控制流并运行shellcode,执行漏洞利用链的下一步,尝试突破 Chrome沙箱。
针对以上模式,V8设计并实现了控制流完整性 (CFI) ,它是一项安全功能,其基本构想是,即使攻击者设法破坏进程的内存,额外的完整性检查也可以阻止他们执行任意代码,从而防止其利用劫持控制流。
V8中的CFI主要包括三个部分:
- 前缘 - CFI验证间接控制流传输(例如函数指针或 vtable 调用)的完整性。
- 后沿 - CFI需要确保从堆栈读取的返回地址有效。
- JIT - 验证运行时写入可执行内存的所有数据。
184. Speeding up V8 heap snapshots
日期:230727
类别:内存工具
主题:V8堆内存快照加速
摘要:
通过改进String Storeage Hashing算法,以及缓存资源地址等优化措施,对于V8堆内存快照的生成,在开发环境和生产环境的性能分别提升了50%和90%。
183. WebAssembly tail calls
日期:230406
类别:WebAssembly
主题:V8堆内存快照加速
摘要:
在V8 v11.2中,交付了WebAssembly Tail Calls(尾调用)功能。在WebAssembly中,尾调用(tail calls)是指在函数的最后一个操作中调用另一个函数,并且该调用是函数的最后一个操作。尾调用可以通过优化来减少函数调用的开销。当函数在尾部调用另一个函数时,一些编译器和执行引擎可以实现尾调用优化(TCO,Tail Call Optimization)。这种优化可以避免在调用栈上创建新的堆栈帧,而是重用当前函数的堆栈帧,从而减少了额外的内存消耗和堆栈空间。
182. Introducing the WebAssembly JavaScript Promise Integration API
日期:230119
类别:WebAssembly
主题:WebAssembly JavaScript Promise集成API简介
摘要:
WebAssembly JavaScript Primiose Intergration API(JSPI)是一种建议标准,允许 WebAssembly 模块与 JSPI无缝集成,从而让WebAssembly可以异步调用JS方法,并可以模块化。通过使用此API,WebAssembly程序可以改进执行性能,简化代码编写并提高可移植性。
181. Pointer compression in Oilpan
日期:230727
类别:内部/内存/CPPGC(C++垃圾回收)
主题:Oilpan中的指针压缩
摘要:
这篇文章介绍了Oilpan中所使用的指针压缩技术。Oilpan是一款用于C++的基于跟踪的垃圾回收器,它用于托管Blink 中的文档对象模型,因此成为浏览器技术中优化内存的一个重要目标。
指针压缩是一种在64位平台上减小指针大小的机制。Oilpan中的指针被封装在称为Member的智能指针中。在未压缩的堆布局中,Member引用直接指向堆对象,即每个引用使用 8 字节内存。在这种情况下,堆可以在整个地址空间上分布,因为每个指针包含了指向对象所需的所有相关信息。
而在压缩的堆布局中,Member引用仅是堆笼的偏移量,堆笼是一块连续的内存区域。基指针(base)指向堆笼的起始位置,而 Member与基指针的结合形成一个完整的指针,类似于分段寻址的工作原理。
使用指针压缩,Blink的内存占用在Windows平台上可以减少20~30%,在Android平台上约是7%。
180. RegExp v flag with set notation and properties of strings
日期:220627
类别:ECMAScript
主题:正则表达式中的 /v 标志
文章介绍了ECMAScript 2023 中新增的 /v 正则表达式标志。它允许使用Unicode属性来匹配字符。包括:
- Unicode 属性字符类来匹配特定的字符集(中文、希腊字母等等)
- 改进的大小写不敏感匹配
179. Discontinuing release blog posts
日期:230617
类别:版本发布
主题:不再公布新的分支版本发布信息
没有具体技术内容,就是版本和产品发布策略的调整。
178. Retrofitting temporal memory safety on C++
日期:230614
类别:内部/内存/安全
主题:在C++中改进时间性内存安全
文章介绍了V8团队正在进行的旨在将时间性内存安全(temporal memory safety)添加到C++的工作。时间性内存安全是指保证内存在任何给定时间都不会被访问或修改,这是程序的一个重要关键的安全特性,但 C++ 语言本身并不提供对此的直接支持。
V8 团队的改进将使用一种称为“隔离和堆扫描”的方法来实现时间性内存安全。隔离是将内存分配为独立的区域,这些区域只能由特定的代码访问。堆扫描是定期检查内存,以查找未释放的对象或其他潜在问题。
177. Faster initialization of instances with new class features
日期:230420
类别:内部
主题:使用新的类特性改进实例初始化性能
V8团队在V8 9.9版本中增加了对类的相关操作的改进功能,可以显著提高类初始化和访问的性能。这些改进包括:
- 使用预生成代码来初始化类的私有字段
- 改进属性访问的算法,提高属性访问的速度
- 改进了类的构造方法的实现算法,提高构造函数执行的速度
小结
从这些博客内容来看,笔者有一些相关的思考。
- 如果这些博客文章比较全面和重点的反映V8的开发活动的话,可以看到V8的开发已经进入一个稳定发展的阶段,版本发布、安全和缺陷改进、新特性实现的节奏都不算太频繁
- 现在V8在技术上的一个发展重点看起来是WebAssembly
- V8系统内部的安全和性能在持续改进,并借鉴很多外部技术和理念