【C/C++】程序如何来,编译全过程
概述
编译的目的是把人书写的高级语言代码翻译成目标程序的语言处理程序,编译用的程序(例如gcc)称为编译系统。
一个编译系统把一个源程序翻译成目标程序的工作过程分为5个阶段:词法分析、语法分析、中间代码生成、代码优化和目标代码生成。
其中主要阶段是词法分析和语法分析,也可以称为源代码分析,分析过程中发现有语法错误,给出提示信息。
词法分析
词法分析的目的是处理源代码中的单词。
词法分析程序按照从左到右的顺序wyuq 扫描源代码,生成单词对应的符号,把字符描述的程序转换为符号描述的中间程序。
词法分析程序也称做词法扫描器。
词法分析过程可以用手工构造和自动生成两种方法。手工构造可以使用状态图,自动生成的构造方法通常使用确定步骤的程序状态机。
语法分析
语法分析程序使用词法分析程序的结果作为输入。
语法分析的功能是分析单词符号是否符合语法要求,如表达式、赋值、循环等是否构成语法要求。此外,语法程序还按照语法规则分析检查程序的语句是否符合合理正确的逻辑结构。
语法分析方法有自上而下和自下而上分析两种方法。
自上而下分析方法从方法开始的符号向下推导,逐步分析。自下而上分析方法利用堆栈的原理,把词法符号按顺序入栈,然后分析语法是否符合要求。
中间代码生成
中间代码也称做中间语言,是一种介于源代码与目标代码之间的表示方式。
使用中间程序可以完整地表达源代码的意思,同时又使编译程序在逻辑结构上简单明确。
中间语言是供编译器使用的,常见的表示形式有逆波兰几号、四元式、三元式和树等。
代码优化
代码优化是目标是生成有效的目标代码。
代码优化通过对中间代码的分析,进行等价变换,达到减小存储空间和缩短运行时间的目的。
程序优化并不改变源代码的功能。
代码优化还可以对目标代码进行优化,与中间代码优化相比,对目标代码优化依赖计算机类型,但是优化的效果相对较好。
目标代码生成
编译程序的最后一项任务是生成目标代码。
目标代码生成器把中间代码变换成目标代码,通常有3种变换形式:
立即执行的机器语言代码。这种方式对应静态连接方式,程序中所有地址都重定位,执行效率最高,但是占用的存储空间最大。
待装配的机器语言模块。该方式不连接系统共享的程序库,在需要使用的时候会由系统加载共享程序库。
汇编语言代码。该方式经过汇编程序汇编后,直接生成可以在操作系统上运行的目标代码。
生成目标代码需要考虑3个影响生成速度的问题:
一是采用什么方法生成比较短小的目标代码;
二是如何在目标代码中多使用寄存器,减少目标代码访问外部存储单元的次数;
三是如何根据不同平台计算机指令特性进行优化,提高程序运行效率。
本文出自 “成鹏致远” 博客,请务必保留此出处http://infohacker.blog.51cto.com/6751239/1198506
【C/C++】程序如何来,编译全过程的更多相关文章
- 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视GCC编译全过程 | 百篇博客分析OpenHarmony源码| v57.01
百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...
- .NET程序的简单编译原理
1.不管是什么程序,最终的执行官是CPU,而CPU只认识1和0的机器码. 2.我们现在写的一般是高级语言写的程序.CPU是不认识我们用高级语言写的源代码的,那应该怎么办才能让CPU执行我们写好的程序尼 ...
- Matlab 运行C程序出现的编译出错问题
2016-03-18 17:18:34 最近在运行一些公开的Matlab代码包时,比如LibSVM.crfChain等,遇到了需要在Matlab环境下编译C程序的问题,对于我所遇到的问题,给出以下解决 ...
- C#基础--.net平台的重要组成部分以及.net程序简单的编译原理
.net平台的组成只要有两部分 FCL:框架类库 CLR:公共语言运行时 .net程序简单的编译原理 1.0:使用C#编译器(csc.exe) 将C#源代码编译成程序集+{编译之前:会检查C ...
- Linux C 程序 空语句-gcc编译命令(SIX)
C语言语句1.空语句:当一个if或者while判断部分能完成工作,空语句可以用来表示if或者while内的空循环体 if(a == b ); 2.gcc编译器 //程序的编译过程: // 预处理:pr ...
- 反编译Android APK及防止APK程序被反编译
怎么逆向工程对Android Apk 进行反编译 google Android开发是开源的,开发过程中有些时候会遇到一些功能,自己不知道该怎么做,然而别的软件里面已经有了,这个时候可以采用反编译的方式 ...
- 【转】Linux(ubuntu14.04)上编译Android4.4源码的环境搭建及编译全过程
原文网址:http://jileniao.net/linux-android-building.html sublime text让我伤心.本来很信任sublime text的自动保存功能,之前使用一 ...
- Android应用程序资源的编译和打包过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8744683 我们知道,在一个APK文件中,除了 ...
- 【Linux相识相知】yum的配置使用和程序包的编译安装
在上一篇博客中,写到了如何使用rpm命令来安装.卸载软件等,但是大家都知道,各个软件包之间可能存在依赖关系,如果安装某个软件需要额外的依赖其他若干的包,那么我们就需要将其他额外的包一个一个的安装上去, ...
- 怎么快速构建自己的C/C++程序?——有关编译、静态链接和SCons
怎么快速构建自己的C/C++程序?--有关编译.静态链接和SCons 1. 写在前面 最初写C++是在Visual Studio这个IDE里,那时我并没有makefile的概念,对程序的编译和链接的一 ...
随机推荐
- Ubuntu 10.04里安装强大抓图工具Shutter
Shutter 原名叫GScrot,是一款Linux下很强大的抓图工具,支持截取全屏幕,窗口,自选区域以及网页的图像,并且截取后的图像还可以简单编辑,Shutter还支持插件功能,矩齿,边缘化,碎纸, ...
- POJ 2513 Colored Sticks (欧拉回路 + 字典树 +并查集)
Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 27097 Accepted: 7175 ...
- 使用JMeter对网站并发性测试
目录结构: contents structure [+] 1. 下载JMeter 2. 启动JMeter 1) 建立线程. 2) 设置请求服务器.压力链接等信息 3) 查看运行结果 3,分析数据 Ap ...
- SqlLocalDB2014使用笔记
标签: 软件开发,数据库肯定是必不可少的当然是数据库了,在.Net开发中兼容性最好的莫过于微软的亲儿子“SqlServer”了,但是在安装SqlServer的安装随便找个版本就是一个多G或者几百兆,安 ...
- 常用代码之八:setTimeout 和 clearTimeout。
1.先写一个错误的例子: function DealSomething() { //write some code window.setTimeout(function ...
- 配置eureka 老是报错connected time out 或者 refused connected
报错信息总是连接错误,我指定了端口号,却不按照我指定的端口进行访问,而是访问eureka-server 的端口号是8761 ,这是因为配置有问题. 查看 类 EurekaClientConfigBea ...
- django -- 用包来组织数据库模型
默认情况下一个django app的所有模型都保存在一个叫models.py的文件中.这样事实是不方便管理的: 通过包来组织模型是比较方便的. 一.第一步:删除models.py: rm -rf mo ...
- windows如何查看某个端口被谁占用
我们在启动应用的时候经常发现我们需要使用的端口被别的程序占用,但是我们又不知道是被谁占用,这时候我们需要找出“真凶”,如何做到呢? cmd命令中 输入命令:netstat -ano,列出所有端口的情况 ...
- php分享三十二:php调试工具
一:phpdbg http://phpdbg.com/
- Linux内核设计基础(一)之中断处理
假设让内核定期对设备进行轮询.以便处理设备,那会做非常多无用功,假设能让设备在须要内核时主动通知内核,会是一个聪明的方式,这便是中断. 在响应一个特定中断时,内核会运行一个函数--中断处理程序. 中断 ...