close

C語言有什麼特色?

既然說程式語言有很多種,那都有哪些比較有名的? 我發現O'Reilly的這個網頁對程式語言的種類介紹的蠻詳細的。

如果你想做的東西是偏網頁那邊,想要做出很酷炫的網頁讓別人瀏覽使用的話,那就不要浪費時間在我的文章上了。 你需要的是網頁程式語言,趕快去搜尋其他教你怎麼做網頁的教學吧!

像C語言、C++語言、或Java語言等是用來做出可以在電腦上面執行的程式的程式語言,就如你電腦上的各種程、遊戲、網路瀏覽器等就是用這樣的語言寫出來的! 而C語言相較於其它程式語言,他是一種很單純的語言(注意!單純不等於簡單好學), C語言的思維邏輯比較接近電腦底層,其直接、簡明、優雅的特色讓我一直很喜歡這個語言。 另一方面,C語言比較容易寫出高效率的程式,編譯出來的程式通常會比用其他語言寫出來的還要小,因此在運算資源受限的地方便很喜歡使用C語言做為開發語言, 比方說驅動程式、系統核心、嵌入式裝置(像是DVD播放器、網路分享器、遙控器、電子玩具等等)。 簡單的說,C語言最大的特色就是簡明、直接、高效。

但是C語言的優點其實同時也是缺點,C語言的高效很大程度是來自於他的直接,所以會有很多瑣碎的事情需要由程式人員去處理。 所以寫C程式會比較繁瑣,需要顧慮很多東西。 如果程式人員沒有顧好一些小東西的話,很可能會造成程式出問題,異常、當機、記憶體被吃光光、CPU被吃光光、或產生程式漏洞都有可能 (然而請不要因此對他感到太恐懼,在學習的過程上發生這些事的時候只要把程式關掉就好了)。

C語言的哲學基本上是非常的相信程式人員,C語言認為程式人員如果要做什麼事情的話一定有程式人的道理或理由,因此不太會干涉或阻擋程式人員要做的事情。 因為沒有太多的干涉,省掉很多不必要的計算開銷,而且程式人可以自由的控制很多小東西。 但也因為這樣,C語言在一個低素質的程式人員手上常常會造成災難。 相較之下,Java幾乎是另一個極端。

Java的哲學就是不相信程式人員,認為程式人員都是很笨的,就算不笨也都會有疏失的。 所以Java不喜歡程式人動到太細節的東西,什麼東西他都儘量自己處理而不要讓程式人員來做,因為他覺得程式人都是笨蛋。 Java隱藏了非常多的細節,儘量提供一些簡單、安全、不容易出錯的東西讓你用,同時在背後幫你做了很多他不希望你去做的事情。 因此,Java的特色就是簡單、容易、安全; 但同時因為他常常在背後做很多很多其他的事情(再加上一個虛擬機器),造成Java程式效率不容易高、記憶體也吃很兇的特性。 而且由於安全性和容錯性的考量,Java語言本身完全不允許使用者直接控制底層資源, 因此使得使用Java來開發驅動程式等應用成為不可能,只能用來開發應用層面的程式(雖然這樣就夠玩了)。

如果你是一個很怕麻煩的人,想要很容易的輕輕鬆鬆做出什麼小遊戲之類的東西的話,那麼C語言便不適合你, 你應該去學學Java,甚至是Scratch。 而若你喜歡單純、高效率的程式,或者喜歡自己一磚一瓦動手做的人,又或者你是平常喜歡到處問為什麼的人, 那麼你就應該學學C語言。

C語言和C++有什麼關係

你會發現一件事(或者你早就發現了),在談論C語言的地方常常也會談論C++,而在談論C++的地方也會看到談論C語言的部份, 那麼這兩者之間到底有什麼關聯呢? 其實C和C++是兩種不同的程式語言,發明C++的人以C做為基底,做出一個號稱「更好的C」,所以給他取名叫C加加(還有兩個加,可見發明人認為這比C更好還要更好)。 由於C++是以C做為藍本,因此C++語言和C其實有很大的相似之處; 同樣的,Java是由C++做為藍本發明出來的新語言,所以Java看上去也和C++很相似。

但不像Java只是參考C++來發明新的程式語言,C++的發明人在發明C++的時候做了件特別的事以至於讓C++與C彼此關係匪淺。 首先就是他號稱C++是「更好的C」,也就是說C++就是C語言(至少在當時),但是是多了更多更多功能的C語言。 再來就是這兩個程式語言之後雖然各自發展,但彼此也儘量包容對方的新特性。 通常C或C++在改版的時候多了某個功能,另一個語言在下一次改版時也很可能會將這個特性一起包進來。 基於上述原因造成現在的現象,那就是基本上所有的C程式幾乎都可以在未經修改下被C++程式所使用, 所以寫C++的人通常不會完全不了解C;而寫C的人因為需要支援C++使用者的緣故通常也都知道點C++。 C和C++雖為兩種不同程式語言,但因其關係密不可分,於是在許多的討論、話題中便常見使用「C/C++」這樣的寫法。

因為C++大致上是C語言的擴充,也產生一些看似奇怪的現象。 最顯著的部份就是C++是近代「物件導向」概念下的物件導向程式語言,卻由於需要兼容C的緣故不得不容許許多非物件導向的特性存在。 再來是有一些看似功能重複的東西,比方說printf和cout都是用來在螢幕上寫字的功能, 其實原因就是cout是C++發明的東西,也是C++鼓勵人使用的東西,然而為了兼容C的緣故所以同時也可以使用C語言發明的printf。 有些人把這些狀況看做是C++的包袱,於是Java在被發明的時候就不再打著可以兼容C++的口號了! Java以C++做為藍本但完全捨棄C++的語法等特性,所以此兩者成為完全不同的程式語言,只是長的像而已。

