程序的环境

news2024/7/6 19:58:51

文章目录

    • @[TOC](文章目录)
  • 前言
  • 一、程序环境分类
  • 二、翻译环境
    • 1.总体流程
    • 2.编译
      • 2.1预编译
      • 2.2编译
      • 2.3汇编
    • 3.链接
  • 三、运行环境
  • 总结

前言

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

一、程序环境分类

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

总结

以上就是今天要讲的内容,本文介绍了程序的环境,主要对程序的翻译环境进行了了解。
本文作者目前也是正在学习编程方面的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出也欢迎大家在评论区提问、交流。
最后,如果本篇文章对你有所启发的话,也希望可以多多支持作者,谢谢大家!

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

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

相关文章

Java常用设计模式

前言 设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结&#xff0c;其中最出名的当属 Gang of Four (GoF)的分类了&#xff0c;他们将设计模式分类为 23 种经典的模式&#xff0c;根据用途我们又可以分为三大类&#xff0c;分别为创建型模式、结构型模式和行为型模…

物联网漏洞利用整体情况

物联网 威胁分析漏洞篇物联网威胁分析—漏洞篇 引言 本章将从漏洞利用角度对物联网威胁进行分析。首先&#xff0c;我们分析了 NVD和 Exploit-DB中的物联网 年度漏洞及利用 1 变化趋势&#xff1b;之后统计了绿盟威胁捕获系统捕获到的物联网漏洞利用的整体情况&#xff1b;最…

【算法笔记(五)】排序算法

算法笔记(五) 排序算法算法笔记(五)前言一、冒泡排序1.什么是冒泡排序2.实际需求3.代码实现二、选择排序1.什么是选择排序2.需求规则三.插入排序1.了解插入排序2.需求规则3.代码实现四.希尔排序1.什么是希尔排序2.需求规则3.代码实现五.快速排序1.什么是快速排序2.需求规则3.代…

静态代理和动态代理

静态代理和动态代理代理模式代理模式的主要优缺点&#xff1a;优点&#xff1a;缺点&#xff1a;代理模式的编写要点静态代理实现步骤静态代理方式的弊端动态代理:动态代理的实现步骤:代理模式 代理模式的定义&#xff1a;由于某些原因需要给某对象提供一个代理以控制对该对象的…

Javascript 基础知识学习

Javascript 基础知识学习 参考自&#xff1a;https://www.w3cschool.cn/javascript/ javascript 简介 JavaScript 是互联网上最流行的脚本语言&#xff0c;这门语言可用于 HTML 和 web&#xff0c;更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。 JavaScri…

计算流体力学的基本方法简介(有限差分法、有限元法、有限体积法)

1、有限差分法&#xff1a; 原理&#xff0c;用差商代替微商&#xff1b; 优缺点&#xff1a; 2、有限元方法&#xff1a; 有限元剖分方法&#xff1a; 特点&#xff1a; 3、有限体积法&#xff1a; 两种方式&#xff0c;格心格式和格点格式&#xff1a; 特点&#xff1a;

基于html的美食网站——速水果介绍8页(HTML+CSS+JavaScript) 带论文

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 家精彩专栏推荐 美食网页介绍 | 甜品蛋糕 | 地方美食小吃文化 | 餐饮文化 | 等网站的设计与制作 | 美食主题网站 | HTML期末大学生网页设计作业 HTML&…

SpringCloud全系列知识(1)——初识微服务和注册中心

SpringCloud(微服务)相关笔记 一 基础框架图 1.微服务技术栈 2.技术栈分类 二 认识微服务 1.单体架构 将业务功能集中在一个项目中&#xff0c;打成一个包部署。 优点&#xff1a;架构简单&#xff0c;部署成本低。 缺点&#xff1a;耦合度高 2.分布式架构 根据业务功能…

最具影响力的15颗国外开放数据气象卫星介绍

1.热带降雨测量任务(TRMM) TRMM 是 NASA 和日本宇宙航空研究开发机构 (以前称日本国家空间发展署) 的合作项目&#xff0c;是 NASA 地球科学计划中的航天任务。日本提供运载火箭和测雨雷达&#xff0c;而由 NASA 提供卫星、4台仪器和卫星运行系统。 TRMM 卫星是三轴稳定的&…

