有哪些講編程範式的好書或好文?

最近看了《冒號課堂》,感覺是雲里霧裡,其中的很多內容都無法理解。

自知是基礎不紮實,想惡補一下這方面的知識,遂有此問。


謝邀

沒有完整看過冒號課堂的書, 只看過鄭輝在博客上連載的的前半部分(zhenghui.org 的頁面)

當年看冒號課堂的時候也有點雲里霧裡, 當時覺得主要是寫代碼的經驗不夠, 現在覺得那只是間接原因, 直接原因是對編程語言理解不夠深, 寫代碼多了就會碰到語言的各個方面(坑), 還有怎麼利用語言抽象的問題(問題域).

現在我是不喜歡分範式來討論問題的, 範式只是一個很粗略的分類.

所以問"有哪些講編程範式的好書或好文?" 的話我會更推薦些編程語言相關的內容

CSE341: Programming Languages 華盛頓大學的編程語言入門課

Coursera里的一門課(Grossman), 用SML, Ruby, Racket覆蓋了不少語言範式(FP, OOP, MP), SML可以讓自己看到有類型推導的泛型(相比於Java)是種怎樣的感受, 還有閉包什麼聽著挺"高深"的概念也會實現一遍, 附帶一些FP跟OOP的對比(OOP vs. Functional Decomposition), 教授也很有趣

A Little Java, A Few Patterns

一本挺老的書, Matthias Felleisen和Daniel P. Friedman兩個大神一起寫的(當時Java連泛型都沒有被吐槽了), 裡面提及了幾個設計模式, 最重要的是裡面對visitor pattern的講解(裡面有整個pattern的演化過程), 可以重溫下上面提及的OOP vs. Functional Decomposition

對於普通程序員來說完全理解上面的兩個內容對於Multiple dispatch, Expression problem的理解感覺到這裡也夠了(估計能減少不少hardcode的boilerplate以及寫代碼的時候會注意拓展性), 至於並發這種算是大坑一時間不好填, AOP這種我推薦看下Python的Decorator跟Haskell的Monad比Java神叨叨的一套好理解多了, 至於Logic Programing我感覺實現下類型推導的價值比學這個的價值大一點. 設計模式的話看下Peter Norvig的Design Patterns in Dynamic Languages

至於大部頭的話可以看下 Michael L. Scott的Programming Language Pragmatics, 我在這裡有提及過程序設計語言理論(PLT)領域裡有哪些經典的教材?

這一下子就學了SML, Ruby, Racket, Java, Python, Haskell 6種語言(內容也不算dense, 學生的話大概就是一個學期加一個假期可以搞定), 可以跟某人戰個痛了, 也不用看那些講FP言必稱closure, lambda, map, filter, reduce, 講OOP就說everything is object, 封裝多態的口水文章.

以上都是20世紀已經有的姿勢

--

看到有人推薦CTM, 以前有人推薦這本書是"新世紀的SICP"(對, SICP也是上世紀的書了). 對於一般人來說沒有課上的話推這種大部頭很痛苦的, CTM是幾個教授寫出來用來做教材的上課也是挑些章節出來講所以會有學習的邊界, 估計推薦的人自己多數都沒有看完. 至於SICP的話有那種sense, 但是沒有具體的概念, 看過上面的東西回頭來看裡面作者的議論會更有意思(前三章)

評論裡面 @邵成 對Logic Programming的建議:

Logic Programming的話寫寫miniKanren解釋器,然後其他的一些Constrained Programming接觸一下,比如Datalog(和新出的datafun),以及SMT


補充一下Logic Programming(學習、使用時,一定的數理邏輯和函數式編程基礎有很大幫助)

Logic Programming:

Robert Kowalski的Survey Logic Programming.

Frank Pfenning的Lecture Notes Logic Programming

這二位比較有代表性,Kowalski算是Logic Programming和Prolog的創始人;Frank Pfenning對programming language, theorem proving等領域都有傑出貢獻..

Prolog編程

The Art of Prolog

The Craft of Prolog(很多奇技淫巧)

