Doom 通过在 TypeScript 的类型系统中运行来挑战不可能
快速阅读: 《技术点》消息,软件工程师德米特里·米特罗波洛斯将《毁灭战士》游戏成功移植到了TypeScript类型系统中,耗时一年,运行该游戏需3.5万亿行类型和177太字节,单帧编译需12天,速度极其缓慢。尽管面临巨大挑战,他认为未来可通过优化提升性能。此成就展示了《毁灭战士》可在几乎任何平台上运行。
人们已经将《毁灭战士》移植到了各种设备上,从计算器到麦当劳收银机无所不包。PDF和Word文档文件成为了最新的例子。当然,这些方法极其缓慢,但令人难以置信的是,这款游戏竟然能在非计算机平台上运行。软件工程师德米特里·米特罗波洛斯将《毁灭战士》移植到非计算机平台的工作提升到了一个全新的水平。这位程序员成功地让《毁灭战士》在TypeScript类型系统中运行——这一壮举极其复杂,他花费了一整年的时间才完成。TypeScript是由微软开发的一种语言,它通过添加静态类型检查来改进JavaScript,从而在执行前捕捉编码错误。它可以被视为代码中的拼写或语法检查器,确保函数和变量被正确输入。开发者常用它来构建大型JavaScript应用程序。在TypeScript类型系统中运行游戏被认为是不可能的。即便米特罗波洛斯也承认他开始这个项目是为了“快速”证明这是不可能的。然而,当他深入研究时,他变得痴迷于让它工作。最终,即使是经验丰富的TS开发者也被震惊得无言以对。米特罗波洛斯版本的《毁灭战士》运行在3.5万亿行类型中,消耗了惊人的177太字节。编译单帧需要12天,导致每秒仅0.0000009645帧的极其缓慢速度。TypeScript类型追踪器必须每秒处理2000万个类型实例化才能生成输出,从而导致极慢的帧率。尽管存在巨大的开销,米特罗波洛斯认为性能改进是可能的。在他所在的密歇根州TypeScript Discord服务器中,他建议通过进一步优化,编译时间可以减少到“1到12小时”。他已经确定了一些可以提高速度的领域。为了使这一切正常工作,他完全用TypeScript类型构建了一个虚拟机,包括所有116个WebAssembly指令的逻辑实现,这些指令用于运行《毁灭战士》。功能计算机的每一个元素——RAM、磁盘空间,甚至L1 CPU缓存——都必须在类型系统中精心重建。由于TypeScript只允许从左向右迭代字符串,他不得不反向输入二进制算法。运行程序需要一个自定义的WebAssembly运行时,在TypeScript编辑器中处理所有内容。TypeScript编译器也需要修改以处理项目的极端规模,因为其类型追踪器在执行过程中就消耗了超过90GB的RAM。米特罗波洛斯描述这项工作是一个艰苦的挑战。他编写了12,364个手写的测试,学习了多种编程语言,并且最初估计该项目在优化前需要高达1.25拍字节。有一次,编译单帧需要连续三个月的类型实例化。他表示AI对此毫无用处。“哦,AI在这类事情上帮不上忙。”米特罗波洛斯在他的简短七分钟视频解释(标题)中说。“它是如此底层,引擎内部没有数组、对象、字符串或布尔值——只有二进制数字。《毁灭战士》只使用64位和32位整数,没有更多了。哦,那些整数既不是有符号也不是无符号。我花了一整天时间才弄明白这一点。”他用整整一年每天18小时的时间才完成。其他TS开发者对这个项目有很多疑问,米特罗波洛斯计划再发布两个视频来解释技术细节和他背后的动机。目前,我们又多了一个证据,证明《毁灭战士》可以在任何东西上运行——包括那些从未打算用来运行游戏的东西。
(以上内容均由Ai生成)