C语言----程序环境

目录

前言:

1.翻译环境

1.1预编译(预处理)

1.2编译

1.3汇编

1.4链接

2.运行环境


前言:

我们在用vs或一些其他的编译器写代码的时候,当我们运行代码的时候,很自然而然的就出结果了,但是它究竟是如何是如何实现的呢?因为这部分的内容是涉及到**"编译原理"** 的,所以本章节我们只对程序的编译运行有个大致的了解,明白它经过了哪几个阶段,怎么样运作的就行,过于深度的这里就不作探讨,有兴趣的小伙伴可以去深入了解**<<编译原理>>,**那么下面我们开始正片:

在ANSI(美国国家标准化协会) C 的任何一种实现,都存在两个环境!

  • 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制的指令)
  • 第2种是执行环境,它用于实际执行代码

我们先来看一张图:

  • 组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)。
  • 每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。
  • 链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中

下面会对这两大环境进行详细讲解:

1.翻译环境

如何查看编译期间的每一步发生了什么呢?

接下来我会使用Linux系统下的gcc,一步步把这个流程给大家显示出来.

1.1预编译(预处理)

预处理 选项 gcc -E test.c -o test.i

预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。

此时的test.i文件,通过和原先的test.c对比,你会发现头文件已经没有了,变成了几百行的代码,#define定义的值也已经被替换,并且原先的注释也被删除了.

因此我们可以得出结论,在预处理的阶段:

  • 注释的删除
  • #include 头文件的展开
  • #define 符号的替换
  • 理解为文本操作,所有的预处理指令都是在预处理阶段处理的

1.2编译

编译 选项 gcc -S test.c

编译完成之后就停下来,结果保存在test.s中。

经过编译之后,会把预处理后的C语言代码翻译成汇编指令,并且在这一步之中,还会进行:语法分析,词法分析,语义分析,符号汇总.

1.3汇编

汇编 gcc -c test.c

汇编完成之后就停下来,结果保存在test.o中

经过汇编后,会生成可重定位目标文件(Linux下.o后缀的文件),这一步会形成符号表.

1.4链接

拿到所有的.o文件然后合并段表,进行符号表的合并和符号表的重定位.


2.运行环境

程序执行的过程:

  1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
  2. 程序的执行便开始。接着便调用main函数。
  3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
  4. 终止程序。正常终止main函数;也有可能是意外终止。

以上就是本期的全部内容啦,下期文章会专门针对预处理进行详解!

相关推荐
TeleostNaCl12 分钟前
解决 Chrome 无法访问网页但无痕模式下可以访问该网页 的问题
前端·网络·chrome·windows·经验分享
学到头秃的suhian42 分钟前
Maven
java·maven
小坏讲微服务1 小时前
Docker-compose 搭建Maven私服部署
java·spring boot·后端·docker·微服务·容器·maven
chxii1 小时前
Maven 详解(下)
java·maven
inferno1 小时前
Maven基础(二)
java·开发语言·maven
杨武博1 小时前
关于maven中pom依赖冲突问题记录
java·maven
yuuki2332331 小时前
【数据结构】用顺序表实现通讯录
c语言·数据结构·后端
前端大卫2 小时前
为什么 React 中的 key 不能用索引?
前端
你的人类朋友2 小时前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
ad钙奶长高高2 小时前
【C语言】扫雷游戏详解
c语言