关于hello world的经典问题
程序为什么要编译?
*高级语言源程序也要经过翻译才能被计算机接受.编译程序能产生目标程序而解释程序则不能产生目标程序。用高级程序设计语言编写的程序,要转换成等价的可执行程序,必须经过编译和连接。同样一段高级语言程序通过不同的编译器可能产生不同的可执行程序。计算机不能直接执行符号化的程序,而是通过汇编程序、解释程序和编译程序而将符号程序转换为可执行程序。高级语言需要编译成目标代码或通过解释器解释后才能被CPU执行。*
编译器做了哪些事?
百度编译器处理过程
预编译、编译、汇编、链接。
可执行文件里有什么?
可执行文件 (executable file) 指的是可以由操作系统进行加载执行的文件。在不同的操作系统环境下,可执行程序的呈现方式不一样。
包含代码转换成的机器语言,所使用的库例程,以及启动代码的机器代码。
头文件是什么意思?
头文件的主要作用在于多个代码文件全局变量(函数)的重用、防止定义的冲突,对各个被调用函数给出一个描述,其本身不需要包含程序的逻辑实现代码,它只起描述性作用,用户程序只需要按照头文件中的接口声明来调用相关函数或变量,链接器会从库中寻找相应的实际定义代码。
头文件一般由四部分内容组成:(1)头文件开头处的版权和版本声明;(2)预处理块;(3)inline函数的定义;(4)函数和类结构声明等。在头文件中,用 ifndef/define/endif结构产生预处理块,用 #include 格式来引用库的头文件。头文件的这种结构,是利用C语言进行开发软件所通常具备的,属于公有知识。
具体地说,头文件中可以包括:用户构造的数据类型(如枚举类型),外部变量,外部函数、常量和内联函数等具有一定通用性或常用的量。而一般性的变量和函数定义不宜放在头文件中。例如:#include<stdio.h>中的头文件stdio.h作用是让链接器通过头文件里的函数声明找到函数实际代码所在的位置即所在的库文件,这样才能使用该函数的实际代码,函数的实际代码的实现过程是先让链接器通过头文件里函数的申明找到函数实际代码所在的位置即所在的库文件,再通过#include语句把链接器所找到的函数实际代码用链接器把函数的实际代码链接到当前文件即所要执行的程序中。
不同的编译器,编译出的结果一样吗?
不一样,不同的编译器编译出来的结果不一定是一样的,优程程度不同.
程序是怎么运行起来的?
1.创建虚拟内存空间来容纳一个进程,
2.根据文件头内容建立程序虚拟内存地址与 elf 文件的映射关系表
3.初始化程序的栈堆空间
没有操作系统,程序可以运行吗?
可以,在网络刚开始普遍的时候,还没有出现操作系统之前,人们通过各种操作的按钮来操控计算机,后来出现了汇编语言,人们又开始通过有孔的纸带来进行编译。所以说,没有操作系统,程序是可以运行的.
printf函数是怎么实现的?
程序在内存中是什么样子?
这个涉及虚拟内存知识,具体是:每个进程都有自己独立的4G内存空间,但实际上这个内存是不存在的,是虚拟内存,每次访问内存空间地址的时候,都需要翻译成实际物理地址。进程只需要把自己当前需要的虚拟内存空间映射并保存到物理内存上。页表用来记录内存地址上的数据是否在物理内存上,如果存在,在哪里。查看页表,如果对应的数据没在物理内存上,则发生缺页中断。
处理缺页中断:从磁盘上将需要的数据复制到物理内存。