推 guest0079:感謝你的意見分享,晚點再來與你討論 03/07 15:18
推 Ebergies:我認為 guest 的意思是既然 OO 不可避免要產生 overhead 03/07 15:21
→ Ebergies:那乾脆選個不容易 OO 的語言 03/07 15:21
→ Ebergies:如同 public member 總有人要偷用, 那就宣告成 private 03/07 15:22
→ tinlans:「『不可避免』要產生 overhead」? 03/07 15:26
推 Ebergies:我不想爭這個... XD 一個 virtual function 你的質疑就倒 03/07 15:28
→ tinlans:原來用 virtual function 是不可避免的,不寫會生病死掉。 03/07 15:30
推 Ebergies:沒有 virtual 你如何 polymorphism? 還要問別的嗎? 03/07 15:31
→ Ebergies:問到最後還算 OO 嗎? 03/07 15:31
→ tinlans:當你在 C 有使用 virtual function 相同需求時,你一樣要 03/07 15:31
→ tinlans:重新實作跟 virtual function 一樣的東西。 03/07 15:31
→ Ebergies:不要跟我說你的 OO 只是一個 class 然後有 method 03/07 15:31
→ Ebergies:放棄掉 OO 就不一定要實作 virtual function 一樣的東西 03/07 15:32
→ tinlans:我的 OO 可以搭不是 OO 的東西在一起,所以不會不可避免。 03/07 15:33
→ Ebergies:甚至有的 virtual function 是為了做 factory 用的 03/07 15:33
→ tinlans:沒有人規定一個 class 所有 member function 都是 virtual 03/07 15:34
→ Ebergies:我的 OO 可以搭不是 OO 的東西在一起 <= 那我們有牴觸嗎 03/07 15:34
→ tinlans:OO 搭了不是 OO 的東西只是「非純 OO」,不是「非 OO」。 03/07 15:35
→ Ebergies:另外我的重點在 "有人" 會亂用, 既然如此乾脆直接避掉 03/07 15:36
→ tinlans:我看過好多人亂用 pointer 耶,為了避掉大家改用 Java 吧 03/07 15:36
→ Ebergies:避掉 OO 不會降 performance, 避掉 C 用 JAVA 就... 03/07 15:37
→ tinlans:但是避掉 OO 會提高你軟體維護的成本。 03/07 15:39
→ tinlans:結果就是,現在純 C 的程式也免不了使用 OO。 03/07 15:40
推 Ebergies:但是今天沒有人在談軟體維護的成本啊... 03/07 15:40
→ tinlans:所以台灣沒有軟體工業存在,因為普遍無法正視事實。 03/07 15:41
推 Ebergies:不過就我所知... 台灣軟體公司幾乎都是 C++ 的 code 耶.. 03/07 15:42
→ tinlans:現在的使用者需求越來越大,程式越寫越大,哪可能免維護。 03/07 15:43
→ Ebergies:呃... 你是不是離題了 XDD 03/07 15:43
→ tinlans:那都是號稱 C++ 的 code,打開 source code 看就知道。 03/07 15:43
→ tinlans:核心還是圍繞你第二和第三行的推文啊,我只是在說明為什麼 03/07 15:44
→ tinlans:不「乾脆選個不容易 OO 的語言」。 03/07 15:44
→ Ebergies:問題是第二第三行的推文是針對作業系統核心... = =a 03/07 15:45
→ tinlans:若 p 則 q;破 p 可以使命題無效,破 q 可否定命題。 03/07 15:45
→ tinlans:作業系統核心也是需要 OO 的,因為需要維護啊。 03/07 15:46
→ tinlans:很多人被教科書騙了以為 OO 就是要跟現實物體 1 : 1 呈現 03/07 15:46
→ Ebergies:問題是它的複雜跟 OO 與不 OO 沒很大的關係 03/07 15:47
→ tinlans:,讀過比較深的 OO 書籍都會知道那些說法只是為了讓你懂。 03/07 15:47
→ tinlans:有複雜的轉型和依賴 union 的地方通常都可以用 OO 漂亮的 03/07 15:48
→ tinlans:解決掉,而且不會產生額外負擔,因為你 C 原本就那樣寫。 03/07 15:48
→ tinlans:實作相同的功能,C++ 帶來的額外負擔是 C 寫就存在的。 03/07 15:49
推 Ebergies:我覺得你沒有搞懂話題 (逃) 03/07 15:51
→ Ebergies:你說的大都是正確的 03/07 15:51
→ tinlans:OO 當初被設計出來不是為了「讓寫程式的人比較直覺」。 03/07 15:52
→ tinlans:只是因為手動維護 type code、union、function pointers 03/07 15:52
→ tinlans:其實有很多風險存在,語言提供 OO 機制反而是綁住你讓你不 03/07 15:53
→ tinlans:能太自由去亂搞。 03/07 15:53
→ Ebergies:但問題在於 "有人" 會因為 C++ 方便的功能做出不好的東西 03/07 15:53
→ tinlans:事實上,kernel 甚至其它軟體的複雜度常常是這些東西帶來 03/07 15:54
→ tinlans:的,所以 C++ 才會避免「有人」亂設 function pointers, 03/07 15:54
→ tinlans:避免「有人」亂填 type code,避免「有人」亂用 union 欄 03/07 15:55
→ tinlans:位。 03/07 15:55
→ tinlans:C 寫出比 C++ 危險的東西比率高得多了,C++ 聖經本都講過 03/07 15:56
推 Ebergies:你講的部分是"維護"的不好, 我說的是"效能"的不好 03/07 15:56
→ Ebergies:而且沒有人在跟你說用 C 寫東西比較不危險啊老大... 03/07 15:56
→ tinlans:我 15:48 - 15:49 那三行不是說了,C 寫成那樣效能也一樣 03/07 15:57
→ tinlans:,但是比較危險。 03/07 15:58
→ tinlans:重點是,C 真的有那樣的東西存在於 kernel source code。 03/07 15:58
→ tinlans:你用 C++ 的 OO 機制寫,是 compiler 幫你產生等效的程式 03/07 15:59
推 Ebergies:你為什麼要忽略一開始的推文呢?... 03/07 15:59
→ tinlans:碼,效率上不會比較差,但是又比較安全。 03/07 16:00
→ tinlans:你一開始的推文不是說明為什麼乾脆選個不容易 OO 的語言嗎 03/07 16:01
推 Ebergies:我不想從 virtual function 那行又重新再講一遍... 03/07 16:02
→ tinlans:,既然 kernel 有 OO 可以漂亮解決的程式碼,又不會損失效 03/07 16:02
→ tinlans:能,又比較安全,你為什麼不用? 03/07 16:03
→ tinlans:我也不想從手動維護 type code、union、function pointer 03/07 16:03
→ tinlans:這邊重講一遍。 03/07 16:03
→ H45:請問可以回文嗎....雙方論點我抓不太到 03/07 16:03
→ Ebergies:我沒有反駁你這邊喔 03/07 16:03
→ tinlans:還是你認為手動維護這些東西帶來的效能損失比 virtual 03/07 16:04
→ tinlans:function 少? 03/07 16:04
→ Ebergies:我是說 C++ 提供這些東西, 就有人會亂用 03/07 16:04
→ tinlans:你第二行強調 overhead,15:56 強調「效能」。 03/07 16:05
→ Ebergies:C 亂寫會當機, 會不容易維護, C++ 亂寫比較不會當機 03/07 16:05
→ Ebergies:但 C++ 亂寫帶來的 performance down 比較大, 可以理解吧 03/07 16:06
→ tinlans:亂用的部分我也用容易維護和比 C 不易犯錯回你了啊。 03/07 16:06
→ tinlans:........所以當機比 performance down 來得好嗎? 03/07 16:07
→ tinlans:我推薦 Intel 的 vTune,用過它你就會知道這根本不是問題 03/07 16:07
→ Ebergies:但是作業系統雖然 care 當機,但要寫得很安全效能又差太多 03/07 16:07
→ tinlans:,那是一套很強的效能分析器,跑下去你就知道問題在哪了。 03/07 16:07
→ Ebergies:變成你要用 C++ 寫還是會寫成 C 的形式 03/07 16:08
→ tinlans:不,C 也為了讓它安全付出不少代價,這些可以無償跟 OO 換 03/07 16:08
→ tinlans:我不否認用 C++ 寫 kernel 時常要以純 C 形式撰寫,但它的 03/07 16:09
→ tinlans:OO 機制卻可以在適當時機發揮效用。 03/07 16:10
推 Ebergies:你是指 attack 的安全還是 bug 方面的安全? 03/07 16:10
→ tinlans:我們不是光就當機這件事為前提討論是否安全嗎? 03/07 16:10
→ Ebergies:所以, 應用軟體大多使用 OO 了不是嗎? 03/07 16:10
→ tinlans:跟 UI 接近的地方主要使用 OO 是沒錯的,C++ 在 lib 層偏 03/07 16:11
→ tinlans:好的是靜態多型而非動態多型。 03/07 16:11
→ Ebergies:所以最後 release 的結果還是會以純 C 比較好對吧 03/07 16:12
→ tinlans:純 C 不是最好的,OO 適用的地方在於「功能抽換」以及模組 03/07 16:13
→ tinlans:跟外界溝通的邊界上。 03/07 16:13
推 Ebergies:這我也很同意啊 = = 03/07 16:13
→ tinlans:你可以比較 C++ 寫的 kernel 跟 C 寫的 kernel 其易讀性和 03/07 16:14
→ tinlans:效能,世界上又不是沒有 C++ 寫的 kernel。 03/07 16:14
推 Ebergies:我所謂選擇 C 的原因並不是 C++ 寫不出好效能 03/07 16:16
→ Ebergies:而是 C++ 容易寫出不好的效能 03/07 16:16
推 tinlans:我知道你說的是 C++ 「不小心」會寫出效能不好的東西。 03/07 16:16
→ Ebergies:那我們剛剛是在搞笑嗎... ... 03/07 16:17
→ tinlans:不過我倒是不認為有本事用 C++ 寫 kernel 的人會這麼呆。 03/07 16:17
→ tinlans:工廠裡把幾百萬的機具搞壞的員工,理由是他嫌操作手冊太多 03/07 16:19
推 Ebergies:我以為是只要有心人都可以寫 kernel... ... =口= 03/07 16:19
→ tinlans:,這個理由你會接受嗎? 03/07 16:19
→ tinlans:你擔心的事情只會駐留在某個時間點上,當一個人辛辛苦苦用 03/07 16:20
→ tinlans:C++ 寫出 kernel 卻發現效能不好時,他會去查原因還是直 03/07 16:21
→ tinlans:接用 C 重寫一遍? 03/07 16:21
推 Ebergies:如果寫人都是天才, 那基本上... 應該是沒什麼差啦... 03/07 16:21
→ tinlans:就算寫的人是個笨蛋,隨著時間的演進,他也會聰明起來。 03/07 16:22
→ Ebergies:等等~~~ 離題了 XDD 不過我還是可以回答你: 查原因 03/07 16:22
→ Ebergies:但查到最後可能會改掉架構, 然後發現不用 OO 03/07 16:22
→ Ebergies:結果最後居然能用 C compile (大驚!!?) 03/07 16:23
→ tinlans:但是你忽略了當他拋棄 OO 之後可能遇到的新問題。 03/07 16:24
→ tinlans:我也遇過拋棄 OO 改用 C 寫才發現 OO 可貴之處的人啊 XD 03/07 16:24
推 Ebergies:... = = 我從以前到現在一直是用 OO 在寫程式啊... = = 03/07 16:25
→ tinlans:很多東西在沒有瞭解需求的當下是不知道它的優點和用處的。 03/07 16:25
→ Ebergies:尤其了解 patterns 以後覺得 OO 更是可貴 03/07 16:25
→ tinlans:那你有沒有遇過用純 C 為了某個「彈性」和「安全性」手刻 03/07 16:26
→ tinlans:個半死之後才發現那其實根本就是 OO 的前身(劣化版) 結果 03/07 16:26
→ tinlans:幹得要死的情形呢? 03/07 16:26
→ Ebergies:想到 "彈性" 應該直覺就會想到 OO 吧... 我倒是沒這經驗 03/07 16:27
→ tinlans:有人是繞了一圈才體會到其實所謂的 overhead 根本不存在。 03/07 16:28
→ Ebergies:但是我還是要說追求效率時你會很想把那些彈性全都拆掉... 03/07 16:28
→ tinlans:他當初之所以用 OO 就是考量到這些,結果發現效能不佳丟掉 03/07 16:28
→ Ebergies:有一好無兩好就是這樣 03/07 16:28
→ tinlans:OO,結果用純 C 刻出一樣的東西來,結果發現效能也一樣。 03/07 16:29
→ Ebergies:因為刻一樣的東西表示 OO 的概念仍然在只是用 C 實作吧 03/07 16:29
→ tinlans:......然而現實是,少了彈性會讓 user 哭,偏偏 kernel 的 03/07 16:30
→ tinlans:user 就是最難搞的 programmer。 03/07 16:30
→ tinlans:可以用 OO 改寫又效能無損的 C 有兩大類:1. 根本就是 OO 03/07 16:32
→ tinlans:2. OO 書籍上最詬病的那些寫法 03/07 16:33
→ tinlans:2. 是回你 16:29 說的部分,說明狀況不只有 1. 而已。 03/07 16:34
→ tinlans:無論你怎麼走,requirement 還是長那個樣子擺在那邊。 03/07 16:35
推 Ebergies:哈哈哈 XD 所以以前 linux 難用有一部分就是這樣啊 03/07 16:35
→ tinlans:捨棄 requirement 奔向 performance 的懷抱,結果就是被 03/07 16:37
→ tinlans:user (programmer) 罵到臭頭。 03/07 16:38
→ weiyucsie:我怎麼覺得吵這麼多 不如實際改寫看看比較實際XD 03/07 17:03
→ weiyucsie:看看實際上會遇到的困難 以及在各方面的比較 03/07 17:04
→ weiyucsie:不過感覺sort那種東西 有點trade off就是了(速度/大小) 03/07 17:05
→ weiyucsie:(不過應該是部分改寫 全部改寫太累了XD) 03/07 17:21
推 bugmans:改寫比較難,筆戰比較簡單 03/07 18:33
推 yoco315:典型的 Java 言論 XD 03/07 20:09