计算机的黑魔法
前言在这一章内容中我们会探究我们写的代码.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:25阅读更多 →
Arduino Grove初学者套件EOL版:经典硬件入门与传感器编程实战

Arduino Grove初学者套件EOL版:经典硬件入门与传感器编程实战

1. 项目概述:一份迟到的“毕业设计”看到“Grove 初学者套件 for Arduino(EOL)”这个标题,很多老朋友可能会心一笑,而刚入坑的新手或许会感到一丝困惑。EOL,即“End of Life”,意味着这款经典的硬件套件已经停产&#…

2026/8/2 15:49:25阅读更多 →
如何快速提升下载效率:AB Download Manager完整使用教程

如何快速提升下载效率:AB Download Manager完整使用教程

如何快速提升下载效率:AB Download Manager完整使用教程 【免费下载链接】ab-download-manager A Download Manager that speeds up your downloads 项目地址: https://gitcode.com/GitHub_Trending/ab/ab-download-manager 还在为下载大文件速度慢而烦恼吗&…

2026/8/2 15:47:24阅读更多 →
如何在Mac上实现NTFS完整读写:Free-NTFS-for-Mac终极解决方案

如何在Mac上实现NTFS完整读写:Free-NTFS-for-Mac终极解决方案

如何在Mac上实现NTFS完整读写:Free-NTFS-for-Mac终极解决方案 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and manage…

2026/8/2 17:12:08阅读更多 →
全球协作机器人一哥越疆科技“跨界”造恐龙,能否走出盈利困境?

全球协作机器人一哥越疆科技“跨界”造恐龙,能否走出盈利困境?

全球第一,却依然“生活不易”想要重现《侏罗纪公园》里的恐龙,可能比起生物工程,靠具身智能还靠谱一点。7月底,正值暑假中期,深圳自然博物馆展出了两只“活”的恐龙,让恐龙展厅成了当天全馆排队最长的地方。…

2026/8/2 17:12:08阅读更多 →
N皇后问题:从回溯算法到状态压缩的深度解析与优化实践

N皇后问题:从回溯算法到状态压缩的深度解析与优化实践

1. 问题引入:从棋盘到代码的经典回溯如果你对算法竞赛或者数据结构与算法这门课稍有接触,那么“N皇后问题”这个名字你一定不陌生。它就像一个算法领域的“Hello World”,但远比打印一行文字要复杂和深刻得多。我第一次在SCAU(华南…

2026/8/2 17:12:08阅读更多 →
i.MX6ULL蜂鸣器控制全解析:从设备树到应用编程

i.MX6ULL蜂鸣器控制全解析:从设备树到应用编程

在嵌入式开发中,控制一个简单的蜂鸣器(BEEP)往往是点亮第一个LED之后,新手接触硬件控制的第二个经典实验。它看似简单,却串联起了从硬件原理图、设备树(DTS)配置、内核驱动到用户空间应用程序的…

2026/8/2 17:12:08阅读更多 →
Airflow 任务依赖与调度最佳实践:DAG 设计精要

Airflow 任务依赖与调度最佳实践:DAG 设计精要

Airflow 任务依赖与调度最佳实践:DAG 设计精要 一、DAG 不是流程图:从依赖本质说起 很多团队刚接触 Airflow 时,把它当成一张普通的流程图来画。结果很快就踩坑。 DAG 的核心不是「画得好看」,而是「依赖关系正确且可重放」。这…

2026/8/2 17:12:08阅读更多 →
具身智能:从顶会趋势到落地挑战,从业者如何跨越理想与现实鸿沟

具身智能:从顶会趋势到落地挑战,从业者如何跨越理想与现实鸿沟

1. 从顶会热潮到落地冷思考:具身智能的十字路口 刚结束的ICRA和CVPR,无疑是全球机器人学和计算机视觉领域的两场年度盛宴。朋友圈里刷屏的论文接收喜报、会场里人头攒动的海报展,还有那些让人眼前一亮的Demo视频,无不散发着一种技…

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

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

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

2026/8/2 0:00:10阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/2 0:00:12阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

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

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

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

2026/8/2 0:00:10阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/2 0:00:12阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/2 0:00:13阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/2 1:29:34阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/2 2:32:55阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/2 2:09:20阅读更多 →