Re: [問題] 為什麼作業系統都用C寫? 而不用C++呢?

看板C_and_CPP作者 (我要加入劍道社!)時間15年前 (2009/03/07 13:38), 編輯推噓20(200120)
留言140則, 7人參與, 最新討論串10/37 (看更多)
僅就我能回應的部份回應,畢竟我也沒什麼料。 ※ 引述《guest0079 (火辣辣的大姊姊)》之銘言: :  一般認為C++效能較差是有幾點現實上的考量: :  a. C++太多太雜太難掌握,讓程式人員浪費太多時間在語言本身而非問題的最佳解上 這和程式的效能無關。如果你要說的是 C++ 的某個語言特性使得實作某些演算 法變得很困難,請舉出具體實例,而且你還要證明用 C 實作會比較簡單。 : b. C++會偷偷增加一些程式碼來維持本身的OO特性,一不小心就多出了不必要的code : c. C++會偷偷增加一些程式碼來維持運算子過載特性,一不小心就多出了不必要的code 同上,請就這兩點舉出具體實例並證明同樣的功能在 C 中並不會造成額外負擔。 :  d. 用C++物件導向實作的函式庫,很方便使用沒錯,但代價就是負擔太大(如Qt) 所以負擔是什麼?同樣的功能用 C 實作可以快多少? : e. ...應該還有很多我不知道的 : 2.C++程式不易讀 : 運算子過載真是太好用了,而且程式一看就懂,真是太好維護了,但是如果… :   Man a_man("大雄"); // 定義一個男人 :   Woman a_woman("靜香"); // 定義一個女人 : int money = MAX_VALUE; :   printf("幹這是什麼鬼:%s", a_man + money + a_woman); :  這種code要怎麼維護?先回頭找一下Man與Woman中operator + 的定義 :  再確認與int作運算表示什麼,再查一下書看看運算的順序的先後關係,如果operator :  中又用到其他operator的過載,又要再去查,為了追一個問題,又引起n個問題,為 :  了確認n個問題,又出現n^2個問題…沒完沒了。程式很簡潔沒錯,但是要怎麼debug? :  難道每一行程式都要猜猜看嗎? 所以改用 C 的寫法是像這樣囉? printf("幹這是什麼鬼:%s", Add_Something_Woman( Add_Man_Int(a_man, money), a_woman) ); 也不是不行啦,只是有天你發現 int 不夠用要改成 long 的時候,麻煩就很 大了。而且你一樣也是要去看 Add_xxxx 這些 function 的內容才知道他們 做了什麼事,而且這些 function 也會用到其它 function,debug 起來並不 會比較簡單。 另外你自己也說了,「運算子過載真是太好用了,而且程式一看就懂」。這意 味著如果你會寫出自己看不懂的 code,那你就不該用 operator overloading。 你可能會說,這是某個「自以為很厲害的人」寫出的 code,你不得不用,那 可能是以下的情況: 1. 大家都看不懂,只有「自以為很厲害的人」看得懂 code。 這種情況當然是「自以為很厲害的人」該死。 2. 一半的人看得懂,另外一半看不懂。請你們在下次技術團隊會議時好好 討論要不要改做法。 3. 大家都看得懂,你看不懂。很不幸的,這種情況下是你該多念點書。 : 好的物件導向遠比C好維護,不過C++決對不是好的物件導向語言(這句話一言難盡) : 3.物件導向不適合底層程式 : 了解物件導向的人就知道,它是較貼進人類思維的程式寫作方法,反之,它就不是 :  一個貼近底層機器運作原理的編程原則,機器語言、組語才是最貼近底層運作機制的 :  語言,想要用OO來描述機器的行為、自然法則、各式各樣的protocol…等等諸如此類 :  的運作機制容易流於天馬行空,任意妄為。如果硬要用物件導向來實作底層機制,可 :  能十個人有十二種不同的見解,沒人看得懂彼此的程式,因為每個人對機制的感受都 :  不一樣,物件結構的分析各有各的看法,沒完沒了。 :  當然,不用物件導向也是可以寫C++程式,但那還不如用C來的單純 :  (但個人偏愛用完全無繼承機制的物件架構來寫C++,來當作是C的加強版) 就我的認知,物件導向的目的並不是要貼近人類的思維,而是為了軟體易於維護 並擴充功能。所以如果對一個系統該如何設計,若是每個程式設計師都有自己的 意見,那當然是坐下來好好討論哪一個做法比較容易維護、擴充。 當然,程式設計師意見不合是常有的事,但並不如你所想象的那樣是天馬行空的 爭論,而是而實際地考慮各種設計在維護及擴充上的優劣。 : 4.C++的複雜度太高 :  C公認的聖經只有一本,內文也才兩佰多頁,一本C++的入門書就一仟多頁(C++ Primer) : C++的功能及其運作細節多如牛毛,寫了10年的程式也許還會看到自已不懂的語法,或是 : debug時發現某個平常不會注意的細節在作怪,這如果只是開發一般的AP還好,如果是開 : 發OS這種大型、不易物件化的程式時,事情就大條了。因為: : a.開發人員太多,每人都用一種冷門的技巧,那要trace code就要買十本C++在身邊才行 : b.總有人喜歡賣弄技巧,喜歡來個多重繼承,自行定義運算子,把程式的複雜度弄得很高 :  自以為很強,等到程式成長到自已無法控制(可能久了也忘了)才雙手一攤說:比爾蓋茲 :  對不起,我要去Google上班了 : c.自已乖一點不要寫出太複雜的程式就好了嗎?不!因為C++支援太多種技巧、style, :  所以有時候不得不乖乖配合別人的程式風格,想維持單一模組風格的一致性也很因難 : OS不是少數幾個人就能寫出來的程式,一定要有不少人力來大量的分工才能完成 : ,但高度的分工之後又必需維持緊密的偶合關係,是一項複雜度很高,極易失敗的專案 : ,如果再用一個複雜度相對較高的C++工具來寫的話,就難上加難了 團隊開發本來就應該要先統一好 coding style,此外像是類別應該要有什麼行 為、提供哪些 method、哪些東西使用 template,則是在設計階段就應該訂好, 如果有某個程式設計師喜歡搞怪不合作,那換用 C 他還是可以完全不合作。 為了避免使用者濫用,程式語言不應該提供太多複雜的功能嗎?那 C 應該先把 指標拿掉。 #define 也應該要拿掉,不然有人會寫出下面這種東西: #define begin { #define end } : 最後,我很好奇某人說:C++的sort大勝C的qsort,理由何在? qsort 每次對元素進行比較的時候,都要透過 function pointer 去呼叫 compare function。如果你學過 computer architecture 就會了解,使用 function pointer 會比一般的 function call 還慢,尤其 function 的 內容很短的時候,這個額外的負擔就占了很大的比例。 因為 C++ 的 sort 是 function template,是在 compile time 就把靜 態的 function call 插進 sort 裡面,而且若 compare function 很短, 還可以得到 inline 的好處,進一步省掉 function call 的成本,當然 會比 C 的 qsort 快上不少。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.115.112 ※ 編輯: littleshan 來自: 59.121.115.112 (03/07 13:40) ※ 編輯: littleshan 來自: 59.121.115.112 (03/07 13:41)

