程序运行只是单单的编译吗?一文让你深入理解程序运行的过程

news2024/10/6 12:20:25

 前言:

      写了这么长时间的c语言代码,我们都没有想过为什么要写头文件吗,而程序执行的过程又是如何呢?只有编译吗 ?要知道机器只能读懂二进制但我们所写的代码编译器是如何读懂的呢?这一篇文章看后一定能解决以上问题同时能够让你深入的理解程序执行的过程。^ _ ^

 💞 💞    欢迎来到小马学习代码博客!!!!

目录

一、程序执行的过程:

1.1前提准备:

1.2 程序执行过程图:

二、编译器的几个阶段:

2.1编译器阶段的过程图:

2.2通过一个代码分析:

2.3预处理阶段:

2.4编译阶段:

2.5汇编过程:

2.6程序的链接:

总结:


 

一、程序执行的过程:

1.1前提准备:

    为了更好的演示过程这里我没有用Xcode同时也用不了VS2019,因为这样的编译器无法观察编译的具体过程,这里我用的是gcc编译器能够更好的演示在程序运行过程中的每一个过程!!!

1.2 程序执行过程图:

1.2.1    在一个项目中会有不同的.c 文件的形成就好比我上一次写的一个通讯录程序就是有两个.c文件一个.h文件来完成的一个通讯录而.c文件就是程序的源文件他在编译的操作下变成了目标文件,而又通过链接器把我们的目标文件和链接库合并成一个可执行的程序。而编译器是如何将源文件变成目标文件呢?如下图 ☟☟☟☟☟

二、编译器的几个阶段:

2.1编译器阶段的过程图:

 2.1.1在程序执行过程中我们从上面图可以知道编译本身也是分为几个阶段来进行的:预编译阶段,编译阶段,汇编阶段。而每个阶段都有自己相应的功能接下来我来通过gcc来演示不同阶段的功能实现!!!

2.2通过一个代码分析:

