1. 程式人生 > >第5章 用暫存器機器計算

第5章 用暫存器機器計算

第5章 用暫存器機器計算

我的目標是展示出 heavenly天使 機器 不是 divine, live being生靈 的一種,
而是 clockwork 鐘錶匠(他認為時鐘具有製作者賦與其的對工作的榮耀感的靈性)
的一種, 在一種最簡單的和材料的力量的範圍內  引起了幾乎所有的 多種多樣的[manifold] 運動[motion],
正如一種單獨的 重力[weight] 引起了鐘的所有的運動[motion]

以LISP語言寫成的程式為單位,通過研究流程和描述流程,我們開始了本書的內容。
為了解釋這些程式的含義,我們使用了一系列的解釋模型:第一章的替代模型,
第三章的環境模型,和第四章的元迴圈的直譯器。元迴圈的直譯器的問答題特定了揭示出了
類LISP語言是如何被解釋的大部分的奧祕。 但是即使是元迴圈的直譯器,仍留下了重要的問題
沒有回答,因為它沒有做到闡明在LISP系統中的控制機制。例如,直譯器沒有闡明
子表示式的解釋過程如何管理返回一個值到使用這個值的表示式,直譯器也沒有闡明一些遞迴程式生成了
迭代的執行過程,(也就是解釋過程式使用固定大小的空間)而另一些程式生成遞迴的執行過程。
這些問題沒有被回答,是因為元迴圈的直譯器本身是個LISP程式,因此它繼承了LISP系統的控制結構。
為了對LISP的直譯器的控制結構提供一個更完整的描述,我們必須在一個比LISP本身更原生的層次上工作才行。

在這一章中,我們用一個傳統的計算機的一步步地執行操作為單位,來描述流程。
這樣一個計算機,或者說是暫存器機器,序列化地執行指令,這些指令操作一個
儲存元素的有限的集合的內容。這個儲存元素的有限的集合被叫做暫存器。一個典型的
暫存器機器指令應用一個原生的操作到一些暫存器的內容上並且把結果賦值給另外的暫存器。
我們的對於被暫存器機器執行的流程的描述看起來非常像傳統計算機的機器語言的程式。
然而,取代對任何特定的計算機的機器語言的關注,我們通過對一些LISP程式的使用研究,
設計一個特定的暫存器機器,來執行任一個程式。因此,我們完成我們的任務從一個硬體的架構師
的角度而不是一個機器語言的計算機程式設計者的角度。在設計暫存器機器的過程中,
我們開發了為實現重要的程式設計的組裝的機制,例如遞迴。我們也表示出一種語言,
為了描述暫存器機器的設計。在5.2部分,使用這些描述,我們實現了一個LISP程式,
來模擬我們設計好的機器。

我們的暫存器機器的原生操作的大部分內容都是很簡單的。例如,一個操作是把從兩個暫存器
取到的數相加,生成的結果存入第三個暫存器中。這樣的操作能夠被簡單描述的硬體來執行。
為了處理列表結構,我們也使用記憶體的操作car,cdr,cons.它們都要求有一個 變得複雜的[elaborate]
儲存分配的機制。在5.3部分中,我們用更底層的操作來實現它們。

在5.4部分中,在我們已經積累了寫就暫存器機器的程式的經驗以後,我們將設計一個機器,
來執行4.1部分中的元迴圈的直譯器描述的演算法。通過提供直譯器的控制機器的一個隱式的模型,
這將彌補我們對SCHEME表示式如何被解釋執行的理解上的空隙。
在5.5部分中,我們研究了一個簡單的編譯器,用來把SCHEME程式翻譯成能夠被暫存器機器
的暫存器和操作直接執行的指令序列。