iT邦幫忙

0

SICP Lec5b:計算對象 (數位電路模擬器 - part 1)

  • 分享至 

  • twitterImage
  •  

以下是對於 MIT SICP 課程影片(lec 5b)的心得記錄,part 1 為 [開始~31:00] 左右

當我們要開發一組非常複雜的程式,且讓程式可以被修改,對應真實世界的改變是對於思考比較經濟的,就是OOP物件導向的設計方式。

最完美的系統就是電氣系統,電氣系統有個非常棒的特性,每個部件都是個別的物件,而連接起來的電線非常清楚可見,非常重要的部分就是它們的關聯一目瞭然,一個燈泡接上電,電線的連接就是已知的關聯了,這樣是非常好作抽象的,可以清楚地在紙上畫出關係,廢話不多說,就讓我們開始來做一個電氣系統的程式吧。

構建 數位電路

基本元素:

https://ithelp.ithome.com.tw/upload/images/20190513/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
https://ithelp.ithome.com.tw/upload/images/20190513/20117516od5oN8gUiY.png
上面的圖可以看見一個很標準的抽象,對外的接口就是input: a,b與output s,c,且有一個邊界像盒子一樣把內部包起來,內部有兩個wire d,e,創造來連接內部元件的,d,e並沒有與外部連接

  • 抽象可以讓系統看起來非常有層次,這個層次建立於當元件組合抽象完成,就可以把它當成基本元件來使用
  • 抽象裡面的組合,其實需要資料結構去把元件起來,但在這裡其實可以看到,沒有資料結構,純粹用lambda匿名函式,lambda就是終極黏貼劑。

可以再繼續組合成 full-adder
https://ithelp.ithome.com.tw/upload/images/20190513/20117516e8NSQ2FdcS.png

基本元件內容

  • inverter
    https://ithelp.ithome.com.tw/upload/images/20190513/20117516mczNnXfLIL.png
    input object,inverter需要對input object(稍後解釋)說 "當你改變時,跟我說一聲",當input改變,會觸動中間那一行 add-action!,呼叫 inverter-in,且在裡面做set-signal!改變output object。

  • and-gate(or-gate以此類推)
    https://ithelp.ithome.com.tw/upload/images/20190513/20117516DmWQliIvFW.png

組合

https://ithelp.ithome.com.tw/upload/images/20190513/201175162axpVG8Anu.png
OO的設計方法裡,每一個元件都有自己的local state,如下:
https://ithelp.ithome.com.tw/upload/images/20190513/20117516ygRcg5T2fE.png

  • 每一個wire上會攜帶著信號(signal),及當信號改變需要做的事情(action-procedure, AP)像是通知前、後個元件要幹嘛...等
  • and-gate, inverter元件上需要紀錄 是哪個wire帶信號 及 信號是什麼,這裡寫成a1, a2 以及 ontput,

回顧一下整個程式運行的流程

and-gate

https://ithelp.ithome.com.tw/upload/images/20190513/20117516DmWQliIvFW.png

  1. 有三個parameters a1, a2, output,這三個是在and-gate被使用的環境中被綁定(binding)與wire object相連接。
  2. 在環境中構建一個流程 and-action-procedure,當中利用的參數就是從and-gate環境中binding的a1, a2, output。

wire

恩...好複雜
https://ithelp.ithome.com.tw/upload/images/20190513/20117516p9FPHQlUcW.png
https://ithelp.ithome.com.tw/upload/images/20190513/201175166l4eHA856o.png

  1. 首先創造變數 signal, action-procs
  2. 創造些流程set-my-signal定singal成新的值,且呼叫每一個 action-procs
  3. 還有add-action-proc,增加新的AP
  4. 定義dispatch,將信號分派給wire
    其實wire是一個接收signal然後產生proceduer的object,比如接收一個 "給我一個可以增加AP的procedure" ,wire回傳add-action-proc,讓request的人拿去用。

其他

https://ithelp.ithome.com.tw/upload/images/20190513/201175167w5if1At1A.png
這裡可以看到 get-signal, set-signal!, add-action!都是給一個字串去call wire來完成工作,有點像是經過一個 "許可" 的感覺。

時間、順序

實際上的電路會有些 "延遲",如何實現這些延遲與順序呢?
https://ithelp.ithome.com.tw/upload/images/20190513/20117516goFV0lJXzm.png

  1. 有個the-agenda procedure來實現每個action出現的順序
  2. propagenate 來控制它

數位電路模擬系統

完成如下:
https://ithelp.ithome.com.tw/upload/images/20190513/201175169pdrCaBTW3.png

小結

上述內容中可以看到,如何使用設計系統使其對應真實的物件

  1. 系統最重要的三個部分:基本元件、抽象、組合
  2. 所有拿取、修改state的方法都被包在 wire 裡面,要對state做動作,需要一個 "許可" 來獲取function。
  3. 不需要特別定義資料結構,有lambda就可以
  4. 時間、順序的實現需要特別注意(待part 2講解)

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言