为什么制作64位版本的软件如此困难?

时间:2010-09-02 16:56:10

标签: compiler-construction 64-bit 32bit-64bit

在将软件设计到64位环境时,必须考虑哪些方面,以及为什么相同的代码不能像32位和64位一样工作(在谈论应用程序时)?

驱动程序显然是一个不同的野兽,缺少64位驱动程序是几乎所有硬件的臭名昭着的问题。在该领域有什么不同,几乎不可能找到驱动程序?

为什么制作64位版本的软件如此困难?

编辑:让我们忘记带有魔法数字等的老式软件的基本缺陷,并认为你自己创建软件,以兼容两者。您需要考虑哪些方面,是否存在当前编译器设计无法克服的问题?所有缺失的64位软件都不能仅仅因为人们喜欢带有幻数的代码?! :)

结论:似乎完全是关于人类懒惰和历史原因,而不是技术原因。

3 个答案:

答案 0 :(得分:14)

这可能很难的一个具体原因是指针大小会有所不同。指针现在占用64位,而不是占用32位的指针。

如果某个地方的软件通过C ++中的int指向一个reinterpret_cast指针(这可能出现在某些非常低级别的代码中),这就是一个问题,而且它恰好是因为int和指针的大小相同。基本上,代码假定指针有一定的大小。

另一种可以反击的方法是,如果代码中充斥着像4而不是sizeof(void*),或0xffffffff而非INT_MAX或类似的神奇数字。< / p>

如果软件依赖于库或64位不可用的函数,则可能没有64位版本的软件。您不能拥有32位和64位的应用程序。例如,在Windows中,有一个名为SetWindowLong的函数只能接受32位数据,因此如果指针需要传递给函数,它对于64位程序并不是很有用。这就是为什么有一个名为SetWindowLongPtr的函数可以处理64位程序中的64位和32位程序中的32位。

请注意,即使在64位窗口上,Internet Explorer默认也会以32位运行,因为绝大多数插件只能以32位的形式提供。一个很好的例子是the Adobe Flash Player,它只有32位可用。所以,显然即使对于像Adobe这样的大公司来说,移植64位也许并不总是微不足道。

Bitshifting操作可能会受到影响。例如,将位移0x80000以32位向左移10次会得到0x0,但是将位移0x80000以64位向左移动10次会得到0x200000000

所有这一切,没有真正的技术原因,如果代码编写良好,将应用程序移植到64位是非常困难的。最好的情况是简单的项目重新配置和完全重建就是所需要的。

我愤世嫉俗的一面说,公司将此作为实施计划淘汰的一种方式 - 强迫或鼓励人们升级/购买最新产品!

答案 1 :(得分:4)

简而言之的版本:在最流行的语言系列中 - C及其子代 - 数据类型的大小和结构都非常重要,实现定义。事实上,C有许多依赖于实现的功能。这意味着编写不可移植的代码很容易。编写不会对底层架构做出假设的代码并非不可能,但是在您尝试在不同的环境中运行代码之前,很容易依赖于特定于x86的行为而不会意识到您已经完成的任务。

主要是这些低级功能使架构独立性变得困难。在Python和C#等高级语言中,它更容易。

答案 2 :(得分:3)

合理编写的软件通常很容易移植到另一个架构。只需看看NetBSD,Debian或其他大型免费操作系统......许多开源软件可以在两种以上的架构上运行。

问题在于编写了大量软件而忽视了良好实践。使“它”工作通常是程序员通常认为的唯一问题,无视进一步的问题。典型的解释是:如果客户没有看到代码,为什么还要为好的做法而烦恼呢?为什么要花更多时间在已经有效的东西上?

这里的驱动程序略有不同。不同的架构可能以不同的方式处理低级别的东西。 Windows上的x86amd64还有另一个问题:Microsoft为amd64驱动程序设置了更严格的标准 - 硬件公司不打算为符合更严格要求的旧硬件生成驱动程序(同样:为什么这么麻烦?客户通常已经用新的64位盒子购买了新的硬件;如果他不这样做,我们将通过不提供驱动程序让他做到这一点。同样,开源驱动程序通常同时适用于amd64x86

我的声卡在Linux上的x86amd64系统上运行良好,但由于此问题,因此无法与amd64 Windows一起使用。因此,为amd64编写驱动程序并非不可能。硬件公司只是不想。

所以,你问题的最终答案是:钱。