问个比较二的问题,C语言代码编译后是什么代码?记得以前看到说是机器码。可是如果是cpu能直接执行的代码那还要操作系统干嘛?岂不是不同平台的程序都能直接用了?---------------------------看了后面的争论那现在再补充下问题,就是C语言代码编译后的代码是能直接操作机器的代码还是调用操作系统API还是两者都有?我知道编译后的程序可以通过反汇编来生成汇编语言代码,汇编语言不就是直接操作机器的语言么?
2 回答
MYYA
TA贡献1868条经验 获得超4个赞
C语言编译出来的是object文件,里面的内容基本上包括:跟CPU类型相关的机器代码,这个代码当然在兼容的CPU上都是可以运行的常量,例如字符串等等符号表外部符号表,代码里面引用到的其他文件中的符号,例如printf这种外部标准库提供的函数。这需要等到链接的时候来解决。输出符号表,代码里面公开的可以被其他文件引用的符号,例如自己写的函数。这个文件的格式在不同操作系统上是不一样的。所以,虽然其中的机器码可以在CPU上直接执行,但是就算你写的是一个简单的HelloWorld,也需要用到很多的系统调用。你应该不会想自己去写一个磁盘引导程序,然后使用BIOS中断来初始化显卡进入图形模式,然后往显卡缓冲区里填入数据(当然你的程序里面还需要内置好一个ASCII字库,为了简单起见就不用矢量字库了,假设是点阵的吧),就为了在屏幕上显示一行字吧?当然,这还没有考虑任务调度、内存管理、输入输出、硬件抽象层这些操作系统的基本功能。而且,就算你的程序不用到任何输入输出,只是计算简单的1+1,一段机器码也不是那么简单地扔给CPU就能运行了,至少你得找个人替你“扔”这段代码吧,谁来调用你的main方法呢?这是CRuntimeLibrary干的事,你用C写的代码至少得链接到这个库上。这个库负责创建一个进程,然后调用你的main函数。而这个库在不同操作系统上以及不同的编译器上也是不同的。此外,假设你只是想写一个静态库,让在不同平台上的软件都能直接引用你写的一个函数,那也还需要跨越文件格式这个障碍,Unix上面用的是ELF格式,Windows用的是PECOFF。
添加回答
举报
0/150
提交
取消