1. 程式人生 > >5.1.2 在機器設計中的抽象

5.1.2 在機器設計中的抽象

5.1.2 在機器設計中的抽象
我們將經常定義一個機器包含著原生的操作,這個原生的操作實際上可能是非常複雜的。
例如在5.4和5.5部分中,我們把SCHEME的環境操作當成上原生的操作。這種抽象是非常有價值的。
因為它允許我們忽略機器的部分的細節,為了能夠集中精力於設計的其它方面。
事實是我們能夠隱藏起很多的複雜度,然而這並不意味著機器的設計是非現實的。
我們總是能夠用更簡單的原生操作來實現這個複雜的原生操作。

考慮GCD機器。機器有一個指令計算暫存器A和B的內容的餘數,並且把結果賦值給暫存器t.
如果我們要組裝GCD機器沒有使用一個原生的餘數操作,我們必須指定如何用簡單的操作來
計算餘數,例如減法。的確,我們能夠寫一個scheme程式來以如下的方式找到餘數:

(define (remainder  n d)
   (if   (<  n  d)  
            n 
           (remainder  (- n  d)  d))
)

在GCD機器的資料路徑中我們能因此把求餘數的操作替換成一個減法與一個比較測試的操作。
圖5.5顯示了這個更詳盡的機器的資料路徑和控制器。

指令   (assign  t  (op rem)  (reg  a) (reg b))  在GCD的控制器定義被替換成包括了一個迴圈的指令
序列,如圖5.6所示。

(controller 
         test-b 
               (test  (op =) (reg b) (const 0)) 
               (branch  (label  gcd-done))
               (assign  t    (reg  a))
         rem-loop
                (test  (op <)  (reg  t)  (reg  b))
                (branch  (label  rem-done))
                (assign   t    (op  -)   (reg  t)  (reg b))
                (goto  (label  rem-loop))
         rem-done       
               (assign  a  (reg b))
               (assign  b  (reg t))
               (goto (label  test-b))
        gcd-done
)

圖5.6  在圖5.5中的GCD機器的控制器指令序列。

練習5.3  設計一個機器來使用牛頓法計算平方根,如1.1.7部分中的描述那樣。

(define (sqrt x)
  (define (sqrt-iter guess)
    (if (good-enough? guess)
         guess
  (sqrt-iter (improve guess))
     ))
  (define (good-enough? guess)
    (< (abs (- (square guess) x))  0.0001))
  (define (improve guess)
        (average guess (/ x guess)))
   (sqrt-iter 1.0)
)

通過假定good-enough? 和improve操作是作為原生的操作可直接利用的。然後顯示
如何用算術操作實現它們。描述sqrt機器設計的每個版本,通過畫資料路徑圖和以暫存器
機器語言寫出它的控制器定義。