数学视角的程序

数学视角的程序

2024 南京大学《操作系统:设计与实现》
数学视角的程序

数千年来……

数学的 “严格性” 都是由人类保证的

center

2024 南京大学《操作系统:设计与实现》
数学视角的程序

程序的本质

程序是一种 “数学严格” 的对象

  • Everything is a state machine
    • 程序 = 初始状态 + 迁移函数
    • 在这个视角下,程序和数学对象已经无限接近了

f(s)=sf(s) = s'

然而,人类并不擅长 “数学严格”

  • 我们经常写出 “似是而非” 的代码
  • 类似于细节有错但可以修正的数学证明
    • for (int j = 0; j < n; i++)
    • (有时候也会疏忽,导致设计全错)
2024 南京大学《操作系统:设计与实现》
数学视角的程序

程序的本质 (cont'd)

为什么会有程序?

  • 是因为我们有无情的执行指令的机器 (计算机)
  • 只有程序才配得上它

程序天生是 “人类” 的,也是 “反人类” 的

  • 人类的一面:程序连接了人类世界需求
    • 我们并不是在实现 “uniform-random” 的 ff
  • 反人类的一面:程序会在机器上执行 😂
    • 初学者对 “机器严格” 普遍不太适应
    • 部分原因是对程序的行为没有 100% 的掌控
2024 南京大学《操作系统:设计与实现》
数学视角的程序

当我们谈论数学的时候,我们想谈论什么?

证明程序正确性!

@dataclass
class AlipayAccount:
    b: int = 0  # Balance

    def deposit(...): ...
    def withdraw(...): ...
    def transfer(...): ...

我们可以用数学的语言提出程序的规约

  • 例如:任意时刻 a.b0a.b \ge 0
  • 有没有可能真正 “证明” 它呢?
2024 南京大学《操作系统:设计与实现》
数学视角的程序

程序正确性证明的两种方法

暴力枚举

  • 写一个 driver code,运行所有可能的函数调用序列
    • PL/SE 已经研究生成 driver code 几十年了
    • assert(b0b \ge 0)
  • 如果机器和 driver 都没有 bug,程序就是对的

写出证明

  • For all ff-reachable states, b0b \ge 0 holds.
  • ff 写一份数学证明就行了
    • 就像你在上数学课时做的习题一样
2024 南京大学《操作系统:设计与实现》
数学视角的程序

是的,我们可以 “写证明”

而且还有另一个程序能帮我们检查!

center

2024 南京大学《操作系统:设计与实现》
数学视角的程序

一些 Insights

暴力枚举带来的启发

  • 我们应该把需要证明的性质写成 assertions
  • assert(u->prev->next == u)
    • 至少可以避免 “悄悄出错” 的情况发生

写出证明带来的启发

  • 容易阅读 (self-explain) 的代码是好代码
    • 能把代码和需求联系起来
  • 容易验证 (self-evident) 的代码是好代码
    • 能把代码和正确性证明联系起来
    • “Proof-carrying code”
2024 南京大学《操作系统:设计与实现》