lisp eval apply_SICP远古魔法-LISP概览(1-2)
我們之所以能夠像今天這樣構建豐富多彩的應用是因為,我們有大系統中控制復雜度技術。
實際上這種技術在其它領域早已存在。例如造火箭,蓋房子。但是計算機科學又和他們不太一樣,因為計算機科學處理的不是真實的情況,而是虛擬的。
例如在物理上我們構建1個放大器,或者2個放大器進行串聯都很容易,這時噪聲影響很小。但是當我們構造百萬個放大器串聯的時候,可能在還沒有達到百萬的時候,物理噪聲的影響已經使其變得不可用了。
而計算機科學處理的都是理想化的組件。像數據結構或者是代碼,我們是可以隨心所欲地組合的,我們完全不用擔心會有什么物理問題。從邏輯上來講只要是我們能想出來的我們就能構建出來,完全不用擔心物理定律、噪聲等會對它產生某種約束。唯一的約束就是我們的想像力。
那大型系統中控制復雜度都有哪些技術呢?
1.黑盒抽象:將一些東西封裝從而不關心內部細節。
例如上一節提到的求平方根的方法。我們定義好輸入和輸出,當輸入為36的時候,這個盒子可以輸出6。這樣做的一個優點是,我們可以把這個盒子交給其它人使用,例如有個人想計算
,他無需知道開平方是如何實現的,盒子的內部是什么樣的并不重要。使用黑盒的的好處之一是這樣我們可以在不掌握所有細節的時候可以用其它的盒子去構建更大的盒子。而另一個原因是,我們可以構建更抽象一層的通用方法。例如我們上一節提到的求平方根的方法,我們在求解平方根的方法再抽象一層,將其歸納為求解不動點的通用方法。換句話說。我們可以應用獲取不動點的方法來得到一個求解平方根的方法。
下面是求解平方根的方法:
如何求的平方根?1.隨便猜一個數叫G
2.改進你的猜想通過計算 G 和 X/G的平均值
3.不斷重復步驟2,直到滿意為止
我們將其抽象如下圖:
從圖中,我們可以看到,我們構建盒子的時候是可以不限制輸入和輸出必須是數字的。輸入和輸出也可以是一個函數、過程、或者是其它盒子,這些都一樣。換句話說,我們可以通過輸入一個過程從而生成另一個過程,而這種處理方式其實非常強大,我們將在后面體會他的強大之處。
下面我們列出了黑盒抽象在后面的文章會具體討論內容大綱:
Lisp的基本對象:基本過程和基本數據結構組合方法:如何用基本的過程來構建更復雜的過程,基本數據組成復合數據
抽象:過程的定義簡單的數據抽象。
提煉共性:高階過程數據和過程的共性。
2.約定接口:按照約定來實現相應的接口。這個我們第2個應對大型復雜系統的方法。
下面我們通過舉例的方式來理解下為什么約定接口能解決復雜性問題。首先假設我們有一個想法是想把2個元素相加后再乘以某個元素。我們用如下的符號來表示。這種表示方式大家都比較好理解,因為他有我們隱含的約定。
而計算機一般比較擅長處理前綴表達式,于是我們寫成前綴表達式如下,這個表達式和上面等價,只不過位置換了一下。
當我們在進行數學運算的時候,例如我們代入下面的數字,如下的表達式結果為8。
現在思考這樣一個問題,我們希望這樣的描述是通用的,例如
還有 也可以是一個向量,也可以是一個多項式、也可以是一個電信號。上面的表達式可以對不同類型都起作用。所以我們希望我們的編程語言是可以支持描述這樣的抽象,也就是對于不同的參數類型,可以做不同的運算。實際上,如對于不同的類型,他們的處理方式顯然是不同的。那么我們如何運用這些過程去處理不同數據類型呢?
我們不但要面對已知的類型,還需要應對未來,例如未來某一天一個人又提出了一種數據類型,也需要支持這2種基本運算,我們如何能保證將他引入到系統中而且不把系統變得一團糟呢?
解決這個問題的辦法就是約定接口。人們通過對不同的類型,定義相同的接口標準,這樣便可以將這些組件進行組合,組件之間能組合而不關心細節是構建大型系統的關鍵。
下面列出了約定接口后面會具體討論內容:
基本操作大型架構問題
面向對象編程
聚合流操作
3.元語言抽象:這是處理大型系統的第三個方法,有時候你可能受不了處理這個復雜度時,你其實可以自己設計一個語言,它的本質其實是在一方面隱藏了部分細節,另一方面強調了一些其它細節,這也是SICP里最神奇的部分。
我們后面可以看到如何用LISP來解釋LISP,這其實主要是通過LISP里的2個過程APPLY和EVAL來不斷地交替進行。另外還一個魔法符號
在過程式語言用于表達無限,這些內容會在后面進行討論這里只是列舉了一個大綱。總結
以上是生活随笔為你收集整理的lisp eval apply_SICP远古魔法-LISP概览(1-2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中信信用卡怎么修改电子邮箱
- 下一篇: win7蓝屏0x000000f4修复_注