简单剖析程序的翻译过程!

news2024/11/26 2:31:05

本文旨在讲解一段源程序如何翻译成机器所能识别的二进制的命令的,希望通过本文,能使读者对一段程序的翻译过程有进一步的认识!


这里首先要介绍的是一段程序从编写完成到执行需要经过以下几个步骤!

1.预处理

首先讲到的是预处理!预处理在整段翻译的过程中主要有着以下几种功能!

1.1头文件的展开

1.2宏替换

1.3去掉注释

1.4条件编译

下面我将通过简单的代码进行对预处理阶段所做的事情做出证明!

下图为linux环境下的代码,有兴趣的小伙伴也可以自己下来试试看看!

通过本图,小伙伴们可以发现原来注释的代码在经过预处理之后就没有了,并且在进行编译之后由以前的十几行代码直接增加到了八百多行!这是因为预处理将头文件展开了,所以代码行数也自然就增加了!还有最后打印的Max的时候,经过预处理之后被替换掉了!!!还有一点条件编译没有展现出来,那么通过以下代码就可以来看出预处理也对条件编译做出了相应的处理!

        

通过以上代码我们可以看出,当进行预处理的时候,编译器也会对条件编译进行优化!对于条件编译,它实现了动态切割代码的功能!正如我们日常使用的好多软件,都分为会员版与免费普通版,那么对于程序员来说,如果维护这几种不同版本

的代码,那么代价肯定是非常大的!所以条件编译就起到了作用!仅仅就需要维护一份代码就可以满足需求!

至此,预处理阶段的工作简单介绍到这里!


2.编译

现在就来介绍编译的功能!

编译的功能就是将源代码转化为汇编语言的代码!

通过下图我们可以看出编译阶段所做的事情!

虽然我们可能没有学习过汇编代码,但是通过右图的风格,我们不难看出,编译阶段将c代码转化为了汇编代码!

编译的作用就是将c代码转化为了汇编代码!

3.汇编

汇编的作用是将汇编代码转化为可重定位的二进制文件!

下图为可重定位的概念!

通过下图我们可以看出这里汇编的作用确实是将汇编代码转化为了二进制文件!

可以看出经过汇编之后,汇编代码就变成了二进制的文件!只能通过二进制的格式进行读取!

4.链接

最后要将的链接就是结合以上过程,最终形成我们日常看见的.exe后缀文件!


至此,通过上文,已经将程序的翻译过程简单了介绍!

下面我来为大家为大家补充如何使用指令来进行证明这些过程!

//


gcc -E test.c  -o code.i;

gcc -S code.i  -o code.s ;


gcc -c code.s -o code.o;

下面来介绍其中代码的含义!

其中 -E 操作,是仅仅进行预处理操作!当预处理结束之后,就停止, -o code.i  的作用是生成一个.i后缀的文件!其中.i 通常是经过预处理之后的后缀标志!

-S 操作是进行编译操作!  此时可以直接使用code.i文件进行编译!当然使用test.c 文件也是没有问题!

-c 操作是进行汇编操作!生成目标文件!


至此,本文对程序的翻译过程介绍结束,希望读者能有所收获!也欢迎大家评论区多多讨论!

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

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

相关文章

十八章总结

一.Swing概述 二.Swing常用窗体 1.JFrame窗体 创建一个不可见、具有标题的窗体,关键代码: JFrame jfnew JFrame("登陆系统"); Container containerjf.getContentPane(); 删除容器中的按钮,关键代码: container.remo…

Ubuntu22.04配置Go环境

Ubuntu上配置Go环境biCentOS简单多了,有两种方案,一种直接使用apt进行安装,一种自己从官网下载安装包进行安装。 1、使用apt直接安装 更新apt安装包,常规操作 apt update 然后看看apt自带的Go版本是多少 apt list golang 是1…

【C++】复杂的多继承及其缺陷(菱形继承)

本篇要分享的内容是C中多继承的缺陷:菱形继承。 以下为本篇目录 目录 1.多继承的缺陷与解决方法 2.虚继承的底层原理 3.虚继承底层原理的设计原因 1.多继承的缺陷与解决方法 首先观察下面的图片判断它是否为多继承 这实际上是一个单继承,单继承的特…

对象序列化

介绍 作用:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化。 使用到的流是对象字节输出流:ObjectOutputStream。 ObjectOutputStream序列化方法 序列化对象的要求是对象必须实现序列化接口。 示例&#xff1…

面试算法常考题之-------逆波兰式合集

逆波兰式背景介绍 逆波兰式是一种特殊的数学表达式表示法,它的诞生背景可以追溯到20世纪30年代。当时,波兰数学家Jan Wjtowicz和Wacław Sierpiński提出了一种新的数学表达式表示法,这种表示法将运算符放在操作数之后,而不是传统…

Stable Diffusion webui 源码调试(二)

