C语言----程序环境

news2024/11/25 15:25:57

目录

前言:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1093236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读书笔记——C++高性能编程(六)

第六章.并发和性能 阿姆达尔定律 介绍了阿姆达尔定律&#xff08;Amdahls Law&#xff09;&#xff0c;这个定律的意义是“系统中对某一部件采用更快执行方式所能获得的系统性能改进程度&#xff0c;取决于这种执行方式被使用的频率”。具体的公式如下&#xff1a; 其中s0是程…

基于CodeFormer使用C++实现图片模糊变清晰,去除马赛克等效果

前言 CodeFormer是一种基于AI技术深度学习的人脸复原模型&#xff0c;由南洋理工大学和商汤科技联合研究中心联合开发。该模型通过结合了VQGAN和Transformer等技术&#xff0c;可以通过提供模糊或马赛克图像来生成清晰的原始图像。可以实现老照片修复、照片马赛克修复、黑白照…

深入浅出ThreadPoolExecutor(一)

文章目录 线程池简诉ThreadPoolExecutor详解ThreadPoolExecutor参数详解创建线程池的工具类Executors 线程池简诉 针对各种池子,比如 连接池:用于管理和重复使用数据库连接&#xff0c;避免频繁创建和销毁数据库连接带来的性能开销。对象池&#xff1a;用于管理和重复使用对象…

中国雪深长时间序列数据集(1979-2020)

简介 中国雪深长时间序列数据集&#xff08;1979-2020&#xff09;提供1979年1月1日到2020年12月31日逐日的中国范围的积雪厚度分布数据&#xff0c;其空间分辨率为25km&#xff0c;是“中国雪深长时间序列数据集&#xff08;1978-2012&#xff09;”的升级版本。前言 – 人工…

5.Python-使用XMLHttpRequest对象来发送Ajax请求

题记 使用XMLHttpRequest对象来发送Ajax请求&#xff0c;以下是一个简单的实例和操作过程。 安装flask模块 pip install flask 安装mysql.connector模块 pip install mysql-connector-python 编写app.py文件 app.py文件如下&#xff1a; from flask import Flask, reque…

Docker逃逸---授权 SYS_ADMIN Capability逃逸原理浅析

目录 一、产生原因 二、利用条件 三、复现过程 1、容器内挂载宿主机cgroup 2、设置notify_no_release并寻找容器在宿主机上的存储路径 3、将恶意脚本写入release_agent 一、产生原因 给容器额外授权了SYS_ADMIN Cap&#xff0c;并且容器以root权限运行&#xff0c;攻击者…

HUAWEI(26)——防火墙双机热备

