编译器和平台之间的一些疑惑
比如 都是一个C源程序
Linux平台的X编译器
Windows平台的Y编译器
A.这两个编译器对同样一个C源程序编译后,为什么只能在各自的平台上运行啊?编译以后目标程序里,有啥不一样啊?
B.再如一个汇编源程序,而使用NASM编译后的程序,就即能在linux和Windows平台下都可以运行,这是为什么呀?
我原来想是因为(A情况)生成的两个文件结构不一样,组织形式不一样,所以只有相关的平台才能认得, 但是因为(B情况)又把我的想法给推翻了,可以有既linux下运行又可以在Windows下运行的程序啊.
B.我能够理解了
可是你说A是因为操作系统的API不同,是说我在C程序里"隐含"的调用了对应该系统的API了吗?
,可是我在我的C源程序里,并为使用API啊,就只是简简单单的if switch...的语句,这又和平台无关呐
难道我不使用API了,就可以跨平台了吗?还是迷茫啊~
比如你用C语言的fopen打开文件时
Windows下编程工具的fopen这个库函数会调用CreateFile这个API
Linux下的编程工具的fopen这个库函数会调用对应的文件操作中断
你看看CPU的指令
除了in、out、int外,其他大多是算数运算指令
那些硬件功能,全是BIOS/操作系统/驱动程序用in/out指令进行低阶I/O操作来控制的
并为了方便应用程序,在高层建立一致的API接口
// 难道我不使用API了,就可以跨平台了吗
那你怎么接受数据输入?现在可没有API或消息让你得到键盘输入
怎么将数据输出?printf也是靠调用API实现的
C语言函数库就是为了避免平台差异而设计的
虽然在不同平台下C语言函数库的实现是不同的
但操作方式是一致的
跨平台是不现实的
比如Java号称跨平台
可它实际上是在操作系统上又封装了一层,再依靠解释执行字节码以应付不同的处理器
所以它实际上还是受操作系统平台局限的,比如你见过DOS下的Java虚拟机吗?
没有操作系统内置的图形界面、网络等功能支持,Java的类库能实现吗!