将Psyco移植到64位系统中可能会遇到哪些问题?

10

Psyco文档指出:

值得注意的是,Psyco在任何64位系统上都无法使用。现在最新的Mac OS/X 10.6“Snow Leopard”默认提供Python为64位版本,因此这一事实尤其需要注意。在OS/X 10.6上使用Psyco的唯一方法是以32位模式重新编译自定义的Python。

通常来说,将程序从32位移植到64位只有在代码假定指针类型具有某种大小等类似小问题时才真正成为问题。考虑到Psyco的代码量不算太多(约32K行C + 约8K行Python),那会有多难呢?有人尝试过并遇到了困难吗?我还没有机会好好看一看Psyco的源代码,所以如果我在浪费时间,请告诉我……

4个回答

4
Christian Tismer,Psyco的开发者之一,似乎不同意“有多难呢”的假设(引用自这里):

需要转移到x86-64?为什么! 说真的,我很想这样做, 但这比任何人预期的都要困难得多。 由于psyco的编写方式,从32位到64位的转换实际上需要完全重写。 32位的假设无处不在。如果内存模型都是64位的话,那就很简单了。 但没有一个英特尔平台是如此简单的。 再见,感谢所有的鱼--克里斯

嗯。如果不是更多的话,至少需要3到4个月的全职工作时间来完成。我怀疑我能否获得赞助。

如果你想了解更多细节(可能需要对Psyco有深入的了解),我猜你可以尝试在Psyco邮件列表中提问...


3
由于Psyco是一个编译器,因此它需要了解底层汇编语言才能生成有用的代码。这意味着它需要了解8个新寄存器、64位代码的新操作码等信息。
此外,为了与现有代码进行交互,它需要使用与64位代码相同的调用约定。AMD-64调用约定类似于旧的Fast-Call约定,其中一些参数被传递给寄存器(在64位情况下,指针为rcx、rdx、r8、r9和浮点数为Xmm0-Xmm3),其余的则被推送到堆栈上的寄存器中。与x86不同的是,这个额外的空间通常只为可能的所有调用分配一次。IA64约定和汇编语言也是不同的。
简而言之,我认为这可能并不像听起来的那么简单。

C编译器对64位平台不是应该自动处理大部分的问题吗?psyco中似乎没有很多内联汇编(<5行)。 - Chinmay Kanchi

3

Psyco在很多地方假设sizeof(int) == sizeof(void*)。这比仅仅写下64位调用约定和汇编语言要困难得多。顺便说一句,现在pypy支持64位jit。

祝好, fijal


1

+1 for "... how hard could it be?".

看这里:http://codespeak.net/svn/psyco/dist/c/i386/iprocessor.c

所有的汇编代码都需要移植,而且对底层处理器有各种假设。

我认为可以说,如果移植是微不足道的(或者不太困难),那么它早就已经完成了。


好的。我想知道为什么这是一个如此巨大的任务。进一步的搜索指向邮件列表帖子,即使是谷歌的工程师们似乎也放弃了将Psyco移植到Unladen Swallow项目中。 - Chinmay Kanchi
PS:这个“有多难”评论是开玩笑的。我完全预料到可能会出现我没有理解的问题(这也是我首先发布这个的目的)。否则,我就会自己尝试了。 - Chinmay Kanchi
每次我和市场部门交流时,我总是会说:“这有多难呢?”:P - Seth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接