2009年2月10日 星期二

感性與查表

我的電腦編程經驗始於Apple II,這是部改變世界的機器,它的特點之一便是便宜(相對來說),當時電子器件的價格相對高昂,Apple II的設計者便做了很多工作,以減省器件的使用。

例如,當時Apple II使用了記憶對應(memory map)的顯示方式,這就是說,要在螢光幕顯示甚麼,便要在相對應的記憶體內存放甚麼。對一般使用高階語言(例如Basic),根本就無需理會這些細節,因為一切都會由系統代勞。但是,若要追求‘高速’顯示,程序員便要直接處理,問題便來了,原來Apple II的設計者,為了節省幾個NAND Gate,把記憶體設計成交錯式(Interleave)。

何謂‘交錯’,先讓我舉一個例子,先假設一個文字模式(text mode)的顯示,畫面是80 x 24(這不是Apple II),若記憶體是順序排列和由0開始(zero base),又假設這畫面記憶由10000開始(電腦是用二進制的,但人用十進制會比較容易),那麼10000便是第一行的第一個字符,而10079,便是第一行的最後一個字符。而10080便是第二行的第一個字符,如此類推。

或用數學公式表示,若要求出第n行m個字符的地址,便是10000+80n+m。簡單!但Apple II就不是這樣,它把顯示分成交錯的四組,這就是說,第零行便是0-79,但80-159是第四行,而不是第二行,而160-239就是第八行,如此類推。這完了才到第一行,第五行……

運用數學,我們不難推出一公式,事實上,Basic這類高階語言便是這樣做。但要編寫‘高速’運行的程式,如遊戲,這便不可接受了。Apple II有大量的遊戲,考慮Apple II的設計和計算力,這些遊戲實在偉大。遊戲程序員並不能接受以公式計算畫面的地址,因這會嚴重拖慢遊戲的運行。特別是這計算需用除法,對Apple II的‘大腦’(6502)這就實在太沉重了!

解決方案說出來就是出奇的簡單,這就是查表法(table lookup)!這就是把每行的起始地址放在一列表中,這便無需每次都重覆複雜的運算了!

這就是以空間換速度,把要用的東西記下來,便可避免煩複的運算。在心理學上,這便叫‘感性’,‘感性’其實就是經驗的重演,是查表,好處就是‘速度高’!

‘感性’的問題就是不能有效處理突發事件和新環境。就再以Apple II為例,它有多個不同的畫面模式,於是每個模式都要有個別的列表!但若是由公式計算,祗要改動一些參數,便可用於不同的模式了。

簡單化的說法是男人是理性,女人是感性。若回到狩獵收集時代(hunter gatherer),這便極容易理解。女人就是在居住地附近活動,從經驗直接‘查表’,處理問題來得快捷有效。男人打獵就面對不停變化的環境,不能一概而論。

各位男士,下次若你覺女士提出非理性的要求或觀點,請不要太自大,這些其實是經驗的快速提取的結果!很多時都真是可以解決問題的。

沒有留言: