程序员的自我修养——2、编译和链接
来源:互联网 发布:静脉注射空气 知乎 编辑:程序博客网 时间:2024/06/01 22:54
IDE一般把编译和链接合并到一起,称为构建(build)。
4个步骤:
- 预处理(Prepressing)
- 编译(Compilation)
- 汇编(Assembly)
- 链接(Linking)
1、预处理
$ gcc -E hello.c -o hello.i
-E表示只进行预处理。
主要处理规则如下:
- 将所有的 #define 删除,并且展开所有宏定义。
- 处理所有条件预编译指令,比如#if,#ifdef,#else,#endif
- 处理 #include,将被包含的文件插入到该预编译指令的位置。这个过程是递归进行的。
- 删除所有的注释 // 和 /**/
- 添加行号和文件名标识,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号。
- 保留所有的 #pragma 编译器指令,因为编译器须使用它们。
2、编译
编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析以及优化后产生相应的汇编代码文件。
$ gcc -S hello.i -o hello.s
======================================================================================================================
编译过程:
扫描器(Scanner)
有限状态机(Finite State Machine)
记号(Token)
语法分析器(Grammer Parser)
语法树(Syntax Tree)
语义分析器(Semantic Analyzer)
静态语义(Static Semantic):指在编译期可以确定的语义。
动态语义(Dynamic Semantic):只有在运行期才能确定的语义。
源码优化器(Source Code Optimizer)
中间代码(Intermediate Code)
代码生成器(Code Generator)
目标代码优化器(Target Code Optimizer)
经过这些扫描、语法分析、语义分析、源代码优化、代码生成、目标代码优化、
====================================================================================================================
3、汇编
汇编器就是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。
$ gcc -c hello.s -o hello.o
4、链接
链接的主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确地衔接。
链接的过程主要包括:地址和空间分配(Address and Storage Allocation)、符号决议(Symbol Resolution)、重定位(Relocation)
- 程序员的自我修养——2、编译和链接
- 程序员的自我修养——编译和链接
- 程序员的自我修养——编译和链接
- 程序员的自我修养-编译和链接
- 《程序员的自我修养》-编译和链接
- 程序员的自我修养(编译和链接)
- 【程序员的自我修养】第2章 编译和链接
- 程序员的自我修养读书笔记——编译与链接
- 自我修养——编译和链接
- 程序员的自我修养读书笔记-编译和链接
- 《程序员的自我修养》阅读笔记 --编译和链接
- 程序员自我修养--编译链接
- 读书笔记——《程序员自我修养》——编译和链接
- C文件如何成为可执行文件(编译、链接、执行)——摘自《程序员的自我修养》
- 程序员的自我修养(2)----静态链接
- 《程序员的自我修养--链接、装载与库》笔记--第二章 编译和链接
- 《程序员的自我修养——链接、装载与库》
- 程序员的自我修养学习笔记——静态链接
- 获取LayoutInflater对象的方法和inflate方法的一些参数问题
- KMP 字符串匹配 SDNU 1100 字符串查找 HDU 2087 剪花布条
- cmd设置Jdk环境变量并执行java文件
- 创建数据库表
- servlet学习之第一篇
- 程序员的自我修养——2、编译和链接
- Java多线程生产者消费者问题
- minicom and kermit
- struts解压后的各个文件夹的作用
- Ubuntu14.04下Python集成开发环境Anaconda安装配置
- 链表——删除指定元素
- 原码反码补码和python中的按位运算易混点
- 关系型数据库和非关系型数据库的特性以及各自的优缺点
- javascript编译器的一些原理——变量提升