美文网首页
第二章 编译和连接

第二章 编译和连接

作者: Myth52125 | 来源:发表于2017-10-04 12:59 被阅读0次

简单的介绍了从源代码到可执行程序的编译。
更加详细的,需要去看《编译原理》了

编译和连接可以分解为四个部分:预处理,编译,汇编,链接。

从源代码到可执行程序

预处理

g++ -E test.c -o test.i
//不指定文件名,直接输出到控制台

预处理过程主要处理源代码中以#开头的预编译指令,比如#include,#define等等。
主要步骤为:

  1. 将所有的#define删除,并展开所有宏的定义
  2. 处理有多的田间预编译指令,#if,#ifdef,#else,#endif
  3. 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置,这个过程是递归进行的。
    #include <>和“”的区别
  4. 删除所有注释
  5. 添加行号和文件名标识
    以便编译时,编译器产生调试用的行号信息,已经编译时产生的错误或者警告能够显示行号
  6. 保留所有的#pragma编译器指令,因为编译器需要使用他们

编译

g++ -S test.cc -o test.s
//cc1位编译程序

编译过程把预处理完的文件进行一系列的,词法分析,语法分析,语义分析以及优化后,产生县赢得汇编代码文件。
这个过程是整个程序构建的核心部分。

汇编

汇编过程是将编译产生的汇编代码转化为机器可执行的指令,每一条汇编语句对应一条机器指令。

g++ -c test.s -o test.o
//as是汇编器

链接

把各个模块之间的相互引用部分链接好,是的各个模块之间能够正确衔接。

编译器

编译过程(as编译器)分为6步:扫描、语法分析、语义分析、源代码优化、代码生成和目标代码优化。

扫描&词法分析

源代码被被输入到扫描器,然后进行词法分析,由代码中的字符差生一个个记号:关键字,标识符,字面量,特殊符号(+,-)

语法分析

语法分析对扫描器产生的几号进行语法分析,产生语法树。将词法分析产生的记号组合起来。
如果语法分析阶段,发现表达式不合法,比如少括号,少操作符,编译器便会报错。

语义分析

完成表达式中语法层面的分析,
静态语义:在编译器可以确定的语义,包括声明和类型的匹配,类型转换
动态语义:在运行期出现的予以相关问题,比如0作为被除数。

中间语言生成

将语法树转换为中间代码。同时进行了优化

代码生成和优化

代码生成器将中间代码转换成目标机器代码,这个过程依赖于机器,不同的机器有着不同的字长,寄存器等等。

相关文章

  • 第二章 编译和连接

    简单的介绍了从源代码到可执行程序的编译。更加详细的,需要去看《编译原理》了 编译和连接可以分解为四个部分:预处理,...

  • <cython>学习笔记第二章:编译和运行cytho

    Cython第二章,编译和运行cython 编译Pipeline 由于cython是python的超集,因此pyt...

  • 2 编译和链接

    第二章 编译和链接词法分析语法分析语义分析中间语言生成目标代码生成与优化链接器 第二章 编译和链接 平时我们使用的...

  • HttpClient 教程 (二)

    第二章 连接管理 HttpClient有一个对连接初始化和终止,还有在活动连接上I/O操作的完整控制。而连接操作的...

  • scons

    第一章:编译和安装SCons第二章:简单编译第三章:编译相关的一些事情第四章:编译和链接库文件第五章:节点对象第六...

  • DOS Box使用

    DOS Box使用 一、挂载 示例: 二、编译连接 1.编译 2.连接 三、DEBUG 1.进入DEBUG模式 查...

  • 方法重载和重写原理

    Java的编译不包含传统编译过程的连接阶段,连接是在class加载到JVM中才进行的。Java代码在编译成clas...

  • Centos7安装Pyhton3

    安装编译工具 下载python源码,并解压 编译 创建软连接 验证是否成功 Python2和Python3共存 1...

  • C++第六篇多态

    C++中的多态性分为编译时多态性和运行时多态性,编译时多态通过函数重载和模板体现,运行多态通过虚函数体现编译、连接...

  • 编译与连接

    在 Xcode 中按下 command + B不出意外的话, 就会显示小锤子小锤子下面是 Build Succee...

网友评论

      本文标题:第二章 编译和连接

      本文链接:https://www.haomeiwen.com/subject/xiaqyxtx.html