#include "text.hpp"
#define M 100
#include <stdio.h>
int g_val=2022;
int add(int x,int y)
{
    return x+y;
}
//这是一个注释为了方便观察预处理
int main()
{
    int m =M;
    int arr[]={1,2,3,4,5,6,7,8,9,10};
    int i=0;
    for(i=0;i<10;i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
    printf("%d ",g_val);
    return 0;
}

2.3预处理阶段:

2.3.1这是在gcc 编译器下我来演示的 gcc test.c -E -o test.i 这个命令是使test.c文件只执行到预处理阶段而就结束了,我们发现就出现一个test.i文件

 我们通过vim编译器进去观察一下 

对比没有预处理前的代码:

    对比发现在预处理阶段前面多了800多行代码(这里不好展示小马就省略展示了^ _ ^)他就是头文件的展开,同时发想define定义符号的替换删除定义符号(m定义为M发现在预处理阶段变成100了),同时我们的注释在预处理阶段也没有了。

这里我么可以总结一下

在预处理阶段完成了:《头文件的展开》《define定义符号的替换删除定义的符号》《注释删除》。

2.4编译阶段:

2.4.1gcc test.i -S这个指令是将test.i文件完成编译阶段就停止,同时生成一个test.s文件

进行保存翻译过程的信息。

我们在此通过vim编译器进行观察👀 

 我们发现我们写的代码已经被翻译成了汇编语言(这里我也只是为了方便只是展示了一部分^ _ ^)这里编译器经过了:语法分析、词法分析、语义分析、和符号汇总四个过程将我们的代码编程汇编语言,这个过程并不是简单的。而符号汇总是把全局变量的符号进行汇总起来,为了下面的过程提供帮助。

2.5汇编过程:

2.5.1 gcc test.s -c这个命令将test.s 文件进行汇编同时生成一个test.o文件,就是把test.s汇编文件转化为机器能够读懂的二进制文件!!

我们通过vim编译器进行观察test.o文件 :

 这里我们已经变成我们看不懂的二进制语言了(小马也看不懂二进制哈哈哈👀)这里编译器将我们的汇编语言变成机器能读懂的二进制语言,同时生成符号表(就是给我们的函数和全局变量生成地址方便链接的时候进行查找)

编译器通过这三个过程把我们的test.c文件变成了机器能读懂的test.o文件,最后通过链接器变成一个可执行的程序。

2.6程序的链接:

 2.6.1gcc test.o命令就是将test.o文件中的符号表进行链接起来,最后生成一个可执行的a.out文件!!!

我们编译一下a.out文件 

 链接的作用:合成段表同时将符号表进行合成和重定位 最后形成了我们形成一个可以执行的程序。

总结:

         通过我们的一步步演示,在看我们前言所提问的问题就能过很容的进行解决啦,一个程序的执行,并不是一个简单的编程这么简单,他是通过预处理,编译,汇编最后链接这几个步骤才形成一个可执行的程序,而四个步骤每一个步骤都是至关重要的也是缺一不少了,我们通过简单的了解他的执行过程能过让我们深入的理解程序的执行过程,对以后的问题就能够有更深的理解啦^ _ ^

        最后小马码文不易,如果觉得有帮助就多多支持哈!!!^ _ ^

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

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

相关文章

数据结构之Trie树

Trie树&#xff1a; Tire树可以较为高效的存储和查找字符串集合。 存储方式&#xff1a; 首先Trie有一个根节点&#xff0c;我们按从前往后的顺序将字符串的每个位置上的字符存储到树的每一层中&#xff0c;这样我们存储多个字符串时就可以消除一部分冗余&#xff0c;在查询字…

期货开户后需要银期转账绑定

一、期货公司正规性 如何判断期货公司是否正规&#xff1f; 1、 中国证监会官网有公布所有正规期货公司&#xff08;一共150家&#xff09;名录的&#xff0c;我们可以直接参考证监会发布链接&#xff1a;期货公司名录 2、如果你懒得从名录中一个个找&#xff0c;也可以直接…

一款不错的SpringCloud 脚手架项目

文章目录 I 一款不错的SpringCloud 脚手架项目1.1 项目概述1.2 本地启动II. Swagger RESTful 风格的 Web 服务框架2.1 组成部分2.2 springfoxIII 相关辅助脚本3.1 pod 辅助脚本3.2 git 辅助脚本I 一款不错的SpringCloud 脚手架项目 1.1 项目概述 springboot+springcloud注册中心…

基于SpringBoot的电子招标投标管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;HTML、Vue 数据库&#xff1a;MySQL5.7 数据库管理工具&#xff1a;Navicat 12 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否…

Android BottomSheetDialogFragment 使用详解,设置圆角、固定高度、默认全屏等

转载请标明出处&#xff1a;http://blog.csdn.net/zhaoyanjun6/article/details/127967304 本文出自【赵彦军的博客】 文章目录效果BottomSheetBottomSheetDialogBottomSheetDialogFragment圆角效果去掉背景蒙版设置蒙版透明度点击 dialog 外部区域&#xff0c;dialog 不消失禁…

STC51单片机37——定时器流水灯

// 12MHz晶振 #include "reg52.h" #include "intrins.h" #define time (65536-50000) // 单次定时50ms unsigned char cn; unsigned char temp; unsigned char dir; void main(void) { cn20; //20*50ms1s temp0x80; dir0; TMOD 0x…

Vue简单示例——weex

weex的生命周期&#xff1a; 因为我们的Weex和Vue是绑定在一起的&#xff0c;所以我们讨论关于生命周期时&#xff0c;说的实际上是在Weex中可以使用的Vuex的生命周期&#xff0c;也就是Weex对于Vue生命周期的支持&#xff0c;好消息&#xff0c;Weex支持大部分的Vue中的生命周…

基于Vue+ElementUI+MySQL+Express的学生管理系统(3)

3.搭建学生考试信息的前端页面 1.在E:\vue\shiyan9目录下用cmd打开命令窗口。输入命令vue init webpack score-manage&#xff0c;创建一个基于webpack模板的项目。 图15 创建一个新的vue的脚手架的项目 2.执行cd score-manage&#xff0c;进入目录包下。下载依赖包。命令如下…

Pytorch 图像增强 实现翻转裁剪色调等 附代码(全)

目录前言1. 裁剪1.1 中心裁剪1.2 随机裁剪1.3 随机尺寸裁剪2. 翻转2.1 水平翻转2.2 垂直翻转2.3 随机旋转3. 色调3.1 灰度变换3.2 色彩抖动3.3 随机翻转颜色3.4 随机调整锐度3.5 高斯模糊4. 边缘填充5. 仿射变换前言 下文中有使用到plt&#xff0c;不懂的可看我这篇文章&#…

doker中的Jenkins容器配置github

1、在Jenkins插件 管理中下载github plugin和ssh和git插件 2、在Jenkins->系统管理->系统配置->github下配置凭据认证&#xff0c;添加凭证页面类型选择secret text 3、添加凭证页面secret栏输入githu token&#xff0c;其他任意输入 4、github token获取&#xf…

FANUC机器人零点复归的报警原因分析和零点标定相关步骤

FANUC机器人零点复归的报警原因分析和零点标定相关步骤 FANUC机器人零点复归时需要将机器人的机械信息与位置信息同步,来定义机器人的物理位置。 机器人通过闭环伺服系统来控制机器人各运动轴,当用户通过示教器点动机器人时,经过主板分析此命令后,带动电机旋转,电机上的SP…

软件测试入门概念

满足用户期望或正式规定文档&#xff08;合同、标准、规范&#xff09;所具有的条件和权能&#xff0c;包含用户需求和软件需求。 用户需求&#xff1a; 五花八门的用户需求&#xff0c;该需求比较简略。 软件需求&#xff1a; 又叫功能需求&#xff0c;该需求会详细描述开发…

SLAM本质剖析-Boost之Geometry函数大全(二)

4. 点云处理 4.1 add_point 将一个点添加到另一个点 4.2 add_value 将相同的值添加到点的每个坐标 4.3 assign_point 用另一个点指定一个点 4.4 assign_value 为点的每个坐标指定相同的值 4.5 cross_product 计算两个向量的叉积 4.7 divide_point 将一点除以另一点…

Python用27行代码绘制一幅满天星

前言 大家早好、午好、晚好吖 ❤ ~ 每一个孩子都像星空中的一颗星星&#xff0c;散发着自己所特有的光芒照亮着整个夜空。 今天就带大家用27行Python代码绘制一幅满天星吧。 全局设置 在绘制满天星的过程中要运用到turtle工具&#xff0c;它是Python的标准库&#xff0c;也可…

堆排序+TOPK问题

文章目录一.堆排序1.使用向上还是向下调整建堆好&#xff1f;(1)向上调整算法建堆的时间复杂度1. 完整过程(2)向下调整算法建堆的时间复杂度1.完整过程(3)总结2. 排升序(1) 建小堆(2) 建大堆3. 堆排序时间复杂度统计4.完整代码二 、 TOPK问题1. 概念2.两种方法第一种缺陷第二种…

【论文阅读】(2017)The late acceptance Hill-Climbing heuristic

文章目录一、摘要二、Late Acceptance Hill Climbing三、LAHC技术性能的研究3.1 Benchmark problems3.2 Experimental software3.3 Experiments四、LAHC性能评估4.1 评估方法4.2 LAHC不同变体的性能4.3 LAHC与其他技术的比较4.4 LAHC的规模独立性五、Conclusions and future wo…

Salesforce架构师常见问题(上)

Salesforce架构师需要花费大量时间来绘制、讨论、建立和设计稳健的端到端解决方案。架构师角色不仅仅是处理解决方案这么简单&#xff0c;还需要在企业级组织中与多个业务部门打交道。 因此&#xff0c;Salesforce架构师面试需要从以下3个方面准备&#xff1a; Part.1 分享工…

快速理解 JVM 内存模型 对象组成 对象内存分配

快速理解 JVM 内存模型 & 对象组成 & 对象内存分配 JVM 内存模型 JVM 内存模型分为首先在线程纬度可以分为两部分 一部分是 线程共享&#xff1a; 堆、元空间 堆 &#xff1a; 大多数 new 的对象都存在于堆内&#xff0c;也是 GC 主要回收的空间&#xff0c;占据 J…

涨薪跳槽利器,清华大咖总结的 Java 核心突击讲,一应俱全

前言 今天在这里分享一位读者粉丝的经历&#xff1a; 本人双非本科&#xff0c;没拿什么过奖&#xff0c;现在毕业也有三年时间了&#xff0c;大四感觉能力有点不足&#xff0c;进了一家小型的互联网公司实习&#xff1b;期间报名了个线上培训课程&#xff0c;一直在持续学习…

超详细Docker部署SpringBoot+Vue项目(三更博客项目部署)

文章目录1.项目部署规划2.前置工作2.1修改后端配置文件ip2.2修改前端Vue项目运行端口2.3修改前端对应的服务器ip2.4后端项目打包2.4.1解决打包问题2.4.2项目打包&#xff0c;本地运行jar包测试2.5前端项目打包2.6开放端口2.7配置安全组规则3.Docker安装4.拉取镜像5.编写Dockerf…