文章目录前置基础共识一、汇编Assemble汇编代码 → 机器码目标文件1. 什么是汇编2. 核心特点实操拆分gcc完整四步生活化小比喻二、狭义编译Compile高级代码 → 汇编代码1. 编译阶段核心工作关键区分三、链接Link多个半成品整合为可执行程序1. 两大核心工作两种报错承接上面命令全套流水线类比四、解释Interpret边翻译边执行无汇编/链接流程1. 执行逻辑2. 典型特征补充混合语言Java易混考点五、四大概念完整对比表六、总结前置基础共识CPU只认识纯二进制机器码0/1。我们写的C/Python等高级语言是人类文本想要交给CPU执行分两条路线静态路线C/C预处理 → 狭义编译 → 汇编 → 链接四步完整流程提前生成可执行文件动态路线Python/JS解释运行时逐行翻译无完整前置流水线一、汇编Assemble汇编代码 → 机器码目标文件很多人分不清「狭义编译」和「汇编」这是考试高频坑点1. 什么是汇编狭义编译产出的是汇编代码人类能看懂的低级助记符比如mov、add、call汇编就是汇编器把汇编指令一对一翻译成二进制机器码生成.o/.obj目标文件。2. 核心特点一对一映射一条汇编指令 一条机器指令几乎没有复杂转换只翻译指令不处理函数引用遇到call printf只会留占位不知道printf真实地址产出.o半成品依旧不能独立运行必须等待链接。实操拆分gcc完整四步以test.c举例#includestdio.hintmain(){printf(hello world);return0;}只预处理狭义编译生成汇编文件.sgcc-Stest.c打开test.s里面全是movlpush这类汇编助记符这一步是狭义编译还没走汇编阶段。2. 单独执行汇编把汇编.s转为目标文件.ogcc-ctest.s这一步才是汇编阶段汇编器as执行翻译得到半成品test.o。生活化小比喻狭义编译把中文作文翻译成极简机器助记短句汇编代码汇编把每一句短句逐个翻译成01二进制编码目标文件二、狭义编译Compile高级代码 → 汇编代码注意平时大家说的“编译”分两种广义编译预处理狭义编译汇编链接整套流程狭义编译只做「高级语言 → 汇编代码」这一步1. 编译阶段核心工作词法、语法、语义检查少分号、变量未定义、类型不匹配直接报编译错误优化代码常量合并、无用代码删除等简单优化将高级逻辑翻译成汇编助记符不会生成二进制。关键区分编译高级语言 → 汇编文本可读汇编汇编文本 → 二进制目标文件机器可读人看不懂三、链接Link多个半成品整合为可执行程序汇编产出一堆.o目标文件还有系统库文件链接器负责收尾组装。1. 两大核心工作合并段把所有.o的代码段、数据段整合符号解析重定位补齐printf这类外部函数的内存地址把汇编阶段留下的占位全部填满。两种报错编译错误语法问题卡在编译/汇编前无法生成.s/.o链接错误语法全对但缺失函数实现、缺少依赖库能生成.o链接失败。承接上面命令gcc test.o-otest./test链接完成后得到真正能运行的程序。全套流水线类比源代码.c 中文作文初稿狭义编译 翻译成机器专用短句汇编.s汇编 短句转二进制草稿.o半成品链接 补齐参考文献、整合全部草稿产出完整可上交成品exe/elf四、解释Interpret边翻译边执行无汇编/链接流程Python、JS、PHP这类解释型语言不走上面四步流水线。1. 执行逻辑运行时解释器逐行读取源码实时翻译成机器码翻译一行执行一行不会生成汇编、目标文件、可执行程序。2. 典型特征报错滞后前面代码正常跑执行到错误行才崩溃无需编译汇编链接一键运行python test.py缺点重复代码重复翻译运行速度远低于编译链接后的C程序。补充混合语言Java易混考点Java是折中方案先狭义编译.java → 字节码.class不是汇编中间特殊格式JVM运行时解释执行 JIT即时编译热点代码转机器码全程不产生汇编、.o文件和C流水线完全不同。五、四大概念完整对比表环节输入文件输出文件核心工作是否产生二进制狭义编译.c 高级源码.s 汇编代码语法检查、高级转汇编否文本汇编.s 汇编代码.o/.obj目标文件汇编指令一对一转机器码是半成品链接多个.o 系统库exe/elf可执行程序合并文件、补全符号地址是完整程序解释.py/.js源码无中间文件运行时逐行实时翻译执行无持久二进制文件六、总结狭义编译高级源码翻译成可读汇编代码做语法校验汇编汇编助记符一对一转为二进制目标文件(.o)仅半成品链接整合多个目标文件与系统库补齐函数地址生成可执行程序解释运行时逐行翻译源码执行无编译、汇编、链接流程开发快执行慢。