條款1:視C++為一個語言聯邦
在這個特條款下,我理解了C++的全貌,它到底是一個什么樣的編程語言,進而窺探到語言的編程范式。(均為自己翻閱資料后的理解,可能會有錯誤)
書中直接指出C++是一個多范式的編程語言,那么計算機語言有哪些編程范式呢?在維基百科中給出的定義是:基于語言特性來給語言分類的一種方式。在計算機編程語言中,根據計算模型的不同,編程范式分為兩大類:命令式( imperative programming)和聲明式(declarative programming)
命令式范式
命令式編程是面向計算機硬件的抽象,有變量(對應著存儲單元),賦值語句(獲取,存儲指令),表達式(內存引用和算術運算)和控制語句(跳轉指令),一句話,命令式程序就是一個馮諾依曼機的指令序列。知乎
由此看以看出,我自己接觸過的語言其實都是命令式,例如:C、C++、C#、Java、JS。我們平時所說的面向過程(Procedural)和面向對象(Object Oriental),也屬于這個范式,站在編譯器的角度,其實面向對象是包含面向過程的(我認為,在這個角度procedural和imperative似乎是同一個層次的概念),站在程序員的角度,二者在編程抽象上是風格迥異。在書中提到的泛型編程(generic)和元編程(metaprogramming),自然也屬于這范式。泛型編程就是減少代碼對輸入變量的依賴,這就是我們課本中提到的C++模板的作用,模板可以根據不同的類型特化生成不同的代碼。元編程是根據代碼生成代碼,這是課本沒有介紹的C++模板另一個高級用途(在我目前的編程場景中,似乎不用這種方法也都能實現想要的結果,可能一般程序員很少用到這種方法)。泛型和元編程這種范式,在C++中可以統一為模板編程,因為C++的模板可以同時實現這兩種編程。
聲明式范式
Declarative programming is often defined as any style of programming that is not imperative.
- A program that describes what computation should be performed and not how to compute it
- Any programming language that lacks side effects (or more specifically, is referentially transparent)
- A language with a clear correspondence to mathematical logic
以上定義來自維基百科??梢钥闯鏊敲钍骄幊痰膶α⒚?,它的特點是只描述我需要什么,而不關心具體怎么去實現,并且他沒有命令式編程中的副作用(side effects),就是一個函數或者表達式不管是什么時候調用,調用順序如何都不影響他的執行結果,還有就是這種范式中的變量,是數學意義上的,例如i = i+1,這樣的表達式錯誤的,所以他的變量是不可改變的(immutable),Python中也有類似的概念,這樣的特性他的好處在于讓并發計算的實現變得容易,多線程之間就不需要互斥變量這些手段去同步。
函數式編程(functional)和邏輯編程(logic)屬于這種范式,Haskell和Prolog分別屬于這兩種范式的語言。函數式編程,這里函數同樣是數學上的函數而不是C/C++中所說的函數。可以看出來,聲明式范式相對命令式是一種面向數學的抽象,應該是一種更加高層次的抽象,更符合人類的理解。從聲明式范式的理念來看,這應該是一種未來的編程方式,當智能化水平不斷地提高,編程將會更加簡單,亦或許人類都不需要參與編程。
書中給出C++中的編程范式有:過程、面向對象、函數式、元編程、泛型編程。對應到上面就是C++既是命令式范式也是聲明式范式編程語言。所以從這里也看以看出來為什么C++相較于其他語言更加難學習,因為他實在是太“雜”了,Java和C#的設計都是偏向于面向對象特性,而C++并沒有要強化某些范式而弱化其他范式,所以他是全能型選手,但是在特定的領域內又打不過其他選手,所以現在處境略微尷尬。
書中將C++的多種編程范式歸類成四個子語言:C,Object-Oriental C++,Template C++、STL。