库是别人写好的工具箱(你调用它),框架是盖到一半的毛坯房(它调用你)——判断标准只有一条:谁控制主流程。DLL/SDK 是库在不同场景的包装形态。
上游:C++ 10.6 · 命名空间 与 5-22 模块包已铺垫「代码怎么组织复用」;本篇上升到「拿来主义」的完整图景。下游:6-3 的 CSS 框架、6-8 的 jQuery 都是库/框架的实例;6-17 的开源许可决定你能不能白拿这些工具箱。
一、库(Library):你调用它
库 = 编译/打包好的一堆功能,你的代码是主流程,需要时调一下库:
import math # 导入库
print(math.sqrt(2)) # 1.4142... —— 求平方根这种活,30 年前就有人写好了
链接的两种姿势(以 C/C++ 最直观):
- 静态库(.a / .lib):编译时把库代码复制进你的程序——成品胖、但拿走就能跑、不依赖环境。
- 动态库(.so / DLL(Dynamic-Link Library,Windows 动态链接库)):运行时才加载共享——成品瘦、多个程序共用一份、库升级全体受益;代价是「DLL 地狱」=缺库/版本不匹配程序就起不来。
- Python 的 import、Java 的 classpath,本质都是动态链接思路的包装。
二、SDK:一族库+说明书+工具
SDK(Software Development Kit,软件开发工具包)=针对某个平台的整套开发资源:库+头文件+文档+示例+调试工具。Android SDK、树莓派课的 rpicam-apps 都是——「我要在这块硬件上开发,先装它的 SDK」。
三、框架(Framework):它调用你
框架同样是别人写的代码,但主流程在框架手里,你往预留的空位填业务:
# Flask(Web 框架)——你的代码只是「填空」
from flask import Flask
app = Flask(__name__)
@app.route("/") # 框架:收到访问 / 的请求时
def home(): # 你:只填这一个函数
return "hello"
app.run() # 主循环由框架跑,你从不写 while True
框架给的是结构(5-9 生命周期里的标准流),库给的是零件。框架的「控制权反转」(IoC)正是 5-23 依赖注入思想的土壤。框架通常也内含一堆库(Flask 就捎带了 HTTP 工具箱 Werkzeug)。
动手 Demo:同一个功能,「自己写 vs 用库」
import timeit
# 写法一:手写求和(自己当主流程)
def my_sum(n):
total = 0
for i in range(1, n + 1):
total += i
return total
# 写法二:用内置 sum(库)
print(my_sum(100), sum(range(1, 101))) # 5050 5050 —— 结果一样
print(timeit.timeit(lambda: my_sum(100000), number=100))
print(timeit.timeit(lambda: sum(range(1, 100001)), number=100))
看到什么算成功:两种写法结果一致;计时通常是库快好几倍(C 实现)——用库不只是省事,多数时候还更快更稳。
读结果:手写版是学习工具,库是生产工具。「不要重复造轮子」的前提是先知道轮子存在——所以读文档、逛仓库也是程序员的日常功课。
30 秒实验
在 Python 里跑 import this——输出《Python 之禅》二十条。第 7 条「可读性很重要」之前,第 5 条就是 「Simple is better than complex」,第 11 条「Now is better than never」——标准库连彩蛋都在劝你用现成的好东西。
常见误区
- 「库和框架是一回事」——区别在控制权:你调用库,框架调用你(好莱坞原则:别打电话给我们,我们会打给你)。
- 「DLL 是病毒」——DLL 本身是正当机制;「DLL 劫持」是攻击者利用搜索顺序放恶意 DLL(见 6-19)。
- 「静态库一定更好」——体积大、库有漏洞得整体重编;动态库共享升级,但依赖环境。按场景选,没有绝对赢家。
自测三问(点击展开)
1. **库和框架最本质的区别?** 答:控制权——库被你调用(你是主流程),框架调用你(它是主流程,控制权反转)。 2. **DLL 是什么、好处是什么?** 答:Windows 动态链接库;运行时共享加载,程序瘦、多程序共用一份、升级方便。 3. **SDK 和库的关系?** 答:SDK = 库 + 头文件 + 文档 + 工具 + 示例的整套平台开发资源,库是其中的核心零件。- ☑ 6-2 完成 —— 工具箱与毛坯房:库/SDK/框架一张图
- ☐ 下一节 6-3 CSS、CSS框架
相关笔记
- C++ 15.1.1 · 流类库 —— 用了一整章的「库」长什么样
- 模块与包 —— 代码组织的前一站
- DI —— 框架控制权反转的落地手法
- ⌨️ 编程原理 · 索引 —— 全课路线图