C语言编译原理--从源码到可执行文件详解_c编译器源码分析-程序员宅基地

技术标签: 透明的stm32  stm32  c语言基础知识  c语言  嵌入式硬件  开发语言  单片机  

目录

一、什么是编译

二、编译详细流程

1、预处理

2、编译

3、汇编

4、链接

三、总结


一、什么是编译

1、编译本质是将人类可读的程序源码转换为机器可以执行的机器指令。

2、将源程序转换为机器指令的工具叫做编译器,比如gcc,armcc,arm-linux-gcc等编译器。

二、编译详细流程

以C语言编译为例:编译流程大致分为以下几步:

1、预处理

预处理阶段会进行 宏替换,头文件展开,条件编译过滤,用户注释清除。

测试源码 mian.c,文件内容如下:

#include <stdio.h>//用于测试头文件包含

#define BIN_XYB_TEST (10)//用于测试宏替换

#if BIN_XYB_DEFINE //用于测试编译条件
#define BIN_XYB_STR "DEFINE STR"
#else
#define BIN_XYB_STR "NO DEFINE STR"
#endif

//test   //用于测试注释清除

int main()
{
   int i = BIN_XYB_TEST;
   printf("hello world:%d!\r\n", i);
   printf(BIN_XYB_STR);
   return 0;
}

预处理main.c:gcc -E main.c -o main.i 。

生成预处理后的文件 main.i ,如下图:

对比源问件和目标文件结果如下:

2、编译

编译阶段会进行 检查语法错误,生成汇编文件。

编译阶段详细分为:词法分析,语法分析,语义分析,代码优化,目标代码生成。

编译main.i:gcc -S main.i -o main.s 。

生成汇编文件:main.s,如下图:

 用户源码和生成汇编文件对比如下:

推荐一个网站,改工具可以将用户源码编译为汇编文件,支持多种编译器,方便用户深入理解C语言编译后的汇编源码,工具网址:Compiler Explorer

3、汇编

汇编阶段会将汇编文件转换为二进制文件。

编译main.s:gcc -c main.s -o main.o,结果如下图:

生成的main.o文件是二进制形式,以二进制打开,内容如下:

4、链接

链接阶段会将编译后的二进制文件中的函数调用(包括一些静态库的中接口的调用)赋予实际意义,将程序进行整体组装,生成最终可执行的文件。

链接命令:gcc main.o -o main

整个流程下来,生成最终可执行文件main,./main执行,看到有正常输出。

三、总结

编译过程是将人类可看懂的源码语言转变为计算机可执行的指令。

当前阶段,人类可识别的源码语言大致包括两种,一种是编译型语言(比如C语言,C++语言等),也就是本文介绍的,另一种是解释型语言,也就是平时所说的脚本语言(比如Python、Lua等)。

编译型语言在开发平台上,将人类可识别的源码转换为计算机指令(可以理解为程序包),将程序包下载到设备,设备直接执行。

解释型语言是将人类可识别的源码作为程序包添加到设备中,设备需要先将人类可识别的源码转换为机器指令,然后再执行机器指令,相当于是边解释边执行。

相比编译型语言,解释型语言速度较低,但是方便易用,可快速跨平台。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_30095023/article/details/132423126

智能推荐

学习笔记-HTML_html这个checked-程序员宅基地

文章浏览阅读846次。前端学习笔记HTML简介网页的概念:1.网页:通过浏览器阅读,网站构成的基本元素2.网站:网页的集合,以html为后缀所以又称html文件3.html(超文本标记语言):用于描述网页,通过各种(不止文本)标签创建网页,可以进行文件跳转浏览器:ie,edge,firefox,opera,chrome(*),safari浏览器内核:读取网页内容整理讯息计算网页显示方式web 标准:w3c(万维网联盟 )web标准的构成:1.结构(html)用于对网页元素进行整理和分类<躯干>_html这个checked

创新的时机 – 黄金点游戏-程序员宅基地

文章浏览阅读76次。《现代软件工程 课件》 在《移山之道》里, 我提到移山软件学院的游戏:阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫“黄金点”的游戏:N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同..._创新的时机 – 黄金点游戏。

webhooks是什么啊?有什么好处?_wedhook-程序员宅基地

文章浏览阅读387次。你需要向视频处理服务器上传一个视频、你需要获得视频处理后的结果,然而视频处理服务器上视频很多,在排队进行处理,你不能立刻获取到视频的处理结果,此时你可以设计一个hook url,当视频处理完成后,视频处理服务器自动向你的hook url发送请求,告诉你视频已经处理完毕.在传统的web server设计中,我们项目A想要获取项目B的数据,通常项目B需要提供一个API,然后项目A去请求项目B的API,从而获得数据,这样的过程我们称之为"拉"数据。==通过webhook机制,对客户端-服务端的模式进行了逆转。_wedhook

解决:Error:java xxxx 程序包不存在_java语言unil程序包不存在什么意思-程序员宅基地

