2011年11月6日 星期日

Java 與 C 語言的不同點



 我在教「嵌入式系統設計」時,使用的是 C 語言。因為不管是作為類似 BIOS 存在的 U-Boot,或者是 Linux Kernel,甚至於寫某個硬體的 Driver,都脫不了 C 語言。這時候,我常遇到一些「會寫程式,但不會 C 語言」的學員。好奇心驅使下,問他們原來會的語言是什麼,蠻大一部份都回答:「Java」。

為了讓這些原來在「Java」世界打滾的朋友們,能快一點熟悉 C 語言,於是我寫了這一篇文章,給大家參考。希望那些原來熟悉 Java、現在想快點學會 C 語言的朋友,能對您們有點幫助。

以下就列出幾點 C 語言與 Java 語言不同的地方,給大家參考。


 

工具方面

想要撰寫 Java 的工程師,需要下載兩樣東西:Java VM (Virtual Machine) 與 JDK (Java Development Kit)。Java VM 負責將 Byte Code,轉換為當地電腦能理解的「原生碼(Native Code)」。但 C 語言編譯出來的執行檔就是原生碼了,所以只需要下載編譯器,不需要 Java VM 這樣的東西。目前推薦的 C 語言編譯器是 GNU 出品的 GCC。


引入檔

在 Java 中,若要引入一個檔案,您會這麼寫:

import java.lang.String;

但在 C 語言中,您需要這麼寫

#include <string.h>

其中用 # 開頭的指令,被稱為「前處理指令」(Pre-processor Commands),由「前處理器」(Pre-processor)負責找到 string.h 這個檔,然後將它引入後,交給編譯器去編譯。


記憶體霸佔

Java 使用「垃圾收集」(Garbage Collection)機制,來控管所有記憶體的配發與回收。程式師可以不用太去管記憶體何時會回收。但在 C 語言,所有記憶體配發與回收,都得由程式師一肩扛起。在 C 語言中,配發與回收記憶體的程式碼如下所示:

#include <stdlib.h>  // malloc 與 free 定義在此
int *p = malloc(sizeof(*p));
....(其它程式碼)
free( p );


不是所有東西都要寫成物件

C 語言與 Java 語言最不一樣的地方,就是 Java 語言是物件導向語言,任何東西都寫成「物件」來運作。而 C 語言是「程序導向語言」,先把要做的事情,切分成一個個的函數,分別實作後,再將這些函數以正確的順序排列起來。


其它 C 語言與 Java 語言的差異


C 語言誕生於 1972 年,由 Dennis Ritchie 發明。而 Java 語言誕生於 1995 年,由 James Gosling 發明。兩者相差 23 年,當然有些 Java 語言有的特色,是 C 語言沒有的。接下來,我就將 Java 語言有、但 C 語言沒有的特色,列在下方給大家參考:

  • Unicode 支援
  • Classes
  • Interfaces
  • 垃圾收集
  • Java annotations
  • Reflection
  • Exception
  • Java generics

但也有些 C 語言有、可是 Java 沒有、或概念極為不同的東西:

  • 指標
  • 字串格式(C 語言字串會在尾巴加個「0」表示結尾)


結語

雖然 C 缺了那麼多特色,為何嵌入式的世界,還用 C 語言當主要的語言呢?為了兩件事:「速度」與「大小」。Java 編譯出來的執行檔,並非原生碼,還需要 Java VM 翻譯成原生碼後才能執行。這對嵌入式設備普遍擁有時脈不高的 CPU,是個不利的因素。嵌入式設備為了省電、發熱低,大多故意選用「時脈剛剛好」的 CPU。我想沒有人會願意腰間背個冬天可以當懷爐,3 小時就沒電的手機吧?此外,嵌入式設備為了能取得高利潤,大多在記憶體、Flash 儲存體這些方面非常節省。能用小記憶體、小 Flash 當儲存體,卻能達到客戶要的功能,意味著廠商能用較低的成本,造出使用者要的設備。所以像 Java 那種還需要塞個 Java VM 才能執行的語言,嵌入式的世界會比較難接受。

至於其它語法,C 語言跟 Java 語言是很相似的。不論是迴圈、分支判斷、運算子...都像得要命!所以,只要能克服 Java 與 C 語言之間,幾項主要的差異,Java 工程師會比學習其它語言的工程師,更快學會 C 語言的。



