又一次談到 F#。話說,聽說過“面向對像”,那“面向語言”是什麼玩兒?只聽說過“面向對像的語言”,難道說還有“面向語言的語言”?
我個人覺得“面向某某”與其非要形像化成某種語言,不如將之抽象成一種不受語言約束的思想。語言可以對“面向某某”的思想進行支援和實踐,而不要受其桎梏。像 C#.net 這種,“專為面向對像而設計的語言”最終是失敗的,殘酷的現實已經逼得 C# 不得不每升級一次版本,就完成一次“變態”,結果現在的 C# 就是一個大變態,四不像。
那 F# 呢?在這方面 F# 會重蹈覆轍嗎?源自偉大的 ML,經由 Objective Caml 而派生出的 F#,立志通過“面向語言”理念這條新的途徑實現 C# 之力所不及的微軟的野心——整合、壟斷並統治整個軟體工業,顯然,微軟已然預設了變態的 C# 的徹底失敗。C# 依然在不斷完善,但它的變化更像是一種掙紮,給自己一種活下去的理由而已,它的變化是一種變態。C# 已經不再是微軟戰略的中堅,而在不知不覺中完成了新戰略實驗田的轉變。C# 在為誰做實驗?F# 嗎?
哈哈,微軟曾主打 VB,後來微軟改為主打 C#.net,於是 VB.net 成為了 C# 的實驗田,如今,C# 卻又要為它人保駕護航了,哈哈……飛鳥盡,良弓藏;狡兔死,走狗烹!到底是微軟帝國,Microsoft Empire,辦的那事兒,也像一個皇帝治國之術……
既然微軟對 F# 如此下本兒,我們就來好好認識一下 F# 的 Features 吧,先從 LOP 說起。
什麼是 LOP?
LOP,Language – Oriented Programming,面向語言編程,好像 ML 所表達的“元編程”思想一般乍看起來概念很模糊。與其一下子生硬地將之具體化,不如從廣義的定義去解釋它。
搞明白 LOP 之前需要先理解 DSL,Domain Specific Language 的概念。設計 DSL 是為瞭解決特定目的的難題,而不像 C# 等是為了普適地解決問題而設計。DSL 一個著名的實踐就是 Excel 語言。將兩個儲存格內容相加,你可以編寫如下公式“= A1 + B1”,並不需要指定資料類型、函數或轉化程式等。Excel 語言中烙刻著 spreadsheet cell 的概念,使你無需描述 “A1”意味著什麼。然而在 C# 裡,你必須指明:
MasterSheet.GetCell(new CellObject(Row=“A”, Column=1));
DSL 的主要優勢在於其代碼相較 C# 等普適程式設計語言而言極其簡練。使用 DSL 可使你擺脫在某一架構內表達思想的編程模式,比如 C# 中你就不得不嚴格地在類中寫代碼。DSL 之所以能做到這一點,是由於所有的問題領域的關鍵概念都已被刻進語言之中,無需你自己建模。
但 DSL 語言有兩大硬傷。首先,從使用者的角度來說, DSL 使你不得不學習一門新語言,因為省去你自己建模的代價就是你不得不瞭解它為你準備好的關鍵模型,比如 matlab 的矩陣模型,mathematica 的符號模型等。再者,從發明者的角度來說,DSL 使你不得不創造出一門新語言用以描述你的模型,並費力地編寫編譯器。倘若涉及到描述某個公司的整個業務規範這樣複雜的問題時,DSL 的硬傷就很致命了。
好了,DSL 說得已經夠多了。那 LOP 呢?先引用 Google Code 上面 FsUnit 項目來舉個例子吧。FsUnit 是一個用以編寫 F# 單元測試的簡易庫。相比標準寫法:
Assert.IsTrue ( x )
可以將之簡化為:
FsUnit 可使你使用不同的人類語言中的單詞和概念編寫 F# 代碼,這裡樣本以英語。由此,引出 LOP 的定義:
Language - Oriented Programming is a style of programming that tries to produce code that looks like it came from a Domain Specific Language but is still valid in a general purpose programming language.
此定義引用 F# 大拿 Chris Smith 的表述。
F# 中的 LOP 使用簡單代碼描述複雜問題的優勢體現在如下三個方面:
- 抽象表述—— F# 使你在代碼中描述特定領域概念時,不需要引入新的抽象層。
- 具體表述—— F# 使你可使用其它語言描述問題,然後在 F# 中讀取。
- 計算表述—— F# 使你使用其它語言編碼處理本地概念時,不需要借用第三者更專業化的語言。
依上所述三點,似乎 F# 中的 LOP 在嘗試肩負起 .net framework 之力所不及的使命。而諷刺的是,Microsoft F#.net 卻是基於 .net framework 的。截止發此稿之日止,Microsoft F#.net 已升級至 1.9.6 19 版,基於 .net framework 2.0 架構,捆綁在 VS 2010 和 .net framework 4.0 beta1 平台上。預測等 F#.net 正式推出時,將架構在 .net framework 4.0 之上。F# 今後的路到底怎麼走,是否比 C# 活得還長,F# 是否能實現它的野心,包括微軟帝國的野心,我們拭目以待。