3.287. 抽象和细节的信息屏障

看这段描述:

  1. 地址总线上写入地址0x1234

  2. 数据总线上读出数据到寄存器r1

  3. 把r1加10输出到r2

  4. 地址总线最后一个字节修改成0x36

  5. 把r2写入数据总线

下面是软件角度描述的这个行为:

  1. 地址总线上写入地址0x1234

  2. 数据总线上读出数据到寄存器r1

  3. 把r1加10输出到r2

  4. 地址总线最后一个字节修改成0x36

  5. 把r2写入数据总线

来,让我们聚焦到这两段描述的信息细节上看问题,它们有什么相似的地方吗?我认为没有。丢开我们脑子里的那些一一关联的连线,它们表达的信息完全不一样。

只有我们额外补充了整个C语言对机器行为的一一对应,我们才能建立两者的关联。后者是前者在某种C语言实现基础上对前者的抽象。

但前者包含了后者的所有信息吗?如果不带上那个一一对应关系,前者完全可以放飞自我,比如变成成这样:

  1. 地址总线上写入地址0x1234

  2. 把低位字节为1的引线电压提高到2V

  3. 数据总线上读出数据到寄存器r1

  4. 把r1内容输出到串口

  5. 回到1,重复10次

这个发展还能用上面的软件抽象来表达吗?

不能,细节可以完全按自己的逻辑发展,脱离抽象对它的约束。但如果我们的目的在抽象上,比如我们就是要计算a[1]=a[0]+10的结果,那没有高层抽象,我们就会失去这个目标。

这里我们证明的是:有人认为我们只要丢上所有的细节,“抽象”自然就包含在这个信息里面了,这其实是一厢情愿。