
Python写C代码?不是Cython,也不是翻译器,是直接吐出可执行文件。我试了几天,发现它根本不依赖Python解释器,编译完就是个纯C程序,双击就能跑。连pip都没用上,全靠一个pythoc命令搞定。
它不让你写.c文件,但你写的还是Python语法。比如def main:里写print(42),生成的C里真有printf。类型标注不再是提醒,而是命令:i32就是int32_t,ptr[i8]直接变char*,没任何包装。Cython还得围着PyObject打转,PythoC直接绕开,连.h头文件都懒得生成,全塞进一个.c里。

我写了个小结构体,加了@struct,它自己展开成标准C struct定义。又试了ptr[ptr[i32]],生成的代码里真有char**那种双指针。它甚至拒绝VLA——不是不会,是故意不用,说C11支持太乱,宁可报错也不妥协。这点挺较真,但编译时就报错总比运行时崩好。
最不一样的是那个linear。我申请了一块内存,没配对调用consume,它死活不编译。不是警告,是硬拦。refine(not_null, ptr[i32])写完,它真在生成的C里插了if (p == NULL) abort; 不是靠文档提醒,是类型系统盯死你。Cython的cdef int *p?那只是告诉编译器“我当它是int*”,PythoC是“你要是敢让它为空,现在就滚”。
它的main函数不是模拟的。@compile def main(argc: i32, argv: ptr[ptr[i8]]),生成的就是标准int main(int argc, char **argv)。我能用sys.argv传参数,也能用argv[1]直接取值,生成的C里连Python头文件都不include。彻底断奶,不碰Cpython的API,也不调PyEval_EvalCode。
对比Cython,差别太明显了。Cython生成.so,必须import,必须有Python环境;PythoC生成a.out,扔到没装Python的树莓派上照样跑。我拿它写了串口读取小工具,交叉编译到ARMv7,没改一行代码。Cython做不到——它本质是胶水,PythoC是裁缝,拿Python这把剪刀,直接剪出一件C衣服。
但它也有笨地方。每次run都重编译,没有缓存,改个空格也要等两秒。也不让import另一个pythoc文件,说是怕混进Python运行时逻辑。我试过写两个模块,它直接报错:“not supported”。不是bug,是设计选择——它不想做中间人,就想当出口。
有人觉得它该学Cython支持.so,有人想让它对接WASI跑浏览器里。它现在没选。文档里连路线图都没提,就一句:“生成C,只生成C。” 我删掉一个类型标注,它报错信息里写的不是“预期类型”,而是“类型缺失导致C语义不完整”。它不哄你,也不惯着你。
我用它重写了以前用Python写的配置解析脚本。原来要装PyYAML,现在编译完才180KB,静态链接,没依赖。连libc都只用了printf和malloc。生成的C文件我打开看了,变量名是point_i32,函数名是add_f64,全是它自己拼出来的,不是套模板填空,是真在做元编程。
它不教你怎么写Python,也不教你怎么调C库。它只做一件事:你用Python写清楚要什么C,它就给你什么C。不加料,不解释,不兜底。写错了?自己看报错。写对了?直接跑。
昨天我把它编译出的程序发给一个搞嵌入式的同学,他盯着终端输出看了十秒,说:“这真是Python写的?” 我说:“嗯,除了没缩进报错,别的都按Python规矩来。” 他没回。
它不喊口号,不拉横幅,不搞社区投票。编译完,./a.out,回车,结果就出来。
10大股票软件提示:文章来自网络,不代表本站观点。