相比於Java程式的龐大和低效(其實Java的效率還是很不錯的,這是在與C這樣的編譯語言相比下才顯得低效得多), C++在效能上的表現只差C一些些,但與Java、C#等語言相比則好太多了! 比起C語言在使用上的瑣碎,C++提供很多現代的物件導向、泛型等特性,使得在開發複雜的大型程式上比起C更是方便穩當得多。 這樣看起來,C++擁有與C同等級的運算效率和資源耗費,卻也有著現代高階程式語言的各種特性,實在是一個最佳的折衷方案啊!

然而,C++確也存在著一些缺陷。因為需要兼容較低階的C語言,使得C++存在著很多類似的重複功能, 也不得不存在很多足以完全打破物件導向特性的語法設計。 C++本身極度複雜,幾乎是目前公認世界上最複雜的程式語言,這使得該語言的學習與掌握很不容易, 即便在每天寫C++的程式設計師群中,也很難找到一個完全了解C++的每個部份並且能掌握它人(作者我也沒辦法)。 C++本身的複雜加上部份語法語意模糊,甚至落得「C++編譯器複雜和不可靠,不適合構建人命關天類型的程式」的批評(見維基百科的C++條目)。

雖說C++有一些可能嚴重的缺點,但是使用C語言在開發複雜的程式上確實也令人感到力不從心, 連一向堅持使用C語言開發的GCC程式也受不了,而從2008年開始改用C++進行開發。 因此,在我看來C與C++都有各自擅長的應用領域,也都有學習與使用的必要。

就像前面提到的,寫C++的人不會完全不了解C;而寫C的人常也知道點C++。 事實上很多人都會建議新人C和C++都要學,我的系列教學文章雖然以C為主,但有很多地方也會提到一點點C++, 在教學系列文章結束後,若我還有餘力的話也會再補充教學C++程式語言。

而在C和C++都學的前提下究竟是要先學C好呢?還是先學C++好呢? 基本上應該先學C語言或者先學C++的爭論不少,各有說法,有興趣的可以用關鍵字「先學C還是C++」自行搜尋相關文章來閱讀。 在這裡,既然我都已經決定教C語言了,就不會再討論先學何者的利弊,只會單方面的解釋為什麼要學C語言。

為什麼要學C語言?

我推薦學習C語言其實原因很簡單,就是學習C語言比較容易培植技術底子。

C語言是所有現存高階程式語言裡面最低階的程式語言。 相較於其他程式語言把很多的操作、細節封裝起來,讓你比較方便使用,卻也容易讓你觸不到底層的運作,不知其所以然; 而學習與使用C語言需要親自動手操作很多的東西,他低階的特性讓你看見許多事情背後的原理。 有人說:那你為什麼不教組合語言算了?對於這點有兩個原因: C語言雖為最低階的高階程式語言,但至少還是個高階語言,使用組合語言開發程式的話就真的太辛苦了! 再者組合語言其實不是「一個」組合語言,基本上不同種類型號的處理器可能都有一套不同的組合語言,好不容易學好一個,卻發現換個機器就不能用了!

在當前程式設計的領域裡,C語言就好像是英文一樣是世界的共通語言。 在許多流傳的演算法解釋、說例、或者是其他範例程式碼裡,很大的機會你會看到C語言,學習C語言對於學習這些知識很有幫助。 而在實際的程式應用上,各種程式語言彼此間不一定可以互相使用對方寫出來的東西,但幾乎所有的程式語言都有辦法使用由C語言所開發出來的程式庫。 總歸而言,若您通曉C語言的話,在實際的開發工作上,對於程式的合作、除錯、以及其他知識的學習大有幫助。

在一些運算資源受限的應用領域上,比方說軔體、嵌入式系統、或者是電子電機的學生很熟悉的單晶片等等, C語言很可能是你唯一可用的最高階開發語言。 若您未來有想要往這方面發展的話,C語言更是無法逃避的一門程式語言。

當然,在其他的開發應用上我們不一定要用C語言做所有的事情。就如前面所述,各種程式語言各有利弊,以及擅長的領域。 然而在學會C語言後再去學習其他的程式語言是較為容易的。 我會建議有興趣往程式設計領域發展的人先學習C語言,然後再學習C++語言,然後之後不管要再學什麼其他的程式語言應該都不是難事了!

重點回顧

  • C語言的優點是簡明、高效、小巧,很適合開發底層元件、嵌入式系統、核心演算法等應用; 而缺點為使用上需要自己處理很多瑣碎的事情,使得軟體開發時程較長、開發複雜的大型軟體會比較辛苦。
  • Java的優點為簡單容易、軟體開發周期較短、並且較能容忍來自於程式人員的疏忽; 缺點為效率較為低落、記憶體等資源需求大,並且語法上完全封死對於底層的操作,使其只能用來開發應用層面的程式。
  • C++為C語言的兄弟,優點是包含了很多現代程式語言的特性、以及與C語言同等級的效能; 然而其之龐大與複雜、部份語法語意模糊,使得學習與掌握很不容易。
  • C#是與Java類似且同等級的程式語言,優點為擁有微軟公司的強大支援使之在Windows上的可用性很不錯; 缺點為C#相比於Java複雜的多,但卻不像Java可以跨平臺應用,它一旦離開了Windows就和廢鐵沒有兩樣。
  • 推薦你學習C語言是因為:可以從學習與使用的過程中理解電腦較底層的運作原理、 它是程式設計界裡的世界共通語言、 以及學會C語言之後不管要再學什麼程式語言都會比較容易。
arrow
arrow
    文章標籤
    C語言教學
    全站熱搜

    夜行者 發表在 痞客邦 留言(0) 人氣()