Stable Diffusion webui 源码调试(二) 个人模型主页:LibLibai stable-diffusion-webui 版本:v1.4.1 内容更新随机,看心情调试代码~ 分析StableDiffusionProcessingTxt2Img类中的sample函数 Sampler /work/stable-d…

xxx升学助考网登录参数跟栈分析

逆向参数分析: 思路: ​ 如果参数出现的次数比较少,完全可以使用全局搜索 ​ 如果参数出现比较多,建议使用跟栈 网站: 下面运行结果 import base64 # 解密 result base64.b64decode(aHR0cHM6Ly93ZWIuZXd0MzYwLm…

【经验模态分解】3.EMD模态分解算法设计与准备工作

/*** poject 经验模态分解及其衍生算法的研究及其在语音信号处理中的应用* file EMD模态分解算法设计与准备工作* author jUicE_g2R(qq:3406291309)* * language MATLAB* EDA Base on matlabR2022b* editor Obsidian(黑曜石笔记软…

Day25力扣打卡

打卡记录 寻找旋转排序数组中的最小值(二分) 链接 由于是旋转排序数组,所以整个数组有两部分是递增的,选取右侧最后元素,即可将整个数组分为大于该元素和小于该元素,碰头地段即为最小值。 class Solutio…

Effective C++ 系列和 C++ Core Guidelines 如何选择?

Effective C 系列和 C Core Guidelines 如何选择? 如果一定要二选一,我会选择C Core Guidelines。因为它是开源的,有300多个贡献者,而且还在不断更新,意味着它归纳总结了最新的C实践经验。最近很多小伙伴找我&#xff…

系列二、Shiro的核心组件

一、核心组件 # 1、UsernamePasswordToken 封装了用户的登录信息,使用用户的登录信息来创建Token # 2、SecurityManager Shiro的核心组件,负责安全认证和授权 # 3、Subject Shiro的一个抽象概念,包含了用户信息 # 4、Realm 开发者自定义的模块…

AcWing99. 激光炸弹

题目 地图上有 N N N 个目标,用整数 X i , Y i X_i,Y_i Xi​,Yi​ 表示目标在地图上的位置,每个目标都有一个价值 W i W_i Wi​。 注意:不同目标可能在同一位置。 现在有一种新型的激光炸弹,可以摧毁一个包含 R R RR RR 个…

SpringBoot自动配置的原理篇,剖析自动配置原理;实现自定义启动类!附有代码及截图详细讲解

SpringBoot 自动配置 Condition Condition 是在Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操作 思考:SpringBoot是如何知道要创建哪个Bean的?比如SpringBoot是如何知道要创建RedisTemplate的?…

前端-第一部分-HTML

一.初识HTML 1.1 HTML 简介 HTML 全称为 HyperText Mark-up Language,翻译为超文本标签语言,标签也称作标记或者元素。HTML 是目前网络上应用最为广泛的技术之一,也是构成网页文档的主要基石之一。HTML文本是由 HTML 标签组成的描述性文本&a…

在Rust中使用多线程并发运行代码

1.Rust线程实现理念 在大部分现代操作系统中,已执行程序的代码在一个 进程(process)中运行,操作系统则会负责管理多个进程。在程序内部,也可以拥有多个同时运行的独立部分。这些运行这些独立部分的功能被称为 线程&am…

【js逆向实战】某sakura动漫视频逆向

写在前面 再写一个逆向实战,后面写点爬虫程序来实现一下。 网站简介与逆向目标 经典的一个视频网站,大多数视频网站走的是M3U8协议,就是一个分段传输,其实这里就有两个分支。 通过传统的m3u8协议,我们可以直接进行分…

千万别对女项目经理抱有幻想

大家好,我是老原。 前段时间,有一个粉丝朋友来咨询我一个问题,多少是有点把老原我问蒙圈 现在职场上女PM并不少见,也有很多优秀的女PM。 我也有不少和女PM合作的经历,不得不说,和她们沟通/合作可以说是很…

详解卷积神经网络结构

前言 卷积神经网络是以卷积层为主的深度网路结构,网络结构包括有卷积层、激活层、BN层、池化层、FC层、损失层等。卷积操作是对图像和滤波矩阵做内积(元素相乘再求和)的操作。 1. 卷积层 常见的卷积操作如下: 卷积操作解释图解…

能谈一下 CAS 机制吗

(本文摘自mic老师面试文档) 一个小伙伴私信我,他说遇到了一个关于 CAS 机制的问题,他以为面试官问的是 CAS 实现单点登录。 心想,这个问题我熟啊,然后就按照单点登录的思路去回答,结果面试官一…

Azure - 机器学习:自动化机器学习中计算机视觉任务的超参数

Azure Machine Learning借助对计算机视觉任务的支持,可以控制模型算法和扫描超参数。 这些模型算法和超参数将作为参数空间传入以进行扫描。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济…