當前位置:首頁 > 從Java和JavaScript來學習Haskell和Groovy

公司新聞業界資訊網站技術社會寵物

從Java和JavaScript來學習Haskell和Groovy

這是這個系列的最后一篇,從編程范型的角度概覽,前面幾篇的鏈接在文章后半部分有匯總。

我在之前已經介紹過編程范型的概念,而事實上,我們到現在為止,糾結在這四門迥異的語言上面,淺看是各種語言特性,深看就是編程范型和思維方法。

下面這張“神圖”來自于 這里 ,可以說是對于范型和語言歸類的概覽,從左往右從更強的聲明式向著更弱的聲明式發展;依據狀態分為Unnamed state(串行或并發,包含邏輯式和函數式這幾種分類)、Nondet. state(所謂的不確定性狀態)和Named state(包含數據流、消息傳遞和狀態共享這幾種分類),Haskell出現在了左側函數式語言的分支內,而Java出現在了右側狀態共享的分支內。有了這棵大樹,范型之間的關系變得很容易識別,比如這樣的粗線條:

最初的范型僅僅是簡單的“record”而已,純粹的聲明和靜態的描述;有一天加上了過程,于是有了一階函數式編程;之后有一天再加上了狀態,于是有了命令式編程。

一階函數式編程加上閉包,得到了真正的函數式編程(有了閉包,就可以寫高階函數了);命令式編程加上對函數的搜索,就得到了串行的OO以及狀態共享的函數式編程。

……

從維基百科的 Comparison of multi-paradigm programming languages 詞條中,可以看得到常見多范型語言的分類情況。Java和JavaScript位列其中,從表中的分別可以看出二者的分別:因為Java有線程的概念,可以寫并發編程范型的代碼;有泛型的定義,可以進行泛型編程;有專門的Class類,可以反射和自省。

這里提到“多范型”,其實這個概念定義也不精確,大致來說,除了Haskell,我們今天討論的三門其它的語言,都算是多范型的編程語言。例如用Java也可以寫函數式編程的代碼,但是需要避免使用狀態。越是強大的語言,約束越少,可能性越強,代碼卻不一定簡潔。

因此與其討論一門語言“可以”寫哪些范型,倒不如討論一門語言“擅長”寫哪些范型:

  • Java,經典的結構化和指令式編程語言。擅長表現面向對象的范型,限制也很多,不容易搞破壞,但是諷刺的是,它本身卻存在非對象的原語類型,就是int、float、double等等這些東西,這個不足在Groovy中被修復。
  • JavaScript也擅長表現面向對象的范型,但是它是基于原型的面向對象,而非基于類的面向對象。它的約束很少,語法的坑很多。有了閉包以后,再加上JavaScript本身是單線程的,沒有線程這樣的概念,就沒有同步、并發、鎖等等引發復雜性的概念,沒有任何東西可以阻塞當前程序的運行(沒有sleep也沒有wait),于是事件驅動的編程范型就可以大行其道了。
  • Groovy包含Java一切包含的東西,但是由于語言靈活,特別是動態語言的特性,在很多范型編程上面更有優勢,比如面向切面編程。之前介紹過的元編程,在Groovy里發揚光大。Groovy的腳本友好特性,使得它很容易實現簡潔的DSL用于配置描述。
  • Haskell就是專注于函數式編程的典型。之前已經介紹過函數式編程的諸多特性,而且它具備良好的模塊化特性。它本身可以稱為真正的“non-strict programming language”,換言之,function的參數可以不被計算出來,真正實現無限集合的lazy計算。

縱覽編程范型之后,再來回顧一下之前幾篇的內容,歡迎移步閱讀:

  • 《從Java和JavaScript來學習Haskell和Groovy(引子)》 ,記載了寫這一系列文字的初衷,以及為什么選這幾門語言。
  • 《從Java和JavaScript來學習Haskell和Groovy(類型系統)》 ,介紹了從類型角度看編程語言的幾個重要概念,比如動態/靜態類型,類型推導,強/弱類型,結構類型和鴨子類型;介紹了這幾種語言類型系統的基礎;還有幾個對結構描述的基礎概念,包括函數、類、接口和型別。
  • 《從Java和JavaScript來學習Haskell和Groovy(元編程) 》 ,介紹了這四種語言實現元編程方面的能力和特性,包括Java的自省,編譯期織入和運行期代理,Haskell的模板,JavaScript的兩條元編程基本歸納,以及Groovy的豐富元編程特性,比如MethodMissing,GroovyInterceptable,Categories和Magic Package。
  • 《從Java和JavaScript來學習Haskell和Groovy(DSL)》 ,介紹了這幾門語言對于DSL實現的常見模式和語法糖,比如Java的鏈式調用和泛型傳遞,閉包和Lambda表達式,JavaScript的高階函數,Groovy對于DSL友好的語法糖,Haskell的模式匹配和List Comprehension,尾遞歸和惰性求值等等。

如上僅僅只是冰山一角,希望對于想了解這四門語言和相關編程范型的讀者有幫助,也是對我自己而言,通過Java和JavaScript來學習Groovy和Haskell的一個總結。很多特性都沒有涉及,比如Haskell的很多高級特性,是因為我覺得我沒法寫好,就先不寫了。

工作需要,要開始學習Scala了,我本來對Scala的認識水平僅僅停留在“了解”的基礎之上,通過最近這段時間的學習,我發現有了Groovy和Haskell的基礎以后,再來看Scala的那些語法和特性,閱讀的速度很快,很多面孔都似曾相識。

分享到:
點擊次數:  更新時間:2015-07-24  【打印此頁】  【關閉
?

嘉興蜂鳥網絡科技 版權所有 2008-2015 浙ICP備05784968

新疆喜乐彩骗局