计算机的黑魔法
前言在这一章内容中我们会探究我们写的代码.c文件是如何变成一个可执行的程序.exe文件即我们主要讲解翻译环境只是粗略的讲解。翻译环境与执行环境这两个环境名字不同自然所实现的功能也就不一样先大致讲一下这两个环境分别有什么作用翻译是将我们写的test.c文件翻译成计算机能看懂的二进制指令也就是test.exe文件要想执行test.exe文件的话就需要执行环境更详细一点的那么接下来我们细说这两个环境看看每一个环境都是如何实现对应的功能的翻译环境编译和链接翻译包括两个大头编译和链接编译是使得每个test.c文件编译成目标文件.obj/.o文件链接是将每个目标文件加链接库通过链接器生成可执行程序.exe文件就像这样别看就只有这两个步骤其实还内藏玄机呢比如编译阶段就分为预编译编译汇编今儿我们就把这些操作掰开了揉碎了来讲给你。预编译test.i在这一章内容中我们会粗制的讲解一下预处理并不会太详细如果想详细的了解预处理方面的知识可以关注我的另一篇文章——预处理详解。在预处理阶段编译器会把test.c文件编译成test.i文件要是gcc编译器的话需要输入指令gcc test.c -E -o test.i就会生成一个test.i的文件我们就可以在test.i文件中看既然是粗制的讲解我们就直接说在编译的时候预处理要干哪些活1.将#include包含的头文件展开由上面两张图片我们可以看出在预处理阶段把包含的头文件都展开到test.i文件中2.删除注释由这张图片我们可以很直观的看到预处理阶段是如何处理注释操作的即直接删除更准确的说是用空格替代了3.宏替代我们用#define定义MAX为100即在预处理阶段中只要看到MAX就自动写为100由这三点我们可以看出预处理阶段进行的是文本操作关于预处理官方给的指导是预处理阶段主要处理那些源⽂件中#开始的预编译指令。。⽐如#include #define 处理的规则如下1.将所有的 #define 删除并展开所有的宏定义。2.处理所有的条件编译指令如 #if 、 #ifdef 、 #elif 、 #else 、 #endif 。3.处理#include预编译指令将包含的头⽂件的内容插⼊到该预编译指令的位置。这个过程是递归进行的也就是说被包含的头⽂件也可能包含其他⽂件。4.删除所有的注释5.添加⾏号和⽂件名标识⽅便后续编译器⽣成调试信息等。6.保留所有的 #pragma 的编译器指令编译器后续会使⽤。经过预处理后的 .i 文件中不再包含宏定义因为宏已经被展开。并且包含的头文件都被插⼊到 .i ⽂件中。所以当我们无法知道宏定义或者头⽂件是否包含正确的时候可以查看预处理后的 .i ⽂件编译test.s汇编代码编译是将源文件代码编译成汇编代码在gcc编译器上的命令行是gcc test.i -S -o test.s在编译成汇编代码的过程中要三步走1.词法分析 2.语法分析 3.语义分析比如我们在源代码写一个array[index] (index4)*(26);这个代码编译器要怎么编译呢第一个词法分析打标签将源代码程序被输⼊扫描器扫描器的任务就是简单的进⾏词法分析把代码中的字符分割成⼀系列 的记号关键字、标识符、字⾯量、特殊字符等。就像这样给每一个所写的代码打上标签。第二个语法分析看看有什么语法接下来语法分析器将对扫描产⽣的记号进⾏语法分析从⽽产⽣语法树。这些语法树是以表达式为 节点的树。第三个语义分析批改由语义分析器来完成语义分析即对表达式的语法层⾯分析。编译器所能做的分析是语义的静态分 析。静态语义分析通常包括声明和类型的匹配类型的转换等。这个阶段会报告错误的语法信息汇编test.obj二进制指令代码汇编器是将汇编代码转变成机器可执⾏的指令2进制的指令每⼀个汇编语句⼏乎都对应⼀条机器 指令。就是根据汇编指令和机器指令的对照表⼀⼀的进⾏翻译也不做指令优化。汇编操作是将test.s文件转换成test.obj文件在gcc编译器上是输入gcc test.s -c这串命令行达到的效果是由汇编代码变成一个二进制的代码机器可读链接test.exe对.obj文件进行合并和重定位我们先看看链接这个名字哈链接像不像连接那要是连接的话目标对象得是两个以上才行所以链接也有两个以上的目标文件。在编译阶段中我们对每一个.c文件编译成.obj文件但是每一个.obj文件都是单独存在的无法互通链接就是为了解决这个问题而诞生它的主要功能是解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题。链接的步骤地址和空间分配符号决议和重定位等这些步骤。我们看下面这个程序看看链接是如何发挥作用的这有两个.c文件我们在执行它的时候会产生两个.obj文件test.obj和Add.obj链接的对象就是这两个文件。链接的操作如下在链接的符号决议阶段中会扫描所有.obj文件的函数和变量这里变量就不展示了并生成对应的符号表而在重定位阶段中会把真实有意义的函数汇编成一个符号表。这是什么意思呢我们看上面的图片在test.c文件中应用外部函数Add的时候因为在test.c文件中本身没有Add函数会随便给一个地址在最后的重定位中所有有意义的函数地址重新组装成一个符号表。执行环境1.程序必须载⼊内存中。在有操作系统的环境中⼀般这个由操作系统完成。在独⽴的环境中程序的载⼊必须由手工安排也可能是通过可执⾏代码置⼊只读内存来完成。2.程序的执行便开始。接着便调用main函数。3.开始执⾏程序代码。这个时候程序将使⽤⼀个运⾏时堆栈stack存储函数的局部变量和返回 地址。程序同时也可以使⽤静态static内存存储于静态内存中的变量在程序的整个执⾏过程 ⼀直保留他们的值4.终⽌程序。正常终⽌main函数也有可能是意外终⽌。

