mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
2251 字
6 分钟
解释型语言和编译型语言,我把它理清了

解释型语言和编译型语言,我把它理清了#

这篇是我学完相关章节后整理的笔记。一开始我也觉得「Python 是解释型、C 是编译型」背下来就完事了,直到被一个问题问住:Java 到底算哪边?查了一圈才发现,这两个词没有课本里那么简单。写下来既是给自己留个底,也希望对同样刚接触这块的同学有点用。


我是怎么被绕进去的#

上学期学 Python,跑代码就一行命令:

python main.py

不用先编译,改完直接跑,爽。

后来 C 语言课要求先 gcc,再 ./a.out,少一步都不行。老师说是「编译型」,Python 是「解释型」——我记下了。

直到某次刷题,有人评论说「Java 也是编译型啊」,底下又有人回「Java 不是跑在 JVM 上吗,算解释吧」。我盯着屏幕看了半天,发现我背的标签,好像没法干净地贴到具体语言上

于是重新查资料、对照几种语言的实际运行方式,有了这篇笔记。


先用一个不太严谨但好懂的比喻#

把「程序」想成一篇中文稿子,「电脑」想成只懂 0 和 1 的听众。

编译型像:先把整篇稿子翻译成英文,印成册子。之后谁读都直接翻书,不用再翻译。改一个字?重新翻译、重新印。

解释型像:现场配同声传译,你说一句他译一句。改稿方便,随时能换,但传译本身要时间;同一段反复讲,可能反复做类似工作。

真实语言很少纯走某一端,大多在中间,或者两边都沾。


编译型:先把代码变成「能直接跑的东西」#

C、C++、Go、Rust 这类,典型流程是:

你写的源码 → 编译器 → 机器码(可执行文件) → CPU 执行

gcc hello.c 之后得到 a.outhello.exe,运行时一般不再需要编译器(静态链接、同一平台的前提下)。

我感受到的几个点:

跑起来通常更快。 该干的翻译活提前做完了,CPU 执行的是原生指令。操作系统底层、游戏引擎、嵌入式,对性能要求高,这类语言依然常见。

改代码后要重新编译。 C++ 大项目改一行全量编一遍,等几分钟不稀奇。所以工程上才那么在意增量编译、怎么拆模块——跟语言特性绑在一起。

部署相对省心。 编译出一个 binary 丢上去就能跑(当然得匹配操作系统和 CPU 架构,x86 和 ARM 不是一回事)。


解释型:边翻译边执行#

传统说法里,Python、Ruby、PHP 属于这类。印象中的流程:

源码 → 解释器读入 → 当场翻译并执行

python main.py 不用单独生成 .exe,解释器自己上场。

开发体验好。 改完保存再跑,反馈快。写脚本、做小工具、验证想法,这点我感触很深——这也是很多课先用 Python 的原因之一。

运行时多一层开销。 同样逻辑,纯解释执行往往比编译好的 native code 慢。注意是「往往」,不是铁律。

分发的是源码(或中间产物),不是单一 exe。 给别人 Python 项目,对方环境也得有 Python。和「扔一个可执行文件过去」是两种思路。


真正容易搞混的地方#

如果只记「Python 解释、C 编译」,考试可能够,理解语言行为却不够。下面几个是我查资料时帮助最大的。

Java:编译了,但不是直接变成机器码#

Java 先编译成字节码.class),再在 JVM 里跑。JVM 还会对热点代码做 JIT(即时编译),把字节码进一步变成机器码。

所以 Java 不是「纯解释」,也不是「纯 AOT 编译成 exe」。更准确的说法:先编译成中间格式,也就是.class文件。运行时由 JVM 决定怎么执行。C# + .NET 类似。

JavaScript:感觉不用编译,其实引擎里忙得很#

早期 JS 真是读一行跑一行。现在 Chrome 的 V8、Node.js 都会先把 JS 编译成字节码甚至机器码,热路径上 JIT 优化。

我们写 JS 觉得「保存刷新就行」,是因为编译发生在运行时,对我们透明了。不等于它只是「解释型」就完事。

Python:也不只是「打开 .py 就跑」#

CPython 执行前会把源码编译成字节码__pycache__ 里的 .pyc 就是这个。只是这一步通常自动完成,不像 C 那样我们手动跑 gcc

还有 PyPy 这种带 JIT 的实现,性能可以接近编译型语言,只是生态和兼容性有取舍——知道有这回事就行。

Go:编译型,但编译速度被刻意做快了#

Go 走 AOT 编译,产出单一可执行文件,部署方便。它的编译器设计得够快,所以「编译型 = 编译一定很慢」在 Go 上不完全成立。


一张表,帮助建立直觉(不是标准答案)#

C / Go / Rust传统印象里的 PythonJava / JS / Python3
运行前有没有单独的「编译」步骤有,生成可执行文件看起来没有有,但产物多是字节码
谁把代码变成能执行的指令编译器,运行前解释器,运行时两者都有,运行时还有 JIT
改完代码重新编译直接再跑看语言,Java 要重新 javac
性能(泛泛而谈)通常更好通常稍慢看 JVM/V8 优化,差距可以很小

这是建立直觉用的,不是定律。真要比性能,得 profiling,别凭语言标签猜。


我现在的理解:别问「是哪种型」,问三个问题#

教材爱出二选一,好记也好考。实际更值得想的是:

  1. 什么时候翻译? 运行前(AOT)、运行时(JIT),还是边跑边译?
  2. 翻译成什么? 机器码、字节码,还是内部结构?
  3. 谁来做? 独立编译器、虚拟机,还是语言内置引擎?

把这三个问题想清楚,比背「Python 是解释型」有用得多。我后来再看 GIL、JVM warmup、JS 事件循环,都顺一些——它们都和「代码怎么被执行」有关。


对和我一样在学的人,这知识怎么用#

选语言或做项目时,我试着少问「编译还是解释」,多问:

  • 瓶颈在哪?如果主要是等网络、读数据库,语言差异可能没那么大。
  • 部署环境能装运行时吗?有些嵌入式场景只能 C。
  • 更在意开发速度,还是运行效率?

学第二门语言时,理解执行模型,能少很多「为什么这门语言这样设计」的困惑。这不是背概念,是换角度看问题。

如果被问到,我会说:传统上分编译型和解释型,但很多现代语言是混合的。Java 编译成字节码在 JVM 上跑还有 JIT;JS 在 V8 里也会编译优化。更准确的问法是:什么时候、用什么方式,把源码变成可执行指令


收尾#

回到开头:Python 是不是因为「解释型」所以简单?

我觉得简单主要是因为语法、内置类型、库多,跟「解释型」这个标签关系不大。解释型带来的,更多是改完就能跑、反馈快;编译型带来的,更多是运行效率、资源可控、部署形态清晰

两个标签是起点,不是终点。下次听人说「解释型就是慢」,可以想想:说的是 CPython 纯解释,还是 V8 里的 JS,还是 PyPy?——能分清,说明真的理解了。


以上是我根据课程和资料整理的笔记,不同语言版本、不同引擎实现会有差异,细节以官方文档为准。有不对的地方欢迎指正。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

解释型语言和编译型语言,我把它理清了
https://amancando.xyz/posts/解释型语言与编译型语言/
作者
蓝色玫瑰天上飞
发布于
2026-03-01
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00