深度强化学习中利用Q-Learngin和期望Sarsa算法确定机器人最优策略实战(超详细 附源码)

需要源码和环境搭建请点赞关注收藏后评论区留下QQ~~~ 一、Q-Learning算法 Q-Learning算法中动作值函数Q的更新方向是最优动作值函数q&#xff0c;而与Agent所遵循的行为策略无关&#xff0c;在评估动作值函数Q时&#xff0c;更新目标为最优动作值函数q的直接近似&#xff0c;故…

深入理解java虚拟机:虚拟机类加载机制(2)

文章目录3.类加载器3.1 类与类加载器3.2 双亲委派模型3.3 破坏双亲委派模型3.类加载器 虚拟机设计团队把类加载阶段中的通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到Java虚拟机外部去实现&#xff0c;以便让应用程序自己决定如何去获取所需要的类。实现这个…

【密码学篇】数字签名基础知识(无保密性)

【密码学篇】数字签名基础知识&#xff08;无保密性&#xff09; 数字签名主要用于确认数据的完整性、签名者身份的真实性和签名行为的不可否认性等。—【蘇小沐】 文章目录【密码学篇】数字签名基础知识&#xff08;无保密性&#xff09;1.数字签名定义2.数字签名原理3.数字签…

Apache-DBUtils实现CRUD操作

Apache-DBUtils实现CRUD操作 每博一文案 有人说&#xff0c;不要轻易去伤害任何一个人&#xff0c;因为你会因此而受伤。欠的债&#xff0c;躲不掉&#xff0c;总是要还的。 要知道&#xff0c;哪些能被你欺骗的人&#xff0c;都是无条件相信你的人&#xff0c;因为心里有你&a…

【LeetCode-中等】240. 搜索二维矩阵 II(详解)

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/…

ROS之话题通信自定义msg

文章目录背景自定义msg例子1.定义msg文件2.编辑配置文件3.编译话题通信自定义msg调用A(C)0.vscode 配置1.发布方2.订阅方3.配置 CMakeLists.txt4.执行背景 在 ROS 通信协议中&#xff0c;数据载体是一个较为重要组成部分&#xff0c;ROS 中通过 std_msgs 封装了一些原生的数据…

【软考软件评测师】第三十三章 数据库系统应用

【软考软件评测师】第三十三章 数据库系统应用 【软考软件评测师】第三十三章 数据库系统应用【软考软件评测师】第三十三章 数据库系统应用第一部分 知识点集锦1.关系数据库候选码2.自然连接3.元祖关系1&#xff09;1对多关系2&#xff09;多对多关系3&#xff09;复合属性4&a…

Centos8界面语言怎么设置? Centos用户界面语言的设置方法

Centos8怎么给用户设置界面语言&#xff1f;想要设置界面语言&#xff0c;该怎么设置呢&#xff1f;下面我们就来看看详细的教程。 1、Gnome桌面环境下&#xff0c;在桌面空白处右键选择【设置】。 2、在【设置】中点【详细信息】。 3、之后点【用户】。 4、首先单击选中要设置…

ADS原理图到Layout,Layout更新原理图

RF Design-22 目录方法1&#xff1a;自动生成Generate/update Layout将理想元件转换为带footprint的元件统一修改元件参数生成Layout添加传输线&#xff0c;T节由Layout更新原理图Ground pouring覆铜设置地过孔方法2&#xff1a;place components from schem to Layout将原理图…

一种无需调查船上坞的调查设备安装测量方法和安装测量系统

本文来自于博主发明专利的技术交底。 大型科考船船底安装大型的精密测量设备&#xff0c;对安装的测量精度要求比较高&#xff0c;通过上坞&#xff0c;采用传统的测量方式&#xff0c;先做控制网&#xff0c;然后进行碎步测量&#xff0c;得到测量设备及其室内附属设备与船舶的…

Spring Cloud Ribbon面试题大全

Spring Cloud Ribbon面试题大全 目录 文档索引 面试题汇总 Q&#xff1a;Ribbon的总体流程&#xff1f; Q&#xff1a;Ribbon如何选择调用哪个实例&#xff1f; Q&#xff1a;服务列表的获取过程&#xff1f; Q&#xff1a;Ribbon如何避免调用失效实例&#xff1f; Q&am…