概述

   编译的目的是把人书写的高级语言代码翻译成目标程序的语言处理程序,编译用的程序(例如gcc)称为编译系统。

  一个编译系统把一个源程序翻译成目标程序的工作过程分为5个阶段:词法分析、语法分析、中间代码生成、代码优化和目标代码生成。

  其中主要阶段是词法分析和语法分析,也可以称为源代码分析,分析过程中发现有语法错误,给出提示信息。


词法分析

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

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

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

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


语法分析

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

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

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

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


中间代码生成

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

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

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


代码优化

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

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

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

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


目标代码生成

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

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

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

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

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

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

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

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

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

本文出自 “成鹏致远” 博客,请务必保留此出处http://infohacker.blog.51cto.com/6751239/1198506

【C/C++】程序如何来,编译全过程的更多相关文章

  1. 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视GCC编译全过程 | 百篇博客分析OpenHarmony源码| v57.01

    百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  2. .NET程序的简单编译原理

    1.不管是什么程序,最终的执行官是CPU,而CPU只认识1和0的机器码. 2.我们现在写的一般是高级语言写的程序.CPU是不认识我们用高级语言写的源代码的,那应该怎么办才能让CPU执行我们写好的程序尼 ...

  3. Matlab 运行C程序出现的编译出错问题

    2016-03-18 17:18:34 最近在运行一些公开的Matlab代码包时,比如LibSVM.crfChain等,遇到了需要在Matlab环境下编译C程序的问题,对于我所遇到的问题,给出以下解决 ...

  4. C#基础--.net平台的重要组成部分以及.net程序简单的编译原理

    .net平台的组成只要有两部分   FCL:框架类库    CLR:公共语言运行时 .net程序简单的编译原理 1.0:使用C#编译器(csc.exe) 将C#源代码编译成程序集+{编译之前:会检查C ...

  5. Linux C 程序 空语句-gcc编译命令(SIX)

    C语言语句1.空语句:当一个if或者while判断部分能完成工作,空语句可以用来表示if或者while内的空循环体 if(a == b ); 2.gcc编译器 //程序的编译过程: // 预处理:pr ...

  6. 反编译Android APK及防止APK程序被反编译

    怎么逆向工程对Android Apk 进行反编译 google Android开发是开源的,开发过程中有些时候会遇到一些功能,自己不知道该怎么做,然而别的软件里面已经有了,这个时候可以采用反编译的方式 ...

  7. 【转】Linux(ubuntu14.04)上编译Android4.4源码的环境搭建及编译全过程

    原文网址:http://jileniao.net/linux-android-building.html sublime text让我伤心.本来很信任sublime text的自动保存功能,之前使用一 ...

  8. Android应用程序资源的编译和打包过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8744683 我们知道,在一个APK文件中,除了 ...

  9. 【Linux相识相知】yum的配置使用和程序包的编译安装

    在上一篇博客中,写到了如何使用rpm命令来安装.卸载软件等,但是大家都知道,各个软件包之间可能存在依赖关系,如果安装某个软件需要额外的依赖其他若干的包,那么我们就需要将其他额外的包一个一个的安装上去, ...

  10. 怎么快速构建自己的C/C++程序?——有关编译、静态链接和SCons

    怎么快速构建自己的C/C++程序?--有关编译.静态链接和SCons 1. 写在前面 最初写C++是在Visual Studio这个IDE里,那时我并没有makefile的概念,对程序的编译和链接的一 ...

随机推荐

  1. 【DM】The PageRank Citation Ranking: Bringing Order to the Web - PageRank引用排名:将订单带到Web上

    [论文标题]The PageRank Citation Ranking: Bringing Order to the Web (1998) [论文作者]Larry Page [论文链接]Paper(1 ...

  2. java struts2入门学习---异常处理和类型转换

    一.struts2对异常的处理 1.自定义局部异常: <action> <exception-mapping result="sonException" exce ...

  3. 远程首次连接mysql速度慢的解决方法:skip-name-resolve取消DNS的反向解析(转)

    PHP远程连接MYSQL速度慢,有时远程连接到MYSQL用时4-20秒不等,本地连接MYSQL正常,出现这种问题的主要原因是,默认安装的 MYSQL开启了DNS的反向解析,在MY.INI(WINDOW ...

  4. jstree中文github文档

    jstree Bala...bala...这段就不翻译了. jstree就是个基于JQUERY的树形控件. 1 2 jsTree is jquery plugin, that provides int ...

  5. Intellij使用-- 导入Eclipse的代码格式化文件

    目录[-] 方法 安装插件: 配置插件: 使用插件 测试 对于一个团队来说,使用统一的代码格式是非常重要的,否则在使用版本控制工具时,会出现大量的冲突.在Eclipse里,我们可以通过一些xml来进行 ...

  6. wps 根据单元格值 设置单元格所在行 颜色(大于0 行红色 小于0 行xx色)

  7. android studio 如何让包名展开

    通常我们新建一个包名的时候,会发现他们连在一起,根本无法在创建一个同级的包 工具/原料   电脑,android studio 方法/步骤     1,我们先在包名下建一个包,变成了这样,根本无法在同 ...

  8. css中position:fixed实现div居中

    上下左右 居中 代码如下 复制代码 div{ position:fixed; margin:auto; left:0; right:0; top:0; bottom:0; width:200px; h ...

  9. SQL触发器 常用语句

    一.创建一个简单的触发器 CREATE TRIGGER 触发器名称 ON 表名 FOR INSERT.UPDATE 或 DELETE AS     T-SQL 语句 注意:触发器名称是不加引号的.   ...

  10. 微信小程序 weui 使用方法

      https://github.com/Tencent/weui-wxss/ 下载地址用于小程序的https://github.com/Tencent/weui   下载地址用于H5    运用示例 ...