![]() |
1
23
尽管CPU是一样的,但仍有许多不同之处:
即使Linux程序只调用C库的包装函数,Windows C库也不会有像这样的POSIX函数
理论上,这里列出的所有问题都可以解决:可以编写自定义加载程序来支持不同的可执行格式,如果整个程序使用相同的一组约定和接口,则不同的约定和接口不会导致问题。这就是为什么像Wine这样的项目可以在Linux上运行Windows二进制文件。问题是Wine必须在其他操作系统的基础上模拟Windows NT内核的功能,从而降低实现效率。由于使用了不同的不可互操作的接口,此类程序与本机程序交互时也存在问题。
当模拟POSIX系统调用时,像Cygwin这样的源兼容性层也可能效率低下,例如
|
![]() |
2
2
除此之外,即使使用相同的指令,调用约定也可能有所不同,即参数在堆栈或寄存器中的位置、找到的顺序参数、在函数调用中必须保留哪些寄存器、返回值如何从被调用方传递给调用方。 |
![]() |
3
1
这就像说,如果我使用相同的字母表,所有的书都是一样的,一本生物课本和一本数学课本都是一样的,因为它们使用相同的字母表,有封面,有几页,等等。或者我必须去滑雪场,因为它们都使用相同的字母表,因为它们都是关于雪的,所以它们的海报和小册子都是一样的。
细微的差别是肯定的,但关键是这是两个完全不同的操作系统,程序的入口/出口(上面没有显示的代码有很多不同,而不仅仅是这个程序中的小规范if主代码)。 这些是不同的操作系统,它们有不同的调用不同的规则,它们是不同的,常见的指令集有些不相关。这就像是说,因为我在linux上运行,并且使用C作为编程语言,那么为arm制作的二进制文件和为x86制作的二进制文件应该是相同和兼容的(因为我说的三件事中有两件是相同的,编程语言和操作系统,但不是指令集。或者在你的例子中,编程语言和指令集,但不是操作系统。) 这甚至可以指出,gcc编译的windows程序并不能完全兼容所有版本的windows,您不能只说“windows”。linux也是如此。它们独立于目标进行内部更改,因此操作系统之间存在不兼容的差异。仅仅因为砖和灰泥是一样的,并不意味着两栋建筑是一样的。 这是JAVA和Python等语言的目的,为了划一条线,这条线以上的所有内容都是通用的和跨平台的,这条线以下的内容可以是特定于平台和目标的,没有理由期望任何形式的跨平台兼容性。如果我们在全世界拥有C编译器的计算机,或者所有运行独立于平台的linux的计算机,或者所有运行带有编译器和相同指令集的操作系统的计算机上都具有这种兼容性,那么这些语言就不可能存在。 当你下载chrome或7-zip或firefox、handbrake等程序时,会有不同的安装程序和/或二进制文件,具体取决于操作系统和操作系统版本。指令集通常甚至没有列出,因为它被假定为x86,但有不同的二进制文件,如果它是如此微不足道,那么为什么那些交付了这么长时间的成品的人会交付几个不同的产品版本呢? |
![]() |
4
-1
|
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 4 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 4 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 4 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 4 月前 |