针对 .pyc 文件的编译器?

3 投票
5 回答
1002 浏览
提问于 2025-04-15 15:12

出于好奇,是否有很多编译器可以生成 .pyc 文件呢?

经过一番搜索,我只找到两个:

  • unholy:这是一个将 Ruby 代码编译成 pyc 文件的编译器。
  • Python:这是 Python 软件基金会提供的 Python 到 pyc 文件的编译器。

那么…还有其他的吗?

(顺便提一下,我之所以想到这个,是因为我想写一个将 Scheme 代码编译成 pyc 文件的编译器)

(再顺便说一句,我并不认为一个 Scheme 到 pyc 的编译器会有什么 用处,但这会给我一个很好的理由去学习 Scheme 和 Python 的一些内部知识)

5 个回答

2

我建议你专注于CPython。

http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html

与其做一个把Scheme翻译成.pyc的工具,不如先写一个把Scheme翻译成Python的工具,然后让CPython来处理转换成.pyc的部分。(这样做是有先例的;第一个C++编译器叫做Cfront,它把C++翻译成C,然后让系统的C编译器完成后面的工作。)

根据我对Scheme的了解,把Scheme翻译成Python并不会太难。

有一点需要注意:Python的虚拟机在处理Scheme时可能没有Scheme本身那么快。例如,Python不会自动把尾递归转换成迭代,而且Python的栈相对较浅,所以你需要在你的翻译工具中把尾递归转换成迭代。

作为额外的好处,一旦Unladen Swallow让Python变得更快,你的Scheme到Python的翻译工具也会受益,到那时可能会变得更加实用!

如果你觉得这个项目有趣,我建议你去做。并不是每个项目都必须立刻有实际用途。

附言:如果你想做一个稍微更实用的项目,可以考虑写一个AWK到Python的翻译工具。这样,使用旧版AWK脚本的人就能轻松转向Python了!

4

“我想写一个把Scheme语言转换成pyc格式的编译器。”

我脑袋疼!你为什么想这么做呢?Python的字节码是一种中间语言,专门为Python语言设计,目的是在Python虚拟机上运行,而这些虚拟机又是根据Python的需求特别定制的。现在Python开发中最重要的几个方向,就是把Python移植到其他“虚拟机”上,比如Jython(运行在Java虚拟机上)、IronPython(运行在.NET上)、PyPy,还有Unladen Swallow项目(把CPython移到基于LLVM的表示上)。试图把另一种完全不同的语言(Scheme)的语法和语义挤进另一种高级语言的中间表示里,感觉是在用错误的方式解决问题(不管这个问题是什么)。所以,总的来说,似乎不会有很多.pyc编译器存在,这背后是有原因的。

3

几年前,我写了一个编译器,它可以处理一种叫“Noodle”的类似Lisp的语言,并生成Python字节码。虽然这个编译器并没有变得特别有用,但对我来说,这是一个非常好的学习经历,帮助我更好地理解了Common Lisp(我借鉴了它的几个特性)和Python。

我能想到两种情况,直接生成Python字节码可能会更有用,而不是先生成Python代码再交给Python编译器:

  1. 完整的闭包:在Python 3.0之前(也就是在nonlocal关键字出现之前),你不能直接修改一个闭包中变量的值,除非使用一些复杂的字节码技巧。你可以改变值,所以通常会有一个闭包引用一个列表,然后在内部作用域中修改这个列表的第一个元素。这种情况可能会让人很烦恼。不过,这个限制是语法的一部分,而不是Python虚拟机的问题。我的语言有明确的变量声明,所以它成功地提供了“正常”的闭包,并且可以修改闭包中的值。
  2. 在不引用任何内置对象的情况下获取回溯对象。这确实是个非常小众的情况,但我曾用它来破解早期版本的“safelite”监狱。你可以查看我关于这方面的帖子

所以,是的,这可能比它值得的工作量要大得多,但我很享受这个过程,你也可能会喜欢。

撰写回答