在将软件设计到64位环境时,必须考虑哪些方面,以及为什么相同的代码不能像32位和64位一样工作(在谈论应用程序时)?
驱动程序显然是一个不同的野兽,缺少64位驱动程序是几乎所有硬件的臭名昭着的问题。在该领域有什么不同,几乎不可能找到驱动程序?
为什么制作64位版本的软件如此困难?
编辑:让我们忘记带有魔法数字等的老式软件的基本缺陷,并认为你自己创建软件,以兼容两者。您需要考虑哪些方面,是否存在当前编译器设计无法克服的问题?所有缺失的64位软件都不能仅仅因为人们喜欢带有幻数的代码?! :)
结论:似乎完全是关于人类懒惰和历史原因,而不是技术原因。
答案 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上的x86
和amd64
还有另一个问题:Microsoft为amd64
驱动程序设置了更严格的标准 - 硬件公司不打算为符合更严格要求的旧硬件生成驱动程序(同样:为什么这么麻烦?客户通常已经用新的64位盒子购买了新的硬件;如果他不这样做,我们将通过不提供驱动程序让他做到这一点。同样,开源驱动程序通常同时适用于amd64
和x86
。
我的声卡在Linux上的x86
和amd64
系统上运行良好,但由于此问题,因此无法与amd64
Windows一起使用。因此,为amd64
编写驱动程序并非不可能。硬件公司只是不想。
所以,你问题的最终答案是:钱。