当前位置: 首页 > news >正文

编译和链接

编译和链接

  • 一:???
  • 二:翻译环境
    • 1:编译
      • 1:预处理
      • 2:编译
    • 2:链接
  • 三:运行环境:

本文章所使用的图片均来在yyds鹏哥

一:???

我们平时使用VS的时候,将写好的代码经调试之后就可以直接达到我们想要的结果,但实际有那么简单吗?
如果你那么想的话,那就大错特错了。
其实我们写好的源代码最先保存在文件中,就好像我们平时用的记事本,这些代码经过一系列变化,最终得到我们想要的结果。
举例:
test.c文件经过翻译环境和运行环境得到了我们最终想要的结果。
在这里插入图片描述

二:翻译环境

我们知道源代码计算机是识别不了的,而源代码经过翻译环境就会变成机器可以执行的二进制指令。
那具体的过程又是什么样的呢?
翻译环境包括编译和链接。
在这里插入图片描述可能有小伙伴看到这里疑惑了,什么是链接库???
链接库就是用来存放一些函数的头文件的,比如我们使用scanf,printf函数的时候,为什么我们可以直接使用,就是因为有链接库的存在。
在这里插入图片描述目标文件以 .o 为后缀是在gcc编译器下,在VS编译器下是以 .obj 为后缀。

1:编译

编译分为三个过程,首先是将以 .c 为后缀的源 (头)文件经过预处理,转变成了以 .i 为后缀的中间文件,
然后 .i后缀的文件经过编译变成了以 .s 为后缀的中间文件, .s为后缀的中间文件经过汇编变成了以 .obj 为后缀的目标文件。

1:预处理

在预处理阶段,源文件和头文件会被处理成以 .i为后缀的中间文件。
下面让我们讨论一下经过预处理后文件发生了哪些变化?
变化:
1:会将源代码中的#define全部删除,并且展开所有的宏定义。
2:处理所有的条件编译指令,如:#if,#ifdef,#elif,#else等;
3:处理#include预编译指令,将它所包含的头文件内容插入到该预编译指令的位置,(可能 .c 文件中会多几百行代码)
4:删除所有的注释;
5:添加行号和文件名标识,方便后续编译器生成调试信息等。
6:保留所有的#pragma的编译器指令.

2:编译

编译就是将预处理后的文件进行一系列的:词法分析,语法分析,语义分析及优化,生成 .s 文件,也叫做汇编代码文件
2.1:词法分析:
将源代码程序输入扫描器,扫描器将进行简单的词法分析,将代码中的字符分割成一系列的记号(关键字,标识符,字面量,特殊符号等)
比如:array[index]=(index+4)*(2+6)
在这里插入图片描述

2.2:语法分析:
使用语法分析器,将对词法分析产生的记号进行语法分析,从产生语法树,这些语法树是以表达式为节点的。
在这里插入图片描述2.3:语义分析:
语义分析是经过语义分析器来完成的,主要在语法分析后进一步分析 ,编译器所能做的分析就是语义的静态分析,静态语义分析 通常包括声明和类型的匹配,类型的转换等。在这个阶段会报告错误的语法信息。在这里插入图片描述### 3:汇编
汇编会生成以 .obj 为后缀的文件。
汇编这一步主要通过汇编器来完成,汇编器可以将预处理,编译,得到的代码变成机器可执行的指令,每一个汇编语句几乎都对应着一条机器指令,根据汇编指令和机器指令的对照表一一进行翻译,不做指令优化。

2:链接

链接是一个比较复杂的过程,(将多个文件关联起来)链接的时候需要把一堆文件链接在一起才生成可执行程序。
链接的过程主要包括:地址和空间分配,符号决议和重定位(预处理的变化5)。
链接后会生成可执行文件(以 .exe 为后缀)

三:运行环境:

程序运行时主要分为4个步骤:
1:程序载入内存中。在有操作系统的环境中:一般这个过程由操作系统来完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成,
2:开始程序的执行,从main函数开始。
3:开始执行程序代码。这个时候程序使用一个运行的堆栈,存储函数的局部变量和返回地址。程序同时也可以使用静态内存,存储在静态内存中的变量在程序的整个执行过程中一直保留它们的值。
4:终止程序,正常终止main函数,也可能是意外终止。

本文章所使用的图片均来自yyds鹏哥

相关文章:

编译和链接

编译和链接 一:???二:翻译环境1:编译1:预处理2:编译 2:链接 三:运行环境: 本文章所使用的图片均来在yyds鹏哥一:?&#xf…...

常识判断 --- 科技常识

目录 力与热 光和声 航空成就 垃圾分类 百科知识 血型 二十四节气歌 春雨惊春清谷天 夏满忙夏暑相连 秋处露秋寒霜降 冬雪雪冬小大寒 力与热 光和声 航空成就 垃圾分类 百科知识 血型...

修改npm全局安装的插件(下载目录指向)

