开发者Austin Z. Henley写了一个1024字节的C程序,能跑通FizzBuzz,能处理if/else、for循环、while循环,还支持递归调用函数。代码已经开源在GitHub的AZHenley/python1024仓库,发布时间是2026年9月6日。

这不是把Python压缩进了1024字节。这是一场代码高尔夫式的解释器设计练习,用体积换能力,也用体积换健壮性——语法看起来像Python,运行方式和CPython完全是两条路。

从512字节的计算器到1024字节能跑的解释器

Henley最初的目标是512字节。他按递归下降解析器的常规写法,从"1+2"写到"x=1+2*3",再加if语句。

结果他做出了一个计算器,还超了预算。于是他调整策略:先让它能跑,再想办法压体积。

最终的golfed版本正好1024字节。可读版本反而膨胀到超过4800字节——这个对比本身就说明,体积压缩和代码可读性是互斥的两件事。

最终能跑的功能包括:单字母整数变量、四则运算带优先级、单次比较、if/else、while和for range循环(都支持else分支)、无参数函数的定义与递归调用、基于缩进的代码块、打印单个字符串或表达式。

省掉的不是效率,是CPython的整条流水线

CPython处理一段代码要走五步:分词、生成AST、分析优化、编译成字节码、虚拟机执行。这条流水线是为正确性和可维护性铺的路。

Henley这个项目直接跳过了中间表示。解析的同时就地执行,状态塞进几个全局变量和一个999字节的源码数组,变量表靠单字符ASCII值做数组下标查找。

执行路径对比 CPython 分词 Tokenize 生成AST 分析 / 优化 编译为字节码 虚拟机执行 5道工序,换正确性 python1024 递归下降解析 + 就地执行 无AST,无字节码 1道工序,换体积

循环怎么跑?没有编译产物,靠记住条件表达式在源码里的位置,每轮结束跳回去,重新解析一遍。函数调用也一样——定义时把函数体位置记进符号表,调用时保存当前位置、跳过去执行、结束后再跳回来。缩进代码块直接借用C语言的调用栈,一个函数处理一层缩进,遇到缩进减少就返回。

这套办法能跑,但不是唯一的路子,是这1024字节里性价比最高的选择。下面这张表把具体让步摆开:

维度CPythonpython1024
变量任意长度、多种类型仅单个小写字母,只支持整数
函数支持参数、默认值、闭包无参数,仅能递归调用
错误处理有完整异常机制几乎没有,输入错误直接跑飞或崩溃
执行方式分词→AST→字节码→虚拟机递归下降解析+就地执行,循环靠重新解析源码
编译依赖标准C/C++,跨平台依赖GNU C89非标准扩展,换严格编译器可能通不过

学习者该看什么,极客该踩住哪条线

对编译器和解释器实现的学习者,这份1024字节的代码值得逐行读。它把状态压缩、符号表设计、控制流实现这几个核心问题,摆在一个能一次性看完的篇幅里。当教材用很合适,当参考实现也行——但别指望它能直接扩展成一个真正好用的解释器,架构一开始就没往那个方向设计。

对关注极限优化和代码高尔夫的程序员,这是个练手的好靶子:怎么把变量表塞进数组下标,怎么用C调用栈顶替显式栈结构,都是体积压缩的经典手法。但如果是做嵌入式开发,别急着把这套思路搬进产品。它依赖GNU C89的非标准扩展和libc链接,交叉编译工具链未必支持;没有错误处理意味着任何异常输入都可能导致不可预测的行为,这在嵌入式场景里是硬伤,不是可以后补的细节。

Henley自己也说,如果只为跑通FizzBuzz这一个用例,体积还能压到800字节以下。这句话点破了代码高尔夫的本质:目标不是做出好用的东西,而是在给定约束下,一个东西最少需要多少字节才能看起来像那个东西。工程里追求的健壮性和可维护性,从来不是这场游戏要解的问题。