c语言的编译过程,从文本到可执行文件
从文本文件到可执行文件
以hello world举例。
#include<stdio.h>
int main(){printf("hello,world!\n");return 0;
}
这样的一个.c文件如何被编译成可执行文件的呢?
1.1信息就是位+上下文
文本文档一般是通过ASCII码表示的。比如上面的hello.c文件,其内部的编码为:
像.c文件这样的,以ASCII字符组成的文件称为文本文件,所有其他文件都称为二进制文件
hello.c文件的表示方法说明了一个基本思想:系统中的所有信息都是由一串比特表示的,如何区分不同的数据对象呢?需要看他的上下文。
1.2 程序的“翻译”
.c文件如何一步步变成可执行文件的呢?
c语言的编译命令可能如下:
linux > gcc -o hello hello.c
整个翻译过程分四个阶段完成:
编译系统(complolation system):由上述的四个程序(预处理器、编译器、汇编器和链接器)组成
预处理阶段:根据以#开头的命令,修改原始的c程序。比如
#inlcude<stdio.h>
,处理后的hello.i文件将stdio.h中的文件全部插入到hello.c文件中编译阶段: 将hello.i翻译成hello.s,hello.s也是一个文本文件,但它描述的是一个汇编语言程序,内容可能是这样的:
- 汇编阶段。
汇编器将hello.s翻译成机器语言指令,并把这些指令打包**为可重定位目标程序(relocatable object program)**并将结果保存在目标文件hello.o中,hello.o是一个二进制文件链接阶段hello.o调用了printf函数,printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中。链接器负责将printf.o与hello.o合并。结果得到hello文件,这是一个可执行文件。
前一部分《c语言的编译过程》已经介绍了hello.c文件如何被转换为可执行文件hello。那么hello文件在具体执行时,计算机内部又发生了什么呢?
程序运行时,指令和数据在计算机中的传递
初始时,用户从键盘输入运行命令./hello
。shell程序将字符逐一读入寄存器,再把它放入内存中。
当我们敲完回车键后,shell程序就知道我们已经结束了命令的输入。shell会执行一系列指令,把hello目标文件中的代码和数据从磁盘复制到主存。
图1.5中,磁盘中的数据需要经过处理器才能到达主存。而采用DMA技术的话,数据可以直接到达主存。
当代码和数据被加载到主存后,处理器就开始执行hello程序的main程序中的机器语言指令。这些指令将"hello,world\n字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。"
以上可以看到,程序在执行时要不断地执行数据的传输。包括指令和数据,一遍又一遍地在主存和寄存器中传输。使用高速缓存存储器可以使程序运行速度提高几个数量级。
c语言的编译过程,从文本到可执行文件相关推荐
- C语言的编译过程常见的错误和警告
C语言的编译过程: 一. C语言编译过程 C语言的编译过程可分为四个阶段: 1.预处理(Preprocessing) 对源程序中的伪指令(即以#开头的指令)和特殊符号进行处理的过程. 伪指令包括:1) ...
- c语言的编译过程详解
c语言的编译过程详解 IDE的使用让很多和我一样的人对C/C++可执行程序的底层生成一知半解,不利于我们深入理解原理.在这里小结一下,望路过的大神指正~ 前言:从一个源文件(.c文件)到可执行程序到底 ...
- -i 可以编译添加多个_C语言的编译过程
大家对C语言的编译过程可能有个大致的理解,但是,详细到每一步具体都干了啥,可能有的人不是很清楚啦,也包括我,要不然,就不会做笔记了,哈哈... 0.主要步骤 ① 步骤 编写源程序(.c) → 预处理 ...
- 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- C语言程序编译过程 2
C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接是把目标文件.操作 ...
- .NET语言的编译过程:中间语言(IL)和即时编译器(JIT)
.NET语言的编译分为两个阶段.首先高级语言被编译成一种称作IL的中间语言,与高级语言相比,IL更像是机器语言,然而,IL却包含一些抽象概念(比如:类.异常),这也是这种语言被称为中间语言的原因.IL ...
- Linux上C语言程序编译过程详解
点击蓝字 关注我们 因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 来源于网络,侵删 本文将介绍如何将高层的C/C++语言编写的程序转换 ...
- c语言编译生成cpp,C语言的编译过程
编译: 编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序. 流程:C ...
- c语言的编译过程,程序编译过程
相对虚拟地址 在可执行文件中,许多地方都需要被指定一个在内存中的地址.例如在使用全局变量时需要它的地址.PE文件可以被加载到进程地址空间中的任何地方.虽然它有一个首选地址,但你却不能依赖可执行文件一定 ...
最新文章
- linux那个11命令是什么意思,11个有用的Linux命令
- html中怎么隐藏复选框,隐藏复选框字段HTML
- FreeRTOS学习笔记之信号量
- windows组件中没有IIS解决方法
- Windows和Linux如何使用Java代码实现关闭进程
- android 网络调试工具,安卓网络调试助手
- css3-12 transition+css或transform实现过渡动画
- 1116: 删除元素
- mysql增删改查 工具类_JDBC工具类实现对数据库数据的增删改查
- 1.django restframework 项目部署到ubuntu18.04上(同步数据库)
- C语言储蓄系统编程,C语言:银行储蓄系统的开发(初级)-Go语言中文社区
- Java排序:冒泡排序
- 侠诺虚拟服务器,简便不等于简单 侠诺PPPoE服务器功能介绍
- java构建模式_《Java设计模式》之构建者模式
- 一个在华为工作十年的大牛 历程
- CT计算机组成及其特点,浅析CT图像的特点及常用扫描方式
- 红色警戒2修改器原理百科(九)
- 奇摩,你来大陆干什么?
- cocos2d-x创建新项目模板
- 使用计算机进入什么状态,装机过程中什么情况要进bios设置?