网页设计网站建设的书籍,娱乐网站设计与实现,htm网页设计,山东seo百度推广1.前言
从一个高级语言到可执行程序#xff0c;要经过预处理、编译#xff0c;汇编和链接四个过程。大家可以思考下#xff0c;为什么要有这样的过程#xff1f; 我们学习计算机之处#xff0c;就应该了解到#xff0c;计算机能够识别的只有二进制语言#xff08;这是…1.前言
从一个高级语言到可执行程序要经过预处理、编译汇编和链接四个过程。大家可以思考下为什么要有这样的过程 我们学习计算机之处就应该了解到计算机能够识别的只有二进制语言这是本身硬件特点决定的。计算机刚诞生时程序员写的就是二进制语言机器语言也就是0101的代码串。但机器语言的缺点也是非常明显的和人类自然语言相差过大难以理解难以编写难以维护。 后来就发展出易于理解和编写的汇编语言汇编语言是使用使用助记符和符号来代替机器码中的复杂二进制指令提高了程序的可读性和可维护性也降低了编写程序时的复杂程度。但汇编语言依然有其面临的问题它依赖于硬件不同CPU指令集不同寄存器结构也不同难以跨平台使用。比如如何把0101的机器码翻译成指令这就与指令集有关。计算机组成原理这门课会将如何设计一个指令系统感兴趣的请大家自行查阅资料。 基于汇编语言的一些问题进一步诞生了高级语言高级语言的特点是可读性更好移植性也更好更利于编写和维护。当然其缺点就是高级语言无法并计算机直接执行必须翻译成机器码后才能被计算机执行。基于程序在执行之初是否就要全部翻译有编译型语言和解释型语言之分。自然如python这样的解释型语言代码是边解释成机器语言边执行那么其效率自然低一些。与此相对编译型语言因为在执行之初就一次性把高级语言代码翻译成了计算机可以识别的机器码。那么其在执行时花费的时间相对于解释型语言就少相同的硬件环境下。 2.翻译过程
言归正传我们继续讲高级语言翻译成机器码的过程。前面已经提到从高级语言到机器码要经过四步。下面我们对每一步做详细讲解。
1.预处理 预处理之后代码仍然是高级语言。预处理做了哪些东西呢 头文件展开这个过程中会检查头文件循环依赖 宏替换宏的本质是文本替换所以这也是大家看到为什么一些程序员会把定义的宏值用括号给括上 条件宏根据预先设定的条件决定后续编译哪些代码 版本宏和条件宏本质一样只不过常用于隔离不同版本的代码 …… 2.编译过程.i - .s 编译过程就是把高级语言程序翻译成汇编语言。 .s文件里面就是汇编指令。这个编译是要经过词法分析和语法分析具体请看 编译原理相关书籍。 编译器会把每个源文件都编译生成对应的.s文件也会生成相应的符号表存储在.s文件中。比如一个函数修饰成inline了并且编译器也根据用户建议把该函数给内联了那么在符号表中是找不到该函数名的。内联的本质不是函数调用而是把对应的代码嵌入到程序中是函数展开。 3.汇编过程.s-.o .o文件里面已经二进制文件了它还需经链接才能最终生成可执行文件 o文件叫可重定位目标文件它是以地址零为链接起始地址进行链接的。 编译器将函数编译成二进制指令后是从地址零可以将函数的指令序列存放到代码段。每个函数的入口地址都是从地址零开始往后偏移。 4.链接 链接器将各个目标文件组装到一起需要重新修改 各个目标文件中的变量或函数的地址这个过程就是重定位。 链接器怎么知道 .o 重定位目标文件中 哪些函数或变量需要重定位呢.o文件中实际是把需要重定位的符号手机起来以section的形式保存到每个可重定位目标文件中了。 3 程序加载过程
最后讲一下一个可执行文件被装载到内存待执行的过程。大体分为以下几步 1.给进程分配虚拟内存空间 2.创建虚拟地址到物理地址的映射创建页表 3.加载代码段和数据段等数据即将磁盘中的文件拷贝到物理内存中并在页表中写入映射关系。 4.将可执行文件的入口地址写入到CPU的指令寄存器PC(PC中存放的就是下一步要执行的指令的地址) 图引用自 CSDN 汐 风 图引用自 CSDN Rye