文章浏览阅读3.2w次,点赞8次,收藏9次。今天早上,一跑项目报错了。。java程序包不存在。我是小白啊,之前没有遇到过这种问题就赶紧查了查。终于解决了。其实我遇到的也不是什么大问题,只是该文件下少了上述的jar包(见下图)。再查看 pom 文件没有报错,和 Maven Projects 中的 Dependencies 中都没有缺少这些内容。直接重新导入全部的Maven Projects 就好了。参考文章:..._java语言unil程序包不存在什么意思

java接收ajax传参_Ajax传值以及接受传值,@ResPonseBody 和 @RequestBody-程序员宅基地

文章浏览阅读873次。Ajax对于Java编程人员开说可是很重要的,可以说是必会的。Title// 第二步:使用Jquery的 ajax (被封装过的)来请求数据地址$.ajax({type:'post',url:'api/data.json',data:{},success:function (res) {console.log(res)}})// url: 填写的内容的是 后台的数据接口// type: 本次发送..._java控制层获取ajax传参

【Python】 将一个函数作为参数传递到另一个函数中_python怎么作为参数引入一个方程-程序员宅基地

文章浏览阅读2.6k次,点赞3次,收藏2次。背景:学数据结构的时候需要一个能够测量各种算法消耗时长的函数,重复写,话不多说直接上代码。import time as tdef mutinomial(n,a,x): p = 0 for i in range(0,n+1): p += a[i]*pow(x,i) return print(p)def qinjiushao(n,a,x): p = a[n] for i in range(n,0,-1): p *= x _python怎么作为参数引入一个方程

随便推点

爬虫逆向学习进阶路线_爬虫逆向进阶pdf下载-程序员宅基地

文章浏览阅读1.2w次,点赞46次,收藏241次。大数据时代下,爬虫技术逐渐成为一套完整的系统性工程技术,涉及的知识面广,平台多,技术越来越多样化,对抗性也日益显著。大家可以参考一下学习路线,看看自己需要对哪些知识进行补充。爬虫逆向学习路线学习路线总结系统提高加密算法特征和实现传输协议和通讯协议各种验证码识别方法个人汇总专栏爬虫逆向社区学习路线总结基础学习路线总结:主语言基础语法常用网络请求库、解析库常用抓包工具自动化工具库流行采集框架多进程、多线程、协程、分布式爬虫采集器管理Js逆向学习路线总结:浏览器构造、基础语法、作_爬虫逆向进阶pdf下载

IT各个领域推荐的书籍-程序员宅基地

文章浏览阅读119次。1、C语言提升《c和指针》《c缺陷和陷阱》《c专家编程》这三本书我在很多的文章中都提过,是一个初级C程序员必看的三本书,同时也是我们公司应届新员工必须好好学习的教材,非常适合刚毕业的大学生学习。2、C++语言提升Effective C++:改善程序与设计的55个具体做法》《More EffectiveC++:35个..._反模式:危机中软件、架构和项目的重构

Comsol事件控制线圈加热冷却(涡流热成像)_comsol涡流检测里线圈-程序员宅基地

文章浏览阅读1.1k次,点赞19次,收藏12次。在涡流加热过程中,通常需要关注的不仅是加热过程,还有加热物体的冷却过程。这非常重要。Xiao XT【】中用试验方法说明了对于缺陷的深度的定量分析,加热与冷却过程的频域图(幅度与相位)十分重要。_comsol涡流检测里线圈

Java——《面试题——MySQL篇》_java mysql面试题-程序员宅基地

文章浏览阅读3.3k次,点赞4次,收藏28次。视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是 有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易, 相比多表查询。内联接(Inner Join):匹配2张表中相关联的记录。左外联接(Left Outer Join):除了匹配2张表中相关联的记录外,还会匹配左表中剩余的记 录,右表中未匹配到的字段用NULL表示。_java mysql面试题

web3j 命令行_web3j 命令行工具-程序员宅基地

文章浏览阅读7.8k次。1. 下载最新的版本已经没有直接的命令行工具了,工具版本v4.5.5 下载2. 可以配置到环境变量3. 命令version: 版本号wallet: create: 生成一个新的以太坊钱包 update:更新现有钱包的密码 send: 将以太币发送到另一个地址solidity: 智能合约new:import:..._web3j 命令行工具

iptables移植到ARM Linux教程_arm-linux iptable源码下载-程序员宅基地

文章浏览阅读5.1k次,点赞5次,收藏10次。http://www.veryarm.com/568.htmliptables或netfilter(网络过滤器)是一个工作于用户空间的防火墙应用软件,允许系统管理员可以调整设置X表(Xtables)提供相关的系统表格(目前主要位于iptables/netfilter)以及相关的“链”与“规则”,以管理网络数据包的流动与转送的动作。Iptables是用户态提供的更改过滤规_arm-linux iptable源码下载

推荐文章

热门文章

相关标签