原创

C/C++编译全过程

词法分析

词法分析的目的是处理源代码中的单词。

  词法分析程序按照从左到右的顺序wyuq 扫描源代码,生成单词对应的符号,把字符描述的程序转换为符号描述的中间程序。

  词法分析程序也称做词法扫描器。

  词法分析过程可以用手工构造和自动生成两种方法。手工构造可以使用状态图,自动生成的构造方法通常使用确定步骤的程序状态机。

语法分析

语法分析程序使用词法分析程序的结果作为输入。

  语法分析的功能是分析单词符号是否符合语法要求,如表达式、赋值、循环等是否构成语法要求。此外,语法程序还按照语法规则分析检查程序的语句是否符合合理正确的逻辑结构。

  语法分析方法有自上而下和自下而上分析两种方法。

  自上而下分析方法从方法开始的符号向下推导,逐步分析。自下而上分析方法利用堆栈的原理,把词法符号按顺序入栈,然后分析语法是否符合要求。

中间代码生成

中间代码也称做中间语言,是一种介于源代码与目标代码之间的表示方式。

  使用中间程序可以完整地表达源代码的意思,同时又使编译程序在逻辑结构上简单明确。

  中间语言是供编译器使用的,常见的表示形式有逆波兰几号、四元式、三元式和树等。

代码优化

代码优化是目标是生成有效的目标代码。

  代码优化通过对中间代码的分析,进行等价变换,达到减小存储空间和缩短运行时间的目的。

  程序优化并不改变源代码的功能。

  代码优化还可以对目标代码进行优化,与中间代码优化相比,对目标代码优化依赖计算机类型,但是优化的效果相对较好。

目标代码生成

  编译程序的最后一项任务是生成目标代码。

  目标代码生成器把中间代码变换成目标代码,通常有3种变换形式:

立即执行的机器语言代码。这种方式对应静态连接方式,程序中所有地址都重定位,执行效率最高,但是占用的存储空间最大。

待装配的机器语言模块。该方式不连接系统共享的程序库,在需要使用的时候会由系统加载共享程序库。

汇编语言代码。该方式经过汇编程序汇编后,直接生成可以在操作系统上运行的目标代码。

  生成目标代码需要考虑3个影响生成速度的问题:

一是采用什么方法生成比较短小的目标代码;

二是如何在目标代码中多使用寄存器,减少目标代码访问外部存储单元的次数;

三是如何根据不同平台计算机指令特性进行优化,提高程序运行效率。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

关注作者,阅读全部精彩内容

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++ gcc编译过程

    第一步:预处理 将源代码的.c 、.cpp 、.h 等文件包含到一个文件中。在这个过程中会使用一些预处理指令要求编译器使用什么样的方式包含这些文件。预处理结束之...

    老九学堂-小师弟
  • C语言编译全过程剖析

    C语言编译的整个过程是非常复杂的,里面涉及到的编译器知识、硬件知识、工具链知识都是非常多的,深入了解整个编译过程对工程师理解应用程序的编写是有很大帮助的,希望大...

    阳光岛主
  • C语言编译过程

    预编译结果解释 # linenum filename flags 分别对应行号、文件、标识。 flag对应的含义

    用户2929716
  • C语言编译过程

    连接---->将目标代码与C函数库相连接,并将源程序所用的库代码与目标代码合并,并形成最终可执行的二进制机器代码(程序)。

    老九学堂-小师弟
  • C#在.NET编译执行过程

    1..NET语言的编译器接受源代码文件,并生成名为程序集的输出文件。 程序集要么是可执行的,要么是DLL 程序集里的代码并不是本机代码,而是一种名称为CIL的中...

    hbbliyong
  • Objective-C源文件编译过程

    Objective-C文件的编译过程主要包括clang前端的预处理、编译、后端优化中间表示、生成汇编指令、链接、生成机器码这几个步骤。我们可以借助clang -...

    VV木公子
  • C#在.NET编译执行过程

    程序的CIL直到它被调用运行时才会被编译成本机代码。在运行时,CLR执行下面步骤:

    用户8983410
  • 【C语言笔记】C语言编译的过程

    如果你使用的是集成开发环境,那么你点击编译按钮就可生成可执行文件,然后点击运行即可运行。那么,你知道从源代码到可执行文件经历了哪些过程吗。仅仅是编译?

    正念君
  • C++编译与链接(1)-编译与链接过程

    大家知道计算机使用的一系列的1和0 那个一个C++语言程序又是如何从一个个.h和.cpp文件变成包含1和0的可执行文件呢? 可以认为有以下的几个环节 源程序->...

    magicsoar
  • 用gcc编译c语言程序以及其编译过程

    对于初学c语言编程的我们来说,学会如何使用gcc编译器工具,对理解c语言的执行过程,加深对c语言的理解很重要!!!

    黑泽君
  • 解密C语言编译背后的过程

    我们大部分程序员可能都是从C语言学起的,写过几万行、几十万行、甚至上百万行的代码,但是大家是否都清楚C语言编译的完整过程呢,如果不清楚的话,我今天就带着大家一起...

    Coding十日谈
  • c++工程编译记录

    墨文
  • C++/Rust 元编程之 BrainFuck 编译器(constexpr/ 过程宏解法)

    原文地址:C++/Rust 元编程之 BrainFuck 编译器(constexpr/ 过程宏解法)

    MikeLoveRust
  • Linux编写C程序并编译

    使用Yum安装gcc(Linux下c语言编译器) ,vim编辑器(也可以直接使用vi,vim编辑器有更多功能,还具有代码高亮效果,使用起来更舒服)

    砸漏
  • Linux编译C++

    1)此时脚本开始运行 2)选择python3解释编译ycm文件 此时脚本文件会问你是选择python2还是python3来编译ycm文件?我在这里选择3...

    承苏凯
  • 用gcc编译,c语言程序以及其编译过程!点赞3连

    对于初学c语言编程的我们来说,学会如何使用gcc编译器工具,对理解c语言的执行过程,加深对c语言的理解很重要!!!

    诸葛青云
  • 编译到底做了什么(***.c -> ***.o的过程)

     (第一次写博客,好激动的说.......) 我们知道,一个程序由源代码到可执行文件往往由这几步构成: 预处理(Prepressing)-> 编译(Compil...

    xcywt
  • linux编译运行c++程序

    以一个简单的算法题为例,How do you count the occurrence of a given character in a string?要求保...

    mathor
  • C和C++混合编译,extern和extern "C"

    extern的问题在于你不知道这个关键字出现的时候到底是声明还是定义。  谨记:声明可以多次,但是定义只能有一次。

    朵朵花儿

扫码关注云+社区

领取腾讯云代金券