1.程序为什么要编译?
答:因为我们所使用的是高级编程语言,机器并不认识这些语言,机器只能识别机器语言。
2.编译器做了哪些事?
答:预编译、编译、汇编、链接。
这个是我在C Primer Plus上所看到的:
1.首先编译器将源代码转换成机器语言代码,将结果放置在一个目标代码文件(或简称为目标文件)中(这里假设您的代码由单个文件组成)。目标文件包含源代码的转换结果,但它还不是一个完整的程序。
2.目标代码所缺少的第一个元素是一种叫做启动代码(start-up- code)的东西,此代码相当于程序和操作系统之间的接口。
3.缺少的第二个元素是库例程的代码
4.链接器将这3个元素(目标代码,系统的标准启动代码,库代码)结合在一起,并将它们存放在单个文件,即可执行文件中。
3. 可执行文件里有什么?
答:可执行文件中包含代码转换成的机器语言,所使用的库例程,以及启动代码的机器代码。
4.头文件是什么意思?
答:百度头文件
预处理器发现#include指令之后,就会寻找后跟的文件名并把这个文件的内容包含到当前文件中。被包含文件中的文本将替换代码文件中的#include指令,就像把被包含文件中的全部内容键入到源文件中的这个特定位置一样。
5.不同的编译器,编译出的结果一样吗?
答:不一样,不同的编译器会做一些不同的优化。(这个问题不是很明白,但是学长演示了两种不同的编译器,它们所编译后,汇编语言中存在很多区别)
6.程序是怎么运行起来的?
答:
1.创建虚拟内存空间来容纳一个进程,
2.根据文件头内容建立程序虚拟内存地址与 elf 文件的映射关系表,vma(virtual memory area)结构.
3.初始化程序的栈堆空间
7.没有操作系统,程序可以运行吗?
答:可以,操作系统很好实现了程序的共用,以及对计算机硬件资源的管理。但是最初的电脑并没有操作系统,人们通过各种操作按钮来控制计算机,后来出现了汇编语言,操作人员通过有孔的纸带将程序输入电脑进行编译。所以没有操作系统,程序也是可以运行的
8.printf函数是怎么实现的?
答:我们经常使用这个函数,从来没去想过这个函数是怎么实现的,学长讲解并实现了一下这个函数,我觉得有几点比较重要,
(1)参数
(2)函数参数压栈
(3)函数参数的调用过程
(4)格式转换函数
9.程序在内存中是什么样子?
答:这个问题是虚拟内存,在之前的博客中有提到一些,
我的博客