03/07 15:18, , 1F
感謝你的意見分享,晚點再來與你討論
03/07 15:18, 1F

03/07 15:21, , 2F
我認為 guest 的意思是既然 OO 不可避免要產生 overhead
03/07 15:21, 2F

03/07 15:21, , 3F
那乾脆選個不容易 OO 的語言
03/07 15:21, 3F

03/07 15:22, , 4F
如同 public member 總有人要偷用, 那就宣告成 private
03/07 15:22, 4F

03/07 15:26, , 5F
「『不可避免』要產生 overhead」?
03/07 15:26, 5F

03/07 15:28, , 6F
我不想爭這個... XD 一個 virtual function 你的質疑就倒
03/07 15:28, 6F

03/07 15:30, , 7F
原來用 virtual function 是不可避免的,不寫會生病死掉。
03/07 15:30, 7F

03/07 15:31, , 8F
沒有 virtual 你如何 polymorphism? 還要問別的嗎?
03/07 15:31, 8F

03/07 15:31, , 9F
問到最後還算 OO 嗎?
03/07 15:31, 9F

03/07 15:31, , 10F
當你在 C 有使用 virtual function 相同需求時,你一樣要
03/07 15:31, 10F

03/07 15:31, , 11F
重新實作跟 virtual function 一樣的東西。
03/07 15:31, 11F

03/07 15:31, , 12F
不要跟我說你的 OO 只是一個 class 然後有 method
03/07 15:31, 12F

03/07 15:32, , 13F
放棄掉 OO 就不一定要實作 virtual function 一樣的東西
03/07 15:32, 13F

