本文首发公众号 猩猩程序员 欢迎关注
本文来自 www.reddit.com/r/rust/comm…
引言:Temporal API的实现背景
在过去的两个月里,我一直致力于将庞大的Temporal日期时间API集成到V8中,V8是Chromium的JavaScript引擎。这项工作的核心部分完全依赖于Rust语言。虽然Firefox已经使用ICU4X(一个基于Rust的国际化库)实现了类似功能,但对于V8来说,我们选择使用了temporal_rs,它基于ICU4X,但进行了更多的规范特定的定制。虽然这不是Chromium第一次使用Rust,但这是一个比较大的Rust代码贡献。因此,尽管这项工作尚有测试符合性方面的任务需要完成,但可以说,API的实现已经完全到位。
Temporal API与Rust:跨越时区与日历的挑战
Temporal API旨在解决现有JavaScript Date API的一些严重问题,尤其是在处理时区和日历时的局限性。传统的Date对象在这些方面处理起来既不精确,也不灵活。Temporal API不仅提供了更精确的日期时间计算,还支持处理非格里历日历。这对于那些需要跨时区、跨日历系统进行精确日期处理的开发者来说,无疑是一个重大的改进。
然而,实施这样的API并非易事。它涉及到复杂的日期时间算法,特别是非格里历的处理。为了实现这些功能,我们需要一个可靠的库来提供底层支持。对于V8而言,temporal_rs便是这个关键组件。
temporal_rs与ICU4X:为何选择它们?
temporal_rs是一个专门为实现Temporal API而设计的Rust库,建立在ICU4X基础上。与Firefox的实现不同,V8团队选择了在ICU4X之上进行额外开发,打造了temporal_rs,以更好地契合Temporal API的规范需求。
ICU4X提供了对国际化和日期时间的强大支持,特别是在处理非格里历日历时。然而,temporal_rs不仅仅是简单地利用ICU4X,它还处理了Temporal API的规范细节,并且提供了额外的抽象层,确保其行为符合规范要求。
尽管ICU4X在很多复杂的非格里历算法处理上至关重要,但temporal_rs填补了ICU4X的一些空白,尤其是那些针对JavaScript开发环境特定需求的部分。
Rust与V8的集成:挑战与解决方案
将Rust代码集成到V8中并非没有挑战。最初,V8的错误处理和数据交换机制并不适应Rust的“只移动类型”特性。因此,我们需要在V8的错误处理系统中做出一些修改,使其能够处理Rust所生成的类型。此外,V8内部的字符串处理方式与Rust的方式也有所不同,因此,我们需要在两者之间进行频繁的转换,尤其是UTF-16和UTF-8字符串的转换。
幸运的是,Diplomat这个Rust到JavaScript的FFI库简化了这一过程。它为Rust与V8之间的交互提供了一个高效的桥梁,尤其在字符串编码、错误处理等方面,使得集成变得更加平滑。
Jiff与temporal_rs:两者的对比与选择
在开发过程中,Jiff这个Rust库也被提及过,它是一个灵感来源于Temporal的库。尽管Jiff是一个不错的通用日期时间库,但它并没有实现Temporal规范,因此它并不适合用作V8中Temporal API的基础。Jiff的设计初衷并不是为了浏览器中的日期时间处理,它的设计目标更多是通用性的,缺乏对非格里历日历的支持。
temporal_rs则专注于实现Temporal API,它符合所有的规范要求,尤其是在日期时间的各种细节上,确保符合JavaScript规范的行为。虽然Jiff在一些普通用途上表现不错,但在需要满足特定标准和处理复杂日历时,temporal_rs显然是更合适的选择。
时间与精力分配:构建与集成
关于temporal_rs和V8集成所花费的时间与精力,开发者们指出,temporal_rs的构建占据了大部分工作量,大约70%到80%的努力都集中在开发和维护这个库及其依赖项上。相比之下,将其与V8集成的工作虽然复杂,但相对来说,开发过程更加平滑。通过Diplomat,我们能够快速将Rust代码和V8的C++代码进行对接,而集成过程中最大的挑战,仍然是如何处理从JavaScript到Rust的参数传递和转换。
国际化与未来展望:更多Rust进V8?
Rust在Chromium中的应用并不止于Temporal API。事实上,Chromium中的其他项目也在逐步采用Rust。例如,skrifa和read-fonts库已经在稳定版Chrome中替代了传统的freetype库,此外,harfrust库正在开发中,目的是替代Chrome中的HarfBuzz。
有趣的是,Rust代码在性能上表现出色,甚至超越了许多经过深度优化的C++库。这种表现使得更多团队开始考虑将Rust引入到更多Chromium组件中。未来,V8的Intl(国际化)模块也有可能会迁移到ICU4X,从而进一步提高性能,并利用Rust的优势。
结语:Rust与Temporal的未来
总的来说,Temporal API的集成不仅是对JavaScript日期时间处理的重大改进,也为Rust在V8中的应用开辟了新的道路。随着更多团队开始探索Rust在浏览器引擎中的潜力,我们可以预见,未来会有更多基于Rust的高性能模块进入V8和Chromium,进一步提升Web开发的效率与性能。
这项工作证明了Rust在性能和内存安全方面的优势,并为Web开发者带来了一个更加可靠和高效的日期时间处理工具。随着更多规范的实现和优化,Temporal API将成为现代JavaScript开发中不可或缺的一部分。
本文首发公众号 猩猩程序员 欢迎关注