2.3 基本概念——编译型与解释型区别¶
内容梗概¶
本节回答安装 Python 时有同学提出的问题:"为什么学这门语言必须先下载安装一个环境?"答案是 Python 是解释型语言,代码必须靠解释器(python.exe)在运行时翻译执行,而不像 C 语言那样先编译链接成 exe。老师用"翻译"作类比,并从编译原理角度分别讲解了两类语言的完整执行流程:C 语言经编译、链接生成机器码 exe;Python 由解释器做词法语法分析、生成字节码,再交给 Python 虚拟机(PVM)执行。最后解释了为什么解释型语言通常比编译型语言慢。
知识点详解¶
引子:为什么要装环境¶
- C 语言(编译型):在 Visual Studio 中右键 Build/Generate,源代码变成 .exe 后才能运行(约 01:00)。
- Python(解释型):不需要编译链接出 exe,直接通过
python.exe——官方术语叫**解释器**——把 .py 文件解释执行(约 01:49)。安装包装的就是这个解释器及其运行所需的支撑文件。
通俗类比:翻译¶
- C 语言:事先请翻译把中文文档整体翻译成英文(得到 exe),英语母语者(CPU)直接快速阅读(约 02:28)。
- Python:随身带一个翻译,你说一句他现场翻译一句给英语国家的人听——这个翻译就是解释器 python.exe。所以执行慢(约 02:40)。
- 老师说明该类比不严谨:实际上解释器会把整个文件先编译成字节码再逐条翻译执行(约 21:16)。
澄清:Python 的"快"¶
- Python 的执行效率比 C 语言**低很多**,这是它被诟病的原因(约 04:30)。
- 所谓"Python 快"指的是**开发速度快**(写代码方便),得益于语法糖和丰富的第三方库,而非运行快。
编译型语言执行流程(以 C 语言 / Windows / VS 为例)¶
- 编译:对 .c/.h 源文件做**词法分析**与**语法分析**(约 06:47):
- 词法分析:把
int、main等一个个词单独提取出来,识别每个词的含义(编译器预存了关键字表); - 语法分析:分析词与词之间的关系是否符合 C 语言规则,写错时编译报错就发生在这个阶段;
- 另有**预处理**:如 a.c 引入 b.h 时,把 b.h 的内容与 a.c 拼接成一个文件。细节留待"编译原理"课程。
- 编译产物:一堆中间目标文件——VS/Windows 下为 .obj,Linux 下为 .o,两者类似(约 09:15)。
- 链接(约 09:46):.obj 只包含你自己写的代码;用到的库函数(如
printf,其实现位于 .lib 文件中)不在 obj 里。**链接器**负责找到这些 lib,把库代码与 obj 拼接起来;图标等资源文件(.icon 等)也在此阶段拼入。 - 链接完成得到 .exe:已是机器码(二进制),CPU 直接认识,双击即运行,运行时不再需要编译链接,所以快(约 13:14)。
- 分发便利:在没有额外动态链接库依赖时,把 exe 发给别人可直接运行,对方无需装任何开发环境(约 13:45)。
IDE 在背后做的事¶
- 学 C 时看不到编译、链接两步,是因为 IDE(如 VS)自动完成:右键 Build 时 VS 调用自带的 CL.exe(compiler,负责编译),编译完再调用 link.exe(负责链接)(约 12:16)。
- 学了写 makefile 后会手动调用 CL.exe 和 link.exe 完成这两个过程。
解释型语言执行流程(Python)¶
- 安装目录里找不到编译器那一套东西,只有解释器
python.exe(约 15:44)。 - CPU 只认二进制,并不认识 .py 里"像英文的东西"——靠解释器在**运行时**完成翻译(约 16:13)。
- 交付形式是源代码:交作业、交付用户都是交 .py 源码,对方必须配好同样的环境(有解释器)才能运行(约 16:56)。
- 易混淆点:解释型语言并非没有词法分析和语法分析,这些步骤仍然存在,只是**隐藏在解释器内部**(约 17:25)。
- 完整流程:解释器做词法/语法分析 → 生成中间代码**字节码(bytecode)** → 交给最底层的 PVM(Python Virtual Machine,Python 虚拟机) 执行,PVM 把字节码翻译成二进制代码交给 CPU(约 17:54)。
- 关键:上述步骤**全部发生在运行时**,比编译型多出很多运行时步骤,这就是解释型语言一般比编译型语言慢的原因(约 18:46)。
本节小结¶
- 编译型流程:源代码 → 编译器(CL.exe)→ .obj → 链接器拼库与资源 → .exe → 直接执行(约 20:15)。
- 解释型流程:源代码 + 解释器 → 字节码 → PVM → 机器码,运行时逐层翻译。
- 学其他语言时自然能分辨它是编译型还是解释型,不必死记(约 22:33)。
示例与演示¶
- 结合课件流程图讲解:左边 C 语言编译链接流程,右边 Python 解释执行流程,并画线标明 Python 的哪些步骤发生在运行时。
- 以
printf函数为例说明链接的作用(函数实现在 .lib 中,不在自己的 .obj 中)。 - 以 Visual Studio 的 Build/Generate 操作为例说明 IDE 自动调用 CL.exe 与 link.exe。
重点与难点¶
- 核心结论:Python 必须装环境是因为解释型语言需要解释器;编译型语言编译出 exe 后开发环境即可抛弃。
- 易错概念 1:Python"快"是写得快,不是跑得快,运行效率远低于 C。
- 易错概念 2:解释型语言也有词法/语法分析,只是藏在解释器里,且多了字节码与 PVM 环节。
- 理解编译(词法/语法分析、预处理)、链接(拼接库代码与资源)各自的作用;详细机制留待编译原理课程。
- 解释型语言分发的是源代码,运行依赖目标机器上的解释器环境。
关联内容¶
- 直接回答 2.1 安装 Python 时同学提出的"为什么要下载安装包"的问题。
- 前置知识:上学期学过的 C 语言(Visual Studio 的 Build 流程)。
- 词法/语法分析、编译链接的深入内容对应后续课程"编译原理";计算机组成原理解释了 CPU 只识别二进制。
- .py 源码直接运行的操作体验见 2.2 IDLE 简介;Python 代码基本结构见 2.4。