一、拓扑 二、需求 PC2 ping PC1 FW1与FW2双机热备,FW1为active,FW2为Standby,抢占延时1s VRRP 三、配置 1.IP地址,防火墙接口加入区域 防火墙用户名:admin 防火墙旧密码:Admin@123 防火墙新密码:admin@123 [FW1]interface GigabitEthernet 1/0/0 [FW1-GigabitEthe…

【计算机毕业设计】python在线课程培训学习考试系统637r7-PyCharm项目

使用说明 使用Navicat或者其它工具&#xff0c;在mysql中创建对应名称的数据库&#xff0c;并导入项目的sql文件&#xff1b; 使用PyCharm 导入项目&#xff0c;修改配置&#xff0c;运行项目&#xff1b; 将项目中config.ini配置文件中的数据库配置改为自己的配置&#xff0c;…

CSS 滚动驱动动画 animation-range

animation-range 语法 normallength-percentagetimeline-range-name 具名时间线范围 named timeline rangecovercontainentry 和 entry-crossingexit 和 exit-crossing 兼容性 animation-range 这个属性可同时对 scroll progress timeline 和 view progress timeline 这两种不…

机器学习笔记 - 使用3D卷积神经网络进行视频分类

1、导入相应的库 3D CNN 使用三维滤波器来执行卷积。内核能够在三个方向上滑动,而在 2D CNN 中它可以在二维上滑动。 首先安装并导入必要的库,用于处理ZIP文件内容的Remotezip 、用于使用进度条的tqdm 、用于处理视频文件的OpenCV 、用于执行更复杂的张量操作的einop…

计算机的总线

文章目录 前言一、总线的概述1.总线的概述&#xff08;是什么、什么用&#xff09;2.总线的分类2.1 片内总线2.2 系统总线2.2.1 数据总线2.2.2 地址总线2.2.3 控制总线 二、总线的仲裁1.为什么需要总线仲裁2.总线仲裁的方法2.1 链式查询2.2 计时器定时查询2.3 独立请求 总结 前…

激发创意,打造震撼视觉效果——Adobe After Effects 2024(Ae2024)全新来袭!

想要创造独特的、令人惊叹的视觉效果吗&#xff1f;不要犹豫&#xff0c;现在就升级到全新的Adobe After Effects 2024&#xff08;Ae2024&#xff09;&#xff01;作为业界领先的动态图形和视觉效果软件&#xff0c;Ae2024将为您的创作带来前所未有的火花。 Ae2024拥有强大的…

Android 音频可视化

Android音频可视化&#xff0c;指的是将音频的频率绘制到屏幕上&#xff0c;达到一种视觉效果&#xff0c;使播放或录制过程更加生动形象。 在Android进行视频可视化涉及的三个主要知识点,其中比较难以理解的傅里叶变换公式。 Android原生的Visualizer使用&#xff08;获取频…

someip 入门

什么是someip&#xff1f; SomeIP&#xff08;Scalable Service-Oriented MiddlewarE over IP&#xff09;是一种基于以太网的通信协议&#xff0c;用于汽车领域的通信。它允许不同的汽车电子控制单元&#xff08;ECUs&#xff09;之间通过网络进行通信&#xff0c;以便在车辆内…

网站的搭建与应用|企业APP软件定制开发|小程序

网站的搭建与应用|企业APP软件定制开发|小程序 网站是一种数字化媒体&#xff0c;它可以将我们的信息传递给全球的用户&#xff0c;让更多的人了解我们、了解我们的产品和服务。那么&#xff0c;如何搭建一个网站呢&#xff1f;下面&#xff0c;我将为大家介绍一下网站的建设步…

JavaScript 通过数组对JSON key字段进行排序

这里我以vue为例 不过json排序用的js方式 任何前端项目都可以通过js完成 我们组件代码现在是这样的 <template><div><div v-for "item in navCateList" :key "item.id">{{ item.name }}</div></div> </template>&…

【电源专题】电源芯片手册中的NVDC(narrow voltage DC)功能和电池充电曲线详解

在查看一些充电芯片的规格书时,会发现有一个NVDC功能。其中NVDC的全称是narrow voltage DC ,直译过来是窄电压DC电源架构。此外在规格书里还会发现NVDC Power Path Management字样,也就浊NVDC电源路径管理。 那么什么是NVDC电源路径管理? 如下所示当VIN有输入时(如适配器U…

【LeetCode】剑指 Offer Ⅱ 第7章:队列(6道题) -- Java Version

题库链接&#xff1a;https://leetcode.cn/problem-list/e8X3pBZi/ 类型题目解决方案滑动窗口剑指 Offer II 041. 滑动窗口的平均值队列&#xff1a;滑动窗口 ⭐剑指 Offer II 042. 最近请求次数队列&#xff1a;滑动窗口 ⭐二叉树宽搜剑指 Offer II 043. 在完全二叉树中添加节…

【软件设计师-从小白到大牛】上午题基础篇:第七章 程序设计语言与语言处理程序基础

文章目录 前言章节提要一、编译过程真题链接解释器与编译器特点与区别真题链接 二、文法的定义以及语法推导树真题链接 三、有限自动机与正规式四、表达式真题链接 五、函数调用&#xff08;传值与传址&#xff09;传值调用与传址调用真题链接 六、各种程序语言的特点真题链接 …

ubuntu下yolov7 tensorrt模型部署

文章目录 ubuntu下yolov7 tensorrt模型部署一、Ubuntu18.04环境配置1.1 安装工具链和opencv1.2 安装Nvidia相关库1.2.1 安装Nvidia显卡驱动1.2.2 安装 cuda11.31.2.3 安装 cudnn8.21.2.4 下载 tensorrt8.4.2.41.2.5 下载仓库TensorRT-Alpha并设置 二、从yolov7源码中导出onnx文…