《程序员的自我修养》程序实现的两大环境

news2025/1/15 2:29:39

学习内容

翻译环境

预处理

编译

汇编

链接

执行环境


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

1.翻译环境:在这个环境中,源代码被翻译成为可执行的机器指令。

2.执行环境:用于执行实际的代码

VS2022中,我们写好代码之后,Ctrl+F5好像直接出来我们想要的结果,貌似并没有看到这些复

杂的过程。其实是因为VS2022已经被包装的相当完善,为了快捷方便这些步骤几乎是一气呵成。

所以,博主在浅浅地学习了一下Linux操作,为大家展示一下细致的过程。


翻译环境

首先创建一个源文件test.c,写下一个简单的代码:

利用gcc编译器搭配不同的命令选项,可以查看编译期间每一步发生了什么。

预处理

预处理阶段需要完成的操作:

1.头文件的包含

2.注释的删除

3.#define符号的替换

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

cat -n 查看test.i文件,并为每一行编上行号。

test.i文件中,包含852行代码,文件的末尾几行正式我刚刚所写的内容。

那么不难猜到,上面836test.s行代码应该都是包含头文件的内容。

编译

把C语言代码转化为了汇编代码。包含:

1.语法分析

2.词法分析

3.语义分析

4.符号汇总

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

 cat -n 阅读test.stest.s

只展示一部分,这些是C语言被翻译为汇编语言。

汇编

把汇编指令转化为二进制指令,形成符号表。

gcc -c 汇编完成之后就停下来,结果保存在test.o文件中。

ps:  指令ls:展示当前目录下的文件

 readelf -s 阅读二进制文件test.o,并显示符号表中的内容。

虽然可能看不太懂,但是里面依旧有我们熟悉的字眼。

链接

1.合并段表

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

如果是一个含有多文件的程序,每个.c文件都会生成一个自己的符号表,链接的过程就是将这些符号表汇总合并。


执行环境

程序执行的过程:

1.程序必须载入内存中。在有操作系统的环境中,一般由操作系统来完成;在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。

2.程序的执行开始,接着便调用main函数。

3.开始执行程序代码,这个时候程序将进行一个运行时堆栈,存储函数的局部变量和返回值地址。程序同时也可以使用静态内存,存储于静态内存中的变量在程序执行的这个过程一直保留他们的值

4.终止程序。正常终止程序,也有可能是异常终止。

本文参考书籍:《程序员的自我修养》

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

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

相关文章

字符串的读入方式

文章目录1、scanf2、fgets()3、cin4、cin.getline()5、getline()1、scanf scanf只能读入不带空格的字符串,遇到空格则结束。scanf只能读入字符数组,不能读入string。scanf在读入的时候,会自动在字符串的末尾加上’\0’。定义字符数组长度时&…

虚表指针在C++类的继承/多态与重载中的基本逻辑

文章目录前言重载继承虚函数虚函数表动态绑定的实现析构函数构造函数多态子类直接继承父类的方法,不覆盖多重继承纯虚函数前言 C在C语言的基础上增加了类的概念,而类的最关键的特性就是三个: 继承多态重载 这篇文章想接着上两篇C相关的文章…

[附源码]Python计算机毕业设计SSM基于推荐算法的汽车租赁系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java动物爱心救助平台s9dza

首先选择计算机题目的时候先看定什么主题,一般的话都选择当年最热门的话题进行组题,就比如说,今年的热门话题有奥运会,全运会,残运会,或者疫情相关的,这些都是热门话题,所以你就可以…

HTML做一个抗疫逆行者感动人物页面(纯html代码)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

AI公平性研究进展(2022)

最近AI公平性方面出了不少新的研究成果,如有遗漏,欢迎补充↓↓↓↓ 公平性提升 MAAT: A Novel Ensemble Approach to Addressing Fairness and Performance Bugs for Machine Learning Software, FSE, 2022. 利用模型集成的方式获得公平的预测结果&am…

Windows下如何查看某个端口被谁占用

