學習C++程式語言的最大難度是什麼(轉)
學習C++程式語言的最大難度是什麼(轉)[@more@]困難度之一
“C++ 是個難學易用的語言”,這句話相信很多人都心有慼慼。C++的學習難度,一在於語言本身太多的“幕”,另一個就在於 "paradigm shift" (思考模式的移轉)。
傳統語言如 C, Pascal, Basic, Fortran...,除了模樣看起來稍有不同,基本上都是函式 call 來 call 去,大同小異,很容易掌握。你想做的動作,在 code 中都看得一清二楚。你所看不到的,也不過就是編譯器為你的函式加上用以處理堆疊的一小段碼(prologue 和 epilogue),這一小段碼基本上做的是 housekeeping 工作,你沒看到也沒有關係,並不影響你對程式邏輯的思考。
C++ 不一樣,C++ 有太多和程式邏輯息息相關的動作是編譯器為我們加上去的。換句話說 C++ 編譯器為我們“加碼”。如果不識清這一節,學習C++ 有如霧裡看花,霧非霧,花非花。
編譯器為我們的 C++ 程式加了什麼碼呢?很多!物件誕生時 ctor 會被喚起,物件死亡時 dtor 會被喚起,這都是加碼的結果。ctor 中設定vtpr 和 vtbl,這也是加碼的結果。new 單一物件時會產生 memory block cookie,new 物件陣列時會產生一個內部結構記錄著 object size 和 class ctor...,這也都是布幕後的工作。可以說,程式碼中看不到而卻必須完成的所有與程式邏輯有關的動作,統統都是 C++ 編譯器加碼後的結果。
當“繼承”發生,整個情況變得稍微複雜起來。“多重繼承”又更復雜一些,“虛擬繼承”又再更復雜一些。
這些布幕後的主題,統可歸類為所謂的 C++ object model(物件模型)。如果不知道這些底層機制,你就只能夠把 "make destructors virtual in base classes"或 "never treat arrays polymorphically"這類規則硬背下來,卻不明白它的道理。用一樣東西,卻不明白它的道理,林語堂如是說:“不高明”。只知道 how,不知道 why。
困難度之二
C++ 的第二個學習難度在於 "paradigm shift"(思考模式的移轉)。別說自己設計classes 了,光使用別人的classes,就都是一種思考模式和行為模式的移轉。MFC(或 OWL 或 VCL)programmer 必然能夠領略並體會其中的意思。
使用所謂的 application framework(一種大型的、凝聚性強的、有著物件導向公共基礎建設的 class library),你的碼和 framework 之間究竟是怎樣的關係呢?framework 提供的一大堆可改寫的虛擬函式的意義與價值究竟在哪裡呢?為什麼 framework 所設計的種種美好性質以及各式各樣的演演算法竟然可以施行於我們自己設計的 class types 身上呢?framework 被設計時,也並不知道我們的存在。這正是物件導向中的多型(polymorphism)的威力。
稍早所說的 C++ 物件模型,偏屬程式設計的低層面;這裡所說的思考模式移轉,則是程式設計的高層面。能夠把新思維模式的威力發揮得最淋漓盡致的,當推物件導向的 polymorphism(多型)和 generalization(泛型)。如果你沒有使用這兩項特性,等於入 C++ 寶山卻空手而歸。
反覆磨鍊,迴圈震盪
想像 C++ 是一把用來解決程式問題的刀,要它堅軔,要它鋒利,就必須經過多次的回火,在高熱和驟冷之間——煉。
初學 C++ 語法(syntax)之後,你應該儘快嘗試體驗 polymorphism(大致而言也就是虛擬函式的運用)。等到對 OOP 的精神有了大局掌控的能力,但對 C++ 的許多小細節不甚清楚,就是回到C++ 物件模型 煉的時機。
成長,是在高階(polymorphism)和低階(object model)之間反覆震盪,才能夠震盪到更高的位階,而不是平平庸庸於中階(C++ syntax)的一灘死水。
“C++ 是個難學易用的語言”,這句話相信很多人都心有慼慼。C++的學習難度,一在於語言本身太多的“幕”,另一個就在於 "paradigm shift" (思考模式的移轉)。
傳統語言如 C, Pascal, Basic, Fortran...,除了模樣看起來稍有不同,基本上都是函式 call 來 call 去,大同小異,很容易掌握。你想做的動作,在 code 中都看得一清二楚。你所看不到的,也不過就是編譯器為你的函式加上用以處理堆疊的一小段碼(prologue 和 epilogue),這一小段碼基本上做的是 housekeeping 工作,你沒看到也沒有關係,並不影響你對程式邏輯的思考。
C++ 不一樣,C++ 有太多和程式邏輯息息相關的動作是編譯器為我們加上去的。換句話說 C++ 編譯器為我們“加碼”。如果不識清這一節,學習C++ 有如霧裡看花,霧非霧,花非花。
編譯器為我們的 C++ 程式加了什麼碼呢?很多!物件誕生時 ctor 會被喚起,物件死亡時 dtor 會被喚起,這都是加碼的結果。ctor 中設定vtpr 和 vtbl,這也是加碼的結果。new 單一物件時會產生 memory block cookie,new 物件陣列時會產生一個內部結構記錄著 object size 和 class ctor...,這也都是布幕後的工作。可以說,程式碼中看不到而卻必須完成的所有與程式邏輯有關的動作,統統都是 C++ 編譯器加碼後的結果。
當“繼承”發生,整個情況變得稍微複雜起來。“多重繼承”又更復雜一些,“虛擬繼承”又再更復雜一些。
這些布幕後的主題,統可歸類為所謂的 C++ object model(物件模型)。如果不知道這些底層機制,你就只能夠把 "make destructors virtual in base classes"或 "never treat arrays polymorphically"這類規則硬背下來,卻不明白它的道理。用一樣東西,卻不明白它的道理,林語堂如是說:“不高明”。只知道 how,不知道 why。
困難度之二
C++ 的第二個學習難度在於 "paradigm shift"(思考模式的移轉)。別說自己設計classes 了,光使用別人的classes,就都是一種思考模式和行為模式的移轉。MFC(或 OWL 或 VCL)programmer 必然能夠領略並體會其中的意思。
使用所謂的 application framework(一種大型的、凝聚性強的、有著物件導向公共基礎建設的 class library),你的碼和 framework 之間究竟是怎樣的關係呢?framework 提供的一大堆可改寫的虛擬函式的意義與價值究竟在哪裡呢?為什麼 framework 所設計的種種美好性質以及各式各樣的演演算法竟然可以施行於我們自己設計的 class types 身上呢?framework 被設計時,也並不知道我們的存在。這正是物件導向中的多型(polymorphism)的威力。
稍早所說的 C++ 物件模型,偏屬程式設計的低層面;這裡所說的思考模式移轉,則是程式設計的高層面。能夠把新思維模式的威力發揮得最淋漓盡致的,當推物件導向的 polymorphism(多型)和 generalization(泛型)。如果你沒有使用這兩項特性,等於入 C++ 寶山卻空手而歸。
反覆磨鍊,迴圈震盪
想像 C++ 是一把用來解決程式問題的刀,要它堅軔,要它鋒利,就必須經過多次的回火,在高熱和驟冷之間——煉。
初學 C++ 語法(syntax)之後,你應該儘快嘗試體驗 polymorphism(大致而言也就是虛擬函式的運用)。等到對 OOP 的精神有了大局掌控的能力,但對 C++ 的許多小細節不甚清楚,就是回到C++ 物件模型 煉的時機。
成長,是在高階(polymorphism)和低階(object model)之間反覆震盪,才能夠震盪到更高的位階,而不是平平庸庸於中階(C++ syntax)的一灘死水。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-957371/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 什麼是linux?學習linux需要什麼語言?Linux
- 什麼是linux?Linux需要學習什麼語言?Linux
- 到底該學習什麼程式語言
- 中文程式語言——易語言,到底是用來幹什麼的?易語言值得學習嗎?易語言的優勢有什麼?
- C、C++、Java到Python,程式設計入門學習什麼語言好?C++JavaPython程式設計
- 什麼是程式語言,什麼是Python直譯器Python
- 前端的你常用的程式語言是什麼?前端
- Python是什麼語言?Python底層語言是什麼?Python
- 為什麼自制指令碼語言是程式語言的最高境界?指令碼
- Linux學習之Shell指令碼語言的優勢是什麼?Linux指令碼
- C/C++語言的學習方向C++
- 程式語言成功的秘訣是什麼? -erik
- 對於初學者來說,最好的程式語言是什麼?
- java是最值得學習的程式語言嗎?Java
- 學習Python自動化能做什麼?Python程式語言Python
- 何為程式語言?為什麼要學C語言?C語言
- 什麼是程式語言?程式語言都有哪些?以及主要用途
- 什麼是爬蟲?學習Python爬蟲難不難?爬蟲Python
- Python是什麼型別語言?為何Python這麼多人學習?Python型別
- 什麼是完美的教學語言 - Garth
- 2022 年收入最高的程式語言是什麼?
- 什麼是r語言R語言
- python語言是什麼Python
- 為什麼那麼多人要學習go語言?go語言有什麼特點?Go
- 什麼是Python?python是一門怎樣的程式語言?Python
- 什麼是Go語言?Go語言有什麼特點?Go
- Python程式設計基礎(一)程式語言是什麼?編譯型語言和解釋型語言的區別|Python是什麼?Python程式設計編譯
- 為什麼JavaScript是你應當學習的下一個(或第一個)程式語言JavaScript
- 為什麼要學習Go語言呢?Go
- python和C語言哪個難?它們的區別是什麼?PythonC語言
- 【譯】需要學習的是程式設計,而不是程式語言程式設計
- python可以0基礎學習嗎?python是什麼型別的語言?Python型別
- 都說python是最佳程式設計入門語言,為什麼你學習卻是如此坎坷?Python程式設計
- C語言學習方法,怎麼學習C語言?C語言
- C語言/C++對程式設計學習的重要性!C語言C++程式設計
- 什麼是 ABAP 程式語言的 Used Memory 和 Allocated Memory
- 轉行Web前端工程師,需要什麼程式語言?Web前端工程師
- Top 5 榜單:最容易學習和最難掌握的程式語言
- Go語言GOPATH是什麼Go