C是一种编译语言,可以编译为本机CPU指令,如您所知。
但是,如果C对每个CPU的编译方式不同,那么为什么基本的Windows程序不能在Mac上运行(例如,考虑到它们都有Intel 386系列的处理器)?
一个很好的例子是C中的printf
函数,它将以不同的方式进行编译
Windows和Mac OS X,即使它们都使用相同类型的处理器(Intel 386)。
我确实不确定它在每个操作系统下的编译方式是否真的不同,而是一个简单的Windows应用程序输出" Hello World!"到控制台窗口不能在Mac上打开,有点让它看起来有点不同。
我确定GUI编译的方式不同,因为它调用系统函数在屏幕上绘制,但为什么printf
在每个操作系统上编译不同?我认为它依赖于CPU,而不依赖于操作系统,据我所知,拥有Intel 386 CPU的Windows PC和Mac意味着它们都具有相同的指令集。
那么,你能解释一下吗?
答案 0 :(得分:4)
C标准指定了支持它的非常小的运行时库的语言和非常API以及预期的行为。
它没有具体说明编译器生成的目标文件格式的细节 - 必然如此 - 因为我们期望C编译器生成的目标文件与平台提供的其他库链接,以及系统链接器链接它们。
以两个系统为例,在具有相同架构的硬件上运行CPU(Windows和MacOSX) - 这些平台上的动态链接工作方式与编译器生成的目标文件完全不同。即使系统使用相同的CPU,也可能存在ABI差异。