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

“构建”到底是什么?
那么构建到底是什么?它与简单的“保存”有何不同?
我们编写的源代码(.java、.c)实际上只是一个文本文件。这是即使用记事本打开也可以阅读的“文本”。然而,计算机(CPU)不知道如何阅读。您只能知道电流是否流动(1)或不流动(0)。
构建是一个综合打包过程,它将我们编写的‘文本文件’转换为计算机可以运行的‘可执行文件(.exe、.class、.jar)。
换句话来说,如果源代码是“菜谱(纸)”,那么构建就是按照菜谱对食材进行修剪、炒制,并提供“成品菜肴(食物)”的过程。无论你对菜谱(代码)修改多少,如果你不重新烹饪(构建)它,你昨天做的冷食仍然留在桌子(服务器)上。
数字分发中心工作说明
要理解这个复杂的过程,请将计算机内部与巨大的数字物流中心进行比较。
在这里,CPU 是一个工作者,速度非常快,但灵活性为零。该工人只能读取称为机器语言(0 和 1)的工作指令。
用 Java 或 Python 编写代码的行为是创建分发给工人的“工作手册”的过程。但问题是我们用英语(编程语言)编写本手册。该工人不懂英语。所以我们需要翻译。一种语言的命运取决于这种翻译方法。
1.编译者:提前翻译的专业翻译
2.口译员:实时同声传译

【代码验证】验证机器语言的真面目
光是听是无法感受到的。让我们直观地检查一下 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
分析:
另一方面,编译时,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)以瞄准其他语言”以及为什么基础知识对于避免成为框架的奴隶很重要。