03/07 15:33, , 14F
我的 OO 可以搭不是 OO 的東西在一起,所以不會不可避免。
03/07 15:33, 14F

03/07 15:33, , 15F
甚至有的 virtual function 是為了做 factory 用的
03/07 15:33, 15F

03/07 15:34, , 16F
沒有人規定一個 class 所有 member function 都是 virtual
03/07 15:34, 16F

03/07 15:34, , 17F
我的 OO 可以搭不是 OO 的東西在一起 <= 那我們有牴觸嗎
03/07 15:34, 17F

03/07 15:35, , 18F
OO 搭了不是 OO 的東西只是「非純 OO」,不是「非 OO」。
03/07 15:35, 18F

03/07 15:36, , 19F
另外我的重點在 "有人" 會亂用, 既然如此乾脆直接避掉
03/07 15:36, 19F

03/07 15:36, , 20F
我看過好多人亂用 pointer 耶,為了避掉大家改用 Java 吧
03/07 15:36, 20F

03/07 15:37, , 21F
避掉 OO 不會降 performance, 避掉 C 用 JAVA 就...
03/07 15:37, 21F

03/07 15:39, , 22F
但是避掉 OO 會提高你軟體維護的成本。
03/07 15:39, 22F

03/07 15:40, , 23F
結果就是,現在純 C 的程式也免不了使用 OO。
03/07 15:40, 23F

03/07 15:40, , 24F
但是今天沒有人在談軟體維護的成本啊...
03/07 15:40, 24F

03/07 15:41, , 25F
所以台灣沒有軟體工業存在,因為普遍無法正視事實。
03/07 15:41, 25F

03/07 15:42, , 26F
不過就我所知... 台灣軟體公司幾乎都是 C++ 的 code 耶..
03/07 15:42, 26F

03/07 15:43, , 27F
現在的使用者需求越來越大,程式越寫越大,哪可能免維護。
03/07 15:43, 27F

03/07 15:43, , 28F
呃... 你是不是離題了 XDD
03/07 15:43, 28F

03/07 15:43, , 29F
那都是號稱 C++ 的 code,打開 source code 看就知道。
03/07 15:43, 29F

03/07 15:44, , 30F
核心還是圍繞你第二和第三行的推文啊,我只是在說明為什麼
03/07 15:44, 30F

03/07 15:44, , 31F
不「乾脆選個不容易 OO 的語言」。
03/07 15:44, 31F

03/07 15:45, , 32F
問題是第二第三行的推文是針對作業系統核心... = =a
03/07 15:45, 32F

03/07 15:45, , 33F
若 p 則 q;破 p 可以使命題無效,破 q 可否定命題。
03/07 15:45, 33F

03/07 15:46, , 34F
作業系統核心也是需要 OO 的,因為需要維護啊。
03/07 15:46, 34F

03/07 15:46, , 35F
很多人被教科書騙了以為 OO 就是要跟現實物體 1 : 1 呈現
03/07 15:46, 35F

03/07 15:47, , 36F
問題是它的複雜跟 OO 與不 OO 沒很大的關係
03/07 15:47, 36F

03/07 15:47, , 37F
,讀過比較深的 OO 書籍都會知道那些說法只是為了讓你懂。
03/07 15:47, 37F

03/07 15:48, , 38F
有複雜的轉型和依賴 union 的地方通常都可以用 OO 漂亮的
03/07 15:48, 38F

03/07 15:48, , 39F
解決掉,而且不會產生額外負擔,因為你 C 原本就那樣寫。
03/07 15:48, 39F
還有 61 則推文
03/07 16:19, , 101F
我以為是只要有心人都可以寫 kernel... ... =口=
03/07 16:19, 101F

03/07 16:19, , 102F
,這個理由你會接受嗎?
03/07 16:19, 102F

03/07 16:20, , 103F
你擔心的事情只會駐留在某個時間點上,當一個人辛辛苦苦用
03/07 16:20, 103F

03/07 16:21, , 104F
C++ 寫出 kernel 卻發現效能不好時,他會去查原因還是直
03/07 16:21, 104F

03/07 16:21, , 105F
接用 C 重寫一遍?
03/07 16:21, 105F

03/07 16:21, , 106F
如果寫人都是天才, 那基本上... 應該是沒什麼差啦...
03/07 16:21, 106F

03/07 16:22, , 107F
就算寫的人是個笨蛋,隨著時間的演進,他也會聰明起來。
03/07 16:22, 107F

