SICP Lec5b:计算对象 (数位电路模拟器 - part 1)

以下是对于 MIT SICP 课程影片(lec 5b)的心得记录,part 1 为 [开始~31:00] 左右

当我们要开发一组非常複杂的程式,且让程式可以被修改,对应真实世界的改变是对于思考比较经济的,就是OOP物件导向的设计方式。

最完美的系统就是电气系统,电气系统有个非常棒的特性,每个部件都是个别的物件,而连接起来的电线非常清楚可见,非常重要的部分就是它们的关联一目了然,一个灯泡接上电,电线的连接就是已知的关联了,这样是非常好作抽象的,可以清楚地在纸上画出关係,废话不多说,就让我们开始来做一个电气系统的程式吧。

构建 数位电路:

基本元素:

http://img2.58codes.com/2024/201175160ViHuuMhMH.png
右边三个图片是数位电路中的基本元件,Inverter, And-gate, Or-gate、wire,用wire(在系统当中代表电压、电流信号)将其串在一起,形成电路系统。

a, b, c, d, e, s每个wire都是由一个function称为 make-wire所产生。以or-gate为例子,or-gate接收两个input a, b,输出output d,其他的元件以此类推。

抽象:

拥有以上的基本元件之后,就可以在组合出其他更大型的元件,如 half-adder
http://img2.58codes.com/2024/20117516od5oN8gUiY.png
上面的图可以看见一个很标準的抽象,对外的接口就是input: a,b与output s,c,且有一个边界像盒子一样把内部包起来,内部有两个wire d,e,创造来连接内部元件的,d,e并没有与外部连接

抽象可以让系统看起来非常有层次,这个层次建立于当元件组合抽象完成,就可以把它当成基本元件来使用。抽象里面的组合,其实需要资料结构去把元件黏起来,但在这里其实可以看到,没有资料结构,纯粹用lambda匿名函式,lambda就是终极黏贴剂。

可以再继续组合成 full-adder
http://img2.58codes.com/2024/20117516e8NSQ2FdcS.png

基本元件内容

inverter
http://img2.58codes.com/2024/20117516mczNnXfLIL.png
input object,inverter需要对input object(稍后解释)说 "当你改变时,跟我说一声",当input改变,会触动中间那一行 add-action!,呼叫 inverter-in,且在里面做set-signal!改变output object。

and-gate(or-gate以此类推)
http://img2.58codes.com/2024/20117516DmWQliIvFW.png

组合

http://img2.58codes.com/2024/201175162axpVG8Anu.png
OO的设计方法里,每一个元件都有自己的local state,如下:
http://img2.58codes.com/2024/20117516ygRcg5T2fE.png

每一个wire上会携带着信号(signal),及当信号改变需要做的事情(action-procedure, AP)像是通知前、后个元件要干嘛...等and-gate, inverter元件上需要纪录 是哪个wire带信号 及 信号是什么,这里写成a1, a2 以及 ontput,

回顾一下整个程式运行的流程

and-gate

http://img2.58codes.com/2024/20117516DmWQliIvFW.png

有三个parameters a1, a2, output,这三个是在and-gate被使用的环境中被绑定(binding)与wire object相连接。在环境中构建一个流程 and-action-procedure,当中利用的参数就是从and-gate环境中binding的a1, a2, output。

wire

恩...好複杂
http://img2.58codes.com/2024/20117516p9FPHQlUcW.png
http://img2.58codes.com/2024/201175166l4eHA856o.png

首先创造变数 signal, action-procs创造些流程set-my-signal定singal成新的值,且呼叫每一个 action-procs还有add-action-proc,增加新的AP定义dispatch,将信号分派给wire
其实wire是一个接收signal然后产生proceduer的object,比如接收一个 "给我一个可以增加AP的procedure" ,wire回传add-action-proc,让request的人拿去用。

其他

http://img2.58codes.com/2024/201175167w5if1At1A.png
这里可以看到 get-signal, set-signal!, add-action!都是给一个字串去call wire来完成工作,有点像是经过一个 "许可" 的感觉。

时间、顺序

实际上的电路会有些 "延迟",如何实现这些延迟与顺序呢?
http://img2.58codes.com/2024/20117516goFV0lJXzm.png

有个the-agenda procedure来实现每个action出现的顺序由 propagenate 来控制它

数位电路模拟系统

完成如下:
http://img2.58codes.com/2024/201175169pdrCaBTW3.png

小结

上述内容中可以看到,如何使用设计系统使其对应真实的物件

系统最重要的三个部分:基本元件、抽象、组合所有拿取、修改state的方法都被包在 wire 里面,要对state做动作,需要一个 "许可" 来获取function。不需要特别定义资料结构,有lambda就可以时间、顺序的实现需要特别注意(待part 2讲解)

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章