F#:微軟的下一代重量級語言

文 / 蔡學鏞

微軟從2002年開始研發F#,2005年推出第一個版本,而2008年的現在,F#已經接近成熟。2007年底,微軟宣布將F#從研究室的專案轉移到產品部門,進入產品化的階段。在下一個版本的Visual Studio中,F#將會成為正式的一員,和C#、Visual Basic平起平坐。目前,F#也已經和Visual Studio做了初步的整合。

一個新語言的誕生,自然有它的時代背景,對F#來說,自然是函數式編程(FP,Functional Programming)的因素。我已經在許多文章提到FP對現在IT環境的重要性,請自行上網查詢閱讀這些文章,我不在此重複敘述。

事實上,除了具備FP的能力,F#在Imperative Programming與OOP(物件導向編程)方面的能力,也是不打折的。因此,利用F#寫程式,可以享有高度的自由,想用什麼樣的paradigm,你可以自己作主。但如果完全不使用FP,那麼使用F#的意義不大,不如回頭使用C#。

雖然F#比其他FP語言(Haskell、Erlang、Common Lisp)似乎更好學(因為語法比較不奇怪),但是一般人要善用F#並不容易,主要是FP的Paradigm和我們慣用的OOP與Imperative Programming不同。因此,熟悉F#的過程中,一開始最好強迫自己只用FP的方式寫F#程式,不要用到OOP和Imperative Programming。

FP編程常用到的技巧包括了下面八點:Higher-Order Function、Currying、Lazy Evaluation、Continuations、Pattern Matching、Closure、List Processing、Meta-Programming。令人驚訝地,F#對這八點的支援都相當不錯。許多FP語言在這些方面可能還比不上F#完整。一開始寫F#程式,盡量多用這些技巧,寧可矯枉過正,這是學習的必經階段。

我認為,想要開始習慣用F#寫FP程式,你可以開始做下面的事:

將Object為主的程式碼轉回Procedure的方式:將Object化成Record,將Method轉成Function,將this(或self)當作Function的參數,把Function集中放到Module(模組)。
 
將程式中用到迴圈的地方,盡量轉成遞迴(Recursion)。先不要管執行效率的問題。
 
將程式中用到if/else或switch/case的地方,改用Pattern Matching(模式比對)。
 
只要做到上述這三件事,你的F#程式會具有濃濃的FP風味。

F#由於是建構在.NET平台上,所以當然和.NET有天衣無縫的整合。事實上,F#所提供的互動式環境,對於學習.NET API來說,是相當不錯的工具,比PowerShell更適合程式員使用。

由於F#的開發相當早(2002年),且F#比較是屬於靜態的語言,而不是動態的語言,所以目前F#並沒有以.NET的DLR(Dynamic Language Runtime)為平台。未來F#會不會搬到DLR上頭?情況還不明朗。

以往用FP開發的系統多以科學和財務為主,現在有了F#和.NET,應該可以為FP打開更廣的應用領域。我相信,漸漸地會有人改用F#寫.NET的各種應用(ASP.NET、GUI、LINQ)。

F#也是一種Language-Oriented Programming(語言導向編程)的語言。所謂的「語言導向編程」,就是Meta-Programming,也就是「可以建立自己的DSL」。我寫過一篇關於「GPL & DSL」的文章,但是這篇文章並未得到太多讀者的注意,顯然大家並沒有意識到Meta-Programming的重要性,相當可惜。

F#對於Meta-Programming的支援相當好,有多種方式可以實作出DSL。有了F#,你不需要用到ANTLR這樣的外部工具,也可以建立自己的DSL。

如果你現在就想學習F#的話,要特別注意。目前F#的文件寫得並不好,不完整、未更新、且凌亂。想透過閱讀官方的線上資料來學習F#,能學會F#的機會不高。必須讀APress出版的Expert F#這本書。此書作者之一Don Syme是F#計畫的負責人。

雖然目前文件上有缺失,但是因為F#已經轉移到產品部門,所以我相信再不用多久,這些問題就會逐漸解決。

雖然F#已經推出三年,但是過去僅算是實驗室的專案,並不是商品,所以在Tiobe排行榜上面並沒有特別好的表現。在商品化之後,應該就會改善。在Tiobe排行榜中,F#併入ML中,而目前ML在排行榜中是39。未來這幾年,勢必會漸漸逼近20名。

整體來說,F#是很不錯的語言,熟悉F#之後應該可以提升軟體開發的生產力。身為微軟.NET家族的唯一FP語言,F#的地位相當特殊而重要。以F#的先進與方便,未來「說不定」會成為C#的強大競爭對手。有人甚至認為,使用過F#之後,就不會想用其他.NET語言了。這是真的...至少對我來說是如此。

原文地址:https://www.cnblogs.com/godwar/p/1219546.html