使用 TypeScript 的类型运行 DOOM

184 天前
 eypidan

https://www.reddit.com/r/programming/comments/1iyqeu7/typescript_types_can_run_doom/

如链接~ 本人非前端程序员,也不是很了解 ts 的类型系统,有老哥能帮忙讲一下这件事的难度吗😂

补充:githuab: https://github.com/MichiganTypeScript/typescript-types-only-wasm-runtime

2304 次点击
所在节点    程序员
10 条回复
songray
184 天前
之前尝试过用纯 type 实现 Lua 虚拟机,只能说这玩意全是难点。
举个简单的例子,纯 type 实现 通用的整数加法运算:

// 创建长度为 N 的元组类型
type BuildTuple<N extends number, R extends unknown[] = []> =
R['length'] extends N
? R
: BuildTuple<N, [...R, unknown]>;

// 通过元组长度实现加法
type Add<A extends number, B extends number> =
[...BuildTuple<A>, ...BuildTuple<B>]['length'];

但这玩意最多只能算到 45 ,因为 ts 类型系统有递归限制,默认的类型递归深度限制是 50 。
要突破这个限制就只有把整数转为二进制数组,再从二进制数组转回整数。

这样的限制存在方方面面... 所以这老哥真是神人了。
zhizunzz
184 天前
我不理解这是用什么干了什么,我水平太低了
sillydaddy
184 天前
可以跟这个类比: /t/822664 ,说的都是图灵完备,就可以做任何事情。
hengshenyu
184 天前
@zhizunzz 用 ts 类型系统去开发一个游戏。ts 类型由于有三元表达式(条件),递归(循环),泛型(函数)。所以可以做到图灵完备。但是实际做起来有超多限制和问题,常见的就是 1 楼说的递归栈有限这种问题
w568w
184 天前
延伸阅读:GNU C 的 printf() 也是图灵完备的,因此理论上你可以用 printf 运行任何程序…… 例如 https://github.com/HexHive/printbf
billccn
184 天前
视频中说这个工作所涉及的范畴和已经远远超过了用类型实现的图灵机的复杂度。

这个人学了好几个语言来把 Doom 编译成 WASM ,然后再写一个虚拟机/模拟器在类型系统上运行 WASM ,我想图形输出(以 Ascii Art 形式)肯定也是手搓的。

另外 177TB 的类型文件直接用官方 tsc 去编译的话那估计直接崩溃了,所以这个 tsc 肯定也是优化过。
wangtian2020
184 天前
写 JavaScript 就像在解一元方程,做 typescript 类型体操就像在求导就像在做微积分
UnluckyNinja
184 天前
看了下源码,没有对 tsc 修改,就单纯地取消了各种深度、递归限制,视频 4:00 写了具体修改了哪些,在 repo 里可以从 patches 文件夹里看到(用的 pnpm 的本地补丁功能),看完视频最大的感受就是他的硬件成本也相当高,1.25P 的硬盘阵列,nodejs 吃 90G 内存……
He could so he did...
levelworm
183 天前
类似的事情,有用 imessage 用来 parse 图像的库来构造虚拟机指令,最后造出来一个 64 位的虚拟机的恶意软件。
liuidetmks
183 天前
@sillydaddy 涨姿势了,orz

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1115898

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX