仓库源文

.. Kenneth Lee 版权所有 2022

:Authors: Kenneth Lee :Version: 1.0 :Date: 2022-03-17 :Status: Draft

抽象和细节的信息屏障


看这段描述:

  1. 地址总线上写入地址0x1234
  2. 数据总线上读出数据到寄存器r1
  3. 把r1加10输出到r2
  4. 地址总线最后一个字节修改成0x36
  5. 把r2写入数据总线

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

.. code-block::c

a = (int16_t *)4660; a[1] = a[0] + 10;

  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的结果,那没有高层抽象,我们就会失去这个目标。

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