甫於日前落幕的Software Development 2.0研討會,來賓之一的Andrei Alexandrescu被問到未來編程語言的趨勢時,他認為函數編程(Functional Pogramming)可能會再度興起。我認同他的看法,我過去發表的JavaFX文章中,碰巧也有提到這一點。

目前兩大開發平臺(Java與.NET)都開始出現函數編程思維的蹤跡。Java平臺的JavaFX語言,具備所有重要函數編程的特色,所以應該歸類為函數語言(或者至少是多重思維語言);.NET平臺的C# 3.0也存在相當多函數編程的影子。微軟的LINQ本來就源自於函數語言,更不用提微軟官方的F#語言,F#沿用相當多ML語言的語法,更是徹底的函數語言(其中的F,應該是Functional的意思)。

根據Tiobe對於2007年12月語言需求所做的統計,物件導向語言占54.4%,程序語言(Procedure Language)占41.9%,函數語言占2.0%,而邏輯語言占1.8%。以上加起來剛好百分之百。

但是,這樣的分類並不精確。現在的語言很少是單一思維,幾乎都是多重思維(Multi-paradigm),特別是物件導向和函數編程,因為兩者間並沒有衝突的地方,許多物件導向語言會漸漸納入函數編程的特色。例如,儘管C# 3.0具有相當多函數語言的特色,但是依然會被Tiobe歸類於物件導向語言的類別。

函數編程最重要的基礎是Lambda Calculus,在C# 3.0稱為「Lambda表示式」,在Python稱為「Lambda函數」,在PowerShell稱為Scriptblock(劇本區塊),在Java稱為匿名方法(Anonymous Method),不同語言會用不同名詞稱呼它,但其實都是類似的東西。從這個角度來看,許多主流語言多少都具備函數編程的能力。這個趨勢應該會延續下去,許多既有語言推出新版本時,會持續加入函數語言的特色。

另外,我最喜歡的REBOL,許多人工智慧專家使用的Common Lisp,近年興起的Erlang,Perl高手唐鳳專精的Haskell,這些也都是函數語言。為什麼我們喜歡函數編程?因為函數編程可以讓我們把時間花在有生產力的事情上,而不是處理許多瑣碎的事。簡單地說,函數語言可以讓我們用簡單的方式寫程式,但是威力又強大。

編程語言專家Ravi Sethi教授認為「簡單」與「威力」,正是函數編程的兩大優勢。簡單,來自於以「值」(Value)為中心,不用理會下面平臺是什麼機器、記憶體要如何配置、如何指定。函數編程的威力,則來自於「遞迴」以及將函數視為「First-class」(一等)的值(函數本身就是值,可以被傳遞、被指定)。

自動記憶體管理雖然始於函數語言,但是近年來已經進入各大主流語言。而將函數視為一等的資料型別,也開始進入各大主流語言。這些都要歸功於函數語言,尤其是Lisp。

Lisp是函數語言的始祖,誕生於1958年,相當於50年前。換算成人類年齡的話,Lisp已經算是程式語言中的人瑞了。Lisp的後繼者眾多,其中,至今仍然最活躍的是誕生於1980年代的Common Lisp,它在Tiobe的排名是第十七名。在Peter Seibel寫出《Practical Common Lisp》一書,並得到Jolt Award之後,讓大家逐漸對Common Lisp一改印象,開始認為它不只是學術上的語言,而是一種務實的語言。

一般來說,相較於C、Pascal這類命令式編程(Imperative Programming),函數編程的缺點是效率比較差,這也是函數語言一直無法流行的主因之一。不過,隨著處理器速度的提升,編譯器技術的進步,都讓效率不再是問題,甚至在數學運算上,用Clean與OCaml(這些都是函數語言)開發出來的程式,效率也不會比C差。

尤其是在多核心處理器和分散式運算時代,函數編程更是比Imperative編程具有更強的優勢。例如近年來逐漸受到重視的Erlang,正是將重點放在Concurrency與容錯上。用Erlang可以輕鬆開發出來的系統,如果改用別種語言開發,可能會造成程式長度暴增以及不穩定的情況。

如果你想學習函數編程,而且如果你使用.NET平臺,我會建議你使用F#;如果你使用Java平臺,你可以考慮JavaFX;如果你沒有Java與.NET平臺考量的話,那麼你可以選擇Common Lisp與Erlang。

若未曾使用過函數編程技術,思維就會受到傳統Imperative編程作法的拉扯,一開始時會很不習慣,但只要堅持下去,等到跨過門檻之後,函數編程其實更自然,生產力更高。

有些技術沒有被大眾所接受,並不是因為它不好,而是因為當下時空環境無法配合等因素所造成。不同於過去,現在的網路、多核心技術、高速處理器、軟體複雜度等發展態勢,正是適合函數編程生存的環境,值得我們持續關注它的發展。

作者簡介:
蔡學鏞-技術顧問
清華大學資訊工程碩士,曾任華碩集團軟體工程師、元智大學資訊系講師、美商歐萊禮出版社技術編輯、臺灣微軟特約專欄作家。

熱門新聞

Advertisement