1813
5
5516
超级版主
我们在编辑器敲下几行代码,点击运行,屏幕就输出文字。很多初学者只知道写代码、点运行,但并不清楚中间一整套复杂流程。本文以 C 语言Hello World作为主线,完整走完预处理→编译→汇编→链接→程序加载→CPU 执行→系统调用输出全链路,再对比 Python、Java 的执行模式,搞懂不同语言底层的差异,理解源码到屏幕输出中间,编译器、链接器、操作系统、CPU 分别在干什么。概念释义机器指令:CPU 硬件可以直接识别的二进制指令。汇编语言:机器指令的助记文本,方便人类阅读。目标文件 (.o):汇编输出的二进制中间文件,还不能直接运行。链接:把多个目标文件、系统库整合,解析函数符号依赖,生成可执行程序。字节码:虚拟机指令,不是 CPU 原生机器码,需要虚拟机解释或者 JIT 编译执行。系统调用:用户态程序向操作系统内核申请服务的入口,例如打印输出、读写文件。
概念释义机器指令:CPU 硬件可以直接识别的二进制指令。汇编语言:机器指令的助记文本,方便人类阅读。目标文件 (.o):汇编输出的二进制中间文件,还不能直接运行。链接:把多个目标文件、系统库整合,解析函数符号依赖,生成可执行程序。字节码:虚拟机指令,不是 CPU 原生机器码,需要虚拟机解释或者 JIT 编译执行。系统调用:用户态程序向操作系统内核申请服务的入口,例如打印输出、读写文件。
注意:预处理阶段不做语法检查,只是纯文本加工。
到这里磁盘上得到可执行程序,但它依旧还没有跑起来。
同一个可执行文件,可以多次启动,生成多个互相独立的进程,每个进程拥有自己独立内存空间。
关键点:应用程序不能直接操作屏幕硬件,输出、读写文件都必须通过操作系统的系统调用完成。
新版 CPython 引入实验性 Copy‑and‑Patch JIT,但默认模式依旧以解释字节码为主。
共同点:Python 虚拟机、JVM 虚拟机本身,也是普通 C/C++ 写出来的程序,最终依旧要跑在 CPU 机器指令之上。
真相:gcc 是编译器驱动程序,内部依次调用预处理器、编译器、汇编器、链接器四套工具,只是对用户屏蔽中间文件。
真相:字节码是虚拟机的指令集,CPU 不能直接识别,必须依靠虚拟机做一层转换。
真相:内核加载程序后,会先运行 C 库启动初始化代码,再调用 main,main 不是程序最开始执行的代码。
真相:用户态代码无权直接操作硬件,全部要通过系统调用交给操作系统内核完成 IO。
源代码文本 →【预处理‑编译‑汇编‑链接】→磁盘上可执行文件 →操作系统 fork/execve 加载进内存创建进程 →CPU 执行机器指令 →库函数发起系统调用 →操作系统内核完成 IO 输出到终端。
举报
本版积分规则 发表回复 回帖后跳转到最后一页
相关侵权、举报、投诉及建议等,请发 E-mail:2026@typc.net
Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|晋ICP备2026008270号-1|晋公网安备14010602111293号