圖形界面編程成就了C++
聽有人說C#、VB比C++好是因為做界面方便還算傻得可愛,聽有人說用C++做數值計算而不屑於做界面可就對不起咱C++的恩人了。這我可要說道說道。
想當年C++剛出江湖,名門出身,自立門派,想搶Objective C老大的位置割據一方。但名門出身的混混也還是混混,論OO不夠Objective C或SmallTalk的水准,論效率沒有C的干淨利索,結果折騰半天沒人看得起。時至今日,*nix法老們還在堅持用C。
但世事難料,界面圖形化之後,大蝦小蝦們都深感界面功夫之難,是時VB橫空出世,威震四方。C教各界大為不滿,怎能讓一介小蝦奪了"The one true programming language"的風頭。於是強烈要求微軟在Microsoft C裡提供類似VB的功能。當時Microsoft C/C++還不成氣候,比起Turbo C來簡直是一坨。微軟怎麼能錯過這麼好的機會呢。不過也巧,微軟手頭還真有這麼個差不多的東西,就是頂頂大名的MFC的前身AFX。
起初AFX這個東西是想利用C++的OO特性來簡化Windows界面編程,他們甚至設計了一套完整的OO的窗口系統,但交給其他部門試用後被批評得一塌糊塗。有鑒於開發人員更中意C的API,AFX被徹底重做,成了Win API的簡單包裝,並改名成MFC,於是有了Visual C++。之後微軟在IDE上做了大量工作,模擬VB的界面設計功能,於是推出了Visual C++ 2.0,並成功的使“IDE generated code, do not change!"路人皆知。
那麼剩下的事情,就是說服C程序員改用C++。理由大家應該都很熟悉,無非就是C++完全包含C的功能,還支持OO,還有現在已經沒人相信了的”改掉了C裡不安全的地方“,然後演示怎麼用MFC像VB一樣拖拽來創建窗口。書商很英明的開始大肆出版OO的書籍,搞得不懂OO就像今天有人不懂Agile一樣。於是乎經過艱難的3年時間,Windows95已經進入尋常百姓家,Windows上的C程序員也大多皈依了C++新教。就算不太懂C++,也可以在簡歷上寫”C/C++",賺個面子。後來開源興起,為推翻Windows圖形桌面系統的壟斷,眾多激情澎湃的開發人員加入開源,於是*nix上的C++社群也開始發展起來。不過也因此暴露出各個C++編譯器各說各的方言的問題,而不像C的可移植性那麼好。
到了05年,終於有人忍不住站出來說了心裡話。C++的OO唯一成功的例子就是做界面。到了07年,Linus Torvalds更是毫不客氣的以“You are full of bullsh1t. C++ is a horrible language."來開頭抨擊。C++錯了嗎?C++錯了嗎?C++真的錯了嗎?
C++確實具有非凡的創新和成就,但作為革新的嘗試,它當時提出的方法並沒有完全解決它要解決的問題。撇開偏見看一看的話就會發現,直到今天,我們所有可重用的代碼中大部分是C的,而且大部分高性能代碼也都是C寫的,即使用的編譯器是C++。而活得比較久的C++的類庫代碼,最多的則就是界面類的。其中原因說得太多,不再羅嗦了。
正是由於C++的這些弱點和Stroustrup對於C++的純正性的堅持,導致了Java大肆修改C++的空前的成功。蓋茨對Java興奮不已,導致微軟早期大力推動Java,但Java同樣有不成熟的地方,微軟要扮演改革派,但SUN卻扮演了守舊派,拒絕微軟對Java的任何改動,雙方最終不歡而散。失去了微軟支持的SUN當時卻力不從心,不過最終英明的把1.2版類庫設計外包給了Borland,將Java從玩具變成了將C++踢下王座的征服者。而微軟則從Borland挖到Anders Hejlsberg設計了C#定位為應用開發與Java一決雌雄。從此,C++逐漸退出主流,隱居後台底層和維護橋接歷史遺產,而C卻因嵌入式開發和良好的集成能力小小發展了一把。
總結,盡管有些C++人看不起界面編程,但正是圖形界面編程成就了C++。