当前位置: 首页 > 科技观察

Rust是JavaScript基础架构的未来吗?

时间:2023-03-18 02:00:27 科技观察

Rust最初由Mozilla创建,是一种快速、可靠、内存高效且非常流行的编程语言,专为性能和安全性而设计。它已连续6年被StackOverflow调查评为最受欢迎的编程语言,并被Facebook、Apple、Amazon、Microsoft和Google等超大规模公司用于系统基础设施、加密和虚拟化。Rust现在正在取代JavaScriptWeb生态系统的一部分,例如缩小(Terser)、转译(Babel)、格式化(Prettier)、打包(webpack)、linting(ESLint)等。让我们深入了解为什么这种趋势越来越受欢迎和采用。1.什么是铁锈?Rust帮助开发人员编写快速、内存高效的软件。它是C++或C等语言的现代替代品,侧重于代码安全和简洁的语法。Rust与JavaScript完全不同。JavaScript试图找到未使用的变量或对象并自动将它们从内存中清除。这称为垃圾收集。该语言将开发人员从手动内存管理的思考中抽象出来。使用Rust,开发人员可以更好地控制内存分配,而无需经历C++的痛苦。“Rust使用一种相对独特的内存管理方法,它结合了内存‘所有权’的概念。Rust跟踪谁可以读写内存。它知道程序何时使用内存并在不再需要时立即释放它。它在编译时强制执行内存规则,几乎不可能出现运行时内存错误。您不需要手动跟踪内存。编译器会处理它。”—Discord[1]2.Rust的使用除了上述公司,Rust还被用在流行的开源库中例如:Firecracker[2](AWS)Bottlerocket[3](AWS)Quiche[4](Cloudflare)Neqo[5](Mozilla)“Rust一直是我们团队的力量倍增器,押注NoteRust是我们做出的最佳决定之一。不仅仅是性能,它的人体工程学和对正确性的关注帮助我们驯服了同步的复杂性。我们可以在类型系统中对关于我们系统的复杂不变量进行编码,并让编译器为我们检查它们。—Dropbox[6]3.从JavaScript到RustJavaScript是使用最广泛的编程语言,运行在每个带有网络浏览器的设备上。在过去的10年中,围绕JavaScript构建了一个庞大的生态系统:Webpack:开发人员希望将多个JavaScript文件捆绑为一个。Babel:开发人员希望在支持旧浏览器的同时编写现代JavaScript。Terser:开发人员希望生成尽可能小的文件。Prettier:开发人员想要一个可以正常工作的固执己见的代码格式化程序。ESLint:开发人员希望在部署之前发现代码中的问题。已经编写了数百万行代码,并修复了更多的错误,为今天的Web应用程序提供了基础。所有这些工具都是用JavaScript或TypeScript编写的。它们工作得很好,但我们已经达到了JS优化的最佳点。这启发了一种旨在显着提高Web构建性能的新型工具。SWCSWC[7]成立于2017年,是一个基于Rust的下一代快速开发工具的可扩展平台。它被Next.js、Parcel和Deno等工具以及Vercel、ByteDance、Tencent、Shopify等使用。SWC可用于编译、缩小、打包等——并且被设计为可扩展的。您可以调用它来执行代码转换(内置或自定义)。通过Next.js等更高级别的工具运行这些转换。DenoDeno[8]创建于2018年,它是一个基于V8[9]并使用Rust构建的简单、现代且安全的JavaScript和TypeScript运行时。它试图取代由Node.js的原始创建者编写的Node.js。尽管它创建于2018年,但直到2020年5月才发布v1.0[10]。Deno的linter、代码格式化程序和文档生成器是使用SWC[11]构建的。esbuildesbuild[12]创建于2020年1月,是一个JavaScript捆绑器和压缩器,比其他用Go编写的工具快10-100倍。“我正在尝试创建一个构建工具,它a)适用于给定的最佳用例(打包JavaScript、TypeScript,也许是CSS)和b)在JavaScript构建上重塑社区意味着该工具是快速的。在我看来,我们目前的工具太慢了。”—Evan[13],esbuild的创建者在esbuild发布之前,使用Go和Rust等系统编程语言构建JavaScript工具相当小众。在我看来,esbuild激发了人们对尝试使开发人员工具更快的兴趣。Evan选择使用Go:“如果足够努力,Rust版本可以以同样的速度运行。但在高水平上,Go工作起来要愉快得多。这是一个副项目,对我来说工作一定很有趣on—Evan,esbuild的创建者有些人认为Rust可以表现得更好,但两者都可以实现Evan影响社区的最初目标:“即使只有基本的优化,Rust也可以胜过Go的超级手动调整版本。与我们必须对Go进行的深入研究相比,这很好地证明了用Rust编写高效程序是多么容易。”—DiscordRomeRome[14]创建于2020年8月,是一个用于JavaScript、TypeScript、HTML、linter、编译器、捆绑器、测试运行器以及JSON、Markdown和CSS的库。他们的目标是取代和统一整个前端开发工具链。它是由SebastianMcKenzie[15]创建的,他之前也创建了Babel。那么为什么要重写一个呢?“对Babel进行必要的更改以使其成为其他工具的坚实基础将需要对所有内容进行更改。该架构与我在2014年学习解析器、AST和编译器时所做的初始设计选择有关。”—SebastianMcKenzie[16]Rome目前使用TypeScript编写并在Node.js上运行。但是他们现在正在使用RSLint解析器和他们自己的访问者系统用Rust重写[17]以进行AST遍历。NAPIRust与Node.js的集成优于其他低级语言。napi-rs[18]允许您使用Rust构建预编译的Node.js插件。它提供交叉编译和分发本地二进制文件到NPM:一个开箱即用的解决方案,不需要node-gyp或安装后脚本。您可以构建一个可以直接从Node.js调用的Rust模块,而无需创建像esbuild这样的子进程。Rust+WebAssemblyWebAssembly[19](WASM)是一种可移植的低级语言,Rust可以编译成。它在浏览器中运行,可与JavaScript互操作,并受所有主要现代浏览器的支持。“WASM肯定比JS快很多,但不如原生快。在我们的测试中,编译成WASM的Parcel运行速度比使用原生二进制文件慢10-20倍。”—DevonGovett虽然WASM还不是一个完美的解决方案,但它可以帮助开发人员创建极速的Web体验。Rust团队正在研究[20]高质量和尖端的WASM实现。对于开发人员来说,这意味着您可以在为web编译(使用WASM)的同时拥有Rust(相对于Go)的性能优势。该领域的一些早期库和框架:Yew[21]Percy[22]Seed[23]Sycamore[24]Stork[25]这些编译为WASM的基于Rust的Web框架并没有试图取代JavaScript,而是与它一起工作工作。虽然我们还没有做到这一点,但有趣的是看到Rust在两个方面都在Web之后:使现有的JavaScript工具更快,并提供[26]编译为WASM的未来想法。从头到尾生锈。4.Rust有什么问题?Rust有一个陡峭的学习曲线。网友戏称:Rust入门很容易。我已经开始了四五次了。它比大多数Web开发人员习惯的抽象级别更低。一旦您使用本机代码(通过Rust、Go、Zig或其他低级语言),算法和数据结构比语言选择更重要[27]。这不是灵丹妙药。“Rust让你思考对系统编程很重要的代码维度。它让你思考内存是如何共享或复制的。它让你思考真实但不太可能出现的极端情况,并确保它们得到处理。它帮助你多种方式。”编写极其高效代码的可能方法。”—TomMacWright[28]此外,Rust在在线社区中的使用仍然是小众的。它尚未达到关键用途。虽然学习Rust用于JavaScript工具将是一个入门障碍,但它很有趣请注意,开发人员更喜欢拥有更快的工具,即使很难贡献代码。目前,很难找到NIIT喜欢的Rust库或服务框架(例如,使用身份验证、数据库、支付等)。我认为一旦Rust和WASM获得关键采用,这将自行解决。但它还不成熟。我们需要现有的JavaScript工具来帮助我们弥合差距并逐步采用以提高性能。5.JavaScript工具的未来我相信Rust是JavaScript工具的未来。Next.js12[29]通过用SWC和Rust完全取代Babel(翻译)和Terser(压缩)开始了我们的过渡。为什么?可扩展性:SWC可以用作Next.js中的Crate,而无需妮妮ding来分叉库或解决设计约束。性能:通过切换到SWC,我们能够在Next.js中实现大约3倍的刷新速度和大约5倍的构建速度,还有更多的优化空间仍在进行中。WebAssembly:Rust对WASM的支持对于支持所有可能的平台和在任何地方进行Next.js开发至关重要。社区:Rust社区和生态系统令人惊叹且不断发展。不仅仅是Next.js采用了SWC:Deno的[30]linter、代码格式化程序和文档生成器都是使用SWC[31]构建的。dprint[32]建立在SWC之上,是Prettier[33]的30倍[34]代码格式替代品。Parcel[35]使用SWC[36]将整体构建性能提高了10倍。“在我们使用Babel的解析器和用JS编写的自定义转换之前,Parcel像库一样使用SWC。现在,我们在Rust[37]中使用SWC的解析器和自定义转换。这包括提升实现、依赖项收集等的全部范围。它的范围类似于Deno在SWC之上的构建方式。”—DevonGovett这是Rust的早期阶段——一些重要的部分仍在开发中:插件:对于许多JavaScript开发人员来说,用Rust编写插件并不容易。同时,在JavaScript中公开插件系统可能会抵消性能提升。最终的解决方案还没有出现。理想情况下,JavaScript和Rust将在未来结合。如果您想用JavaScript编写插件,则需要权衡速度。需要更多性能?使用Rust插件API。捆绑:开发swcpack的一个有趣领域是webpack的SWC替代品。它仍在开发中,但可能非常有前途。WebAssembly:如上所述,编写Rust并编译为WASM的前景非常诱人,但仍有工作要做。6.结论在可预见的未来,Rust的流行度将继续增长,并对JavaScript生态系统产生重大影响。想象一下,Next.js中使用的所有构建工具都是用Rust编写的,以便为您提供最佳性能。Next.js然后可以作为从NPM[38]下载的静态二进制文件分发。对我来说,那将是一个适合生活(并在其中茁壮成长)的理想世界。