针对 .pyc 文件的编译器?
5 个回答
我建议你专注于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了!
“我想写一个把Scheme语言转换成pyc格式的编译器。”
我脑袋疼!你为什么想这么做呢?Python的字节码是一种中间语言,专门为Python语言设计,目的是在Python虚拟机上运行,而这些虚拟机又是根据Python的需求特别定制的。现在Python开发中最重要的几个方向,就是把Python移植到其他“虚拟机”上,比如Jython(运行在Java虚拟机上)、IronPython(运行在.NET上)、PyPy,还有Unladen Swallow项目(把CPython移到基于LLVM的表示上)。试图把另一种完全不同的语言(Scheme)的语法和语义挤进另一种高级语言的中间表示里,感觉是在用错误的方式解决问题(不管这个问题是什么)。所以,总的来说,似乎不会有很多.pyc编译器存在,这背后是有原因的。
几年前,我写了一个编译器,它可以处理一种叫“Noodle”的类似Lisp的语言,并生成Python字节码。虽然这个编译器并没有变得特别有用,但对我来说,这是一个非常好的学习经历,帮助我更好地理解了Common Lisp(我借鉴了它的几个特性)和Python。
我能想到两种情况,直接生成Python字节码可能会更有用,而不是先生成Python代码再交给Python编译器:
- 完整的闭包:在Python 3.0之前(也就是在
nonlocal
关键字出现之前),你不能直接修改一个闭包中变量的值,除非使用一些复杂的字节码技巧。你可以改变值,所以通常会有一个闭包引用一个列表,然后在内部作用域中修改这个列表的第一个元素。这种情况可能会让人很烦恼。不过,这个限制是语法的一部分,而不是Python虚拟机的问题。我的语言有明确的变量声明,所以它成功地提供了“正常”的闭包,并且可以修改闭包中的值。 - 在不引用任何内置对象的情况下获取回溯对象。这确实是个非常小众的情况,但我曾用它来破解早期版本的“safelite”监狱。你可以查看我关于这方面的帖子。
所以,是的,这可能比它值得的工作量要大得多,但我很享受这个过程,你也可能会喜欢。