将Psyco移植到64位时可能遇到哪些陷阱?

10 投票
4 回答
1121 浏览
提问于 2025-04-15 19:58

Psyco的文档提到:

仅供参考,Psyco在任何64位系统上都无法使用。这个事实值得再次强调,因为最新的Mac OS/X 10.6“雪豹”在64位机器上默认使用的是64位的Python。要在OS/X 10.6上使用Psyco,唯一的方法是重新编译一个32位模式的Python。

一般来说,把程序从32位移植到64位主要是因为代码假设了指针类型的大小等一些小问题。考虑到Psyco的代码量并不大(大约32K行C语言 + 大约8K行Python),这会有多难呢?有没有人尝试过这个并遇到困难?我还没有机会仔细查看Psyco的源代码,所以如果我在这方面浪费时间的话,能否告诉我一下...

4 个回答

3

Psyco这个东西假设int类型的大小和指针类型的大小是一样的,这种假设在很多地方都用到了。这比直接写出64位的调用规则和汇编代码要复杂得多。顺便提一下,现在pypy也支持64位的即时编译了。

祝好,
fijal

4

Christian Tismer,Psyco的开发者之一,似乎对“这有什么难的呢”的想法表示不同意见(引用自这里):

要支持x86-64?为什么呢! 说实话,我很想做这件事,但这比任何人想象的都要难。 由于Psyco的编写方式,要把它从32位的限制中解放出来,实际上需要重新写一半的代码。 32位的假设几乎到处都是。如果内存模型完全是64位的,那就简单多了。 但没有哪个英特尔平台是那么简单的。 再见了,感谢所有的鱼 -- chris

还有:

嗯。如果要做到这一点,至少需要3到4个月的全职工作,甚至可能更多。我怀疑我能否获得赞助来做这件事。

如果你想要更多细节(可能需要对Psyco有深入了解),我想你可以试着在Psyco的邮件列表上询问一下……

3

因为psyco是一个编译器,所以它需要了解底层的汇编语言,才能生成有用的代码。这就意味着它需要知道8个新的寄存器、新的64位代码操作指令等等。

此外,为了能够和现有的代码一起工作,它还需要使用和64位代码相同的调用约定。AMD-64的调用约定有点像以前的快速调用约定,其中一些参数是通过寄存器传递的(在64位情况下,使用rcx、rdx、r8、r9来传递指针,Xmm0-Xmm3用于浮点数),其余的则放在栈上的溢出空间里。与x86不同的是,这个额外的空间通常只分配一次,用于所有可能的调用。而IA64的调用约定和汇编语言又是不同的。

所以简单来说,我觉得这可能没有听起来那么简单。

撰写回答