自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于C語言,我喜歡和討厭的十件事

開發(fā) 后端 開發(fā)工具
最近有個家伙抱怨道“為什么我還要再用C?”-雖然我不同意他的說法,但至少他隨口提到如果你“在一臺拇指大小的電腦”上編程,或者為一門語言寫引導程序,那么可以用C語言。要我說,寫設備驅(qū)動,或者特定平臺的內(nèi)核,不管怎么說都可以使用C。

前言:最近有個家伙抱怨道“為什么我還要再用C?”-雖然我不同意他的說法,但至少他隨口提到如果你“在一臺拇指大小的電腦”上編程,或者為一門語言寫引導程序,那么可以用C語言。要我說,寫設備驅(qū)動,或者特定平臺的內(nèi)核,不管怎么說都可以使用C。

幾年之前,我用C語言寫下了我的第一個網(wǎng)絡程序,但我并不推薦這么做。現(xiàn)在,我只用P打頭的,尤其是P-y打頭的語言寫網(wǎng)絡程序(譯者注:繞什么圈子,不就是Python嘛…)。但在當時,我剛從DOS和TSRs的世界中出來,在那兒用上10KB的RAM我都會覺得大得驚人。

現(xiàn)在我是一名Web開發(fā)者,但是僅限于晚上。白天我為嵌入式微處理器編寫固件,因此,C依舊是我所選擇的語言。我所說的微處理器是那種嵌入烤面包機,或者其他類似設備中的處理器,只有大概64KB的代碼空間以及2KB的RAM。因此,可供選擇的語言基本上就只有匯編和C了。(也可以是Forth,不過那是另外的故事。)

然后,我漸漸發(fā)現(xiàn)越是多用C,就越不覺得它討厭了。因此我就想著要給這個世界最常用的系統(tǒng)級程序語言寫一些頌詞。

以下分別是關(guān)于C語言我喜歡五件事和討厭的五件事。請隨意在底下的評論欄里加上你們自己喜歡或討厭的事情。

1.K&R(喜歡)

Kernighan & Ritchie 寫的C程序設計語言是關(guān)于C語言最好的書,而且我估計它也是關(guān)于編程的最好的書之一。簡潔明了,都是有用并且重要的例子。這是一本非常好的書,同時也是一個非常好的參考。

甚至就連序言都非常好。在此引用一句,“C不是一門龐大的語言,因此不應該用一本厚重的書來詮釋。”如果所有的編程教程都像這本書一樣把長度限制到270頁,它們會好很多。K&R的簡潔明了、點到為止,很可能是C語言的成功所不可或缺的。

另一本給我喜愛的類似的編程教材是Leo Brodie所著的《Thinking Forth》。當然,肯定還有其他非常好的書,像是SICP之類的,只是我還沒有讀過罷了。

2.它十分簡明(喜歡)

事實上,C語言作為一門簡明語言是一個實實在在的福利。想要學習C,你只需了解它的類型,熟悉流程控制,處理好指針,然后你基本上就已經(jīng)掌握它了。剩下的就僅僅是函數(shù)了。事實上,K&R利用這個低級的命令式語言,僅花費11行就實現(xiàn)了qsort(),不得不說這是對C語言簡明性有力的證明。

3.IOCCC(喜歡)

你或許會覺得我瘋了,不過如果你足夠上進,International Obfuscated C Code Contest可能那兒是關(guān)于計算機科學最好的老師之一。算我開的一個小玩笑,不過我的確認為眾多黑客都在不停挑戰(zhàn),并且創(chuàng)造了很多值得一談的功績。

其中讓我確實學到很多的就是OTCC,F(xiàn)abrice Bellard所寫的“混淆的小型C編譯器”。從中我學到了關(guān)于編譯器設計的知識,主要是C語言編譯器不必是340萬行代碼的龐然大物。同時,我也從Let’s Build a Compiler中獲益,并靜下來寫了一個迷你的由C到Forth的編譯器。

4.變量的定義與使用形式相似(喜歡)

這一點對記住如何定義十分復雜的事物非常有用,舉個例子,一個指向包含十個整形的數(shù)組的指針應該是int *api[10]還是int (*pai)[10]呢?像你使用它的方式一樣定義它即可,只需要記住[]操作符的優(yōu)先級高于*(很自然就可以記住),然后你就明白那個括號是需要的了。(譯者注:前者是指針數(shù)組,包含十個指向整形的指針。)

5.它編譯出的“hello, world”體積很?。ㄏ矚g)

尤其是對嵌入式編程,這一點簡直棒極了。C語言之上沒有一個體積龐大的運行時,在很多嵌入式處理器上,一個什么都不做的程序一般只會編譯出3到4個byte。一個完整的“hello, world”程序,甚至是在Windows XP下,都只會編譯出1.5KB大小(使用Tiny C Compiler,它非常合適與做小型可運行程序)。

