用 1024 字节手写一个 Python 解释器

Making a Python interpreter in 1024 bytes

用 1024 字节手写一个 Python 解释器

为了找回写代码的乐趣,我在周末挑战用纯 C 语言手写一个仅 1024 字节的 Python 解释器。没有宏技巧,也没有依赖库,目标就是让代码看起来像 Python。从最初的 512 字节尝试失败,到最终实现支持变量赋值、算术运算、if/while/for 循环、函数定义与调用以及缩进块等核心功能。这个微型解释器通过递归下降解析器直接执行源码,利用 C 语言的调用栈处理递归,甚至用跳转回退的方式实现循环。虽然牺牲了错误处理和部分语法特性,但它证明了在极简约束下也能构建出具备 Python 神韵的解释器。

它相当美妙,即使没有任何中间表示,我们依然能实现这么多功能!
  1. 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 都能做这些!

  2. teddyh

    对于那些在生产环境中确实需要这种东西的人,有一个叫 Snek 的项目:<https://sneklang.org/> “Snek 是一种极小的可嵌入语言,专为仅有几 KB 闪存和 RAM 的处理器设计。”

  3. marcelo-earth

    读完这篇文章,我简直不敢相信自己直到今天才知道 Code Golf(代码高尔夫)这种东西。我当程序员已经十多年了。

    不过话说回来,这是个惊人的项目!我喜欢它是人工编写的 :)。

  4. userbinator

    准确地说,这是 1024 字节的 C 代码,编译后的二进制文件要大得多,而且它实现的只是 Python 的一个极小子集。

    循环是通过向后跳转并在每次迭代时重新解析源代码来实现的。

    这就是 DOS .bat 脚本的处理方式;我不确定 Unix 风格的 Shell 是否也一样,因为我从未有过利用这个“特性”的需求。

    这里的另一条评论提到了 C4,但还有一个极其紧凑(且稍大一些,因为它实际上并非刻意“代码高尔夫”)的解释器你可能想看看,那就是 J Incunabulum:

    https://www.jsoftware.com/ioj/iojATW.htm

    更广泛地说,数组编程文化似乎认为这种密度是常态:

    https://news.ycombinator.com/item?id=45800777

  5. stevefan1999

    但老实说,我在想最小且实用的图灵完备虚拟机(VM)是什么?我认为实现一个我们将 Python 解释器降级的 brainfuck,或者甚至是一个无类型 lambda 演算或 SKI 组合子的解释器会非常有用,特别是在硬件引导(bootstrapping)方面。

    我指的是像 SectorLisp 这样的东西 https://justine.lol/sectorlisp/

  6. jeanmichelselli

    很有趣,尤其是当你想到过去他们能在不到 32 KB 的空间里塞进一个完整的 BASIC 解释器时。

  7. shmoil

    作者一开始就把我弄晕了。

    >> 我从我能想到的最基本的代码开始:1 + 2

    好吧,你是怎么把它塞进 512/1024 字节的?你试过 print(3 * * 1000) 吗?

  8. andai

    也是该作者的作品:

    让我们做一个极小的编译器

    https://news.ycombinator.com/item?id=36102460

同日更多故事

2026-09-07