机器不懂英语
当我在学校第一次学习C语言时,有一些东西是我最不明白的。 “为什么我的代码不能立即运行,而是必须经历烦人的构建和编译过程?”
当你编写代码并按回车键时,Python 会立即启动,但 Java 和 C 需要耗时的步骤。当我还是一名本科生时,我只是想,“每种语言都有不同的语法。”当出现在考试中时,你所要做的就是回答“C 是编译型语言,Python 是解释型语言”。
然而,当我在实践中使用处理大量流量的后端服务器时,我意识到这个简单的差异却是决定系统性能和部署速度的巨大障碍。我写的那些优雅的代码,对于那些无知而认真的工作者来说,其实只是一门未知的外星语言,叫做CPU。

“构建”到底是什么?
那么构建到底是什么?它与简单的“保存”有何不同?
我们编写的源代码(.java、.c)实际上只是一个文本文件。这是即使用记事本打开也可以阅读的“文本”。然而,计算机(CPU)不知道如何阅读。您只能知道电流是否流动(1)或不流动(0)。
构建是一个综合打包过程,它将我们编写的‘文本文件’转换为计算机可以运行的‘可执行文件(.exe、.class、.jar)。
- 预处理(Preprocessing):删掉注释,并把需要的库代码拿过来粘贴进去。
- 编译(Compilation):把用英语写成的代码翻译成机器语言(或字节码)。
- 链接(Linking):把多个翻译好的文件合并成一个,生成最终的可执行文件。
换句话来说,如果源代码是“菜谱(纸)”,那么构建就是按照菜谱对食材进行修剪、炒制,并提供“成品菜肴(食物)”的过程。无论你对菜谱(代码)修改多少,如果你不重新烹饪(构建)它,你昨天做的冷食仍然留在桌子(服务器)上。
数字分发中心工作说明
要理解这个复杂的过程,请将计算机内部与巨大的数字物流中心进行比较。
在这里,CPU 是一个工作者,速度非常快,但灵活性为零。该工人只能读取称为机器语言(0 和 1)的工作指令。
用 Java 或 Python 编写代码的行为是创建分发给工人的“工作手册”的过程。但问题是我们用英语(编程语言)编写本手册。该工人不懂英语。所以我们需要翻译。一种语言的命运取决于这种翻译方法。
1. 编译器(Compiler):提前翻译好的专业译者
- 代表语言:C、C++、Java(混合型)、Go、Rust
- 方式:就像把一整本书全部翻译好,提前出版出来。在开始工作之前,就把所有代码都转换成机器语言,生成可执行文件(.exe、.class)。
- 优点:因为已经提前翻译好了,工人(CPU)读起来非常快。在运行之前就能把语法错误全部揪出来。
- 缺点:哪怕只改了手册里的一行,也得把整本书重新印刷一遍(Re-build)。
2. 解释器(Interpreter):实时同声传译员
- 代表语言:Python、JavaScript、Ruby
- 方式:紧跟在正在干活的工人身边,一句一句读给他听,并当场口译。
- 优点:手册一改就立刻生效。不需要单独的翻译文件。
- 缺点:口译需要时间,所以工作速度较慢。不实际运行一遍,就不知道后面有没有错别字。

【代码验证】验证机器语言的真面目
光是听是无法感受到的。让我们直观地检查一下 Python 是否真的在逐行翻译以及机器看到的代码是什么样的。
Python 有一个名为 dis(反汇编器)的模块。使用它,您可以看到哪些指令在执行时在内部分解为 Python 代码。
import dis
def my_function():
a = 10
b = 20
print(a + b)
# 確認 Python 程式碼被轉換成什麼機器碼(位元組碼)
print("--- Python Bytecode Verification ---")
dis.dis(my_function)
当您运行此代码时,将输出以下外来语言。
5 0 LOAD_CONST 1 (10)
2 STORE_FAST 0 (a)
6 4 LOAD_CONST 2 (20)
6 STORE_FAST 1 (b)
7 8 LOAD_GLOBAL 0 (print)
10 LOAD_FAST 0 (a)
12 LOAD_FAST 1 (b)
14 BINARY_ADD
16 CALL_FUNCTION 1
18 POP_TOP
20 LOAD_CONST 0 (None)
22 RETURN_VALUE
分析:
- 我们写的
a = 10被拆成了LOAD_CONST(取出常量 10)和STORE_FAST(放进快速存储区 a)这两条指令。 - 为了执行
print(a + b),会依次执行BINARY_ADD(二元加法)和CALL_FUNCTION(函数调用)。 - Python 解释器在运行时逐条读取这些指令,驱动用 C 语言写成的内部逻辑。也就是说,它并不是直接向 CPU 下达命令,而是向与 CPU 对话的“虚拟机(VM)”下达命令。这就是 Python 比 C 慢的原因。
另一方面,编译时,C语言直接翻译成实际的CPU汇编语言,例如MOV EAX, 10(将10放入EAX寄存器中)。由于没有中层管理人员,所以只能快。
实践中的权衡:选择哪一个?
本科生的时候,舒服就是最好的。与存在编译错误的 C 语言相比,我更喜欢 Python 或 JavaScript,因为它们可以轻松编写和运行。然而,在实践中,必须在稳定性和生产力之间进行激烈的权衡。
<强>1。害怕运行时错误(解释器的弱点)用Python构建服务器时最可怕的事情是服务器因为一个拼写错误而在凌晨3点停止。解释器在运行之前(执行代码时)才知道错误。另一方面,Java(编译语言)会问:“我这里打错了?”构建代码时。他告诉我。这种在部署之前严格发现错误的做法成为大型项目的救世主。
<强>2。无聊的构建时间(编译器弱点) 另一方面,当 Java 项目增长时,修改和检查一行代码可能需要几分钟(Gradle Build…)。这就是为什么Python在初创公司的早期阶段被广泛使用,因为快速修改和部署至关重要,或者需要立即得到结果的任务,例如数据分析。

结论:理论成为武器
我们现在知道“构建和编译”过程以及代码翻译的方式因语言而异。理论上,根据项目的性质选择最好的语言才是正确的答案。
但现实并没有那么美好。我加入的公司已经有一套技术栈,虽然我是作为 Java 开发人员加入的,但我还是要接触 Python、JavaScript,甚至 Android XML。
矛盾的是,今天学到的这些“基本理论”将我从“杂食性发展”这个令人困惑的领域中拯救出来。这是因为虽然语言的外壳不同,但其内部运行的原理是相同的。
下次我会讲一下我的实践经验,关于我如何“深入一种语言(Java)以瞄准其他语言”以及为什么基础知识对于避免成为框架的奴隶很重要。


