将 Psyco 移植到 64 位可能存在哪些缺陷?
Posted
技术标签:
【中文标题】将 Psyco 移植到 64 位可能存在哪些缺陷?【英文标题】:What are the possible pitfalls in porting Psyco to 64-bit? 【发布时间】:2010-03-03 19:18:08 【问题描述】:Psyco 文档说:
仅供参考,Psyco 不 可以在任何 64 位系统上工作。 这个事实值得再次注意, 现在最新的 Mac OS/X 10.6 “雪豹”自带默认 64 位上的 64 位 Python 机器。使用 Psyco 的唯一方法 OS/X 10.6 是通过重新编译自定义 32 位模式下的 Python。
一般来说,将程序从 32 位移植到 64 位只是当代码假定指针类型具有一定大小和其他类似的小(ish)问题时才是真正的问题。考虑到 Psyco 并不是一大堆代码(约 32K 行 C + 约 8K 行 Python),它有多难?有没有人试过这个并撞墙?我还没有真正有机会好好看看 Psyco 的资源,所以如果我在浪费时间研究这个,我真的很感激......
【问题讨论】:
【参考方案1】:Christian Tismer,Psyco 开发人员之一似乎也不同意“这有多难”的假设(引自 here):
需要来 x86-64 吗?为什么! 说真的,我很想这样做, 但这比 任何人都会期待。由于方式 psyco是写的,真的会 半重写以将其从它的 32-苦味。 32位假设 无处不在。这将是 直截了当,如果内存模型 都是 64 位的。但没有英特尔平台 就这么简单。这么久,谢谢 对于所有的鱼——克里斯
和
嗯。如果不是更多的话,至少要花费 3 或 4 个月的全职工作才能做到这一点。我怀疑我能否获得赞助。
如果您想了解更多详细信息(可能需要 Psyco 的内部知识),我想您可以随时尝试在其中一个 psyco 邮件列表中询问...
【讨论】:
【参考方案2】:由于 psyco 是一个编译器,它需要了解底层的汇编语言才能生成有用的代码。这意味着它需要了解 8 个新寄存器、64 位代码的新操作码等。
此外,要与现有代码互操作,它需要使用与 64 位代码相同的调用约定。 AMD-64 调用约定与旧的快速调用约定类似,其中一些参数在寄存器中传递(在 64 位情况下,rcx,rdx,r8,r9 用于指针,Xmm0-Xmm3 用于浮点),其余为推到堆栈上的溢出空间。与 x86 不同,这个额外的空间通常为所有可能的调用分配一次。 IA64 约定和汇编语言还不同。
简而言之,我认为这可能并不像听起来那么简单。
【讨论】:
64 位平台的 C 编译器不应该处理大部分这些吗? psyco 中的内联汇编似乎很少( 【参考方案3】:Psyco 假设 sizeof(int) == sizeof(void*) 到处都是。这比写下 64 位调用约定和汇编程序要困难得多。顺便说一句,pypy 现在支持 64 位 jit。
干杯, 菲哈尔
【讨论】:
【参考方案4】:+1 表示“......这有多难?”。
看这里:http://codespeak.net/svn/psyco/dist/c/i386/iprocessor.c
所有 ASM 都必须被移植,而且关于底层处理器的假设无处不在。
我认为可以公平地说,如果移植很简单(或不太困难),那么它已经完成了。
【讨论】:
很公平。我想知道为什么这是一项艰巨的任务。进一步搜索将我指向邮件列表帖子,其中甚至 Google 的工程师似乎都放弃了将 Psyco 移植到 Unladen Swallow 项目。 PS:“这有多难”的评论完全是在开玩笑。我完全预料到会有我没有理解的问题(这是首先发布这个问题的重点)。否则,我会尝试它。 我发现自己在说“这有多难?”几乎每次我与营销人员交谈时都以同样的方式:P以上是关于将 Psyco 移植到 64 位可能存在哪些缺陷?的主要内容,如果未能解决你的问题,请参考以下文章
将使用 Psyco 的 Python 应用程序移植到 Mac
我使用 Python 2.7、Windows 7 64 位——Psyco 的替代品?