c语言编译系统工作原理
c语言编译系统内部的工作原理
程序生命周期概述
一个程序的生命周期可以被分成四个部分:
- 创建
- 编译
- 运行
- 退出
以一个简单的 helloworld.c 程序为例:
#include<stdio.h>
int main()
{
printf("hello world!");
return 0;
}
编译的详细过程
通过这条命令
gcc -o helloworld helloworld.c
即可完成对 helloworld.c 的编译,生成可执行程序 hello
这是我们最常使用的编译手段(gcc)
看似很简单,一个命令就能把源码编译成了可执行程序。
实际上,编译的过程可以细分为四个步骤
预处理(Pre-processor)(cpp)
编译(Compiler)(ccl)
汇编(Assembler)(as)
链接(Linker)(ld)

预处理
预处理器会根据以#开头的代码段,来修改原始程序
如:helloworld.c 程序中引入头文件——stdio.h
预处理器会读取其中的内容,将其中的内容直接插入到源程序中,最终得到另外一个c程序
经过预处理器处理后得到的文件通常以 .i 结尾

编译
经过词法分析、语法分析、语义分析、优化等步骤,把c语言程序翻译成汇编程序
对于编译阶段,c语言文件 helloworld.i 经过编译得到输出文件 helloworld.s

汇编
汇编器根据指令集 将汇编程序 helloworld.s 翻译成机器指令,并且把这一系列的机器指令按照固定的规则进行打包
汇编语言文件 helloworld.s 经过汇编后得到 可重定位目标文件helloworld.o

此时,helloworld.o 虽然是一个二进制文件,但是还不能执行
链接
编译器负责把多个可重定位目标文件根据一定规则进行合并
在 helloworld.c 这个程序中,我们调用了 printf 函数(标准c库中的函数),这个 printf 函数在名为 printf.o 的文件中(一个提前编译好的目标文件)
链接器负责把 helloworld.o 和 printf.o 进行合并
最终,经过链接得到可执行文件 helloworld ,此时得到的 helloworld 文件就可以被加载到内存中去执行了

c语言编译系统工作原理的更多相关文章
- java复习要点(一)------- java语言的特点、java的工作原理、配置环境变量、java命令的使用
一.java语言的特点: (1)简单并面向对象 (2)鲁棒并安全: java语言在编译及运行程序时,都要进行严格的检查,防止不匹配问题的发生.如果引用一个非法类型,或执行一个非法类型操作,java减肥 ...
- Java语言的特点与工作原理
Java语言的特点 1.简单性 Java语言与我们常听到的C++语言很像,但是没有C++那么繁琐.因为Java就是在C++之上设计出来的,设计者把C++的一些特性去掉了,这些特性在实际开发中,程序员也 ...
- Servlet的生命周期及工作原理
Servlet生命周期分为三个阶段: 1,初始化阶段 调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...
- 浏览器内部工作原理--作者:Tali Garsiel
本篇内容为转载,主要用于个人学习使用,作者:Tali Garsiel 一.介绍 浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工作原理,我们将看到,从你在地址栏输入google.com到你看到 ...
- HTTP协议请求响应过程和HTTPS工作原理
HTTP协议 HTTP协议主要应用是在服务器和客户端之间,客户端接受超文本. 服务器按照一定规则,发送到客户端(一般是浏览器)的传送通信协议.与之类似的还有文件传送协议(file transfer p ...
- B/S工作原理
B/S疑问 先对比C/S,在C/S中我们开发时怎么做的,是不是这样:拖控件,写方法,所有的功能基本就是这样,就像我们的机房收费系统,C/S学习完之后,我们开始B/S学习,这里我们接触的是ASP.NET ...
- Java中GC的工作原理
转文: 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个 ...
- 轻松搞懂WebService工作原理
用更简单的方式给大家谈谈WebService,让你更快更容易理解,希望对初学者有所帮助. WebService是基于网络的.分布式的模块化组件. 我们直接来看WebService的一个简易工作流程: ...
- AJAX工作原理及其优缺点
1.什么是AJAX?AJAX全称为"Asynchronous JavaScript and XML"(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术.它 ...
- PHP底层工作原理
最近搭建服务器,突然感觉lamp之间到底是怎么工作的,或者是怎么联系起来?平时只是写程序,重来没有思考过他们之间的工作原理: PHP底层工作原理 图1 php结构 从图上可以看出,php从下到上是一个 ...
随机推荐
- 03 jQuery属性控制
03 jQuery属性控制 属性相关的控制主要有以下几个功能 val() => 处理value属性 text() => 处理innerText html() => 处理innerHT ...
- #K-D Tree#BZOJ 4303 数列
题目传送门 分析 将 \((i,p_i)\) 视为一个点,那么相当于对横坐标或纵坐标对应的点区间乘.区间加或者区间求和, 把这些点丢到 K-D Tree 上,维护最小/大横/纵坐标,如果当前区间点在范 ...
- #状压dp#D 诗人小K
分析 考虑题目的唯一突破口就是\(x,y,z\) 那么要与二进制状态挂上钩,状态应表示某一段正好为\(x,y或z\) 设\(g[s][i]\)表示当前位置的元素为\(i\),上一次状态为\(s\), ...
- Linux系统奇安信浏览器报错跨域:the resource is in more-private address space 'local'
报错: Access to XMLHttpRequest at "123" from origin "456" has been blocked by CORS ...
- JMeter接口性能测试工具
博客地址:https://blog.csdn.net/lovesoo/article/details/78579547
- 树模型--ID3算法
基于信息增益(Information Gain)的ID3算法 ID3算法的核心是在数据集上应用信息增益准则来进行特征选择,以此递归的构建决策树,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类. ...
- [CentOS]压缩+解压+打包命令大全
[CentOS]压缩+解压+打包命令大全 --------------- .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注 ...
- lattice的ipexpress异常,解决办法
最近ip服务器可能会遇到问题,建议客户把更新检查关掉.我们有对应的IP下载链接. https://www.latticesemi.com/ispupdate/ipexpress/ https://ra ...
- hibernate4升级5带来的一些参数变化
public String hqlToHibernate5(String hql) { String[] tmp = hql.split(" "); String hqlTmp = ...
- Sample HL7 ADT Messages
Here are a few sample ADT messages for testing that I've picked up over time. I may edit this post l ...