编译器和平台之间的一些疑惑

比如 都是一个C源程序
Linux平台的X编译器
Windows平台的Y编译器

A.这两个编译器对同样一个C源程序编译后,为什么只能在各自的平台上运行啊?编译以后目标程序里,有啥不一样啊?

B.再如一个汇编源程序,而使用NASM编译后的程序,就即能在linux和Windows平台下都可以运行,这是为什么呀?

我原来想是因为(A情况)生成的两个文件结构不一样,组织形式不一样,所以只有相关的平台才能认得, 但是因为(B情况)又把我的想法给推翻了,可以有既linux下运行又可以在Windows下运行的程序啊.

[310 byte] By [Windows_80X86_C] at [2008-1-9]
# 1
A.
不同操作系统的API不同(比如Windows平台的Win32 API与Linux的X-Windows中图形界面API截然不同)

B.
无论是Linux还是Windows,都兼容DOS程序
# 2
B.我能够理解了

可是你说A是因为操作系统的API不同,是说我在C程序里"隐含"的调用了对应该系统的API了吗?
,可是我在我的C源程序里,并为使用API啊,就只是简简单单的if switch...的语句,这又和平台无关呐
难道我不使用API了,就可以跨平台了吗?还是迷茫啊~

Windows_80X86_C at 2007-10-19 > top of Msdn China Tech,其他开发语言,汇编语言...
# 3
比如你用C语言的fopen打开文件时
Windows下编程工具的fopen这个库函数会调用CreateFile这个API
Linux下的编程工具的fopen这个库函数会调用对应的文件操作中断

你看看CPU的指令
除了in、out、int外,其他大多是算数运算指令
那些硬件功能,全是BIOS/操作系统/驱动程序用in/out指令进行低阶I/O操作来控制的
并为了方便应用程序,在高层建立一致的API接口
# 4
由于需要初始化C语言函数库,光程序的入口都是平台相关的
# 5
那你的意思就是说:源程序的编译是因为.我源程序中使用了和操作系统相关的API

比如我的程序是这个样子
Bool main()
{
return true;
}
跨平台也OK呀~没有调用API

难道还会在编译过程中会往exe中附加的调用API?
Windows_80X86_C at 2007-10-19 > top of Msdn China Tech,其他开发语言,汇编语言...
# 6
// 难道我不使用API了,就可以跨平台了吗

那你怎么接受数据输入?现在可没有API或消息让你得到键盘输入
怎么将数据输出?printf也是靠调用API实现的

C语言函数库就是为了避免平台差异而设计的
虽然在不同平台下C语言函数库的实现是不同的
但操作方式是一致的

跨平台是不现实的
比如Java号称跨平台
可它实际上是在操作系统上又封装了一层,再依靠解释执行字节码以应付不同的处理器
所以它实际上还是受操作系统平台局限的,比如你见过DOS下的Java虚拟机吗?
没有操作系统内置的图形界面、网络等功能支持,Java的类库能实现吗!
# 7
// 难道还会在编译过程中会往exe中附加的调用API?

由于需要初始化C语言函数库,光程序的入口都是平台相关的

还有
Windows下的可执行文件一般是PE格式
Linux下的可执行文件一般是ELF格式
# 8
主要在于连接器~~
目标文件是通用的,但是连接器必须基于平台
一个win32的连接器连出exe/dll(PE结构),而一个linux连接器(如ld)连出的是unix的可执行文件。

当然,这体说的“通用”的前提条件是不使用不跨平台的库
axx1611-longlong*&ago at 2007-10-19 > top of Msdn China Tech,其他开发语言,汇编语言...
# 9
感谢zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果) 的精彩回答~谢谢你们的帮助
Windows_80X86_C at 2007-10-19 > top of Msdn China Tech,其他开发语言,汇编语言...