我们先打开终端 然后执行 npm config get prefix查看npm 的下载地址 一般都会在C盘 但是 我们都知道 C盘下东西多了是很不好的 所以 我们可以执行 npm config set prefix “E:\npmfile”将 npm 的下载地址 改变成 E盘下的 npmfile目录 这样 以后 默认全局安装的插件就会都到…...

<C++> 异常

C语言传统的处理错误的方式 传统的错误处理机制: 终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的…...

聊聊HttpClientBuilder

序 本文主要研究一下HttpClientBuilder HttpClientBuilder httpclient-4.5.10-sources.jar!/org/apache/http/impl/client/HttpClientBuilder.java public class HttpClientBuilder {public static HttpClientBuilder create() {return new HttpClientBuilder();}protected…...

MacOS - Sonoma更新了啥

1 系统介绍 苹果公司于2023年9月26日发布了macOS Sonoma 14.0正式版。名称由来不知道,可能是地名:Sonoma是一个地名,指加利福尼亚州北部索诺玛县(Sonoma County)。 2 系统重要更新 2.1 将小组件添加到桌面 速览提醒事项和临近日程等。按住Control键点…...

C++17中头文件filesystem的使用

C17引入了std::filesystem库(文件系统库, filesystem library),相关类及函数的声明在头文件filesystem中,命名空间为std::filesystem。 1.path类:文件路径相关操作,如指定的路径是否存在等,其介绍参见:http…...

「专题速递」数字人直播带货、传统行业数字化升级、远程协作中的低延时视频、地产物业中的通讯终端...

音视频技术作为企业数字化转型的核心要素之一,已在各行各业展现出广泛的应用和卓越的价值。实时通信、社交互动、高清视频等技术不仅令传统行业焕发新生,还为其在生产、管理、服务提供与维护等各个领域带来了巨大的助力,实现了生产效率和服务…...

PE格式之PE头部

1. PE头部总体组成 2. DOS MZ头 3. PE头 PE头由3部分组成: 下面分别: OptionalHeader比较大: 然后是节表, 节表有多个: PE文件头部就结束了, 最后就是节区了, 来看几段代码: ; main.asm .586 .model flat, stdcall option casemap:noneinclude windows.inc include ke…...

SLAM从入门到精通(用python实现机器人运动控制)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在ROS下面,开发的方法很多,可以是c,可以是python。大部分接口操作类的应用,其实都可以用python来开…...

接口和抽象类有什么区别?

接口和抽象类都是用于实现抽象类型的机制: 抽象类:抽象类可以包含抽象方法(未实现的方法)和具体方法(已实现的方法)。抽象类可以有字段(成员变量),这些字段可以是具体的,也可以是抽象的。一个类只能继承一个抽象类,Java不支持多继承。抽象类可以拥有构造方法,用于初…...

基于springboot+vue的人事系统

目录 前言 一、技术栈 二、系统功能介绍 员工信息管理 考勤信息管理 考勤信息管理 下班记录管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,作为学校以及一些培训机构,都在用信息…...

记住这份软件测试八股文还怕不能拿offer?你值得拥有

前言 2023秋招即将来临,很多同学会问软件测试面试八股文有必要背吗? 我的回答是:很有必要。你可以讨厌这种模式,但你一定要去背,因为不背你就进不了大厂。 国内的互联网面试,恐怕是现存的、最接近科举考试…...

2023年,在CSDN拥有10000粉丝有多难?

该数据来源于粉丝数人数排行前5000名用户的关注用户列表中产生的,由于采集样本数有限,数据可能具有一定的误差,仅供参考,本次采样用户数大概在100万以上。 筛选条件人数粉丝人数大于50007519粉丝人数大于100003763粉丝人数大于500…...

C++ -- 学习系列 关联式容器 set 与 map

一 关联式容器是什么? c 中有两种容器类型:关联式容器与序列式容器(顺序容器) 关联式中的容器是按照关键字来存储与访问的,序列式容器(顺序容器)则是元素在容器中的相对位置来存储与访问的。…...

Day 04 python学习笔记

Python数据容器 元组 元组的声明 变量名称(元素1,元素2,元素3,元素4…….) (元素类型可以不同) eg: tuple_01 ("hello", 1, 2,-20,[11,22,33]) print(type(tuple_01))结果&#x…...

Moonbeam Ignite强势回归

参与Moonbeam上最新的流动性计划 还记得新一轮的流动性激励计划吗?Moonbeam Ignite社区活动带着超过300万枚GLMR奖励来啦!体验新项目,顺便薅一把GLMR羊毛。 本次Moonbeam Ignite活动的参与项目均为第二批Moonbeam生态系统Grant资助提案中获…...

【改造后序遍历算法】95. 不同的二叉搜索树 II

95. 不同的二叉搜索树 II 解题思路 遍历每一个节点查看以k为根节点的二叉搜索树储存所有左子树的根节点储存所有右子树的根节点将左子树和右子树组装起来 将根节点储存在向量中 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeN…...

栈的基本操作(数据结构)

顺序栈的基本操作 #include <stdlib.h> #include <iostream> #include <stdio.h> #define MaxSize 10typedef struct{int data[MaxSize];int top; }SqStack;//初始化栈 void InitStack(SqStack &S){S.top -1; } //判断栈空 bool StackEmpty(SqStack S)…...

D. Jellyfish and Mex Codeforces Round 901 (Div. 2)

Problem - D - Codeforces 题目大意&#xff1a;有一个n个数的数组a&#xff0c;数m初始为0&#xff0c;每次操作可以删除任意一个数&#xff0c;然后m加上那个数&#xff0c;求n次操作和m的最小值 1<n<5000&#xff1b;0<a[i]<1e9 思路&#xff1a;可以发现&am…...

4.1 缺失值处理

本章学习目标&#xff1a; 理解什么是缺失值、为什么会出现学会发现和量化缺失值掌握4种核心处理方法&#xff1a;删除、均值/中位数填充、众数填充、前向/后向填充建立决策原则&#xff1a;什么时候用什么方法不需要记住代码&#xff0c;只需要知道“有什么方法、什么时候用、…...

oh-my-prompt:模块化终端提示符引擎的设计、配置与性能优化

1. 项目概述&#xff1a;一个为现代终端量身定制的提示符引擎如果你和我一样&#xff0c;每天有超过一半的工作时间是在终端&#xff08;Terminal&#xff09;里度过的&#xff0c;那么一个高效、美观且信息丰富的命令行提示符&#xff08;Prompt&#xff09;绝对能让你事半功倍…...

开发者技能图谱:如何利用GitHub仓库系统化规划技术学习路径

1. 项目概述&#xff1a;一个面向开发者的技能图谱与学习路径仓库最近在GitHub上闲逛&#xff0c;发现了一个挺有意思的仓库&#xff0c;叫tayyabexe/skills。乍一看名字&#xff0c;你可能会觉得这又是一个“Awesome-XXX”式的资源列表合集。但点进去仔细研究后&#xff0c;我…...

如何用Rye与Docker打造无缝Python容器开发环境:完整实践指南

如何用Rye与Docker打造无缝Python容器开发环境&#xff1a;完整实践指南 【免费下载链接】rye a Hassle-Free Python Experience 项目地址: https://gitcode.com/gh_mirrors/ry/rye Rye是一款旨在提供无忧Python开发体验&#xff08;a Hassle-Free Python Experience&am…...

C++ 入门核心语法|从 Hello World 到基础特性一次性吃透

文章目录前言一、C 第一个程序&#xff1a;Hello World二、命名空间 namespace1. 为什么需要命名空间&#xff1f;2. 命名空间定义规则3. 三种使用方式三、C 输入 & 输出1. 核心对象2. 最大优势四、缺省参数&#xff08;默认参数&#xff09;1. 定义2. 使用方式3. 声明与定…...

从零构建AI智能体编排平台:TalonOS架构解析与实战指南

1. 项目概述&#xff1a;从零构建一个自主智能体编排平台如果你正在寻找一个能将多个AI智能体像交响乐团一样组织起来&#xff0c;协同完成复杂任务的解决方案&#xff0c;那么你很可能已经接触过或听说过TalonOS。这个项目&#xff0c;或者说这个愿景&#xff0c;代表了一种全…...

ARMv8 A64指令集内存访问优化与LDRH/LDRSB指令详解

1. A64指令集与内存访问基础在ARMv8架构中&#xff0c;A64指令集作为64位执行状态的核心指令系统&#xff0c;其内存访问指令的设计直接影响处理器性能。与32位的A32指令集相比&#xff0c;A64在寄存器数量、地址空间和指令编码等方面都有显著改进。1.1 ARMv8内存访问特点ARM架…...

RISC-V汽车电子开发:功能安全认证工具链的挑战与实践

1. 项目概述&#xff1a;RISC-V在汽车领域的破局与挑战最近和几个在主机厂和Tier 1做嵌入式开发的老朋友聊天&#xff0c;话题总绕不开芯片选型和开发工具。大家普遍的感觉是&#xff0c;传统的Arm架构虽然生态成熟&#xff0c;但在追求极致能效比和定制化的今天&#xff0c;成…...

4sapi 企业级实战:统一模型网关与全生命周期管理解决方案

引言随着大模型技术在企业中的广泛应用&#xff0c;越来越多的企业开始面临 "模型碎片化" 的挑战。不同部门、不同业务线各自对接不同的大模型厂商&#xff0c;使用不同的 API 接口&#xff0c;导致企业内部出现了多个独立的 AI 孤岛&#xff0c;带来了一系列严重的问…...

从学生成绩表到销售报表:手把手教你用ag-grid列组/行组构建复杂业务表格

企业级销售报表实战&#xff1a;用ag-grid行组与列组构建动态分析系统 当业务数据从Excel迁移到前端可视化系统时&#xff0c;开发团队常面临多维分析的挑战。某零售企业曾因无法实时查看"华东区→浙江省→杭州市"三级维度下的季度销售趋势&#xff0c;导致错失库存调…...