標題殺人法 :)
前幾天,在 gmane.comp.version-control.git 上暴發了一串有關 C++ vs. C 的爭議,詳細的前因後果可以看下面幾篇文章,簡單的說明就是有個叫 Dmitry Kakurin 的傢伙用力的批評 Linus Torvalds 所開發的 Git 居然是用純 C 寫的,而不是用 C++ 寫的,而引發了 Linus Torvalds 更用力的反擊,Linus Torvalds 說 C++ 是個糟糕的語言,會導致非常糟糕的設計。
Linux之父炮轰C++:糟糕程序员的垃圾语言
Linux之父话糙理不糙
C 的回归
用C设计,用C++编码
先不談 C 和 C++ 的優劣,讓人覺得有點悻悻然的是,C++ 果然是退流行了啊,這麼火爆的話題居然沒看到國內有多少的討論,雖然本身是個吵到爛,會讓人討厭的話題,但這麼大牌的人物,用這麼明確的說法攻擊 C++,光是吵架就應該吵翻天了吧。“全世界都在學 Java/Ruby/Python/PHP/Ajax/JavaScript ... 話”,現在好像一堆人只學過 Java 沒學過 C++ 的,那個學程式就是學 C/C++ 的時代真的是過去了。
不過 C++ 的沒落不是沒有原因的。C++ 的複雜度真是夠瞧的,連語言設計者都說他不期待哪個人可以完全了解 C++,在這種複雜度之下,居然稱不上是個夠現代化的語言。C++ 沒有垃圾回收,沒有執行緒支援,沒有二進位模組標準,甚至在標準化這麼久了之後,仍然沒有一個編譯器可以完全符合標準(當然,上面這些有些不是不能也,是不為也)。但 C++ 也是個最豐富的語言,可以完全用程序導向來寫程式,可以用基本的物件來編程,可以用物件導向來編程,甚至導入 template 後,居然一堆人在用類似 functional programming 的形式來編程,尤其是 template,用到一些奇技淫巧時,根本就是在考驗大家的智慧。在 C++ 是主流語言的時代時,大家沒有選擇,高手以鑽研細節為樂,庸手以避開陷阱為苦。當 Java 出現後,大家知道不用考慮得太多也可以寫出程式,當語言沒什麼值得探究後,就轉移到較高層次的爭論,像是設計模式,敏捷編程等。所以大概經過了一代人不需要知道什麼是指標,不需要考慮 memory leakage,字串可以直接相加,像是執行緒,網路等都是隨手可用。有人也對這個趨勢提出質疑,但大勢是無可逆轉的,能改變的只有 C++ 自己。在即將推出的最新標準 (C++0x) 中,加入像是 Concept, 垃圾回收等機制,但更多簡潔漂亮,特定功能的語言不斷推出,C++ 的前景真是不看好啊。有關 C++0x 可以看這幾篇文章。嗯,又更加豐富了 :)
說了這麼多,但其實複雜度不是 Linus Torvalds 反對 C++ 的理由。就說嘛,這種有名的大咖怎麼會說 "C++ 太難了不好用" 這種漏氣話呢。Linus Torvalds 是說 C++ 是個帶有"心理(mental)包袱"的語言,而這會導致設計上的問題。“語言決定思想”這件事引出了各種不同的語言設計,不同的語言影響了編程者的心態,C 會如此根本的影響編程,是因為 C 的風格就是如此貼近機器,幾乎是各種機器上都有的編程語言,語言本身也十分容易掌握,語言中提供的一切都是十分明確而不含糊。不過 C 提供給設計方面的工具就相對少得多了,大致上都是以函式為主體,通常較大規模的程式可能會發展出一套 macro 的用法,算是補強設計機制的手段吧。為什麼 C 語言相對來說貧乏的設計機制反而會被(某些人)認為是比 C++ 的功能繁花似錦更有設計上的優勢呢?我的看法是,用 C++ 的人習慣把抽象化的層次提得太高了,這通常反應著除了核心的功能外,大家也常把 C++ 拿來當應用程式開發用,而用 C++ 堆砌起高聳的抽象化大樓。當開始在編程時一切都很順手,你面對要解決的問題,在心中架構起自己的抽象化。但當需求改變,或是當另一個人在面對你的程式時,就可能是有另一套抽象化,或是你原本的抽象化已被抽象滲漏法則給摧毀,此時要去變動原本的設計就談何容易了。當然這也代表著原本的設計不夠周詳,但一個完整且可塑性高的設計十分困難,而且一開始就採用如此設定反而有過度設計之嫌,所以 C++ 變成不斷的堆倒和重建的過程。至於在 C 中因為比較缺少抽象化機制,反而會傾向於用較平實的形式的設計,對於熟悉的人而且反而是比較能快速上手且經得起變化的。
不過啊,這真的是有底氣的人才能達到的境界,我這種庸才,既無法把 C 用得出神入化,也追不上 C++ 華麗的步伐,可能像 Java 這種的才敢說比較熟悉吧 :)
2 comments:
[quote]
我的看法是,用 C++ 的人習慣把抽象化的層次提得太高了,這通常反應著除了核心的功能外,大家也常把 C++ 拿來當應用程式開發用,而用 C++ 堆砌起高聳的抽象化大樓。
[/quote]
不是很確定你的意思,不過就你說的這一點,使用 Java 的人,就不會有這個習慣了嗎? 如果不會有,是什麼原因造成的哩 :)
題外話,在 PC 遊戲界,C++ 仍是獨佔的吧,我猜 ^^
理論上也是會,不過實際上好像比較不嚴重。例如 Java 中的 String, logging, thread, scheduler 大家幾乎都用標準函式庫或是 de facto 的,這個 C++ 好像每個大型的 library 都有自己的一套。不過這也是因為用了 Java 就會用 Java 的方式編程,這也是 Java 的 "心理包袱" :)
遊戲界 C++ 我想應該還是主流(吧?),不過也慢慢受到動態語言的影響,像是 lua ...
Post a Comment