开发者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值做数组下标查找。
循环怎么跑?没有编译产物,靠记住条件表达式在源码里的位置,每轮结束跳回去,重新解析一遍。函数调用也一样——定义时把函数体位置记进符号表,调用时保存当前位置、跳过去执行、结束后再跳回来。缩进代码块直接借用C语言的调用栈,一个函数处理一层缩进,遇到缩进减少就返回。
这套办法能跑,但不是唯一的路子,是这1024字节里性价比最高的选择。下面这张表把具体让步摆开:
| 维度 | CPython | python1024 |
|---|---|---|
| 变量 | 任意长度、多种类型 | 仅单个小写字母,只支持整数 |
| 函数 | 支持参数、默认值、闭包 | 无参数,仅能递归调用 |
| 错误处理 | 有完整异常机制 | 几乎没有,输入错误直接跑飞或崩溃 |
| 执行方式 | 分词→AST→字节码→虚拟机 | 递归下降解析+就地执行,循环靠重新解析源码 |
| 编译依赖 | 标准C/C++,跨平台 | 依赖GNU C89非标准扩展,换严格编译器可能通不过 |
学习者该看什么,极客该踩住哪条线
对编译器和解释器实现的学习者,这份1024字节的代码值得逐行读。它把状态压缩、符号表设计、控制流实现这几个核心问题,摆在一个能一次性看完的篇幅里。当教材用很合适,当参考实现也行——但别指望它能直接扩展成一个真正好用的解释器,架构一开始就没往那个方向设计。
对关注极限优化和代码高尔夫的程序员,这是个练手的好靶子:怎么把变量表塞进数组下标,怎么用C调用栈顶替显式栈结构,都是体积压缩的经典手法。但如果是做嵌入式开发,别急着把这套思路搬进产品。它依赖GNU C89的非标准扩展和libc链接,交叉编译工具链未必支持;没有错误处理意味着任何异常输入都可能导致不可预测的行为,这在嵌入式场景里是硬伤,不是可以后补的细节。
Henley自己也说,如果只为跑通FizzBuzz这一个用例,体积还能压到800字节以下。这句话点破了代码高尔夫的本质:目标不是做出好用的东西,而是在给定约束下,一个东西最少需要多少字节才能看起来像那个东西。工程里追求的健壮性和可维护性,从来不是这场游戏要解的问题。
