⌨️ 第二章 编程语言都有什么不同
📄 一句话概括

语言离硬件越近越难写、离人越近越要一层翻译;【跨平台】就是让同一段代码换个电脑还能跑——实现它有两条完全不同的路:源码跨平台(到哪都重新编译)和二进制跨平台(带着虚拟机走天下)。

📝 本节和前面几节的关系

2-1 说清了【翻译】这道关,本节按【翻译的抽象层级】给语言排队——低级语言贴着硬件走,高级语言贴着人走;上一节埋的【执行文件绑定平台】伏笔,在本节由【跨平台】两条路收掉。

一、低级语言:贴着硬件走

机器码:CPU 直接执行的二进制指令,人类几乎无法阅读(计算机基础第 05 篇见过它的真容)。 汇编语言:给机器码起的人类可读名字——MOV(搬)、ADD(加)。它和机器码一一对应,仍然贴着硬件。

低级语言的特征:

二、高级语言:贴着人走

高级语言用接近自然语言与数学的方式表达逻辑,把【怎么管理硬件】托付给编译器/解释器。一个 a + b,在汇编里是【取 a 入寄存器、取 b 入寄存器、相加、存回】四步,在 Python 里就是一行。

抽象层级每升一层,代价与收益同步换手:

层级 代表 你得到 你交出
机器码 —— 最快 没法写
汇编 x86/ARM 汇编 精确控制每个时钟 开发慢到绝望、不可移植
高级·编译型 C、C++、Rust 快、精确 手动管理内存、重新编译
高级·虚拟机型 Java、C# 跨平台、自动内存 启动慢一点、多一层 VM
高级·解释型 Python、JS 最快上手、最灵活 运行速度垫底

【低级/高级】说的是抽象程度,不是能力高低——汇编能干的高级语言干不了(某些硬件操作),反之亦然;只是各自的【人机界面】离谁更近。

三、跨平台的两条路

【跨平台】=同一段代码在 Windows、macOS、Linux(还有树莓派)上都能用。两条实现路径:

① 源码跨平台:到哪都重新编译

C/C++ 的方式。源代码本身是通用的,但每个平台各编译一次,产出各自平台的机器码执行文件。代价是开发方要维护多平台构建(不同平台的编译器行为、库还有差异——C++ 课 1.2 提过 Dev-C++ 与 Visual Studio 的差异就是雏形)。

② 二进制跨平台:带着虚拟机走天下

Java 的方式,口号是【一次编写,到处运行】。源代码只编译一次成字节码,各平台各装一个 JVM,由 JVM 把字节码翻译成本平台的机器码(怎么高效翻译是 2-9 的主题)。Python 解释器同理——你的 .py 脚本没为树莓派编译过,它照样跑,因为各平台的解释器早已各就各位。

对比 源码跨平台(C/C++) 二进制跨平台(Java/Python)
搬运物 源代码 字节码/脚本
平台上发生什么 重新编译 VM/解释器执行
性能上限 更高 略低(多一层)
开发方负担 维护多平台构建 只维护一份产物

四、动手 Demo:一段代码,两台机器

同一个脚本,在你的 Windows 电脑和树莓派(x86 与 ARM 两种 CPU)上原样都能跑:

import platform

print("操作系统:", platform.system())
print("CPU 架构:", platform.machine())

在你的 Windows 上跑,看到什么算成功:

操作系统: Windows
CPU 架构: AMD64

读结果:这份 .py 文件从未针对任何平台编译过,却能同时报告出两台完全不同的机器——【二进制跨平台】(更准确说:脚本跨平台)的直观证据。把它拷到树莓派上再跑一次,第二行会变成 aarch64,而代码一个字没改。

五、30 秒实验

翻一翻你电脑上某个安装好的软件目录(比如 C:\Program Files 下的任意一个):找到的 .exe 都是别人替你编译好的机器码。再想想 Python 官网下载的安装包——你装的其实是【解释器本身】,而它自己也是编译好的执行文件。解释器也是别人的程序,这个循环关系值得回味 30 秒。

六、常见误区

  1. 【低级语言=过时的语言】——错。【低级】指抽象层级低(离硬件近),不是落后;写操作系统内核非它不可。
  2. 【高级语言跨平台是理所当然的】——错。Python 脚本能到处跑,是因为每个平台都有人提前把解释器编译好了;跨平台的成本只是被转移了,不是消失了。
  3. 【汇编已经没人用了】——不准确。它退出了应用开发,但内核启动、驱动热点、逆向分析仍是主战场;TIOBE 2026-09 榜单上 Assembly language 仍排第 16 位。
自测三问(点开对答案) 1. **汇编语言和机器码是什么关系?** 答:一一对应——汇编指令是机器码指令的人类可读别名,两者贴着同一套 CPU 指令集。 2. **【一次编写,到处运行】靠什么实现?** 答:字节码+各平台的虚拟机(JVM 等):源代码只编译一次成字节码,翻译成本平台机器码的活由各平台的 VM 干。 3. **C/C++ 的跨平台与 Java 的跨平台,本质区别在哪?** 答:C/C++ 跨的是【源代码】(各平台重新编译出各自的机器码),Java 跨的是【编译产物】(字节码不动,各平台 VM 现场翻译)。

相关笔记