暫時想不起專門講"Prolog設計模式"一類的材料。

推薦SWI Prolog(好吧SICStus也不錯..),各種擴展如Constraint Logic Programming(CLP), Answer Set Programming(ASP)之類的,想玩也都比較方便(某些庫/實現可能比較老..)

----

具體應用也是有很多的,拙文一篇僅供參考。。Logic Programming?(水平、時間有限..)


你是上篇讀不懂嗎?

後半部分主要還是在針對OOP做講解,如果對OOP和設計模式比較了解的話,理解起來並不難。

這本書已經很基礎了,語言也比較詼諧,像這樣把編程範式和設計思想結合起來講解的書不多見。如果你哪裡不理解,可以先做筆記,然後針對不理解的點單獨找資料重點學習。


編程範式是一個比較抽象的概念,它是計算機編程中對風格和模式的提煉,同時也反映了某種心理認知和自然觀認知。

函數式編程範式/面向對象編程範式

就拿常見的函數式編程和面向對象編程來看,兩種編程範式都有各自比較明顯的學科特徵:

  • 函數式編程,是將程序描述為表達式和變換,以數學方程的形式建立模型,並且盡量避免可變的狀態;
  • 面向對象編程,包含類、對象、封裝、繼承、多態、重載等機制,通過類和類之間的消息機制建模,提倡針對不同的場景問題構建不同的數據結構,通過方法的調用或消息的互通實現程序交互。

兩種編程範式具有完全不同的心理認知觀和自然認知觀,函數式編程偏向於告訴系統去做什麼,而不像命令式編程告訴程序如何去實現每一步;面向對象編程則強調程序的組織技術,通過繼承機制將鬆散的類/對象聚合起來,實現對象之間的交流互通。

一門語言可以對應一到多個編程範式,但是一般都具有偏向性。比如 C 語言,可以使用面向對象的範式編程,但它以過程式編程範式為主導;C++ 是 C 語言的超集,完全可以用過程式編程的範式來編製程序,但它與 C 最大的區別就是增強了面向對象編程所需的繼承、多態、重載機制,使用時也偏向於面向對象範式。

理解編程範式

範式總是對應幾個核心的概念,在一個範式上增加新的概念,它就可以演變成另外一個範式,因為解決問題的思路可能完全不一樣了。比如函數式編程範式中添加並發概念,整個編程範式就會演變成並發編程範式;從面向過程式的編程範式中增加類、對象、實例等概念,就會演變成面向對象編程範式。

所以理解一種編程範式,首先看看它的編程思路是怎樣的,通常我們會看到一種範式命名包含一個英文單詞,叫做「oriented」,面向過程、面向方面、面向對象、面向...都會從一個特定的角度去分析問題。

那麼有一個疑問就解決了,比如我們可能在疑惑「非同步」算不算一種編程範式呢?答案是肯定的。通常我們解決非同步問題最常用的方式是回調,這種形式有點像過程式編程,而通過 Promise/async/await/yield 可以將回調式編程模式「拉平」成更加直觀的模式,在編程思路上有了比較大的變化。過程式編程時我們需要關注並維護程序的運行過程,而非同步編程中,通過語言去管理程序的運行流程,編程者只需要關心每個流程的狀態以及流程之間的銜接,大大地簡化了編程邏輯。

推薦幾篇網上寫的還不錯的文章,以供參考:

  • Sina App Engine Blog

  • 編程範式

  • 關於編程範式的分析與理解 - Lai18.com IT技術文章收藏夾


推薦閱讀:

Lua 的 table 索引默認從 1 開始,這樣做有什麼好處?
intel x86系列CPU既然是strong order的,不會出現loadload亂序,為什麼還需要lfence指令?
說說你使用Elixir/phoenix的實戰項目心得,以及對該語言/框架的前景的看法?
C++中有变量a,b,c,d,e,f作为条件表达式:如果其中任意2个及以上相同则表达式为假。怎样写?
C++高級編程、Windows程序設計和MFC,這三者學習的順序?

TAG:書籍推薦 | 編程語言 | 編程範式 |