

這是這個系列的最后一篇,從編程范型的角度概覽,前面幾篇的鏈接在文章后半部分有匯總。
我在之前已經介紹過編程范型的概念,而事實上,我們到現在為止,糾結在這四門迥異的語言上面,淺看是各種語言特性,深看就是編程范型和思維方法。
下面這張“神圖”來自于 這里 ,可以說是對于范型和語言歸類的概覽,從左往右從更強的聲明式向著更弱的聲明式發展;依據狀態分為Unnamed state(串行或并發,包含邏輯式和函數式這幾種分類)、Nondet. state(所謂的不確定性狀態)和Named state(包含數據流、消息傳遞和狀態共享這幾種分類),Haskell出現在了左側函數式語言的分支內,而Java出現在了右側狀態共享的分支內。有了這棵大樹,范型之間的關系變得很容易識別,比如這樣的粗線條:
最初的范型僅僅是簡單的“record”而已,純粹的聲明和靜態的描述;有一天加上了過程,于是有了一階函數式編程;之后有一天再加上了狀態,于是有了命令式編程。
一階函數式編程加上閉包,得到了真正的函數式編程(有了閉包,就可以寫高階函數了);命令式編程加上對函數的搜索,就得到了串行的OO以及狀態共享的函數式編程。
……
從維基百科的 Comparison of multi-paradigm programming languages 詞條中,可以看得到常見多范型語言的分類情況。Java和JavaScript位列其中,從表中的分別可以看出二者的分別:因為Java有線程的概念,可以寫并發編程范型的代碼;有泛型的定義,可以進行泛型編程;有專門的Class類,可以反射和自省。
這里提到“多范型”,其實這個概念定義也不精確,大致來說,除了Haskell,我們今天討論的三門其它的語言,都算是多范型的編程語言。例如用Java也可以寫函數式編程的代碼,但是需要避免使用狀態。越是強大的語言,約束越少,可能性越強,代碼卻不一定簡潔。
因此與其討論一門語言“可以”寫哪些范型,倒不如討論一門語言“擅長”寫哪些范型:
縱覽編程范型之后,再來回顧一下之前幾篇的內容,歡迎移步閱讀:
如上僅僅只是冰山一角,希望對于想了解這四門語言和相關編程范型的讀者有幫助,也是對我自己而言,通過Java和JavaScript來學習Groovy和Haskell的一個總結。很多特性都沒有涉及,比如Haskell的很多高級特性,是因為我覺得我沒法寫好,就先不寫了。
工作需要,要開始學習Scala了,我本來對Scala的認識水平僅僅停留在“了解”的基礎之上,通過最近這段時間的學習,我發現有了Groovy和Haskell的基礎以后,再來看Scala的那些語法和特性,閱讀的速度很快,很多面孔都似曾相識。