| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 深扒源程序到执行程序的过程 -> 正文阅读 |
|
[系统运维]深扒源程序到执行程序的过程 |
写代码时,我们通常会创建一个.c的C语言文件,然后经过编译器编译后可以生成一个可执行程序。而创建的.c我们称为源文件,.exe就是一个可以运行的可执行文件。那么编译器究竟对源程序做了哪些 翻译环境和执行环境首先要知道,任何生成的可执行程序都会经历两个环境,一个是翻译环境,另一个叫执行环境。
翻译环境我们将翻译阶段分为两个部分:编译和链接。
大致流程: 编译做了什么编译有三个步骤:预编译、编译、汇编。 Linux可以很好的演示程序编译的每一个步骤,但是我没有装Linux所以只能尽量按照Windows来描述了。 预编译(预处理)干什么 一、头文件预处理 你有没有想过为什么要引头文件?引头文件其实就是为了声明函数。当程序进行预编译阶段时,会先将头文件包含的所有函数声明全部导入文件。假设你只有10行程序,当你引了头文件后,你的代码在预编译可能会有几百行,真正有效的还是你那10行程序。其实上面的代码就都是头文件里的函数声明。 编译器想的是:我只负责帮你把声明全部导入到你的程序,至于这些声明的函数用到了几个,那我管不着
二、对define定义的宏和常量的替换 除了声明,预处理会将所有使用define定义的符号、宏的地方都替换成define定义的内容,然后把define那段删掉。 比如说:
因为宏是完全替换的,所以并没有开辟栈帧,对空间和时间的开销都比函数消耗较少。但是宏因为是完全替换的,所以宏不能递归,并且非常需要注意优先级。如我的代码里一样要给足够括号。所以宏适合定义一些比较短小简单的程序,适当的使用可以降低程序的开销。该用宏时不要客气,但是该使用函数还是要使用函数。 三、删注释 鲁迅曾说过:“我最讨厌的两件事,一个是别人不写注释,另一个是别人让我写注释”,都知道注释是一个非常重要的事情,没注释的代码那就是一座屎山,一个没有注释的代码程序真的可以逼疯一个程序员。因为注释始终是给人看的,而电脑就没必要去执行。编译器就在预处理阶段先将注释给删掉。 预编译总结:在预编译阶段,编译器在做的都是些文本操作,像符号的替换,头文件声明的拷贝,和删除宏和注释(在Linux下程序预编译后会生成一个.i为后缀的文件) 编译阶段
汇编阶段
?链接库链接链接阶段,编译器会将工程所有编译过后生成的.obj(Linux为.o)文件链接起来生成可执行程序(Windows为.exe后缀?Linux为.elf后缀)。 一、合并段表 合并段表可简单理解为,可执行文件将工程里所有的.obj文件都给分为了几个段,每个段的功能是相同的都有自己相同的意义,然后可执行文件再将这些.obj文件的每个相同的段链接在一起,最后只生成了一个可执行文件。类似于下面这个样子(有点像缝裤子怎么回事)。 二、符号表的合并重定位 形成符号表之后,编译器就要将这些函数的地址给链接起来。编译器会通过符号表对照,将函数名相同的函数地址链接起来,将原先声明给的临时填充地址覆盖成函数地址,这个覆盖的过程就叫做重定位。
结尾最近打算也写写其他的内容了。一篇草稿鸽了这么久,老是只写这些干货感觉自己也没啥动力,准备分享一些刷题的题解和思路。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 0:32:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |