从c到exe的编译过程

news/2025/12/25 11:22:57/文章来源:https://www.cnblogs.com/navyofficer/p/19384467

C语言代码首先被编译成与硬件平台相关的汇编指令,然后汇编器将这些汇编指令翻译成机器指令(二进制代码)。
C代码不能直接变成机器指令,它必须经过一个被称为“编译”的转换过程。下面详细拆解这个神奇的过程。
一、宏观过程概览
整个过程可以概括为以下四个主要步骤,由一个叫做“编译器”的软件驱动:
C源代码 (.c) -> 编译器 -> 汇编代码 (.s) -> 汇编器 -> 目标文件 (.o) -> 链接器 -> 可执行文件
二、详细分解每一步
`#include <stdio.h>

int main() {
int a = 10;
int b = 20;
int c = a + b;
printf("Result: %d\n", c);
return 0;
}`
第1步:预处理
在编译之前,预处理器会对源代码进行一些“文本替换”工作。

  • 处理以 # 开头的指令:例如 #include <stdio.h> 会将整个 stdio.h 头文件的内容插入到 hello.c 中。
  • 宏展开:如果你定义了 #define PI 3.14,那么代码中所有的 PI 都会被替换成 3.14。
    经过预处理后,会得到一个纯粹的、没有预处理指令的C代码文件(通常以 .i 结尾)。这个文件仍然是人类可读的C代码,但已经膨胀了很多。

第2步:编译
这是最核心的一步。编译器(如GCC、Clang)将预处理后的C代码翻译成汇编代码。

  • 工作内容:
    a.词法分析:将代码拆分成一个个的“单词”(令牌),比如关键字int、标识符main、运算符+、分号;等。
    b.语法分析:根据C语言的语法规则,检查这些“单词”是否能组成一个有意义的句子(语句),并生成一棵“抽象语法树”。这一步会检查出语法错误,比如缺少分号。
    c.语义分析:检查代码的逻辑是否正确,比如变量是否先声明后使用,数据类型是否匹配。
    d.中间代码生成与优化:编译器可能会先生成一种与硬件无关的中间表示,并对其进行优化(比如删除无用的代码,简化计算)。
    e.代码生成:将优化后的中间代码转换为特定CPU架构(如x86, ARM)的汇编代码。
    如果你使用GCC编译器,可以命令它只进行到编译步骤就停止,从而看到生成的汇编代码:gcc -S hello.c
    这会生成一个 hello.s 文件,里面就是x86或ARM等架构的汇编指令,看起来像这样(简化版):
    屏幕截图 2025-12-23 203430
    可见C语言代码先变成汇编指令

第3步:汇编
汇编器(如 as)接手工作,它的任务非常简单直接:将人类可读的汇编指令(助记符)一对一的翻译成机器可以执行的二进制代码(机器指令)。

  • 每一条汇编指令都对应一个特定的二进制操作码。
  • 例如,在x86架构中,movl $10, -4(%rbp) 这条指令会被翻译成一串特定的二进制数,CPU能直接识别这串二进制数并执行“移动数据”的操作。
    经过汇编后,我们得到一个目标文件(在Linux上是 .o,在Windows上是 .obj)。这个文件里已经是二进制机器码了,但它还不能直接运行。

第4步:链接
一个程序通常会用到外部库的函数,比如我们例子中的 printf。printf 函数的代码并不在我们的 hello.c 里。
链接器(如 ld)的任务就是:

  • 将我们程序生成的多个目标文件(如果有的话)和所需的库文件(如C标准库)“链接”在一起。
  • 解析这些文件之间的函数和变量引用(比如,找到 printf 函数在C标准库中的实际地址,然后替换掉我们代码中的“占位符”)。
    最终,链接器生成一个完整的、可以被操作系统加载和执行的可执行文件(在Linux上无后缀,在Windows上是 .exe)。

总结与类比
屏幕截图 2025-12-23 204003
所以,C语言是通过“编译”这个桥梁,先变成汇编,再变成最终的机器指令的。 我们平时用的 gcc hello.c 命令,实际上是一次性自动完成了以上所有步骤。

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

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

相关文章

4 STM32学习板入门视频教程 STM32芯片功能介绍

欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~&#x1f447;热门内容&#x1f447; python使用案例与应用_安城安的博客-CSDN博客 软硬件教学_安城安的博客-CSDN博客 Orbslam3&Vinsfusion_安城安的博客-CSDN博客 网络安全_安城安的博客-C…

Vue customRef

customRef 是 Vue 3 中的一个高级响应式 API&#xff0c;用于创建自定义的响应式引用&#xff08;ref&#xff09;&#xff0c;允许开发者对依赖追踪和更新触发过程进行细粒度控制。它通过一个工厂函数接收 track 和 trigger 两个函数&#xff0c;返回一个包含 get 和 set 方法…

软银竭力筹措225亿美元资金支持OpenAI

日本科技投资巨头软银需要在年底前筹措225亿美元资金&#xff0c;以履行其对AI合作伙伴OpenAI的承诺。据路透社报道&#xff0c;软银首席执行官孙正义有几种方式可以筹集这笔资金&#xff0c;包括动用与其持有的英国芯片设计公司Arm Holdings股份相关的未使用保证金贷款。软银是…

OpenWRT 24.10下使用radvd发送IPv6 RIO路由

我家网络下接了两个OpenWRT路由器,一个PPPoE接入电信1000M线路,一个PPPoE接入移动100M线路。 我希望实现:默认走电信,目标IP在移动网内时走移动。 IPV4下很好实现,关闭移动路由器的DHCP,两个路由器之间安装bird2…

基于matlab的bp网络车牌识别系统

- 标题&#xff1a; 基于matlab的bp网络车牌识别系统 - 关键词&#xff1a; matlab GUI界面 数字图像预处理 定位车牌 字符分割 bp神经网络识别 - 步骤: 打开图像 灰度化 阈值化 边缘检测 孔洞填充 形态学操作 滤波操作 粗定位 精定位 字符分割 bp神经网络识别 - 简述: 使用mat…

LangGraph 实战:手把手教你搭建一个「全自动科研论文写作」AI 团队 【多智能体协作实战项目一】

目录 &#x1f9e0; 第一部分&#xff1a;思维篇——如何设计智能体&#xff1f; 1.1 什么是“任务分解”&#xff1f; 1.2 本项目的架构设计 &#x1f575;️ 角色 A&#xff1a;Planner&#xff08;主编/研究员&#xff09; ✍️ 角色 B&#xff1a;Writer&#xff08;笔…

隧道超声波风速风向检测器:优化通风能耗管理

隧道超声波风速风向检测器通过实时监测与智能调控&#xff0c;显著优化通风能耗管理&#xff0c;其核心价值体现在以下方面&#xff1a; 一、技术原理&#xff1a;高精度测量奠定能耗优化基础 隧道超声波风速风向检测器采用超声波时差法&#xff0c;通过测量超声波在顺风与逆…

全自动太阳能电池片分选仪:光伏组件质量的“第一道防线“

在光伏组件生产线上&#xff0c;一个隐裂的电池片被焊接成串&#xff0c;最终封装进72片组件中。这个微小的缺陷可能在25年的使用过程中逐步扩展&#xff0c;导致整板功率衰减甚至热斑风险。如何避免"一颗老鼠屎坏了一锅粥"&#xff1f;答案藏在产线前端的全自动太阳…

2025年知名的电缆生产厂家推荐排名:电缆生产厂家推荐盘点名单(12月新版更新) - 品牌2026

电线电缆作为电力传输与信号传递的核心载体,广泛服务于电力、建筑、交通等关键领域。随着行业门槛持续收紧,优质产能愈发集中,选择兼具资质与口碑的生产厂家成为关键。本文结合生产规模、技术实力等维度,梳理电缆生…

cesium126,240621,Ce for Ue 通过 GeoServer 来加载 Shapefile:

&#xff08;294&#xff09;什么是 shapefile &#xff1a;&#xff08;295&#xff09; 因为下载不下来 geoserver 的安装 exe 文件&#xff0c;先看一下。 &#xff08;296&#xff09; &#xff08;297&#xff09; &#xff08;298&#xff09; 谢谢

百度自动驾驶出租车将于2026年进入伦敦市场

机器人出租车将于2026年进入伦敦市场。中国互联网巨头百度周一宣布&#xff0c;其Apollo Go自动驾驶网约车服务将在2026年上半年在英国首都进行试点运营&#xff0c;并得到Uber的支持。Uber表示"很兴奋能够加速英国在未来出行领域的领导地位&#xff0c;为伦敦人在明年带来…

AI 原生应用开发框架深度解析:从单智能体到多智能体协同开发

当 ChatGPT 带火 “生成式 AI” 后&#xff0c;我们很快发现&#xff1a;单纯的内容生成早已满足不了复杂业务需求 —— 我们需要 AI 能自主拆解任务、调用工具、协同工作&#xff0c;这就是 “智能体&#xff08;Agent&#xff09;” 的价值。而要落地智能体&#xff0c;离不开…

户外储能电源2KW双向逆变器板:快速开启产品研发之路

户外储能电源方案双向逆变器板资料&#xff0c;原理文件&#xff0c;PCB文件&#xff0c;源代码&#xff0c;电感与变压器规格参数&#xff0c;户外储能电源2KW(最大3KW)双向逆变电源生产资料&#xff0c;本生产资料含有前级DCDC源程序&#xff0c;后级的SPWM&#xff01;本户外…

64 位 Windows 对 32 位程序的兼容处理

简单来说,Windows 为 32 位程序提供 32 位版本系统库和一个用于访问 64 位内核的转接层 WOW64 来确保兼容性。 32 位程序在 64 位系统上执行时像往常一样加载和调用 32 位版本系统库,只是对 32 位版本系统库的调用将…

国产CAD实现跨部门设计变更同步

非标自动化设备的集成&#xff0c;是机械、电气、软件等多学科深度协作的过程。任何一个环节的设计变更&#xff0c;都可能像多米诺骨牌一样产生连锁反应。传统的协作模式依赖邮件、即时通讯工具传递图纸&#xff0c;版本管理极易混乱。项目经理大量的精力耗费在确认“当前是否…

隧道代理在数据挖掘中的实战应用:从原理到落地的全流程解析

免费编程软件「pythonpycharm」 链接&#xff1a;https://pan.quark.cn/s/48a86be2fdc0在互联网数据采集领域&#xff0c;代理IP早已不是新鲜技术&#xff0c;但传统代理模式常因IP质量差、切换效率低等问题成为数据采集的瓶颈。隧道代理&#xff08;Tunnel Proxy&#xff09;的…

Python Threading.Lock() threading.thread(target=lambda:[()])

import uuid import threading from datetime import datetime import timeidx=0 idx_lock=threading.Lock()def get_time_uuid():with idx_lock:global idxidx=idx+1current_idx=idxreturn f{current_idx}_{datetime.…

AI 原生应用开发框架深度解析:从单智能体到多智能体协同开发 - 2

目录 一、从单进程到分布式&#xff1a;智能体规模化的必然选择 二、A2A 协议&#xff1a;分布式智能体的 “通用语言” 2.1 A2A 协议的核心角色 2.2 A2A 协议的核心元素 2.3 A2A 协议的 3 种交互机制 2.4 A2A 协议的完整工作流 步骤 1&#xff1a;发现 A2A 服务端的 Ag…

全面掌握AI大模型:从零基础入门到实战应用的七阶段学习路线图全攻略!

文章提供了完整的大模型学习路线图&#xff0c;分为七个阶段&#xff1a;系统设计、提示词工程、平台应用开发、知识库应用开发、微调开发、多模态大模型应用和行业应用构建。路线涵盖Transformer架构、训练方法、Python编程、工具使用、API开发、RAG技术、向量数据库等核心技术…

请编写一个 Bash 脚本检查系统中的所有服务状态(中等)

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;Shell 面试 文章目录一、&#x1f340;前言1.1 ☘️示例1.2 ☘️知识扩展一、&#…