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函数;也有可能是意外终止。

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

相关推荐
paopaokaka_luck几秒前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
-一杯为品-8 分钟前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
以后不吃煲仔饭13 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师14 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
The_Ticker19 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
Json_1817901448036 分钟前
电商拍立淘按图搜索API接口系列,文档说明参考
前端·数据库
大数据编程之光41 分钟前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
爪哇学长1 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
爱摸鱼的孔乙己1 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
风尚云网1 小时前
风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计
前端·css·学习·html·html5·风尚云网