开发时经常遇到端口被占用的情况,这个时候我们就需要找出被占用端口的程序,然后结束它,本文为大家介绍如何查找被占用的端口。 1、打开命令窗口(以管理员身份运行) 开始—->运行—->cmd,或者是 windowR 组合键&#xff0c…

含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

开关电源 - LLC电路的谐振工作模态浅析

LLC电路的谐振工作模态浅析 LLC谐振电路是常用的拓扑,广泛应用在目前的热门应用中,本文主要从典型谐振状态来分析其基本工作过程,后续我们将逐步扩展到其它工作状态。 一、电路工作基本条件及电路组成 图1 电路主要组成部分 如上图1所示&a…

c#入门-运算符

可用运算符 值的运算也是自定义的,但是这个就看不出了。 要么翻源文件,要么翻说明书才知道一个类型能怎么运算。 但是一个默认情况下的类型,是没有定义任何运算符的。 也就是说你适用的运算一定是由人先写出来的,没有系统默认的…

MYSQL的索引事务

文章目录1:索引1.1:概念:1.2 作用:1.3 使用场景:1.4 使用:补充:**2:了解一下B树:****3:了解一下B树**4:为什么使用B树/B树来实现索引2&#xff1a…

通过IP地址如何查到用户真实个人信息

当人们使用服务时,互联网上所有科技巨头公司都会收集大量的数据,他们就是这样发财的。微博知道您的朋友是谁、您 “喜欢” 什么,以及您在新闻源上阅读的内容种类;百度知道您的想法、您想知道什么、以及任何时候的去向;…

[附源码]JAVA毕业设计小区物业管理系统(系统+LW)

[附源码]JAVA毕业设计小区物业管理系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术…

Spring cloud Eureka服务注册中心实战

Spring cloud Eureka服务注册中心一、注册中心二、存在意义三、角色四、运行流程五、入门案例1、创建Spring Cloud 工程2、创建 Eureka 服务pom.xml3、配置 application.yml4、服务间调用方式一:RestTemplate DiscoveryClient方式二:RestTemplate Load…

【Golang】关于slice调用append函数后分配新数组的问题(slice的底层实现)

问题描述 今天在写代码的时候遇到一个很奇怪的现象,先看下面两段代码 func push(a []int, v int) {a[1] 2a append(a, v) } func main() {a : []int{0, 1, 2}push(a, 3)fmt.Println(a) }结果:[0 2 2] func push(a []int, v int) {a append(a, v)a[…

如何看股票l2接口的最佳买卖价位委托明细?

股票l2接口的买卖价位委托明细即买一卖一位置的挂挡情况,挂单可以让用户及时了解交易队列,从而了解完整的开盘情况。用户可以通过观察挂单来判断档位是否有主力资金介入,从而判断开盘时的主力动态,进而把握投资机会。 1.股票l2接…

数据库之insert的使用讲解

1单独插入一条数据: INSERT INTO t1(col1,col2) VALUE(v01,v02); 2插入多条数据 INSERT INTO t1(col1,col2) VALUE(v01,v02),(v03,v04),(v05,v06)...; 3插入查询的数据(查询N条数据插入N条数据,广泛应用&#xf…

微信小程序|使用小程序制作一个足球拼图小游戏

世界杯的意义永远不止是冠军,它是每个精彩的瞬间,是呐喊,是青春。此文用小程序制作一个足球的拼图小游戏,一起为世界杯疯狂吧! 开发步骤一、工具安装二、功能实现1 . 提示图展示2 . 绘制画布内容3 . 打乱方块顺序4 . 移…

模型和视图框架(概念)

MVC(Model-View-Controller)是一种设计模式。 Model(模型)是应用对象,用来显示模型View (视图)是用户界面,用来显示数据Controller(控制)定义用户界面对用户输出的反映方式模型/视图类可以分为上述三组:模型、视图和委…

CPU100%,怎么快速定位?

一台机器,CPU100%,如何找到相关服务,如何定位问题代码,今天简单分享下思路。假设,服务器上部署了若干Java站点服务,以及若干Java微服务,突然收到运维的CPU异常告警。如何定位是哪个服务进程导致…