我想写一个Scheme到pyc的编译器。
这让我感到头疼!你为什么要这样做呢?Python字节码是一种中间语言,专门设计满足Python语言的需要,并设计运行在Python虚拟机上,而这些虚拟机又是根据Python的需求进行了定制。目前Python开发中最重要的领域之一是将Python移植到其他“虚拟机”,例如Jython(JVM)、IronPython(.NET)、PyPy和Unladen Swallow项目(将CPython移植到基于LLVM的表示形式)。试图将另一种非常不同的语言(Scheme)的语法和语义挤进另一种高级语言的中间表示似乎是在错误的层次上攻击问题(无论问题是什么)。因此,总的来说,似乎没有太多.py编译器存在的原因就在于这个。
几年前,我写了一个编译器,它接受一种类似于Lisp的语言称为“Noodle”,并生成Python字节码。虽然它从未变得特别有用,但对于更好地理解Common Lisp(我复制了其中的一些功能)和更好地理解Python来说,这是一次非常好的学习经验。
我可以想到两种情况,直接针对Python字节码可能会更有用,而不是生成Python并将其传递给Python编译器:
nonlocal
关键字之前),你不能修改闭包变量的值,除非使用字节码技巧。你可以改变值而不是修改,因此通常习惯于引用一个列表的闭包,并从内部作用域中更改第一个元素。这可能会变得真的很烦人。限制是语法的一部分,而不是 Python VM。我的语言有明确的变量声明,因此成功地提供了可修改闭合值的“正常”闭包。所以,是的,这可能比它值得的工作要多得多,但我很喜欢它,你也可能会喜欢。
http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html
与其写一个 Scheme 到 .pyc 的转换器,我建议您编写一个 Scheme 到 Python 的翻译器,然后让 CPython 处理转换为 .pyc。(这样做有先例;第一个 C++ 编译器是 Cfront,它将 C++ 转换为 C,然后让系统的 C 编译器完成剩下的工作。)可能有点晚了,但如果您仍然感兴趣,clojure-py项目(https://github.com/halgari/clojure-py)现在能够将Clojure的大部分内容编译为Python字节码——但始终需要一些帮助。
本身针对字节码并不难,除了一个问题:它在不同平台上不稳定(例如,在Python 3中,MAKE_FUNCTION从堆栈中弹出2个元素,但在Python 2中只弹出1个),而这些差异没有在单个位置清晰地记录下来(据我所知)——因此可能需要一些抽象层。
unholy
只存在是因为 _why 很疯狂。(确切地说是疯狂得很棒。) - Bob Aman