.. 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的结果,那没有高层抽象,我们就会失去这个目标。 这里我们证明的是:有人认为我们只要丢上所有的细节,“抽象”自然就包含在这个信息里 面了,这其实是一厢情愿。