Operating system 编译成机器语言的程序如何在不同的机器上运行?

Operating system 编译成机器语言的程序如何在不同的机器上运行?,operating-system,compiler-theory,Operating System,Compiler Theory,在学校里,我们被教导编译器将计算机程序编译成机器语言。我们还学到,机器语言由直接指向硬件的指令组成。那么,同一个编译的程序如何能在多个具有不同硬件的计算机配置上运行呢?使用模拟器或虚拟机,两者都可以有效地动态转换机器语言。取决于您所说的“不同硬件”,如果它是同一处理器(或同一系列,如英特尔x86)那么机器代码指令是相同的 如果额外的硬件是不同的外围设备(屏幕、磁盘、打印机等),那么操作系统会通过给您一组一致的指令来驱动它们,从而隐藏这些细节 如果你的意思是,你怎么能在英特尔x86上为ARM cp

在学校里,我们被教导编译器将计算机程序编译成机器语言。我们还学到,机器语言由直接指向硬件的指令组成。那么,同一个编译的程序如何能在多个具有不同硬件的计算机配置上运行呢?

使用模拟器或虚拟机,两者都可以有效地动态转换机器语言。

取决于您所说的“不同硬件”,如果它是同一处理器(或同一系列,如英特尔x86)那么机器代码指令是相同的

如果额外的硬件是不同的外围设备(屏幕、磁盘、打印机等),那么操作系统会通过给您一组一致的指令来驱动它们,从而隐藏这些细节

如果你的意思是,你怎么能在英特尔x86上为ARM cpu运行一个程序,那么你就不能——除非通过某种虚拟机仿真器读取每个ARM指令并将其转换为x86或运行与一组x86函数相同的功能,然后返回与ARM指令相同的答案

编辑:我想你指的是具有不同硬件(即不同的外围设备)但具有相同处理器系列的PC


与硬件交谈本身并不涉及具体的指令——主要是将内存移动到操作系统和/或设备驱动程序专门为发送到该设备的数据保留的特定位置。在过去的DOS和BIOS中,您会触发中断,调用BIOS中的特定代码位来处理该数据并将其发送到硬件

我认为更准确的说法是,本机编译器编译为处理器的特定指令集。因为有保持向后兼容性的处理器系列:8086-80386-80486-80586-双核-四核。。。;然后,每个处理器运行其祖先的指令。如果您想跨处理器体系结构移植代码,那么您肯定需要一个虚拟机或仿真器,就像前面提到的那样

那么你的意思是在这个过程中总是使用某种模拟?@BobbyMarinoff:如果你已经为一个CPU架构编译了代码,并且正在另一个CPU架构上运行,那么一定是有什么东西在进行转换。谢谢你简洁的回答。我不明白程序是如何连接到操作系统的API的?我想象在程序和处理器之间有一个抽象层,它执行一些指令,并将其他指令传递给处理器。这些“虚拟”指令是用什么语言编写的?我在哪里可以读到更多关于这个过程的信息?它只是移动内存,而不是特定的指令。在过去,它更简单-屏幕位于某个地址,你在该地址上写了“65”,左上角出现了一个“a”,你在另一个位置写了1,它将该字符的颜色设置为红色。编译的C程序将链接到当前机器上的库。即使处理器架构相同,如果计算机A的可执行文件被移动到计算机B,如果计算机B没有与计算机A相同的库,该可执行文件不会运行吗?