让我们说我会用Windows API编写程序然后编译它。代码被编译为机器代码以供CPU执行。现在,我的问题是:如果我在其CPU中使用另一个指令集为其他人共享可执行文件。他们的CPU如何以相同的方式运行代码而不会出错或运行不同的代码?
答案 0 :(得分:1)
其他人在他们的CPU中有另一个指令集 ... 他们的CPU如何以相同的方式运行代码
代码无法运行。简单地说,CPU就是另一种语言。
您有两个选择
重新编译目标CPU的代码(假设您可以使用相同的源语言而不使用特定于平台的API,因此您将使用带有stdlib的C / C ++)
编写脚本/字节码并使用两个平台可用的运行时来解释脚本(或字节码)
这就是运行时安装的原因,例如JVM(用于Java)和脚本(Python,Scala,Lua,JavaScript等),其中代码是脚本形式或平台无关代码。
现在 - 下一步。如果你正在使用Windows API,顾名思义 - 它是Windows系统提供的API(服务)。因此,即使在没有Windows系统的情况下使用相同的CPU(例如在Linux系统上),该应用程序也不会运行。 (好吧,通常有一种方法可以在Linux上公开Windows API,但有时候它可能很棘手)。
结论:二进制文件在指令集之间是不可移植的,如果你使用的是任何高级API(Win32,...),那么你也很熟悉操作系统
答案 1 :(得分:0)
当高级语言编译成可执行文件时,通常将它们编译为中间代码。这是汇编语言更接近编译的源代码的表示,但它并不特定于任何CPU指令集。由运行可执行文件的机器来解释这个中间代码并在CPU的本机指令集中运行它。