从打字到生锈/WebAssembly

2020-07-09 11:21:17

我最近决定把棋盘游戏实验室的引擎从TypeScriptt换成Rust。以下是我使用这两种语言的经验总结。

使用JavaScript或TypeScript的优势之一是,您可以在客户端和服务器上运行相同的代码。对于桌面游戏实验室,这意味着可以在两端独立更新游戏状态。这将在客户端带来无延迟体验,同时仍将服务器用作权威数据源。

随着WebAssembly的起飞,您可以获得同样的优势,书写铁锈。我们通过编译Rustto WebAssembly将服务器端代码推送到客户端,而不是将客户端代码推送到服务器。

这个Rollupplugin允许您将Cargo.toml文件导入到您的TypeScript代码库中,从而实现了Rust和TypeScript代码之间的无缝集成。开发体验几乎和编写打字稿本身一样流畅(例如,当您更改一行生锈代码时,浏览器会自动刷新)。

用打字稿编写代码在很大程度上是一种愉快的经历,但改用铁锈立即暴露了打字稿的一些局限性。

与类型检查器相比,TypeScript更像是一个类型提示程序,它主要确保您不会访问不是通过类型系统声明的字段(这是非常有表现力的)。它还为您的IDE启用了更好的自动完成功能。

但是,它实际上并不能确保您正在操作的数据与您声明的表示它的类型相对应。例如,数据可能包含其他字段,甚至声明类型的值不正确。

您必须编写数据验证代码以确保您在TypeScript中操作的数据是正确的。您可以在Rust中获得这个forfree,如果您解析的数据与要将其保存在内存中的结构不一致,则会抛出错误。

Rust的模式匹配和错误处理使得处理可能导致错误的每条代码路径变得非常容易,从而产生非常健壮的代码。

这在很大程度上使人们相信,如果编译成功,它很可能不会在运行时抛出错误。

在没有任何性能优化的情况下,最初的重写已经比以前的打字代码库更快了。这还不是太重要,但是棋盘游戏实验室最终将与机器人一起运行,所以一旦需要搜索游戏树,性能就会变得很重要。

前一台服务器使用的是ws,这是NodeJS的一个受欢迎的库。新版本使用了Warp(锈蚀),在相同的负载下使用了更少的内存。

总体而言,我对这一转变相当满意。尽管我是Rust的新手(我有C++背景,这可能会有所帮助),但我并没有遇到来自借用检查器的太多阻力。