03/07 16:22, , 108F
等等~~~ 離題了 XDD 不過我還是可以回答你: 查原因
03/07 16:22, 108F

03/07 16:22, , 109F
但查到最後可能會改掉架構, 然後發現不用 OO
03/07 16:22, 109F

03/07 16:23, , 110F
結果最後居然能用 C compile (大驚!!?)
03/07 16:23, 110F

03/07 16:24, , 111F
但是你忽略了當他拋棄 OO 之後可能遇到的新問題。
03/07 16:24, 111F

03/07 16:24, , 112F
我也遇過拋棄 OO 改用 C 寫才發現 OO 可貴之處的人啊 XD
03/07 16:24, 112F

03/07 16:25, , 113F
... = = 我從以前到現在一直是用 OO 在寫程式啊... = =
03/07 16:25, 113F

03/07 16:25, , 114F
很多東西在沒有瞭解需求的當下是不知道它的優點和用處的。
03/07 16:25, 114F

03/07 16:25, , 115F
尤其了解 patterns 以後覺得 OO 更是可貴
03/07 16:25, 115F

03/07 16:26, , 116F
那你有沒有遇過用純 C 為了某個「彈性」和「安全性」手刻
03/07 16:26, 116F

03/07 16:26, , 117F
個半死之後才發現那其實根本就是 OO 的前身(劣化版) 結果
03/07 16:26, 117F

03/07 16:26, , 118F
幹得要死的情形呢?
03/07 16:26, 118F

03/07 16:27, , 119F
想到 "彈性" 應該直覺就會想到 OO 吧... 我倒是沒這經驗
03/07 16:27, 119F

03/07 16:28, , 120F
有人是繞了一圈才體會到其實所謂的 overhead 根本不存在。
03/07 16:28, 120F

03/07 16:28, , 121F
但是我還是要說追求效率時你會很想把那些彈性全都拆掉...
03/07 16:28, 121F

03/07 16:28, , 122F
他當初之所以用 OO 就是考量到這些,結果發現效能不佳丟掉
03/07 16:28, 122F

03/07 16:28, , 123F
有一好無兩好就是這樣
03/07 16:28, 123F

03/07 16:29, , 124F
OO,結果用純 C 刻出一樣的東西來,結果發現效能也一樣。
03/07 16:29, 124F

03/07 16:29, , 125F
因為刻一樣的東西表示 OO 的概念仍然在只是用 C 實作吧
03/07 16:29, 125F

03/07 16:30, , 126F
......然而現實是,少了彈性會讓 user 哭,偏偏 kernel 的
03/07 16:30, 126F

03/07 16:30, , 127F
user 就是最難搞的 programmer。
03/07 16:30, 127F

03/07 16:32, , 128F
可以用 OO 改寫又效能無損的 C 有兩大類:1. 根本就是 OO
03/07 16:32, 128F

03/07 16:33, , 129F
2. OO 書籍上最詬病的那些寫法
03/07 16:33, 129F

03/07 16:34, , 130F
2. 是回你 16:29 說的部分,說明狀況不只有 1. 而已。
03/07 16:34, 130F

03/07 16:35, , 131F
無論你怎麼走,requirement 還是長那個樣子擺在那邊。
03/07 16:35, 131F

03/07 16:35, , 132F
哈哈哈 XD 所以以前 linux 難用有一部分就是這樣啊
03/07 16:35, 132F

03/07 16:37, , 133F
捨棄 requirement 奔向 performance 的懷抱,結果就是被
03/07 16:37, 133F

03/07 16:38, , 134F
user (programmer) 罵到臭頭。
03/07 16:38, 134F

03/07 17:03, , 135F
我怎麼覺得吵這麼多 不如實際改寫看看比較實際XD
03/07 17:03, 135F

03/07 17:04, , 136F
看看實際上會遇到的困難 以及在各方面的比較
03/07 17:04, 136F

03/07 17:05, , 137F
不過感覺sort那種東西 有點trade off就是了(速度/大小)
03/07 17:05, 137F

03/07 17:21, , 138F
(不過應該是部分改寫 全部改寫太累了XD)
03/07 17:21, 138F

03/07 18:33, , 139F
改寫比較難,筆戰比較簡單
03/07 18:33, 139F

03/07 20:09, , 140F
典型的 Java 言論 XD
03/07 20:09, 140F
文章代碼(AID): #19iWW-TT (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 10 之 37 篇):
文章代碼(AID): #19iWW-TT (C_and_CPP)