数学视角的计算机程序

数学视角的计算机程序

2025 南京大学《操作系统原理》
数学视角的计算机程序

程序的本质

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

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

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

Quick Quiz

  • 怎样给出 ff 的定义?
  • (《离散数学》课程内容)
2025 南京大学《操作系统原理》
数学视角的计算机程序

《离散数学》没学好?

马院:怎么大家考那么烂?期末开卷均分 40 几分?

助教:我一直觉得这个课问题很大……讲得东西太多了,每个部分都没讲清楚……一学期有 30 次左右作业,助教也来不及出题,学生也来不及做,就抄答案……但没讲清楚计算机人为什么要学离散数学……”

jyy: 讲那么快怎么可能学得懂?

所以我主张把离散数学拆了

  • 第一门课只教用数学严格的语言描述计算机世界中的对象
    • 我想叫它《计算机科学的数学基础》
      • Proof Assistant (妄想)
  • 第二门课 (选修) 再讲结构
2025 南京大学《操作系统原理》
数学视角的计算机程序

一个设想

把时间还给同学们

  • 艰难地推进中

center

2025 南京大学《操作系统原理》
数学视角的计算机程序

再看程序的本质

为什么会有程序?

  • 是因为程序必须在无情执行指令的机器上执行
  • 只有程序才配得上它

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

  • 人类的一面:程序连接了人类世界需求
    • 语言模型有非常惊艳的编程能力
  • 反人类的一面:程序会在机器上执行 😂
    • 语言模型还是经常有幻觉
      • (对程序的行为的 100% 掌控就是非常困难的)
  • “Maintainability”: 代码字面意义实际行为直接关联
2025 南京大学《操作系统原理》
数学视角的计算机程序

我们能证明程序的正确性吗?

int popcount(int x) {
    int count = 0;
    while (x) {
        x -= (x & -x);
        count++;
    }
    return count;
}
2025 南京大学《操作系统原理》
数学视角的计算机程序

我们能证明程序的正确性吗? (cont'd)

我们还需要 “什么叫对”

  • Specification: 不 crash; 没有 UB; assert satisfy, ...
int popcount(int x) {
    int count = 0;
    while (x) {
        x -= (x & -x);
        count++;
    }
    return count;
}

void popcount_spec() {
    for (uint64_t x = 0; x <= 0xffffffff; x++) {
        assert( ((x >> 0) & 1) + 
                ((x >> 1) & 1) + ...
                ((x >> 31) & 1) == popcount(x) );
    }
}
2025 南京大学《操作系统原理》
数学视角的计算机程序

证明程序 ff 正确

For all executions of ff, the specification is satisfied.

暴力枚举

  • 写一个 driver code,枚举所有的 xx,运行 f(x)f(x)
    • Testing: 选一些有代表性的

写出证明

  • 直接证明 “For all executions of ff, the specification is satisfied.”
    • 就和你在《离散数学》课上的证明一样
2025 南京大学《操作系统原理》
数学视角的计算机程序

证明程序 ff 正确 (cont'd)

“Proof Assistant” (Coq, Lean, ...)

center

2025 南京大学《操作系统原理》