作者介绍本文作者 CodeStats资深底层技术爱好者专注计算机体系结构、操作系统内核与编程语言实现原理。长期在 CSDN 分享硬核技术文章致力于用通俗语言讲透计算机背后的运行逻辑。参考文章本文核心思想基于作者的两篇前置文章强烈建议配合阅读《深入CPU与操作系统的底层骗局彻底吃透程序运行本质》《从CPU权限控制看懂Linux、Windows、鸿蒙的本质区别》 目录思考一个问题你真的理解“程序运行”吗程序执行的终极真相CPU只做一件“蠢事”操作系统与CPU权限用户态与内核态的“游戏规则”编译型 vs. 解释型从CPU视角看透本质区别重点预制程序浏览器如何让HTML/CSS/JS协同运行总结打通底层到应用层的统一模型一、思考一个问题你真的理解“程序运行”吗打开一个网页双击一个游戏运行一段Python脚本——这些日常操作背后你是否想过为什么C语言程序运行飞快而Python相对慢操作系统是怎么“保护”自己不被普通程序搞崩溃的浏览器凭什么能把HTML、CSS、JS三种不同“语言”融为一体展示出动态页面如果你无法清晰回答这些问题说明你对程序运行的本质还存在认知空白。这篇文章将从CPU的最底层指令执行开始一路讲到操作系统权限控制再到编译型/解释型语言的本质差异最后揭开浏览器渲染的神秘面纱。读完它你会建立一个从单条机器指令到各种应用程序执行原理的完整认知框架。二、程序执行的终极真相CPU只做一件“蠢事”2.1 剥离所有软件外衣我们日常接触的代码、IDE、框架、操作系统全部是上层建筑。剥离所有软件层直达硬件你会发现CPU的工作逻辑简单到令人惊讶。CPU没有理解能力没有思维不会“读懂”任何高级语言。它只会机械地重复一个无限循环查看程序计数器PC——一个记录下一条指令内存地址的寄存器从内存中取出该地址的指令执行指令算术运算、数据搬移、地址跳转等更新程序计数器指向下一条指令回到第1步。这就是冯·诺依曼架构的核心程序就是内存中连续排列的二进制指令程序运行就是CPU顺着程序计数器这条“锁链”逐条取指执行的过程。2.2 重要推论CPU根本听不懂你的代码CPU只能执行它所对应的机器码x86、ARM、RISC-V的指令集各不相同。你写的任何高级语言——无论是C、Java、Python还是JavaScript——最终都必须被翻译成CPU能识别的二进制机器语言。这个“翻译”过程正是不同语言执行模型的本质分水岭。三、操作系统与CPU权限用户态与内核态的“游戏规则”3.1 为什么需要权限分级如果所有程序都能随意访问所有内存和硬件一个普通的计算器程序就能把你的硬盘格式化。为了防止这种灾难CPU设计了特权级别。在x86架构中有Ring 0到Ring 3四个级别。我们只需要关注最常用的两个模式通俗称呼能做什么谁运行在这里Ring 0内核态执行任何CPU指令、访问所有内存、直接控制硬件操作系统内核Ring 3用户态只能访问自己的内存空间不能直接操作硬件你的应用程序微信、浏览器、游戏核心规则用户态程序如果想做“特权操作”读文件、发网络包、申请大块内存必须通过系统调用System Call陷入内核由内核代码代为完成。内核在完成操作后再切换回用户态。这就是为什么你的普通程序崩溃不会导致整个电脑蓝屏——它被关在“用户态笼子”里根本影响不了内核。3.2 从CPU权限看操作系统内核架构两种权限态的存在直接决定了操作系统的设计哲学宏内核Linux、旧Unix将进程调度、内存管理、文件系统、设备驱动等几乎所有服务都放在内核态运行。优点模块间直接调用性能高。缺点一个驱动bug就可能让整个内核崩溃。微内核QNX、L4、鸿蒙部分设计内核态只保留最基础的功能调度、IPC、内存管理。其他服务驱动、文件系统都作为普通用户态进程运行。优点极致稳定一个驱动挂了最多重启该进程。缺点频繁的内核-用户态切换带来性能开销。混合内核Windows、现代Linux也吸收部分微内核思想将关键功能如图形驱动放入内核态保证性能非关键服务放在用户态。无论哪种架构底层都依赖CPU提供的用户态/内核态切换指令。理解了这个你就看懂了所有操作系统的本质。四、编译型 vs. 解释型从CPU视角看透本质区别重点预制程序4.1 两种“翻译”策略将人类写的代码转化为CPU能执行的机器码需要翻译器。翻译方式有两种编译型C、C、Go、Rust在程序运行之前一次性将整个源代码翻译成目标平台的机器码生成一个独立可执行文件。可以理解为做一桌宴席全部提前做好然后一次性端上来。解释型传统Python、Ruby、早期JavaScript在程序运行过程中一边读取源代码一边翻译一小段然后立即执行再读取下一段。可以理解为吃火锅边涮边吃边吃边涮。4.2 从CPU执行角度看本质区别重点现在是最核心的部分——从CPU指令执行视角来区分两者编译型语言源码经过编译器直接生成了完整的可执行机器码文件。运行时操作系统将程序计数器直接指向这个文件的入口地址。CPU从头到尾执行的就是这个程序自己的机器码。没有中间商没有额外翻译开销。所以它快。解释型语言源码以普通文本文件存在里面没有任何机器码。运行时操作系统启动的是一个解释器程序比如python.exe或node.exe。这个解释器本身是一个已经编译好的可执行文件。CPU执行的从头到尾都是这个解释器程序的机器码。你的源代码呢它只是被解释器读取的输入数据就像文本编辑器打开的txt文件一样。解释器的机器码内部有一个主循环读一行你的源码 → 解析这一行 → 找到对应的预编译功能函数 → 调用该函数 → 继续读下一行。所以它慢因为多了“边读边解析”的额外开销。4.3 核心概念预制程序为什么解释器能执行你的源代码因为解释器是一个预制程序——它内部已经提前编译阶段实现好了所有你可能需要的操作变量赋值、算术运算、条件判断、循环、函数调用……每个操作都对应一段已经编译成机器码的函数。当你写a 1 2时CPU并不是直接计算12。CPU执行的是解释器的机器码这段机器码会解析文本“a 1 2”识别出“赋值”和“加法”跳转到解释器内部预制的“加法函数”机器码去执行真正计算跳转到解释器内部预制的“变量存储函数”去记录结果总结解释型语言的本质 预制程序解释器 你的源代码控制数据4.4 Java和现代JS的“中间路线”Java和Chrome V8引擎打破了纯解释的局限。它们引入字节码和JIT编译源代码先被编译成平台无关的字节码比文本源码更紧凑、更易翻译运行时解释器执行字节码同时监控哪些代码段执行频繁“热点代码”在运行时动态将其编译成真正的本地机器码之后CPU直接执行这些动态生成的机器码不再经过解释器这使得Java和现代JS的性能接近编译型语言同时保留了跨平台能力。五、浏览器如何让HTML/CSS/JS协同运行5.1 本质CPU执行的是浏览器的机器码当你打开一个网页时不要被“HTML是标记语言、CSS是样式表、JS是脚本”这些概念迷惑。从CPU视角看很简单浏览器本身是一个庞大的、预先编译好的可执行程序Chrome.exe、Safari等。操作系统将它加载到内存CPU开始逐条执行浏览器的机器码。你的HTML文件、CSS文件、JS文件对CPU来说都是输入数据。浏览器程序的机器码内部包含多个模块HTML解析器将文本数据转成内部DOM树结构CSS解析器将样式文本转成CSSOM树JS引擎V8等负责执行JS代码但V8本身也是浏览器程序的一部分渲染引擎根据DOMCSSOM生成屏幕像素5.2 渲染管线的核心步骤浏览器的主线程会依次做这几件事简化版解析HTML→ 构建DOM树内存中的一个对象模型表示网页结构解析CSS→ 构建CSSOM树表示每个元素应该长什么样合并→ 生成渲染树只包含可见元素及其最终样式布局→ 计算每个元素在屏幕上的精确位置和大小绘制→ 生成绘制指令“在(x,y)处画一个红色矩形”合成→ 将分层内容交给GPU显示到屏幕5.3 JS如何修改页面——通过操作DOM/CSSOMJS代码本身也是输入数据被浏览器内置的JS引擎V8执行。关键在于浏览器给JS引擎提供了一个宿主对象——document。当你的JS执行document.getElementById(box).style.backgroundColor blue时JS引擎执行这段JS的机器码自己解释或JIT编译后执行JS引擎调用浏览器提供的原生函数getElementById、style的setter这些原生函数直接修改DOM树中对应节点的样式属性然后标记该节点为“需要重新计算样式”下一轮渲染时浏览器会重新执行样式计算、布局、绘制最终屏幕变蓝关键机制事件循环Event Loop浏览器主线程不断重复执行JS任务 → 执行微任务 → 必要时渲染。JS执行和渲染是交替进行的不能同时并行。如果一个JS任务执行时间太长页面就会卡住——因为渲染一直没机会发生。5.4 一个生活比喻浏览器 一个智能工厂整体程序HTML 产品设计图纸定义结构和组件CSS 涂色和装饰说明定义外观JS 自动化控制脚本定义交互逻辑工厂内部的机器 浏览器的各个模块解析器、渲染引擎、JS引擎CPU 工厂的电力系统——它只负责让所有机器运转不关心图纸内容六、总结打通底层到应用层的统一模型回顾整篇文章我们其实只讲了一件事CPU只会机械执行内存中的机器码。所有软件——操作系统、编译器、解释器、浏览器——都是不同形态的机器码程序。你的高级语言代码最终要么直接变成机器码编译型要么作为数据被另一个“预制程序”解释器/浏览器处理。这个统一模型可以帮助你理解从指令到应用程序任何应用程序微信、游戏、浏览器的底层都只是一堆CPU指令在按照程序计数器顺序执行。所谓的“应用程序执行原理”本质就是“CPU执行机器码 操作系统权限管理”。为什么C比Python快因为C的机器码是直接执行Python的机器码是解释器的预制程序在执行多了解析开销。为什么操作系统崩溃比应用程序崩溃严重得多因为操作系统运行在内核态最高权限应用程序在用户态受限权限。为什么浏览器能同时处理HTML、CSS、JS因为浏览器是一个预制好的大程序内部包含了解析/执行这三种数据的不同模块。打通了这个认知你再去看任何新技术、新框架、新语言都不会再感到神秘——它们统统逃不出“CPU执行机器码 操作系统权限管理 预制程序处理输入数据”的基本框架。作者寄语计算机科学没有魔法。所有看似神奇的效果底层都是简单的规则层层组合。希望本文能帮你搭建起从硬件到软件的认知桥梁让你在今后的学习和工作中“胸有成竹”。如果觉得有收获欢迎点赞、关注、收藏⭐让更多人看到。有任何疑问或想深入探讨的方向评论区告诉我
从 CPU 指令执行到权限管控:对比三大操作系统,梳理编程语言演进,解读 HTML/CSS/JS 浏览器解析的共通底层逻辑
发布时间:2026/6/10 1:14:08
作者介绍本文作者 CodeStats资深底层技术爱好者专注计算机体系结构、操作系统内核与编程语言实现原理。长期在 CSDN 分享硬核技术文章致力于用通俗语言讲透计算机背后的运行逻辑。参考文章本文核心思想基于作者的两篇前置文章强烈建议配合阅读《深入CPU与操作系统的底层骗局彻底吃透程序运行本质》《从CPU权限控制看懂Linux、Windows、鸿蒙的本质区别》 目录思考一个问题你真的理解“程序运行”吗程序执行的终极真相CPU只做一件“蠢事”操作系统与CPU权限用户态与内核态的“游戏规则”编译型 vs. 解释型从CPU视角看透本质区别重点预制程序浏览器如何让HTML/CSS/JS协同运行总结打通底层到应用层的统一模型一、思考一个问题你真的理解“程序运行”吗打开一个网页双击一个游戏运行一段Python脚本——这些日常操作背后你是否想过为什么C语言程序运行飞快而Python相对慢操作系统是怎么“保护”自己不被普通程序搞崩溃的浏览器凭什么能把HTML、CSS、JS三种不同“语言”融为一体展示出动态页面如果你无法清晰回答这些问题说明你对程序运行的本质还存在认知空白。这篇文章将从CPU的最底层指令执行开始一路讲到操作系统权限控制再到编译型/解释型语言的本质差异最后揭开浏览器渲染的神秘面纱。读完它你会建立一个从单条机器指令到各种应用程序执行原理的完整认知框架。二、程序执行的终极真相CPU只做一件“蠢事”2.1 剥离所有软件外衣我们日常接触的代码、IDE、框架、操作系统全部是上层建筑。剥离所有软件层直达硬件你会发现CPU的工作逻辑简单到令人惊讶。CPU没有理解能力没有思维不会“读懂”任何高级语言。它只会机械地重复一个无限循环查看程序计数器PC——一个记录下一条指令内存地址的寄存器从内存中取出该地址的指令执行指令算术运算、数据搬移、地址跳转等更新程序计数器指向下一条指令回到第1步。这就是冯·诺依曼架构的核心程序就是内存中连续排列的二进制指令程序运行就是CPU顺着程序计数器这条“锁链”逐条取指执行的过程。2.2 重要推论CPU根本听不懂你的代码CPU只能执行它所对应的机器码x86、ARM、RISC-V的指令集各不相同。你写的任何高级语言——无论是C、Java、Python还是JavaScript——最终都必须被翻译成CPU能识别的二进制机器语言。这个“翻译”过程正是不同语言执行模型的本质分水岭。三、操作系统与CPU权限用户态与内核态的“游戏规则”3.1 为什么需要权限分级如果所有程序都能随意访问所有内存和硬件一个普通的计算器程序就能把你的硬盘格式化。为了防止这种灾难CPU设计了特权级别。在x86架构中有Ring 0到Ring 3四个级别。我们只需要关注最常用的两个模式通俗称呼能做什么谁运行在这里Ring 0内核态执行任何CPU指令、访问所有内存、直接控制硬件操作系统内核Ring 3用户态只能访问自己的内存空间不能直接操作硬件你的应用程序微信、浏览器、游戏核心规则用户态程序如果想做“特权操作”读文件、发网络包、申请大块内存必须通过系统调用System Call陷入内核由内核代码代为完成。内核在完成操作后再切换回用户态。这就是为什么你的普通程序崩溃不会导致整个电脑蓝屏——它被关在“用户态笼子”里根本影响不了内核。3.2 从CPU权限看操作系统内核架构两种权限态的存在直接决定了操作系统的设计哲学宏内核Linux、旧Unix将进程调度、内存管理、文件系统、设备驱动等几乎所有服务都放在内核态运行。优点模块间直接调用性能高。缺点一个驱动bug就可能让整个内核崩溃。微内核QNX、L4、鸿蒙部分设计内核态只保留最基础的功能调度、IPC、内存管理。其他服务驱动、文件系统都作为普通用户态进程运行。优点极致稳定一个驱动挂了最多重启该进程。缺点频繁的内核-用户态切换带来性能开销。混合内核Windows、现代Linux也吸收部分微内核思想将关键功能如图形驱动放入内核态保证性能非关键服务放在用户态。无论哪种架构底层都依赖CPU提供的用户态/内核态切换指令。理解了这个你就看懂了所有操作系统的本质。四、编译型 vs. 解释型从CPU视角看透本质区别重点预制程序4.1 两种“翻译”策略将人类写的代码转化为CPU能执行的机器码需要翻译器。翻译方式有两种编译型C、C、Go、Rust在程序运行之前一次性将整个源代码翻译成目标平台的机器码生成一个独立可执行文件。可以理解为做一桌宴席全部提前做好然后一次性端上来。解释型传统Python、Ruby、早期JavaScript在程序运行过程中一边读取源代码一边翻译一小段然后立即执行再读取下一段。可以理解为吃火锅边涮边吃边吃边涮。4.2 从CPU执行角度看本质区别重点现在是最核心的部分——从CPU指令执行视角来区分两者编译型语言源码经过编译器直接生成了完整的可执行机器码文件。运行时操作系统将程序计数器直接指向这个文件的入口地址。CPU从头到尾执行的就是这个程序自己的机器码。没有中间商没有额外翻译开销。所以它快。解释型语言源码以普通文本文件存在里面没有任何机器码。运行时操作系统启动的是一个解释器程序比如python.exe或node.exe。这个解释器本身是一个已经编译好的可执行文件。CPU执行的从头到尾都是这个解释器程序的机器码。你的源代码呢它只是被解释器读取的输入数据就像文本编辑器打开的txt文件一样。解释器的机器码内部有一个主循环读一行你的源码 → 解析这一行 → 找到对应的预编译功能函数 → 调用该函数 → 继续读下一行。所以它慢因为多了“边读边解析”的额外开销。4.3 核心概念预制程序为什么解释器能执行你的源代码因为解释器是一个预制程序——它内部已经提前编译阶段实现好了所有你可能需要的操作变量赋值、算术运算、条件判断、循环、函数调用……每个操作都对应一段已经编译成机器码的函数。当你写a 1 2时CPU并不是直接计算12。CPU执行的是解释器的机器码这段机器码会解析文本“a 1 2”识别出“赋值”和“加法”跳转到解释器内部预制的“加法函数”机器码去执行真正计算跳转到解释器内部预制的“变量存储函数”去记录结果总结解释型语言的本质 预制程序解释器 你的源代码控制数据4.4 Java和现代JS的“中间路线”Java和Chrome V8引擎打破了纯解释的局限。它们引入字节码和JIT编译源代码先被编译成平台无关的字节码比文本源码更紧凑、更易翻译运行时解释器执行字节码同时监控哪些代码段执行频繁“热点代码”在运行时动态将其编译成真正的本地机器码之后CPU直接执行这些动态生成的机器码不再经过解释器这使得Java和现代JS的性能接近编译型语言同时保留了跨平台能力。五、浏览器如何让HTML/CSS/JS协同运行5.1 本质CPU执行的是浏览器的机器码当你打开一个网页时不要被“HTML是标记语言、CSS是样式表、JS是脚本”这些概念迷惑。从CPU视角看很简单浏览器本身是一个庞大的、预先编译好的可执行程序Chrome.exe、Safari等。操作系统将它加载到内存CPU开始逐条执行浏览器的机器码。你的HTML文件、CSS文件、JS文件对CPU来说都是输入数据。浏览器程序的机器码内部包含多个模块HTML解析器将文本数据转成内部DOM树结构CSS解析器将样式文本转成CSSOM树JS引擎V8等负责执行JS代码但V8本身也是浏览器程序的一部分渲染引擎根据DOMCSSOM生成屏幕像素5.2 渲染管线的核心步骤浏览器的主线程会依次做这几件事简化版解析HTML→ 构建DOM树内存中的一个对象模型表示网页结构解析CSS→ 构建CSSOM树表示每个元素应该长什么样合并→ 生成渲染树只包含可见元素及其最终样式布局→ 计算每个元素在屏幕上的精确位置和大小绘制→ 生成绘制指令“在(x,y)处画一个红色矩形”合成→ 将分层内容交给GPU显示到屏幕5.3 JS如何修改页面——通过操作DOM/CSSOMJS代码本身也是输入数据被浏览器内置的JS引擎V8执行。关键在于浏览器给JS引擎提供了一个宿主对象——document。当你的JS执行document.getElementById(box).style.backgroundColor blue时JS引擎执行这段JS的机器码自己解释或JIT编译后执行JS引擎调用浏览器提供的原生函数getElementById、style的setter这些原生函数直接修改DOM树中对应节点的样式属性然后标记该节点为“需要重新计算样式”下一轮渲染时浏览器会重新执行样式计算、布局、绘制最终屏幕变蓝关键机制事件循环Event Loop浏览器主线程不断重复执行JS任务 → 执行微任务 → 必要时渲染。JS执行和渲染是交替进行的不能同时并行。如果一个JS任务执行时间太长页面就会卡住——因为渲染一直没机会发生。5.4 一个生活比喻浏览器 一个智能工厂整体程序HTML 产品设计图纸定义结构和组件CSS 涂色和装饰说明定义外观JS 自动化控制脚本定义交互逻辑工厂内部的机器 浏览器的各个模块解析器、渲染引擎、JS引擎CPU 工厂的电力系统——它只负责让所有机器运转不关心图纸内容六、总结打通底层到应用层的统一模型回顾整篇文章我们其实只讲了一件事CPU只会机械执行内存中的机器码。所有软件——操作系统、编译器、解释器、浏览器——都是不同形态的机器码程序。你的高级语言代码最终要么直接变成机器码编译型要么作为数据被另一个“预制程序”解释器/浏览器处理。这个统一模型可以帮助你理解从指令到应用程序任何应用程序微信、游戏、浏览器的底层都只是一堆CPU指令在按照程序计数器顺序执行。所谓的“应用程序执行原理”本质就是“CPU执行机器码 操作系统权限管理”。为什么C比Python快因为C的机器码是直接执行Python的机器码是解释器的预制程序在执行多了解析开销。为什么操作系统崩溃比应用程序崩溃严重得多因为操作系统运行在内核态最高权限应用程序在用户态受限权限。为什么浏览器能同时处理HTML、CSS、JS因为浏览器是一个预制好的大程序内部包含了解析/执行这三种数据的不同模块。打通了这个认知你再去看任何新技术、新框架、新语言都不会再感到神秘——它们统统逃不出“CPU执行机器码 操作系统权限管理 预制程序处理输入数据”的基本框架。作者寄语计算机科学没有魔法。所有看似神奇的效果底层都是简单的规则层层组合。希望本文能帮你搭建起从硬件到软件的认知桥梁让你在今后的学习和工作中“胸有成竹”。如果觉得有收获欢迎点赞、关注、收藏⭐让更多人看到。有任何疑问或想深入探讨的方向评论区告诉我