⚙️ 第七章 程序在怎样的环境下运行
📄 一句话概括

运行环境是操作系统 + 硬件两层叠出来的:硬件决定指令集,操作系统决定能调哪些功能——换一层就可能跑不起来。

📝 本节和前面几节的关系

第六章讲的是数据怎么变小,这一章换个角度:同一个程序,为什么换个地方就跑不起来。

一、【运行环境】到底是什么

它不是一个玄乎的词,就是两样东西: 硬件——CPU 是哪一种,决定了本机代码长什么样。 操作系统——决定了程序能调用哪些功能(文件怎么打开、窗口怎么画)。 所以同一份可执行文件,换了 CPU 或者换了系统,都可能直接失效。

二、两层各自管什么

硬件这一层管【说的话】:x86 和 ARM 的指令集完全不同,同一串字节在一台机器上是指令、在另一台上可能是乱码。 操作系统这一层管【能办的事】:打开文件、创建进程、显示画面,都要通过系统提供的接口。 换句话说:硬件决定你怎么说,操作系统决定你能办什么。 两层都对上,程序才跑得动——这就是【运行环境】的完整含义。

三、于是跨平台成了难题

想让同一份程序在多个平台上跑,就得同时解决这两层: 硬件差异——不能只给一种 CPU 写代码。 系统差异——不能只盯着一家的接口。 这一章剩下的六节,讲的全是这两个问题上各种各样的解法: 有的靠操作系统自己吸收(7.2),有的靠中间垫一层(7.5),有的干脆把机器也租出去(7.6)。

四、这一章的位置

前六章讲的都是【一台机器内部】的事:CPU、数据、内存、磁盘、压缩。 这一章把镜头再拉远:这台机器外面还包着操作系统、驱动、虚拟机和云。 下一章会接着往下走:一个源文件要经过哪些步骤,才能变成这里说的可执行文件。 先记住这一句就够了:运行环境 = 操作系统 + 硬件。

五、动手 Demo:运行环境=操作系统+硬件

同一个程序,换个环境就可能跑不起来。 因为运行环境是两样东西叠起来的:操作系统 + 硬件。

import platform, struct, sys
print("操作系统  ", platform.system())
print("版本      ", platform.version())
print("处理器架构", platform.machine())
print("指针宽度  ", struct.calcsize("P") * 8, "位")
print("Python    ", sys.version.split()[0])

实跑输出:

--------------------------------------------------------------------
运行环境=操作系统+硬件
--------------------------------------------------------------------

**同一个程序,换个环境就可能跑不起来。**
因为【运行环境】其实是两样东西叠起来的:**操作系统 + 硬件。**

  **硬件**决定本机代码长什么样(x86 和 ARM 的指令集完全不同)。
  **操作系统**决定程序能调用哪些功能(文件怎么打开、窗口怎么画)。
  两层都换了,同一份可执行文件自然就失效了。

  看看眼前这台机器的环境:

  项目                       值
  --------------------------------------
  操作系统(software)       Windows
  版本                       10.0.19045
  处理器架构(hardware)     AMD64
  指针宽度                   64 位
  Python 版本                3.13.14

  **换一台 ARM 的机器,指令集就变了;换一套操作系统,可调用的功能也变了。**
  所以要跨平台,程序必须**在中间垫一层**——这就是接下来几节的主题。

实测这台机器:系统 Windows、架构 AMD64、指针 64 位。 换一套系统或换一种 CPU,这两行里就会有一行对不上——那就是跑不起来的原因。

30 秒实验

  1. 把同一段 Python 代码拷到手机或树莓派上跑,看看哪一行输出会变。
  2. 想想为什么游戏主机上的游戏,拷到电脑上通常打不开。

常见误区

  1. 以为运行环境指的是【装了哪些软件】。核心是操作系统与硬件两层。
  2. 以为换了系统只是【重装一下】。系统调用不同,程序可能根本要重写。
自测三问(点开对答案) 1. 运行环境由哪两部分构成? —— 操作系统 + 硬件。 2. 硬件和操作系统各决定什么? —— 硬件决定本机代码(指令集),操作系统决定程序能调用哪些功能(API)。 3. 为什么换个环境程序可能跑不起来? —— 指令集不同则本机代码失效,系统接口不同则调用的功能不存在。

相关笔记