编译和链接

简介: 编译和链接

一:???

我们平时使用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函数,也可能是意外终止。


目录
相关文章
|
8天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
7天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
346 130
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
19天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1332 8
|
7天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
334 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
6天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
18天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1422 87
|
6天前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
7天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
264 82
2025年阿里云域名备案流程(新手图文详细流程)