2010-09-02 44 views
6

在将软件设计到64位环境中时,必须考虑哪些方面,以及为什么相同的代码不适用于32位和64位(在讨论应用程序时)?为什么很难制作64位版本的软件?

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

为什么很难制作64位版本的软件?

编辑:让我们忘记旧的,奇怪的软件与神奇的数字等基本缺陷,并认为你会创建自己的软件,以兼容两者。你需要考虑哪些方面,以及目前编译器设计无法克服的问题?所有缺少的64位软件都不能简单地因为人们喜欢用神奇数字编码?! :)

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

+1

如果你想要一个很好的答案,你应该更具体。例如,制作64位版本的.NET应用程序是无脑的 - 将其设置为任何CPU或x64进行编译。很显然,你不是在谈论.NET应用程序,但你在谈论什么? :) – 2010-09-02 17:01:05

+0

我在问一般什么是技术原因,这显然使得不可能使用完全相同的代码库来构建32位和64位应用程序。因为如果它只是重​​新编译,所有的库也可以作为64位等,然后所有的应用程序也可以重新编译为64位 - >即。没问题。 – Tuminoid 2010-09-02 17:11:17

+1

“所有缺少的64位软件都不能简单地成为因为人们喜欢用神奇数字代码?!” - 很多缺少的64位软件可能是因为它不是必需的。有人请纠正我,如果我错了,但我听说的经验法则是:除非你可能寻址超过4 GB的内存,你应该编译为32位。 – 2010-09-02 17:30:33

回答

14

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

这是一个问题,如果该软件通过在C++中reinterpret_cast(可能在一些非常低级代码发生)某处鞋拔的指针为int,它发生,因为int的大小工作和指针均在相同的尺寸。基本上,代码假定指针具有一定的大小。

能咬回来的另一种方式是,如果代码与幻数散落像4而不是sizeof(void*),或0xffffffff代替INT_MAX或类似的东西。

如果软件依赖于库或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位移植可能并不总是微不足道的。

移位操作可能会受到影响。例如,移位0x80000在32位中保留10次会得到0x0,但移位0x80000在64位中保留10次会产生0x200000000

所有这些说法都没有真正的技术原因,如果代码写得很好,为什么将应用程序移植到64位上太困难了。最好的情况是,一个简单的项目重新配置和完全重建是所有需要的。

我愤世嫉俗的一面说,公司使用这种方式来实现计划过时 - 强制或鼓励人们升级到/购买最新的产品!

+0

但是,为什么这是一个问题?编译器不应该知道更好吗? – Tuminoid 2010-09-02 17:12:46

+1

它的确如此,但是如果代码使用'reinterpret_cast',编译器将不会发出诊断信息(这就是为什么需要仔细地进行类型转换的原因)。 – 2010-09-02 17:15:59

+0

我正在谈论合理质量的软件,没有充满幻数等。如果有帮助,请考虑自己创建软件以便在两个世界兼容。 – Tuminoid 2010-09-02 17:18:52

3

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

问题是,许多软件都是不顾良好的做法而编写的。制作“它”通常是典型程序员认为唯一的东西,而忽略了更多的问题。典型的解释是:如果客户没有看到代码,为什么还要用好实践呢?它的工作原理是什么?为什么要花更多时间在已经有效的东西上?

驱动程序在这里略有不同。不同的体系结构可能以不同的方式处理低级别的东西。 Windows上的x86amd64还有另一个问题:微软为amd64驱动程序设置了更严格的标准 - 硬件公司并不打算为符合更严格要求的旧硬件生成驱动程序(再次说明:为什么打扰?客户通常已经购买新硬件64位的盒子;如果他没有,我们会通过不提供驱动程序的方式让他做到这一点)。再次,开源驱动程序通常在amd64x86上都可以工作。

我有一张声卡,在Linux上的x86amd64系统上都能很好地工作,但不适用于amd64正是因为这个问题。所以为它编写amd64的驱动程序并不是不可能的;硬件公司只是不想。

因此,你的问题的最终答案是:金钱。

+0

我有一台6个月的佳能彩色激光打印机,他们没有提供64位驱动程序,***中的主要痛苦。所以购买新硬件不会带来快乐。 – Tuminoid 2010-09-02 19:06:09

4

简而言之:在最流行的语言家族中--C及其子类 - 数据类型的大小和结构都非常重要,并且实现定义的也是。事实上,C有很多依赖于实现的功能。这意味着编写非易用代码很容易。编写不假定底层架构的代码并不是不可能的,但是如果直到您尝试在不同的环境中运行代码,才会依赖于x86特定的行为,而不会意识到您已经完成了什么。

它主要是这些使建筑独立性变得困难的低级特征。在Python和C#等更高级的语言中,它更容易。