📄 一句话概括
【退化】不是坏事,是把程序员的活儿交给机器——汇编 3 行变成 1 行,省下的由运行时接手。
📝 本节和前面几节的关系
4.11~4.12 讲了类型的两种放法,这一节回答那个疑问:语言是不是越写越省事了。
一、退化在这里的意思
不是变差,是把【能自动做的】交出去。
汇编三行 movl/addl/movl,C 一行 int total = a + b;——省掉的是机器该记的部分。
所以这个词带引号:从语言的角度看它退化了,从人的角度看它进化了。
二、实测省掉了什么
类型声明、语句结束符、括号——四门语言排一行就能看出来。 汇编 3 行,C/Java/Python 各 1 行。 省掉之后谁负责?运行时。
三、每一样都有代价
类型声明交给运行时推断——慢一点,错晚发现(4.11 讲的正是这个)。 内存释放交给垃圾回收——会停顿,内存占用大一点(4.17 会实测)。 指针运算被语言禁掉——安全了,但少一点控制力。 没有免费的省事。只是把麻烦从一个地方挪到另一个地方。
四、怎么判断一门语言好不好用
看它把哪部分自动化了、代价你能不能接受。 写脚本要的是省事,代价(慢一点)可以接受;写驱动要的是控制,代价(手动管理)必须自己扛。 所以【哪门语言更好】这个问题没有答案,【这个场景该付哪种代价】才有答案。
五、动手 Demo:编程语言【退化】了吗
同一条加法,在四个年代的语言里各要写多少行。 再看省掉的那些活儿,最后落到了谁手上。
src = {
"汇编": ["movl a, %eax", "addl b, %eax", "movl %eax, total"],
"C": ["int total = a + b;"],
"Java": ["int total = a + b;"],
"Python": ["total = a + b"],
}
for k, v in src.items():
print(k, len(v), "行")
实跑输出:
--------------------------------------------------------------------
编程语言【退化】了吗
--------------------------------------------------------------------
这里说的【退化】不是坏事,**是【把程序员的活儿交给机器】。**
实测同一条语句在不同年代语言里要写多少:
年代/语言 要写什么 行数
-------------------------------------------
汇编 movl/addl/movl 3
C int total = a + b; 1
Java int total = a + b; 1
Python total = a + b 1
实测省掉的东西:**类型声明、结束符、括号。**
省掉之后谁负责?**运行时。**
被省掉的 谁接手 代价
---------------------------------------------
类型声明 运行时推断 慢一点、错晚发现
内存释放 垃圾回收 停顿、内存多用
指针运算 语言禁掉 少一点控制力
**所以【退化】的真相是:把【能自动做的】交给机器,人只做【不能自动做的】。**
**判断一门语言好不好用,就看它把哪部分自动化了、代价你能不能接受。**
实测:汇编 3 行,C/Java/Python 各 1 行,省掉的是类型声明、结束符、括号。 省下的活儿交给了运行时:类型推断、垃圾回收、禁止指针运算——每一样都有代价。
30 秒实验
- 找一段你写起来最省事的代码,想一想到底是谁替你把哪部分做了。
- 在你常用的语言里找一个【省事但慢】的特性,判断这个代价你能不能接受。
常见误区
- 以为退化是贬义。它说的是把活儿交给机器。
- 以为越省事越好。每一种省事都对应一种代价。
自测三问(点开对答案)
1. 这里的【退化】指什么? —— 把程序员的活儿交给机器:类型声明给运行时推断、内存释放给垃圾回收、指针运算被禁掉。 2. 同一条加法四种语言各几行? —— 汇编 3 行,C/Java/Python 各 1 行。 3. 怎么判断一门语言好不好用? —— 看它把哪部分自动化了、代价你能不能接受——没有普适答案,只有场景取舍。- ☐ 下一节(4.14 更先进的OOP结构)
相关笔记
- 通过嵌入类型使程序员的工作变轻松 — 省掉类型声明的代价
- 进化的OOP结构之三:垃圾回收 — 省掉内存管理的代价
- 高级语言使程序更加接近人类语言 — 这条路的起点
- 🧩 面向对象是怎样工作的 · 索引