为什么 CPU 之间的区别没有更普遍?
Why isn't the distinction between CPUs more ubiquitous?
我知道人们编写的每个程序最终都必须归结为机器代码 - 这就是编译器生成的内容,这是可执行文件的组成部分,也是处理器理解的唯一语言。我也知道不同的处理器可能有不同的指令集(我知道65c816汇编,我想它和今天的计算机有很大的不同)。
不过,这是我没有得到的:如果存在不同的指令集,那么 为什么我们似乎不必在每次使用软件时都关心它?
如果一个程序是为一个特定的 CPU 编译的,它可能不会在另一个 运行 上编译 - 然而,我从来没有看到像 "Intel users download this version, AMD users download this one" 这样的通知。我什至不必知道我在做什么 CPU,每个可执行文件似乎都可以……工作。编译器也是如此,显然 - 对于每个处理器都没有单独的版本,比如 GCC,对吧?
我知道指令集的差异比以前微妙得多,但即便如此,至少应该有一点区别。我想知道为什么好像没有。
我不明白什么?
事实上,这种区别非常显着。除了英特尔与 AMD 的对比。 AMD 使他们的处理器与 Intel 机器代码兼容。当然是故意的。
今天有向 JIT 编译的转变(Java、.NET 等)。在这种情况下,可执行文件不包含机器代码。它包含一个简单的中间语言,它在执行之前被编译,在 运行 处理器的机器代码中。这使得处理器架构完全不透明。
没有 Intel/AMD 版本,因为它们使用相同的 IS 系列:x86。
但是,有些应用程序在下载时必须注意不同的版本。仍然存在完全不同的指令集,可能会使程序的行为有所不同。例如,如果你有一个 PowerPC 架构并在其上编写一个基于网络的应用程序,你可以忘记小端到大端的转换,但如果你在 x86(小端)上编译相同的代码,应用程序很可能会产生垃圾网络端。
指令的数量也有所不同,例如RISC 与 CISC。
最终还是有很多差异需要寻找,不过在大多数编程语言中您不必太担心它们,因为 compiler/interpreter 会为您处理大部分事情。如果你在较低的水平上工作,那么你必须知道你在每个架构上做什么。
此外,如果您为 ARM 编译,您将无法 运行 任何其他机器上的程序,例如您的 x86 PC。它根本不起作用。
因为操作码may/do不同,采取mov指令,在x86上操作码是0x88,在ARM上可能是0x13等等
AMD 是英特尔的克隆产品。反之亦然,这取决于您对情况的看法。无论哪种方式,都有很多共同点,程序可以编译为 运行(在合理范围内,例如不能倒退 10 年,不能让 32 位处理器理解 64 位特定指令)。下一步是主板必须做类似的事情,他们确实做了,可能有一些英特尔或 AMD 特定的芯片支持项目,但随后你会进入通用外围设备,这些外围设备可以在任何一个平台上找到,或者在一个或另一个平台上足够广泛,以至于操作系统 and/or 应用程序支持它们。
Intel/AMD 实际上有时会有不同的版本。即使对于不同版本的 Intel and/or AMD。这并不常见(尤其是在人们通常使用的那种软件中),因为它不是用户友好的(大多数人甚至不知道 CPU 是什么或做什么,更不用说他们拥有什么类型了),所以经常是多个版本都在同一个可执行文件中并在 运行 时间选择,或者使用 "least common denominator" 指令子集(当性能不是真正关心的时候)。尽管 AMD 和 Intel 之间存在显着差异,但最显着的差异在于它们支持的指令集。 AMD 总是落后于 Intel 执行 Intel 的新指令(新集出来 regularly),而 Intel 通常不执行 AMD 的扩展(AMD64 是个大例外(99% 被 Intel 接受,做了小改动),也是这里和那里的一些指令是借用的,但 XOP 永远不会出现,即使它很棒,3DNow! 从未被英特尔采用)。作为 not 将不同 "extended instruction sets" 的代码打包到同一可执行文件中的软件示例,请参阅 y-c运行cher.
不过回到开头,对于某些(我想不起来,但我以前见过)高性能软件,您可能会看到不同的版本,每个版本都是专门为获得在一种特定的微体系结构上的最大性能。例如,P4 (netburst) 和 Core2 是两个截然不同的野兽(这主要是 P4 的错误是疯狂的),即使 Core2 是向后兼容的并且可以 运行 相同的代码未修改,但这不一定是一个好主意性能角度。
我知道人们编写的每个程序最终都必须归结为机器代码 - 这就是编译器生成的内容,这是可执行文件的组成部分,也是处理器理解的唯一语言。我也知道不同的处理器可能有不同的指令集(我知道65c816汇编,我想它和今天的计算机有很大的不同)。
不过,这是我没有得到的:如果存在不同的指令集,那么 为什么我们似乎不必在每次使用软件时都关心它?
如果一个程序是为一个特定的 CPU 编译的,它可能不会在另一个 运行 上编译 - 然而,我从来没有看到像 "Intel users download this version, AMD users download this one" 这样的通知。我什至不必知道我在做什么 CPU,每个可执行文件似乎都可以……工作。编译器也是如此,显然 - 对于每个处理器都没有单独的版本,比如 GCC,对吧?
我知道指令集的差异比以前微妙得多,但即便如此,至少应该有一点区别。我想知道为什么好像没有。
我不明白什么?
事实上,这种区别非常显着。除了英特尔与 AMD 的对比。 AMD 使他们的处理器与 Intel 机器代码兼容。当然是故意的。
今天有向 JIT 编译的转变(Java、.NET 等)。在这种情况下,可执行文件不包含机器代码。它包含一个简单的中间语言,它在执行之前被编译,在 运行 处理器的机器代码中。这使得处理器架构完全不透明。
没有 Intel/AMD 版本,因为它们使用相同的 IS 系列:x86。 但是,有些应用程序在下载时必须注意不同的版本。仍然存在完全不同的指令集,可能会使程序的行为有所不同。例如,如果你有一个 PowerPC 架构并在其上编写一个基于网络的应用程序,你可以忘记小端到大端的转换,但如果你在 x86(小端)上编译相同的代码,应用程序很可能会产生垃圾网络端。
指令的数量也有所不同,例如RISC 与 CISC。
最终还是有很多差异需要寻找,不过在大多数编程语言中您不必太担心它们,因为 compiler/interpreter 会为您处理大部分事情。如果你在较低的水平上工作,那么你必须知道你在每个架构上做什么。
此外,如果您为 ARM 编译,您将无法 运行 任何其他机器上的程序,例如您的 x86 PC。它根本不起作用。 因为操作码may/do不同,采取mov指令,在x86上操作码是0x88,在ARM上可能是0x13等等
AMD 是英特尔的克隆产品。反之亦然,这取决于您对情况的看法。无论哪种方式,都有很多共同点,程序可以编译为 运行(在合理范围内,例如不能倒退 10 年,不能让 32 位处理器理解 64 位特定指令)。下一步是主板必须做类似的事情,他们确实做了,可能有一些英特尔或 AMD 特定的芯片支持项目,但随后你会进入通用外围设备,这些外围设备可以在任何一个平台上找到,或者在一个或另一个平台上足够广泛,以至于操作系统 and/or 应用程序支持它们。
Intel/AMD 实际上有时会有不同的版本。即使对于不同版本的 Intel and/or AMD。这并不常见(尤其是在人们通常使用的那种软件中),因为它不是用户友好的(大多数人甚至不知道 CPU 是什么或做什么,更不用说他们拥有什么类型了),所以经常是多个版本都在同一个可执行文件中并在 运行 时间选择,或者使用 "least common denominator" 指令子集(当性能不是真正关心的时候)。尽管 AMD 和 Intel 之间存在显着差异,但最显着的差异在于它们支持的指令集。 AMD 总是落后于 Intel 执行 Intel 的新指令(新集出来 regularly),而 Intel 通常不执行 AMD 的扩展(AMD64 是个大例外(99% 被 Intel 接受,做了小改动),也是这里和那里的一些指令是借用的,但 XOP 永远不会出现,即使它很棒,3DNow! 从未被英特尔采用)。作为 not 将不同 "extended instruction sets" 的代码打包到同一可执行文件中的软件示例,请参阅 y-c运行cher.
不过回到开头,对于某些(我想不起来,但我以前见过)高性能软件,您可能会看到不同的版本,每个版本都是专门为获得在一种特定的微体系结构上的最大性能。例如,P4 (netburst) 和 Core2 是两个截然不同的野兽(这主要是 P4 的错误是疯狂的),即使 Core2 是向后兼容的并且可以 运行 相同的代码未修改,但这不一定是一个好主意性能角度。