我認為,如果像Python一樣的其他語言能夠在這一點上趕上C,甚至是C的一部分,他們在嵌入式的世界中就會更加出彩。

#p#

6. 全局變量默認是外部的(討厭)

你會說“用全局變量可不是個好習慣!”。但在嵌入式系統(tǒng)中不同。舉個例子,你有一個名為timer.c的文件,其中有個全局變量int counter,在另一個文件state_machine.c中,有另一個counter。如果你碰巧忘記了在它們之前加上’static’,它們就是同一個變量,你根本察覺不到,沒有Warning,沒有任何提示……

這種行為看起來十分奇怪,尤其是當關(guān)鍵字extern就在手邊的時候。不過當你熟悉static的兩種不同的意義后,就可以輕易避免這種情況了。不過這依然十分令人討厭。

7. static的兩種不同的意義(討厭)

有人能解釋一下為什么static在函數(shù)體中和函數(shù)體外有著兩種完全不同的意義嗎?在函數(shù)體中,他表示“靜態(tài)”——“在函數(shù)調(diào)用過程中保持這個變量唯一”。但是在函數(shù)體外,它的意義完全改變,成了“該變量為該文件私有的”。為什么后者不用private或者intern呢?

8. & 優(yōu)先級低于 ==(討厭)

在嵌入式編程中,我們總是喜歡用if ((x&MASK) == 0)這樣的語句。但你可能常忘記寫里面那對括號,因為感覺上,&的優(yōu)先級應該比==高。但是事實并非如此,因此必須使用這對多出來的括號。

不過,這個情況有個不錯的歷史原因。C語言誕生自B語言,而在B語言中只有&而沒有&&運算符。當Ritchie引入&&運算符時,他們希望原有的B語言端的代碼能夠正常運行,因此使&的優(yōu)先級低于==。

9. 宏的功能并沒有那么強(討厭)

雖然遞歸的#include是非常棒的點子,但是,要怎么做才能不訴諸一些費腦子的方法,輕易地做預處理循環(huán)呢?同樣的,有些我常遇到的情況,比如怎么才能給程序int和string兩種格式的版本號,而同時只需要修改一個變量呢?

  1. #define VERSION_INT 209  
  2. #define VERSION_STR "2.09" 

用上面的代碼,你更新版本號的時候總是需要修改兩個地方。而且,特殊的###并不能幫上什么忙。我找到的唯一的解決則涉及了一些運行時修改。

10. 它不支持反射(討厭)

好吧,可能這只是重申了一下第9點——如果宏系統(tǒng)再稍微強大一點,就不需要反射機制了。說不定我還會濫用它。不過我真正想說的是,用C語言,你不能寫出生成代碼的代碼。

為什么不用C語言本身來寫預處理器呢?這會給循環(huán)展開,更強大的宏機制,甚至更多IOCCC的怪點子提供無窮無盡的可能性。:-)

我認為,C語言之父能夠坦然承認C的不足之處是非??少F的。就像Dennis Ritchie說的一樣:

“C語言行為古怪,瑕疵遍布,但卻是一個巨大的成功。”

更多關(guān)于這點的信息,去讀讀他的論文 The Development of the C language 吧 —— 那真是一篇值得一讀的文章。

總而言之,在自己的優(yōu)勢上,C卓爾不群。

原文鏈接: brush   翻譯: 伯樂在線 - Hacker_YHJ

譯文鏈接: http://blog.jobbole.com/51395/

責任編輯:林師授 來源: 伯樂在線
相關(guān)推薦

2025-02-10 08:59:54

2020-08-10 15:30:24

XDR網(wǎng)絡安全網(wǎng)絡威脅

2010-07-28 16:12:41

2017-05-02 11:36:00

Java

2015-10-10 09:29:32

GitGithub

2015-03-04 14:54:47

DockerIT管理基礎設施

2009-05-26 09:48:34

2014-08-12 09:22:05

程序員

2023-03-23 15:14:43

2024-10-14 12:42:06

2020-05-08 15:30:42

PostgreSQL數(shù)據(jù)庫數(shù)據(jù)

2009-04-24 08:17:15

MySpaceCEO社交網(wǎng)站

2022-11-28 14:43:15

2023-06-30 13:35:12

2014-11-10 10:09:47

開源文檔程序猿

2010-09-27 09:24:09

云計算

2010-02-25 11:02:29

JavaScript

2016-12-26 11:34:23

2022-10-28 08:37:03

UbuntuLinux

2015-09-08 11:47:00

微軟容器
點贊
收藏

51CTO技術(shù)棧公眾號