🔵 静态语言(C/C++/Rust/Go)
① 编译期(Compile Time)
int add(int a, int b) {
return a + b;
}
// 类型在编译期已确定:int = 4字节,直接机器指令
② 操作系统加载(OS Loader)
③ 内存布局(Memory Layout)
代码段 .text
0x400000
机器指令(只读,可执行)
mov eax,edi | add eax,esi | ret
数据段 .data
0x500000
全局变量(编译期确定大小)
堆 heap ↑
0x700000
动态分配(malloc/free)
栈 stack ↓
0x7ffffff0
局部变量、函数参数、返回地址
④ CPU 执行(无运行时类型检查)
CPU 寄存器状态(执行 add(1, 2) 过程)
RAX
0x0000
RDI
0x0000
RSI
0x0000
RIP
0x0000
Step 1: RIP = 0x400000, 取指: mov eax, edi (a=1 传入 edi)
Step 2: RIP = 0x400002, 取指: add eax, esi (b=2 传入 esi, eax=1+2=3)
Step 3: RIP = 0x400004, 取指: ret (返回,结果 3 在 eax 中)
✓ 完成:无类型检查,3 条指令,~0.5ns
🔴 动态语言(Python/JavaScript/Ruby)
① 解释/编译期(Interpret / JIT)
def add(a, b):
return a + b
# 类型在运行期才确定!a 和 b 可以是 int/str/list/任意对象
② OS 加载解释器(Interpreter Runtime)
③ 内存布局(含运行时对象系统)
解释器机器码
0x400000
python.exe 本身的机器指令
类型系统 Type Objects
0x500000
int/str/list/dict 等类型对象(运行时存在!)
PyLong_Type | PyString_Type | PyList_Type
对象堆 Object Heap
0x700000
所有变量都是对象(带类型头部的结构体)
[ob_refcnt|ob_type|ob_val] 每个int占28字节!
栈(引用,非对象)
0x7ffffff0
局部变量 = 对象引用(指针),非对象本身
④ CPU 执行(含运行时类型分派)
CPU 执行解释器的机器指令(解释执行 add(a,b))
RAX
0x0000
RBX
0x0000
RCX
0x0000
RIP
0x0000
Step 1: 解释器取字节码 BINARY_ADD → 查 a->ob_type->tp_as_number->nb_add
Step 2: 确认 a 是 PyLongObject → 调用 long_add(a, b)
Step 3: 执行加法 → 新建 PyLongObject 存结果 → ob_refcnt=1
Step 4: 可能涉及 GC → 检查引用计数 → 可能触发回收
⚠ 完成:多次类型查询+对象分配,~50-100ns(慢100倍)