推广 热搜:   服务  系统  行业    公司  中国  教师  企业  参数 

耗时一年,写3.5万亿行代码、消耗90GB内存,只为让Doom跑在TS类型系统中?

   日期:2025-03-07     浏览:91    移动:http://lanlanwork.gawce.com/mobile/quote/11438.html
整理 | 郑丽媛
出品 | CSDN(ID:CSDNnews)

在技术世界里,总有一些疯狂的想法让人忍不住惊叹:“这也能做到?”

《毁灭战士》(DOOM),这款 1993 年由 id Software 推出的经典第一人称射击游戏,几乎被移植到了所有你能想到的地方:PDF 文件、Word 文档、网站验证码……而最近,DOOM 又被移植到了一个看似不可能的地方:Typescript 的类型系统。

这件事听起来可能有些离谱,毕竟 Typescript 是一门为 Javascript 增加静态类型检查的语言,其类型系统只是用于代码分析,按理来说不能执行任何程序——然而,软件工程师 Dmitri Mitropoulos 花了整整一年的时间,写了 3.5 万亿行类型代码,消耗了 90GB 的内存,最终成功让 Doom 在 Typescript 类型系统中运行起来了!

图片


图片

Typescript 类型系统:一个不该运行游戏的地方

要理解这个项目的疯狂程度,首先得弄清楚 Typescript 类型系统的本质。

Typescript 是 Javascript 的超集,最大的特点就是引入了静态类型检查。简单来说,它可以在代码运行前帮你捕获一些常见的错误,比如函数参数类型不匹配、变量未定义等。你可以把它想象成一种“代码护栏”,确保你的代码不会在运行时遇到类型错误。

然而,Typescript 类型系统并不是为了运行程序而设计的,它的主要作用是类型推导和检查,而不是执行代码。因此,Mitropoulos 的这个项目本质上是在“滥用” Typescript 的类型系统,将其变成一个可以运行游戏的虚拟机。


图片

3.5 万亿行代码:如何“模拟”一台计算机

Mitropoulos 作为一名软件开发者的同时,也是 Michigan Typescript 创始人兼 Squiggleconf 联合创始人。而 Mitropoulos 的项目之所以如此复杂,是因为他需要在 Typescript 类型系统中模拟一台完整的计算机。

这次移植的 Doom 项目,由 3.5 万亿行类型代码组成,总大小高达 177TB,运行时通过 Typescript 类型跟踪器(Type Tracker)进行解析。

如果你对 3.5 万亿行代码这个数字没有概念,那让我们对比参考一下:

● Linux 内核的代码总量:约 4000 万行代码;

● Windows 操作系统(Windows 11 版本)代码总量:约 5000 万行代码;

据他介绍,该项目的每个类型定义都长达数千行,甚至包含了一个完整的虚拟机(VM),具备 RAM、磁盘空间等计算机核心元素:

“整个计算机是由 Typescript 类型组成的,而这些类型是 Doom 运行所需的 116 条 WebAssembly 指令的逻辑实现。”

Mitropoulos 进一步解释,在 Typescript 类型系统中的每个值相当于一行像素,总共 128,000 行像素,以 ASCII 形式渲染出 320×200 分辨率的画面。

图片

但问题是,Typescript 类型系统本身的限制成为了 Mitropoulos 推进这个项目的最大瓶颈。

例如,Typescript 类型跟踪器(Type Tracker)负责解析和实例化所有类型,以此生成游戏的输出。可 Typescript 类型系统本身就不是为处理如此庞大的代码量而设计的, 在编译过程中,类型跟踪器需要占用超过 90GB 的 RAM 才能顺利运行。

如此巨大的开销意味着 Typescript 中常见的工具都无法使用,为此 Mitropoulos 只能手动实现 Doom 的所有组件,甚至包括一个 L1 级 CPU 缓存。

又例如,Typescript 类型系统只能从左向右解析字符串,为此 Mitropoulos 不得不将二进制算法反向输入,以适应类型推导的特性。

可尽管如此,由于代码量过于庞大,在 Typescript 类型系统中光是编译 Doom 的第一帧就花了 12 天,帧率仅为 0.0000009645 fps——换句话说,每秒钟需要实例化 2000 万个类型才能得到输出。

不过,Mitropoulos 也提到:理论上,经过优化后,编译一帧的时间可以缩短到 1~12 小时,但前提是有人愿意继续完善优化方案。毕竟在进行相关优化之前,他曾估算过:整个项目可能需要占据 1.25 PB(1250TB) 的存储空间,而第一帧的编译甚至需要连续运行 3 个月才能完成。


图片

花费一年时间,从零开始的“疯狂”实验

项目完成后,Mitropoulos 在 Michigan Typescript 的 Discord 服务器中分享了他的开发经历。

图片

他表示,这个项目是他完成了“所有其他 Typescript 挑战”后的终极目标。他原本只是想弄清楚为什么 Doom 不能在类型系统中运行,但最终却找到了这种“有些离谱”的解决方案。

这个项目耗时一年,在这一年的时间里,Mitropoulos 不得不从头开始学习 C、C++ 和 WebAssembly,并编写了 12,364 个手写测试。“我觉得,我可能开发了有史以来最大的 Typescript 代码库。”Mitropoulos 说道。


图片

连 AI 也无能为力?

说到这里,可能很多人都会想到 AI:现代 AI 已经在代码编写、优化等领域取得突破,比如 GitHub Copilot、ChatGPT 等 AI 编码助手,都能帮助开发者完成大部分基础编码任务。

但 Mitropoulos 透露,在这个项目上,AI 完全无能为力:“哦,AI 也没法帮忙。”他解释道,由于这项工作涉及的底层逻辑太深,AI 根本无法理解,因此无法提供帮助。

相比之前在 PDF 文件、Word 文档、网站验证码中移植 Doom 的项目,Mitropoulos 所耗费的时间以及庞大的代码量,这或许是目前编程界最疯狂的 Doom 移植项目之一——所以,下一个问题来了:还能在哪运行 Doom?

本文地址:http://lanlanwork.gawce.com/quote/11438.html    阁恬下 http://lanlanwork.gawce.com/ , 查看更多

特别提示:本信息由相关企业自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


相关行业动态
推荐行业动态
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2023001713号