相关新闻

Python面向对象:class定义类与创建实例对象

Python面向对象:class定义类与创建实例对象

Python面向对象:class定义类与创建实例对象一、开篇:class——创建自定义类型的蓝图 在Python中,一切皆对象——整数是int类的实例,字符串是str类的实例,列表是list类的实例。class关键字让你创建自己的类型。这就像从…

2026/8/2 15:49:03 阅读更多 →
Grove压力传感器套件:从MPX5700AP原理到Arduino实战应用

Grove压力传感器套件:从MPX5700AP原理到Arduino实战应用

1. 项目概述:Grove压力传感器套件是什么?如果你玩过Arduino,大概率听说过Grove这个名字。它不是某个具体的传感器,而是一套由Seeed Studio推出的、旨在简化电子原型开发的模块化生态系统。简单来说,Grove把复杂的电路和…

2026/8/2 15:48:02 阅读更多 →
阿里通义Wan2.1视频生成模型:如何在ComfyUI中轻松实现图片变视频?

阿里通义Wan2.1视频生成模型:如何在ComfyUI中轻松实现图片变视频?

阿里通义Wan2.1视频生成模型:如何在ComfyUI中轻松实现图片变视频? 【免费下载链接】WanVideo_comfy 项目地址: https://ai.gitcode.com/hf_mirrors/Kijai/WanVideo_comfy 你是否曾经想过,只需一张静态图片和简单的文字描述&#xff0…

2026/8/2 15:48:02 阅读更多 →

最新新闻

Unity游戏资源提取实战:AssetStudio核心原理与逆向工程应用

Unity游戏资源提取实战:AssetStudio核心原理与逆向工程应用

1. 项目概述:为什么我们需要提取Unity游戏资源?在游戏开发、逆向学习或者内容创作的过程中,你很可能遇到过这样的场景:看到一个Unity引擎制作的精美游戏,对其中的某个模型、一段音效或者一套UI界面爱不释手&#xff0c…

2026/8/2 20:15:51 阅读更多 →
如何快速上手Magpie:3分钟实现文本自动分类的完整指南

如何快速上手Magpie:3分钟实现文本自动分类的完整指南

如何快速上手Magpie:3分钟实现文本自动分类的完整指南 【免费下载链接】magpie Deep neural network framework for multi-label text classification 项目地址: https://gitcode.com/gh_mirrors/magp/magpie Magpie是一款专为多标签文本分类设计的深度神经网…

2026/8/2 20:15:51 阅读更多 →
Web Serial工具使用:浏览器直连ESP32-Bit-Pirate进行调试

Web Serial工具使用:浏览器直连ESP32-Bit-Pirate进行调试

Web Serial工具使用:浏览器直连ESP32-Bit-Pirate进行调试 【免费下载链接】ESP32-Bit-Pirate A Hardware Hacking Tool with Web-Based CLI That Speaks Every Protocol 项目地址: https://gitcode.com/GitHub_Trending/es/ESP32-Bit-Pirate ESP32-Bit-Pira…

2026/8/2 20:15:51 阅读更多 →
NodeJS JWT Authentication Sample核心功能解析:用户注册与登录实战教程

NodeJS JWT Authentication Sample核心功能解析:用户注册与登录实战教程

NodeJS JWT Authentication Sample核心功能解析:用户注册与登录实战教程 【免费下载链接】nodejs-jwt-authentication-sample A NodeJS API that supports username and password authentication with JWTs 项目地址: https://gitcode.com/gh_mirrors/no/nodejs-j…

2026/8/2 20:15:51 阅读更多 →
如何为Argon Design System React贡献代码?开发者指南与最佳实践

如何为Argon Design System React贡献代码?开发者指南与最佳实践

如何为Argon Design System React贡献代码?开发者指南与最佳实践 【免费下载链接】argon-design-system-react React version of Argon Design System 项目地址: https://gitcode.com/gh_mirrors/ar/argon-design-system-react Argon Design System React是基…

2026/8/2 20:15:50 阅读更多 →
利用OBS虚拟摄像头实现多屏共享与专业演示

利用OBS虚拟摄像头实现多屏共享与专业演示

1. 项目概述:多屏共享的“虚拟”解法在远程会议、在线教学或者游戏直播的场景里,你是不是也遇到过这样的尴尬:想同时分享PPT、演示软件和你的摄像头画面,但会议软件只允许你选择一个窗口或一个摄像头;或者,…

2026/8/2 20:14:50 阅读更多 →

日新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/2 2:47:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →