0.1.1-python解释器

Python 执行模型 │ ├─ 1. 编译阶段(源码 → 字节码) │ │ │ ├─ 输入:.py 源码文件 │ ├─ 编译器:CPython 内置的 compile 模块 │ ├─ 输出:字节码(bytecode) │ └─ 缓存:.pyc 文件(pycache/) │ ├─ 2. 解释执行阶段(字节码 → 机器码) │ │ │ ├─ 读取:.pyc 字节码 │ ├─ 执行器:CPython 解释器(用 C 语言实现) │ │ │ │ │ ├─ 解释器主循环:逐条读取字节码指令 │ │ ├─ 对每条字节码(如 LOAD_FAST, CALL_FUNCTION) │ │ └─ 调用对应的 C 函数 │ │ │ ├─ C 函数:早已被 C 编译器(如 GCC)编译成机器码 │ │ │ └─ CPU:执行这些机器码 │ ├─ 3. 与编译型语言对比(C/Go) │ │ │ ├─ 编译型:源码 → 机器码 → CPU 直接执行 │ └─ Python:源码 → 字节码 → 解释器 → 机器码 → CPU │ └─ 4. 常见工具与概念 │ ├─ dis 模块:python -m dis hello.py │ └─ 作用:反汇编字节码,显示助记符(不是机器码) │ ├─ 反编译工具:uncompyle6, pycdc │ └─ 作用:从字节码恢复 .py 源码(不完美) │ └─ 关键记忆点: ├─ .pyc 存的是字节码,不是机器码 ├─ Python = 先编译 + 后解释(两个翻译器) └─ 解释器(CPython)是 C 写的,负责将字节码转译为机器码执行

一、CPU 与机器码

  • CPU 有不同的指令集(如 Intel x86、ARM)。
  • 机器码是二进制的指令,存放在 RAM 中。
  • CPU 从 RAM 读取机器码并执行——这就是“运行程序”。
  • CPU 不能直接识别任何源代码(C/Python/Go 等)。

二、编译型语言(C / C++ / Go)

  • 使用编译器(如 GCC、Go build)。
  • 编译器将源代码一次翻译成机器码,生成可执行文件(.exe 或 Linux 无后缀文件)。
  • 该机器码直接针对特定指令集和操作系统(如 Windows x64、Linux ARM)。
  • 运行时:可执行文件加载到内存 → CPU 直接执行机器码。

三、Python 的执行模型(关键:先编译后解释,两层翻译)

第一层:编译(源码 → 字节码)

  • Python 源码(.py)被 Python 编译器(compile 模块)编译成字节码
  • 字节码是 Python 虚拟机(解释器)能识别的中间指令,与平台无关(x86 和 ARM 上的字节码一样)。
  • 字节码通常缓存为 .pyc 文件(在 __pycache__/ 目录下)。
  • 这一步只在源码改变后执行一次。

第二层:解释执行(字节码 → 机器码)

  • CPython 解释器(用 C 语言实现)加载 .pyc 字节码。
  • 解释器内部有一个主循环:逐条读取字节码,根据字节码调用对应的 C 函数
  • 这些 C 函数早已被 C 编译器(如 GCC)编译成了机器码(这一步发生在 CPython 本身的构建过程中)。
  • CPU 执行那些 C 函数的机器码,完成 Python 程序的实际运算。

关键结论

  • 字节码永远不会被直接翻译成机器码。它只是一个“指令表”,由解释器转译为对已存在机器码(C 函数)的调用。
  • 所以 Python 是 “先编译,后解释”,经历 两个翻译器
    1. 编译器(源码 → 字节码)
    2. 解释器(字节码 → 调用机器码)

四、查看字节码与反编译

  • python3 -m dis hello.py反汇编,显示人类可读的字节码助记符(如 LOAD_FAST, CALL_FUNCTION)。这不是机器码,也不是反编译回 Python 源码。
  • 从字节码恢复 Python 源码(.py)需要专门工具(如 uncompyle6, pycdc),且通常不能还原注释和格式。

五、常见错误纠正

错误说法正确说法
“Python 是纯解释型语言”Python 先编译成字节码,再解释执行字节码。
.pyc 存的是机器码”.pyc 存的是字节码,与平台无关。
“字节码直接变成机器码”字节码由 CPython 解释器读取,解释器调用内部的 C 函数(已是机器码)。
dis 把字节码翻译回机器码”dis 只是显示字节码助记符,不产生任何机器码。
pyc 就是解释器”pyc 是字节码文件;解释器是 CPython(C 写的程序)。

六、一句话总结(适合背下来)

Python 源码被编译成与平台无关的字节码(.pyc),然后由 C 实现的 CPython 解释器逐条执行字节码——解释器内部调用已编译成机器码的 C 函数,最终由 CPU 运行。


0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP