2008年5月22日星期四

思考函數編程(一)Language is Functional Again

文 / 蔡學鏞

什麼是物件導向編程(OOP)?只要你寫過幾年程式,如果你沒太混的話,一定說得出「封裝、繼承、多型」這三個術語。什麼是函數編程(Functional Programming,FP)?即使你寫了很多年的程式,應該也是答不出來,大家對它相當陌生,少有人能正確地敘述出函數編程是什麼,有什麼好處。某些人或許只能空泛地回答:「我聽說函數編程…」,但口氣卻仍不甚堅定。

函數編程長期以來沒有出現在主流的商業軟體世界,欠缺主流語言的支援,函數編程只能偏安一隅,躲在學術界。而學術界,喔!這你也是知道的,總是有辦法把簡單的東西,講解得相當精確(而抽象),讓人敬畏(而摸不著邊際)。欠缺書籍文章淺顯且正確的介紹,那就是為何函數編程會依然躲在象牙塔中的原因。

一直以來,真正讓FP無法被接受的原因可能是「執行效率」。傳統上,函數式編程語言的效率確實比命令式(imperative)編程語言來得差,這在商業系統上是不能忍受的。命令式語言讓我們用貼近馮紐曼架構(van Neumann Architecture)機器的方式寫程式,比較低階,所以效率會比較高。而函數式編程語言卻是使用較高階的數學抽象,所以效率比較低。

但是這個原因卻有了變化。過去這十多年,連Java這種龜速語言都能席捲世界,顯然我們對於「跨平台」和「反微軟」的重視已經超越「執行效率」;而在Java流行十年後的今天,我們有了新的衡量標準:「簡單」、「快速開發」比其他因素都更重要,因為現在軟體的複雜度已經到了我們無法忍受的地步了,而IT產業的競爭也比以往激烈許多。

想要「簡單」、「快速開發」,就要用比較高階的抽象,因此函數式編程比命令式編程更適合現在的開發環境。這些年來硬體的進步,讓我們對於函數編程的效率不再是大問題;甚至由於編譯技術的進步,函數式編程語言的執行速度,現在也已經不再是吳下阿蒙。

妙的是,還不只這樣,局勢似乎180度反轉成為對FP有利的局面:多CPU、多核心、超執行緒(HT)的硬體架構普及,以及分散式運算的流行,這根本就是專為滋養FP繁殖而打造的環境。我不是算命仙,不敢鐵口直斷FP會從明天或明年就開始大流行,但是我確實注意到趨勢呈現出對FP有利的局面,所以我們必須開始注意FP。

但究竟什麼是FP?留待下一期的文章繼續說明,本期文章先來一則FP的故事。

如果你修過大學一年級的「微積分」(calculus),你會發現數學是一種謎題:我們先定義好一些基本且相容(不衝突)的原理(principle),再制訂好一些用來操作這些原理的規則(rule)。規則可以彼此互相套用,產生更複雜的規則。數學家稱這種方法為『正規系統』(formal system)或者『算術』(calculus)。數學家認為,宇宙的一切現象都可以用數學來描述。

1930年代,普林斯敦(Princeton)大學的四個人(大師們登場,同學請立正站好)Alonzo Church、Alan Turing、John von Neumann、Kurt Gödel都對formal system做研究,他們對於實體世界興趣不大,他們探討的問題都是抽象的數學證明題。

他們雖然各自做研究,但他們的問題確有共同點:想要回答關於計算(computation)的問題。如果我們具有一部機器,它的運算威力無限,那麼我們能用它來解決哪些問題?這些問題能否自動解決?哪些問題不能解決?為什麼不能解決?如果兩部機器具有不同的設計,可否具有相同的運算威力?…我一直認為數學家是科學化的哲學家,這不是沒有原因的。

Alonzo Church開發出一套formal system,名為lambda calculus。這個系統本質上是一個編程語言,為一部「想像中的機器」所設計的語言。lambda calculus的函數可以接受函數當作輸入(引數)和輸出(傳出值)。這樣的函數用希臘字母λ當作識別,所以這個語言才名為lambda calculus。利用lambda calculus,Alonzo能夠回答上述的許多問題,提出最終的答案。

Alan Turing也在做類似的研究,開發出不同的系統,就是大名鼎鼎的Turing machine,他得到的結論和Alonzo Church類似。後來證實Turing machine和lambda calculus的威力一樣強大。

在資訊科學的研究領域,資金充裕的美國軍方一直都是很重要的推手之一。二次世界大戰時,IBM為了幫美國軍方解決彈道計算的問題,建立了知名的Mark I電腦。1949年EDVAC電腦誕生,這是第一部採用von Neumann架構的電腦,也是Turning Machine的真實版本。Turing machine領先lambda calculus做出實體機器。
1958年,對lambda calculus相當感興趣的MIT教授John McCarthy(畢業於普林斯敦,他是人工智慧的先驅)設計出Lisp語言,Lisp實踐了lambda calculus,讓lambda calculus可以在von Neumann電腦上執行!大家開始注意到Lisp的威力。1973年,MIT的人工智慧實驗室開發出所謂的Lisp machine硬體,等於是將lambda calculus的機器實踐出來了!

繼續閱讀「思考函數編程(二)Why FP