用C設計,用C 編碼

2021-04-14 07:39:43 字數 1770 閱讀 5189

昨天晚上看到劉江的blog又補充了好幾大段,今天早上又看到雲風的人肉trackback,果然還是這種話題引人關注。

雲風先是提了一下所謂c++帶來的思想包袱(文言文曰「心智包袱」)問題,然後重重地引用了linus的話:「關鍵是設計」,其實他是在暗示:好的設計c同樣能做出來,不勞c++大駕;而c++一旦出面,就要讓人背上額外的思想包袱。

我明確地表個態,在系統級程式設計中,事實就是這樣的。

別小看這個思想包袱,大部分,甚至絕大部分c++程式設計師過不了這一關。相反,做系統級開發,c是幾乎沒有思想包袱的語言,說白了就是刺刀見紅,你想要啥你就去寫啥,它給你的不多也不少,沒什麼幹不了,也沒什麼非讓你揹著不可。

我早在n年前就發現自己寫程式速度慢,我當時對stl遠比周圍人熟悉,照例說長纓在手,應該效率 很高才對。結果發現不是,寫程式的時候特別沒自信,總在想:「這樣固然是可以work了,但恐怕有更好的方案吧,會是什麼呢?加個模板引數試試?要麼抽象 出乙個基類?做乙個bridge模式?那麼ownership的問題怎麼解決?誰 來負責**記憶體呢?移植乙個boost::shared_ptr過來吧!可多執行緒情況下會不會拖慢速度呢?應該不會,可是會碰到迴圈引用的情況。要麼在中 間搞乙個weak_ptr把迴圈鏈斷開?哎呀不行不行,太複雜,別人也理解不了。還是先這樣吧,能work就行。」 就這樣,兜了乙個圈子回來。有的時候,這個圈子不是純柏拉圖式的,我會真的實現不少 「優化」 設計來比對,那個時間啊,花花的就耗在裡面了。有的時候確實會獲得一些改進,但是多數時候是得不償失,旁邊那些在我看來連c都只是一知半解的傢伙採用 「ctrlc-ctrlv-modify-debug」 **,早就衝到我前頭去了。這就是「心智包袱」的威力。

最近幾年沒怎麼用c++寫程式,業餘時間倒是別的語言用了好幾種。大概是體會到這些語言的某些好處之後,對c++就能看得更客觀一些了,也琢磨了一下,如 果自己有朝一日重新跑回去寫c/c++,我會怎麼幹?畢竟現在c++程式設計師全球緊缺,工資越來越高,這個問題還是有其現實意義的。正好昨天跟chensh 聊了一會兒,兩個人的看法一致,就是採取「 c + concreate class + stl」的風格。說白了就是用c來設計,用c++來編碼。

這裡面的道理是這樣的,反正現在c和c++都是來做系統級開發,那些華麗的抽象機制用不上,思考解決方案的時候,就以c的方式。注意,c也是可以做基於對 象甚至物件導向甚至元件級別的設計的,但是在c的層面上思考問題,設計能夠更精益(lean,現在這是個時髦詞),更輕便,更直接。當你構思的設計方案出 來以後,如果其中有些部分,恰好是c++現成做好了,而且使用c++又可以提高開發效率,也沒什麼明顯的***,那麼就用c++來做相應的部分。比如, com原來設計的時候就是在c基礎上做的,設計的時候發現實際上跟c++實現多型的的vptr + vtable是吻合的,所以後來就主要用c++來做com開發。事實上,為了適應com開發的需要,微軟直接改了c++編譯器。很顯然,微軟是首先構思好 的設計,然後讓c++去適應這個設計。而後來很多c++程式設計師,是讓設計去適應c++的那些語言機制,在系統開發中,這個叫做本末倒置。當然這樣的事情在 應用級別上就不是那麼離譜。

實際上回頭看看c++早期的歷史,最早c++就是把一些c中常用的patterns內建到語言裡而出現的,早期它曾經有效地提高了開發效率。今天應該回頭去尋找這種精神。

我支援stl是基於同樣的理由。很多時候,你從c出發得到的設計,也無非就是stl已經實現得很好的東西。在這個時候,當然可以用stl。尤其是那些算 法,針對c array也是適用的,用accumulate求和,用transform對映,用adjacent_find尋找相等的毗鄰項,用 lower_bound和equal_range做二分查詢,等等,這不是比手寫要爽多了嗎?當然,使用stl,還是必須熟悉其背後的機理,沒有這個底子,還是規規矩矩用c算了。

算術編碼用c 的實現

算術編碼在圖象資料壓縮標準 如jpeg,jbig 中扮演了重要的角色。在算術編碼中,訊息用0到1之間的實數進行編碼。算術編碼用到了兩個基本的引數 符號的概率和它的編碼間隔。信源符號的概率決定壓縮編碼的效率,也決定編碼過程中信源符號的間隔,而這些間隔包含在0到1之間。編碼過程中的間隔決定了符號壓縮後的...

算術編碼用c 的實現

算術編碼在圖象資料壓縮標準 如jpeg,jbig 中扮演了重要的角色。在算術編碼中,訊息用0到1之間的實數進行編碼。算術編碼用到了兩個基本的引數 符號的概率和它的編碼間隔。信源符號的概率決定壓縮編碼的效率,也決定編碼過程中信源符號的間隔,而這些間隔包含在0到1之間。編碼過程中的間隔決定了符號壓縮後的...

用例設計 介面用例設計

在介面測試過程中,用例設計是關鍵中的關鍵,需要重點關注的一些維度 介面就是內部模組對模組,外部系統對其他服務提供的一種可呼叫或者連線的能力的標準,所謂的介面是模組與模組之間的一種連線 上圖為乙個典型的介面,乙個介面通常是有輸入輸出的,輸入就是我們常見的入參,輸出有時有,有時沒有。呼叫相關介面,介面會...