程序的环境

简介: 程序的环境

前言

我们平时在编译器上编写代码,然后运行代码,最后得到程序的运行结果。这让我们不经好奇:程序在电脑中到底经过了什么样的变化,使得它最终生成了我们想要得到的结果,因此今天就来了解一下程序的环境

一、程序环境分类

ANSI C(标准C)的任何一种实现中,存在两个不同的环境

第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令,机器可以读懂的指令)。

第2种是执行环境,它用于实际执行代码。

二、翻译环境

1.总体流程

每一个源文件(.c文件)独立的通过编译器的编译,都会生成一个与之对应的目标文件(.obj文件)。将程序中所有的目标文件一起同时加上链接库里的数据(平时用的头文件等都是在系统的链接库里的),再通过链接器的链接,就会产生一个可执行程序(.exe文件)

具体的流程如下:

2.编译

由上图可以看到,编译过程主要包含了预处理、编译和汇编这三个步骤。

接下来进行具体讲解:

2.1预编译

预编译,又称为预处理

如果要在Linux环境下对源文件(test.c)实现这一步,需要的命令是:

gcc test.c -E -o test.i

(然后就生成了 .i文件)

主要工作(文本操作)

1、头文件的包含;

2、宏的定义的替换;(将宏定义的符号用具体的值替换,即,删除宏定义的符号)

3、注释的删除;(注释是方便程序员阅读代码,编译器不需要)

……等。

2.2编译

在Linux环境下,对文件(test.i)进行编译操作,需要的命令

gcc test.i -S

(生成 .s文件)

主要工作

1.把C语言代码转化成汇编代码

2.主要进行:

①语法分析;②词法分析;③语义分析;④符号汇总等。

2.3汇编

在Linux环境下,对文件(test.s)进行汇编的命令

gcc test.s -c

(生成 .obj文件)(linux下是.o文件)

主要工作

1.把汇编代码转化为二进制代码;

2.形成符号表

主要有包括全局变量(不包括局部变量)、函数……等(基于编译部分的符号汇总)。

3.链接

主要工作:

1.合成段表

Linux环境下的可执行程序都是elf格式,因此可以将经过编译步骤生成的可执行程序进行合并成一个段表。

2.符号表的合并和重定义

这样就可以跨源文件查找函数或者全局变量

下面举个关于符号表的例子:

三、运行环境

程序执行的过程:

  1. 程序必须载入内存中。
    在有操作系统的环境中:这个步骤一般由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
  2. 程序的执行便开始。
    开始调用main函数
#include <stdio.h>
int main()
{
  int i = 0;
  for (i = 0; i<10; i++)
  {
    printf("%d ", i);
  }
  return 0;
}
  1. 开始执行程序代码。
    这个时候程序将使用一个运行时堆栈(stack)【可以参考函数栈帧】,存储函数的局部变量和返回地址。也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
  2. 终止程序。
    正常终止main函数;也有可能是意外终止。

总结

以上就是今天要讲的内容,本文介绍了程序的环境,主要对程序的翻译环境进行了了解。

本文作者目前也是正在学习编程方面的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出也欢迎大家在评论区提问、交流。

最后,如果本篇文章对你有所启发的话,也希望可以多多支持作者,谢谢大家!

相关文章
|
网络协议 Linux 数据安全/隐私保护
|
7月前
|
人工智能 物联网 Android开发
【04】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-自定义一个设置输入小部件组件-完成所有设置setting相关的页面-优雅草卓伊凡
【04】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-自定义一个设置输入小部件组件-完成所有设置setting相关的页面-优雅草卓伊凡
385 92
|
机器学习/深度学习 人工智能 机器人
计算机视觉技术介绍
【10月更文挑战第14天】 计算机视觉技术介绍
|
9月前
|
数据采集 Web App开发 API
FastAPI与Selenium:打造高效的Web数据抓取服务 —— 采集Pixabay中的图片及相关信息
本文介绍了如何使用FastAPI和Selenium搭建RESTful接口,访问免版权图片网站Pixabay并采集图片及其描述信息。通过配置代理IP、User-Agent和Cookie,提高爬虫的稳定性和防封禁能力。环境依赖包括FastAPI、Uvicorn和Selenium等库。代码示例展示了完整的实现过程,涵盖代理设置、浏览器模拟及数据提取,并提供了详细的中文注释。适用于需要高效、稳定的Web数据抓取服务的开发者。
488 15
FastAPI与Selenium:打造高效的Web数据抓取服务 —— 采集Pixabay中的图片及相关信息
|
11月前
|
SQL DataWorks 数据可视化
阿里云DataWorks评测:大数据开发治理平台的卓越表现
阿里云DataWorks是一款集数据集成、开发、分析与管理于一体的大数据平台,支持多种数据源无缝整合,提供可视化ETL工具和灵活的任务调度机制。其内置的安全体系和丰富的插件生态,确保了数据处理的高效性和安全性。通过实际测试,DataWorks展现了强大的计算能力和稳定性,适用于中小企业快速搭建稳定高效的BI系统。未来,DataWorks将继续优化功能,降低使用门槛,并推出更多灵活的定价方案,助力企业实现数据价值最大化。
|
机器学习/深度学习 数据采集 索引
探索数据的维度:多元线性回归在实际应用中的威力
探索数据的维度:多元线性回归在实际应用中的威力
|
人工智能 调度
面向生物医药的混合云算力调度平台
通过核心技术能力调度云平台公开的低折扣资源(Spot实例),同时保障业务运行过程中所使用的云资源和业务的高峰低谷量保持一致,不多花一分冤枉钱。
453 1
|
前端开发 JavaScript 测试技术
jmeter--录制请求
jmeter--录制请求
|
存储 分布式计算 Hadoop
云计算与大数据实验二 Hadoop的安装和集群的搭建
云计算与大数据实验二 Hadoop的安装和集群的搭建
836 0
|
人工智能 vr&ar UED
AI-Generated Metaverse, AIGM
AI-Generated Metaverse,简称 AIGM,是指由人工智能生成的元宇宙。元宇宙是一个虚拟的三维空间,由各种虚拟场景和物体组成,用户可以在其中自由地移动和交互。AIGM 则更进一步,利用人工智能技术自动生成元宇宙中的虚拟场景和物体,极大地丰富了元宇宙的内容,提高了用户体验。
623 2