从文本文件到可执行文件

以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语言的编译过程,从文本到可执行文件相关推荐

  1. C语言的编译过程常见的错误和警告

    C语言的编译过程: 一. C语言编译过程 C语言的编译过程可分为四个阶段: 1.预处理(Preprocessing) 对源程序中的伪指令(即以#开头的指令)和特殊符号进行处理的过程. 伪指令包括:1) ...

  2. c语言的编译过程详解

    c语言的编译过程详解 IDE的使用让很多和我一样的人对C/C++可执行程序的底层生成一知半解,不利于我们深入理解原理.在这里小结一下,望路过的大神指正~ 前言:从一个源文件(.c文件)到可执行程序到底 ...

  3. -i 可以编译添加多个_C语言的编译过程

    大家对C语言的编译过程可能有个大致的理解,但是,详细到每一步具体都干了啥,可能有的人不是很清楚啦,也包括我,要不然,就不会做笔记了,哈哈... 0.主要步骤 ① 步骤 编写源程序(.c) → 预处理 ...

  4. 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  5. C语言程序编译过程 2

    C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接是把目标文件.操作 ...

  6. .NET语言的编译过程:中间语言(IL)和即时编译器(JIT)

    .NET语言的编译分为两个阶段.首先高级语言被编译成一种称作IL的中间语言,与高级语言相比,IL更像是机器语言,然而,IL却包含一些抽象概念(比如:类.异常),这也是这种语言被称为中间语言的原因.IL ...

  7. Linux上C语言程序编译过程详解

    点击蓝字 关注我们 因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 来源于网络,侵删 本文将介绍如何将高层的C/C++语言编写的程序转换 ...

  8. c语言编译生成cpp,C语言的编译过程

    编译: 编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序. 流程:C ...

  9. c语言的编译过程,程序编译过程

    相对虚拟地址 在可执行文件中,许多地方都需要被指定一个在内存中的地址.例如在使用全局变量时需要它的地址.PE文件可以被加载到进程地址空间中的任何地方.虽然它有一个首选地址,但你却不能依赖可执行文件一定 ...

最新文章

  1. linux那个11命令是什么意思,11个有用的Linux命令
  2. html中怎么隐藏复选框,隐藏复选框字段HTML
  3. FreeRTOS学习笔记之信号量
  4. windows组件中没有IIS解决方法
  5. Windows和Linux如何使用Java代码实现关闭进程
  6. android 网络调试工具,安卓网络调试助手
  7. css3-12 transition+css或transform实现过渡动画
  8. 1116: 删除元素
  9. mysql增删改查 工具类_JDBC工具类实现对数据库数据的增删改查
  10. 1.django restframework 项目部署到ubuntu18.04上(同步数据库)
  11. C语言储蓄系统编程,C语言:银行储蓄系统的开发(初级)-Go语言中文社区
  12. Java排序:冒泡排序
  13. 侠诺虚拟服务器,简便不等于简单 侠诺PPPoE服务器功能介绍
  14. java构建模式_《Java设计模式》之构建者模式
  15. 一个在华为工作十年的大牛 历程
  16. CT计算机组成及其特点,浅析CT图像的特点及常用扫描方式
  17. 红色警戒2修改器原理百科(九)
  18. 奇摩,你来大陆干什么?
  19. cocos2d-x创建新项目模板
  20. 使用计算机进入什么状态,装机过程中什么情况要进bios设置?

热门文章

  1. 2018年区块链五大关键趋势预测:区块链与物联网结合有望突破
  2. 鬼怪出没不害怕,最怕秒杀404
  3. Ubuntu18 安装yum
  4. 删除数据oracle,oracle删除数据
  5. 加密算法使用(五):RSA使用全过程
  6. 等不到那人,回不到人间——dbGet(四)
  7. FPGA 实现 RGB 图像转 Gray
  8. oracle共享内存段手工清理
  9. 天锦十字绣:网购退货催生退货运费险
  10. 让元素固定_49种元素对钢铁性能的影响