理解高级语言程序

理解高级语言程序

2024 南京大学《操作系统:设计与实现》
理解高级语言程序

灵魂拷问

既然说 “任何程序” 都和 minimal.S 是一样的

  • 为什么我们没有在 C 代码里看到系统调用?
  • C 代码是如何变成二进制文件的?
  • 到底编译器什么优化能做、什么优化不能做?
2024 南京大学《操作系统:设计与实现》
理解高级语言程序

Quick Quiz

你能写一个 C 语言代码的 “解释器” 吗?

  • 如果能,你就完全理解了高级语言
  • 和 logisim/mini-rv32ima 完全一样
while (1) {
  stmt = fetch_statement();
  execute(stmt);
}
2024 南京大学《操作系统:设计与实现》
理解高级语言程序

递归 v.s. 非递归

实现递归到非递归的转换

center

这个问题难到 GPT-4 都翻车了

int f(int n) { return (n<=1) ? 1 : f(n-1) + g(n-2); }
int g(int n) { return (n<=1) ? 1 : f(n+1) + g(n-1); }
2024 南京大学《操作系统:设计与实现》
理解高级语言程序

让我们先做一点简化

试图把 C 代码改写成 “SimpleC”

  • 成每条语句至多一次运算 (函数调用也是运算)
  • 条件语句中不包含运算
  • (暂时假设没有指针和内存分配)

Everything (C 程序) = 状态机

  • 状态 = 变量数值 + 栈
  • 初始状态 = main 的第一条语句
  • 状态迁移 = 执行一条语句中的一小步
    • 为什么你觉得还写不出汉诺塔?
2024 南京大学《操作系统:设计与实现》
理解高级语言程序

真正的 “理解”

“状态机” 是拥有严格数学定义的对象。这意味着你可以把定义写出来,并且用数学严格的方法理解它 —— 形式化方法

状态

  • [StackFrame, StackFrame, ...] + 全局变量

初始状态

  • 仅有一个 StackFrame(main, argc, argv, PC=0)
  • 全局变量全部为初始值

状态迁移

  • 执行 frames[-1].PC 处的简单语句
2024 南京大学《操作系统:设计与实现》