用 1024 字节手写一个 Python 解释器
Making a Python interpreter in 1024 bytes

为了找回写代码的乐趣,我在周末挑战用纯 C 语言手写一个仅 1024 字节的 Python 解释器。没有宏技巧,也没有依赖库,目标就是让代码看起来像 Python。从最初的 512 字节尝试失败,到最终实现支持变量赋值、算术运算、if/while/for 循环、函数定义与调用以及缩进块等核心功能。这个微型解释器通过递归下降解析器直接执行源码,利用 C 语言的调用栈处理递归,甚至用跳转回退的方式实现循环。虽然牺牲了错误处理和部分语法特性,但它证明了在极简约束下也能构建出具备 Python 神韵的解释器。
它相当美妙,即使没有任何中间表示,我们依然能实现这么多功能!
HN 评论区
111- jrdres
这段代码让我忍俊不禁,因为它太“脏”了。这不像 C4 那样,虽然小巧但功能完整,还能对子集进行错误检查。相反,它比 Sector C 还要糟糕,Sector C 虽然走捷径,但至少假设源代码里的一切都是对的。
这个“Python”解释器对关键字的假设简直粗暴:
任何 "f" 都被视为 "for [x] in range[y]"(仅此一种,没有其他形式的 for)。
任何 "w" 都是 "while"。
任何 "i" 都是 "if"。
任何 "d" 都是 "def"。
任何 "p" 都是 "print("。
太脏了,太脏了。
(另外很脏的一点是,文章里的代码片段注释比 GitHub 上那个“可读版”的注释还多。你得看原文才能搞懂它在干嘛。)
作为一个“微型 Python”,这有点太简单了。如果有人愿意多给几 KB 的空间,我倒真想在这里看到列表(lists)和字典(dicts)——Lisp 都能做这些!
- teddyh
对于那些在生产环境中确实需要这种东西的人,有一个叫 Snek 的项目:<https://sneklang.org/> “Snek 是一种极小的可嵌入语言,专为仅有几 KB 闪存和 RAM 的处理器设计。”
- marcelo-earth
读完这篇文章,我简直不敢相信自己直到今天才知道 Code Golf(代码高尔夫)这种东西。我当程序员已经十多年了。
不过话说回来,这是个惊人的项目!我喜欢它是人工编写的 :)。
- userbinator
准确地说,这是 1024 字节的 C 代码,编译后的二进制文件要大得多,而且它实现的只是 Python 的一个极小子集。
循环是通过向后跳转并在每次迭代时重新解析源代码来实现的。
这就是 DOS .bat 脚本的处理方式;我不确定 Unix 风格的 Shell 是否也一样,因为我从未有过利用这个“特性”的需求。
这里的另一条评论提到了 C4,但还有一个极其紧凑(且稍大一些,因为它实际上并非刻意“代码高尔夫”)的解释器你可能想看看,那就是 J Incunabulum:
https://www.jsoftware.com/ioj/iojATW.htm
更广泛地说,数组编程文化似乎认为这种密度是常态:
- stevefan1999
但老实说,我在想最小且实用的图灵完备虚拟机(VM)是什么?我认为实现一个我们将 Python 解释器降级的 brainfuck,或者甚至是一个无类型 lambda 演算或 SKI 组合子的解释器会非常有用,特别是在硬件引导(bootstrapping)方面。
我指的是像 SectorLisp 这样的东西 https://justine.lol/sectorlisp/
- jeanmichelselli
很有趣,尤其是当你想到过去他们能在不到 32 KB 的空间里塞进一个完整的 BASIC 解释器时。
- shmoil
作者一开始就把我弄晕了。
>> 我从我能想到的最基本的代码开始:1 + 2
好吧,你是怎么把它塞进 512/1024 字节的?你试过 print(3 * * 1000) 吗?
- andai
也是该作者的作品:
让我们做一个极小的编译器