喜歡這篇文章嗎?喜歡的話請幫忙按一個「讚」喔!
歡迎加入「紀老師電腦教學網」的 Facebook 粉絲團,取得更多資訊喔!

關於作者
紀俊男,現任和群資訊總經理。曾任職於筌寶電子、趨勢科技、西基電腦、展望電腦等公司。教書經驗約 20 年。專長是程式設計、系統管理、嵌入式系統等領域。您可以在本篇留言與之聯繫、討論、或邀課。

22 則留言:

  1. 紀老師你好,我本身沒有任何程式語言的背景,目前因為研究所論文的研究方向必須要用到JAVA, 請問該如何入門學習JAVA。

    回覆刪除
    回覆
    1. 可惜我最近都是承接 C 語言的課程,不然可以建議給您我上課的時間與地點,您或許可以來聽聽看。

      如果沒有任何程式語言的背景,我會建議您看下面這本書:
      「Java SE6 全方位學習」,朱仲傑 著
      http://www.books.com.tw/exep/prod/booksfile.php?item=0010394227
      ISBN: 9789861813097

      雖然這本書已經絕版,不過各大學或市立圖書館找一找,應該還有這本書才對。先借來看一看,你真的很想要的話,可以把書交給...咳咳...印論文的店(你懂的 XD)...

      不然的話,下面這本書還有在賣,也很適合沒有程式背景的人,當做入門書:
      「深入淺出 Java 程式設計 第二版」,楊尊一 譯
      http://www.books.com.tw/exep/prod/booksfile.php?item=0010311883
      ISBN: 9867794605

      這本的好處是:穿插很多輕鬆搞笑的梗,讀起來沒什麼壓力。相信初學者應該都會很喜歡。講得也還算 OK。缺點是:出版時間太久(2005 年),有些東西已經有變化了。不過如果是當成入門書就還好,因為 Java 基礎部分沒什麼變。

      如果您閱讀過程中,遇到麻煩,可以再留言,我們可以交流一下。也歡迎您加入我的 Facebook 粉絲頁,那裏我比較常張貼一些短的新文章,也可以自行發帖問問題。若害羞的話,Facebook 也可以發私訊,比部落格方便一點。

      Facebook 粉絲頁:「紀老師電腦教學網」
      http://www.facebook.com/teacherchi

      希望這樣的回答有幫助到您一點點。 ^ ^

      刪除
  2. 紀老師你好我有C和C++程式語言背景,但是我買了書來自學java但是卻不知道怎麼應用,是否可以請您指導我一下!!

    回覆刪除
    回覆
    1. 您若有 C、C++ 的背景,照道理說,學 Java 應該輕而易舉才是。Java 基本上就是 (C & C++)/2 這樣一個語言。

      至於您問「怎麼應用」,這個問題太廣泛了。跟問「我學過蛙式,最近在學自由式。老師可以教我自由式要怎麼學才學得會嗎?」這種問題,都會讓一般的老師、教練語塞。某些老師會回答您「就...天天練」。不過我想若我回答您「就...天天練就會應用」這種答案,您應該也不會滿意吧?

      我猜您現在應該是處於「語法看得懂,但書本蓋起來自己寫,又寫不出來」的階段。如果是這樣的話,那您問題的根源不在「不懂」,而在「不熟練」。解決方法,就是去買一本 Java 的範例集,把答案蓋起來,用四~六個月的時間猛練 200 題以上,卡關的話偷看一兩行關鍵答案,馬上再蓋起來繼續寫。這就像,學會自由式沒啥訣竅,看懂標準姿勢後,只要天天練就行了。程式設計也是一樣的道理。有時候,笨功夫反而是最好的靈丹妙藥。

      Java 範例集哪本好就沒有標準了,因為每個人的程度不同。建議去書局站著看,哪本順眼帶走哪本即可。要能應用自如,跟「減肥」一樣,問題都在於「持之以恆」四個字。

      希望這樣回答有幫助。

      刪除
    2. 謝謝紀老師的無私分享

      刪除
  3. 紀老師您好,小弟今年國中剛畢業,對電腦很有興趣,也對Linux系統、網路等還算頗熟悉的(有在學校幫忙維護伺服器&網路設備等),但一直沒很深入的去研究程式語言,想要現在開始努力,目前我的朋友們都推荐我從C或Python開始,請問老師您有沒有推荐的入門書籍呢?可以的話最好是中文,但其實原文也應該沒差啦(自我挑戰一下也好)...謝謝~!

    回覆刪除
    回覆
    1. 國中畢業就能熟練 Linux 很不錯啊~

      C 語言入門書我還蠻推薦這一本的:

      http://www.books.com.tw/exep/prod/booksfile.php?item=0010360466

      至於 Python 嘛...目前還沒有我覺得很不錯的入門書。您可以先學 C 語言看看。C 語言是目前業界用得最廣的一個語言(根據 TIOBE 電腦語言流行排行榜。可參考 2013/07 的排行榜: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html )。學了以後將來出社會會很有用的。

      刪除
    2. 摁,感謝紀老師的回答,小弟立刻就去找那本書來看看!

      刪除
  4. 作者已經移除這則留言。

    回覆刪除
  5. 那老師請問您是否有推薦的書籍ㄋ??

    回覆刪除
    回覆
    1. 不知您問的是哪一種語言呢?

      C 語言的話是這本:
      http://www.books.com.tw/products/0010360466

      Java 是這本:
      http://www.books.com.tw/products/0010485281

      刪除
  6. 回覆
    1. 我剛剛才試過,可以看得見。請您再試一次。不然請查「Java 高橋麻奈」這個關鍵字也可。

      刪除
  7. 老師我想問嵌入式語言跟程式設計是一樣的嗎 我電子科的同學也在學C好像跟焊接電路板有關西 我想學的是程式設計 C語言又是偏向哪邊的設計呢

    回覆刪除
    回覆
    1. 您好:

      嵌入式語言,是泛指「可以用來控制電路板上元件的電腦語言」喔!目前可以用來控制電路板上元件的語言,比較常見的有 C 語言、Java 語言、與 Python 語言。不過 C 語言佔了極大的比例(Java + Python 的普及率加起來都還構不上 C 語言的佔比),所以想學一套控制電路板的語言,大多是學 C 語言。

      程式設計所指涉的範圍,又比嵌入式語言大很多。所有電腦語言的設計、撰寫、執行,全部統稱為程式設計。所以程式設計所指的語言,除了上述的 C、Java、Python 外,還包含 VB、C#、PHP、C++、Objective-C....等。

      「想學程式設計」,就像跟別人說「我想學車」,包括「腳踏車、機車、汽車、連結車...」都算。「想學嵌入式語言」,就像跟別人說「我想學重機車」,那麼別人就不會誤會你想學「汽車、腳踏車、連結車...」了。希望這樣的比喻,您能夠了解。

      至於 C 語言的簡介,可以看我錄製的幾段 C 語言簡介影片:

      1. C 語言的由來與歷史:
      http://youtu.be/1fwzGXNX4HI

      2. 學 C 語言的好處:
      http://youtu.be/qqpkF1ujMzo

      3. C 語言的優缺點:
      http://youtu.be/X8gfMebFoqQ

      希望這樣有解答您的問題。

      刪除
  8. 老師你好我本身沒有軟體背景以前走ic的,現在想學軟體想說要重JAVA開始還是直接重C語言學起呢 謝謝。

    回覆刪除
    回覆
    1. 您好:

      學什麼語言,端看您將來想用這個語言在哪個領域。如果您還是想用在 IC 自動控制、嵌入式程式設計、或機器人工學...等領域,建議還是學 C 語言比較有用。

      如果您想走手機程式設計、或網頁程式設計這些偏「軟」的行業,會建議您學 Java。希望這樣的資訊對您有幫助。

      刪除
    2. 老師你好:
      因為大學以前是走ic的,但研究所跟的老師是走軟體(ic組的老師收滿學生了),所以有點不習慣也跟不太上,想說去外面補習,但之前對於c語言很陌生也有些排斥,可能是自己沒學好所以不太清楚c的用法,想問老師有在教課?或著有一些影片可以參考看看呢謝謝。

      刪除
  9. 老師你好~有個問題想請教您。
    我最近打算買C++的書,目前是決定C++ primer 因為網路上很多人推薦。
    目前C++primer出到第5版。可是第5版目前只找的到簡體版的。可是我個人當然比較偏向繁體版的,一來是怕大陸那邊習慣用語跟我們這邊不太一樣,再者就是也不知道翻譯的品質如何。後來我有找 到C++ primer 第4版的繁中版,是侯捷譯的,看網路上候捷譯的書風評都不錯。
    可是現在有個問題就是C++primer 第5版新增了C++11(雖然現在好像到C++14了)可是第4版沒有。我想問老師像程式語言這種書一定都要買最新版的嗎?
    P.S 我的程度算是有基礎,上一本讀完的是洪維恩的C++教學手冊,裡面的練習題都幾乎做過了,物件導向的概念大致上也都有了,可是不夠深入,還無法靈活應用。希望買一本書能更深入一點的,將強練習,想從初學者往中手邁進,請老師指點一下。謝謝~

    回覆刪除
    回覆
    1. 您好:

      記得我在其他篇回覆過您,C++ Primer 第五版雖然稍舊,但仍能考慮購入的理由。也推薦過另一本更新的「C++ Primer Plus 中文版」(http://www.books.com.tw/products/0010564973)給您了。在此就不再重複細節。

      想跟您談談「從初學者更深入」的這件事。我覺得想要更深入最快的方法,就是做個實際的專案,而非書後的那些「簡單練習題」。您現在就像已經在駕訓場 Top 1 的學員,但還沒實際上路開過一樣。只要實際上路開過,把所學用上,就會發出:「啊!原來那招是這樣用啊!」的踏實感。就不會再覺得自己「浮浮的」、感覺還沒成為道上的一份子的心情了。

      至於要做什麼專案?那得問您學程式設計最早最早的「初心」了。我的話是寫一個「電玩」。我後來也花了一個月,真的寫了一個 2D 地下層迷宮的遊戲。畫面很破,遊戲也只有一關。玩過的人評語都是:「沒啦?」「好簡陋喔!」「這四根像火柴棒的東西你告訴我是人?」但我都笑笑不回答。因為那個時候,我很紮實地感受到,只要給我更長的時間,我已經知道怎麼寫出夠水準的遊戲了。這就是用「成就感」墊出來的「自信」。我想,您現在可能缺的是這一塊。

      所以,找出您的初衷,然後就放手去做一個吧!中間或許會除錯除得很想死。也會因為自己學藝不精一再地「簡化妥協」。但,重點就是「做完」。真的是「做完」(麻煩唸三遍 XD)!多爛都沒關係!至少讓自己成功一次!一次就好!接著,您現在的疑惑就會一掃而空了。

      相信我!(笑)然後,祝你成功!

      刪除
  10. 老師您好~
    我是個剛服完兵役的社會新鮮人,目前自己正在自修C++和資料結構,但對於目前業界狀況不甚了解,有以下幾點想請教。
    1. 我現在是用IDE整合式開發環境來練習C++(我用的是code::block),但卻不會自己架設開發環境,請問那些企業用的也是IDE,還是IDE是為了給初學者方便打程式用的。
    2. 我想在自修期間,順便準備專題。想說邊學邊做,到時還可以當作面試的作品。我現在C++的程度還只能用命令提示字元視窗對程式下指令,即便學了物件導向比較抽象,複雜的東西。但寫出來的東西,並沒有真的能讓人使用的感覺。我大四時因為要繳交專題,我那時只會一些程式的皮毛而已,可是用APP Inventor 邊對照書上教的,在自己東改改,西改改,寫出來的東西,更像是個程式,因為APP inventor 可以用程式語言去控制一些按鈕或圖像,而且App inventor 有用到一些資料庫的東西,不過似乎不太正統??即便我現在覺得我現在的程式能力,比大四時更好了。但用C++我卻不知道該如何呈現那樣的程式 。我需要學一些C++額外的工具嗎幫助我做專題嗎?又或者我只要專注於C++與資料結構,利用我所會的做出一些作品出來,即使有點陽春。

    不好意思,問了一堆問題。因為真的不是很了解外面的狀況,又覺得要學的東西好像很多,有點找不到方向,所以來這邊發問,想請教一下老師,謝謝。

    回覆刪除