同樣是高級語言為什麼C語言可以編寫51單片機程序,JAVA卻不能編寫?

星沉大海3


作為985院校的本碩畢業生以及BAT的Java開發工程師來回答這個問題。

因為同為高級語言的C語言是編譯型語言,而Java是解釋型語言。

解釋型語言與編譯型語言

也許你早就好奇了,什麼是解釋型語言,那什麼是編譯型語言?

我們最開始說C/C++是編譯型語言,原因是相對於java這樣的解釋性語言,C/C++需要通過編譯器,把源代碼編譯成中間文件,然後通過連接器和彙編器生成機器碼,即一系列基本操作序列,可以直接讓計算機執行。

而java程序從源代碼到被計算機執行,也要經歷上述步驟。不同的地方在於,C/C++會把那些從源代碼“變”來的機器碼保存起來,而java直接將這些生成的基本操作序列指令丟給java虛擬機,也就是我們常說的JVM(java virtual machine),執行然後產生動作了。這就是我們所說的解釋型語言。

所以我們看到的現象是,編譯型語言要先編譯再運行,而解釋性語言直接“運行”源代碼。

單片機

單片機其實就是一個微型電腦,除了功能和性能上比我們家用電腦弱很多,其他內部重要構造一應俱全,用來做一些控制家用電器的工作足夠了,比如洗衣機,微波爐什麼的。

單片機程序通常都是用C/C++編寫的。因為他們生成的exe文件,是可以直接放在單片機內部運行的。而像Java,作為解釋型語言,它編譯後的產生的文件是要放在java的虛擬機中才能運行的,直接交給單片機,根本無法運行。

如果一定用Java寫單片機程序,也不是不可以,就是比較麻煩,需要把它的解釋器寫進單片機內部。但是這樣做簡直就是自找麻煩,第一佔用單片機有限的空間資源,第二會影響執行速度。我想所有人都不想點擊洗衣機的開始按鈕之後,過了十秒鐘,才開始加水吧。

以上是我的淺見,如果對你有所幫助,歡迎點贊留言與我交流。

我是蘇蘇思量,來自BAT的Java開發工程師,每日分享科技類見聞,歡迎關注我,與我共同進步。


蘇蘇思量


根據我所知道的回答一下這個問題。


在學生時代,我用過C語言編程也用過JAVA語言編程,工作之後都還給老師了,但是基本的概念還是知道一些。


C語言和JAVA語言同樣是高級語言,但是還是不同的,C語言要更低級一些,對硬件的控制更加直接,JAVA語言的運行需要使用JAVA虛擬機。下面分別對C語言和JAVA語言說一說。

C語言

  • C語言是我大學時的必修課,記得那時還是用的譚浩強老師的C語言教材,現在回想起來歷歷在目;

  • C語言更加接近機器語言,可以使用指針等直接對內存的地址進行操作;

  • C語言是面向過程的編程語言,說的直白點兒,使用C語言編程,腦海中首先得有一個流程圖,第一步幹什麼、第二步幹什麼,直到把這個事情做完;

  • C語言需要使用編譯器編譯成機器語言,然後就可以運行了,不需要運行在虛擬機上,JAVA是運行在虛擬機上的,所以運行速率有點兒慢,但是跨平臺效果好。

JAVA語言

  • JAVA是面向對象的高級語言,說直白點兒就是,編程時,首先要把所有的東西抽象成類,這個類包含了各種屬性和方法,然後封裝起來,更加接近人類世界;

  • JAVA的運行需要解釋器,轉換成字節碼,然後在JAVA虛擬機上運行,相比與C語言是不需要的虛擬機的,編譯成機器語言,直接在硬件上運行。


單片機為什麼用C語言而不用JAVA

  • 單片機的性能一般不是很好,CPU、內存可以說是“寸土寸金”,要省著點而用;

  • 假如單片機使用JAVA語言,那麼首先需要運行一個JAVA虛擬機,性能不是很好的單片機是“跑”不起來的;

  • 單片機使用C語言就不一樣了,C語言編譯後直接轉換成機器語言,直接對硬件進行控制,效率要高很多,而且很節省CPU和內存空間。


對於C語言和JAVA語言的使用區別,大家有什麼看法呢,歡迎在評論區,留言討論。

如需更多幫助,請私信關注,謝謝。


Geek視界


從事嵌入式開發多年,C語言和Java兩種編程語言都拿來做過項目,凡是沒有那麼絕對,不同的編程語言適用於不同的編程場景,對於單片機來講運行個操作系統就已經是很奢侈的事情,再讓運行java的虛擬機還讓人玩不,一旦涉及到操作系統或者java的虛擬機基本上已經超乎單片機的範疇了,單片機再次擴展化就是嵌入式開發了,運行個操作系統或者java虛擬機也不是什麼很難的事情。

術業有專攻,對於單片機而言應用場景非常簡單,用最小的開支控制硬件電路,只要是單片機在的地方,軟件要求都不是太強大,但性能要求非常高,成本普遍比較低,常見一些小的控制設備基本上都是單片機完成,前天部門一個做單片機開發的程序員還在抱怨在嵌入式linux上寫的代碼直接平移到單片機上沒法用,佔用內存太厲害,相同的功能只好重新寫一遍,系統資源特別是內存資源必須要考慮的事情,又不能增加做太多外圍的擴展畢竟成本有限制,基於以上種種原因,單片機能跑個操作系統都是一件很難的事情更何況是Java,任何公司開發產品都需要從實際情況出發。

java目前主流語言裡面的第一編程語言受眾最多,相關從業人數也是最多的,主要在應用級開發以及後臺服務器開發方面有比較大的優勢,可用類庫非常多,所以開發一個功能只要思路確定功能實現起來非常迅速,大部分的基本功能已經封裝成類庫,而且由於受眾比較多,簡單的功能直直接在網上就能搜到然後複製粘貼出來,修改下就能使用,這也是強大的生態鏈支持。

Java也是可以直接調用底層硬件的,通過jni方式只是一個通道而已。在開發安卓框架的時候,有個同事做了多年的java,想轉行做底層的軟件開發,結果搞了三個月堅持不下去了,最後又迴歸到java開發去了,不僅僅是語法方面的差異主要是編程方式以及編程思想差異太大,本質上還是面向對象和麵向過程的差異,現在的程序員特別是剛入行的喜歡拿比較各種編程語言的差異,更誇張還有鄙視鏈。

C語言和java幾點區別?

1.C語言屬於面向過程的編程語言,java面嚮對象語言,編程思路有差異

2.C語言主要用在操作系統,通訊行業,驅動開發等底層語言開發,java主要在app以及後端服務器開發,現在大數據領域應用場景也很多。

3.編程語言發展正在向著集成化發展像java這種在編程領域會越來越受到重視,C語言這種底層語言會越來越走向後臺,並不意味著落伍,只不過從前臺走向了後端,而且從業的門檻也提升了,但重要程度不會因此降低。

術業有專攻任何一種編程語言都不是萬能的,能在合適的場景下解決問題就夠了,沒有必要在一些無關的選擇上浪費太多的時間。

希望能幫到你。


大學生編程指南


一直從事單片機和嵌入式方面的軟硬件設計。這個問題其實跟容易搞明白。先說一下答案吧,因為C語言的語言特性更適合跟硬件打交道,所以選擇C而不是Java。那具體為什麼呢,下面詳細說一下。

首先明白什麼是單片機,單片機說白了可以理解為一個微電腦,它上面集成了ROM(可以理解為電腦硬盤)、RAM(理解為內存條)、CPU以及IO端口、串口、SPI IIC等板載總線,一些高級單片機還集成了USB、LCD以及以太網接口,看上去是不是很像一個微型電腦。當然專業點講,單片機從51到ARM從8位到32位種類很多,性能也千差萬別,根據具體應用選擇型號。所以說到底操作單片機和操作一臺沒有操作系統的裸機是很類似的(也有區別)。

那好了,搞明白了什麼是單片機再來說一下編程語言的歷史。早期操作cpu是用的機器語言,機器語言就是隻有0和1的一串數字編碼,CPU通過執行機器語言進行相關的操作。後來覺得機器語言不好記,就發明了彙編語言,彙編語言可以理解為,把機器語言差不多一對一翻譯成英文字符,這樣方便記憶,寫代碼快啊。

後來又發現不同的CPU使用的機器語言不一樣,自然對應的彙編也就不同,給一個CPU寫的程序在另一個cpu上不能用,於是又把彙編抽象了一下就有了C語言,對不同的CPU只需要用對應的編譯器編譯一下就可以了,為了適應彙編語言便於編譯,C語言保留了許多彙編的特性,比如對內存地址的操作(指針),那時候C語言算是高級語言,但它仍然距離硬件非常近。

再後來人們開發的軟件逐漸龐大起來,C語言讓程序員很為難,在開發大型軟件的時候C語言開發效率太低。於是就有了面向對象的語言C++ JAVA 等。這些面向對象的語言編譯起來比較複雜,在形成可執行語言的時候容易出現問題,因為編譯器也是軟件也會有BUG,所以在底層使用的時候儘量使用簡單的語言,如C語言。面相對象的語言讓程序員輕鬆了,但是代碼效率卻下降了,越高級抽象的語言執行效率越低,低效率的程序直接運行在硬件層是一件很可怕的事情。另外JAVA還不同於C++,JAVA不是直接被編譯成機器代碼的,而是編譯成字節碼,運行在虛擬機上的(這部分內容這裡就不談了),直接理解就是它本身需要別的軟件支持,不能直接運行在硬件層。

最後說C語言的指針可以讓程序員直接操作內存地址以及CPU的寄存器,這是使用C語言操作單片機的最根本的原因。它既避免了彙編語言的不可跨平臺,又提高了編程效率,還能保持和彙編差不多的執行效率。JAVA是做不到的


HeloneTech


1、C語言寶刀不老的優勢就是:代碼簡潔且與單片機關係密切。

2、玩單片機就是用C語言,別整別的么蛾子。你搞別的會被人笑話。

3、C語言入門其實很快的,多學一門編程語言沒壞處。

4、JAVA是基於C的,最後轉換成機器代碼比C繁瑣(彙編語言轉換更快,但寫起來麻煩,500行彙編代碼用C語言100行就夠了)。

5、單片機的各種庫基本都是C語言(我說的是基本都是,不是全是),一些系統底層的程序也基本都是C語言寫的(STM32單片機啟動程序有彙編文件)。要是把這些東西全用JAVA寫好那也行,但沒人懶得開發。

6、單片機寫程序用的主流軟件Keil、IAR、Arduino,基本都是用C語言寫程序;現在還沒聽說過哪個軟件將單片機和JAVA聯繫在一起的。

7、高手都是會4種以上編程語言的,只會一種,算不算高手。


蘇更宇


這兩種語言的運行機制不一樣。

C語言是直接編譯成二進制格式的機器可運行代碼。比如在windows平臺上的exe文件,雙擊可直接運行。

而JAVA不同,JAVA是運行在各種版本的JAVA虛擬機之上的。JAVA虛擬機,可以理解為運行在各個平臺之上的可執行文件,這個程序負責給windows等各個平臺翻譯編譯後的JAVA語言。

舉個例子,C語言就好比你精通各國語言,直接和老外交流,而JAVA則是帶個翻譯(JAVA虛擬機)來和系統交流的。執行效率肯定是C語言更高一些了。

51單片機,機器運行資源相對比較緊湊,在上面跑個JAVA虛擬機的話開銷有些大。另外,JAVA官方也沒有提供51平臺的虛擬機。

另外,C可以直接操作內存,可以調用匯編指令,操作起來更加靈活。而JAVA受虛擬機功能限制,可完成的工作就比較侷限了。

從JAVA語言誕生之日起,JAVA就是為了大規模開發應運而生的。C則擅長直接和硬件打交道。所以,從各方面看,JAVA都不適合開發單片機程序。


自由編程


JAVA是為跨平臺而設計的高級語言。它編譯生成的機器碼指令,是運行在一個虛擬機上的中間代碼。需要在目標機上運行一個JAVA虛擬機的解釋程序,解釋執行這個中間代碼。這樣的時間開銷是很大的,運行速度是較慢的。比C語言產生的直接指令程序要慢到10到100倍。這種用犧牲時間來換取跨平臺的優點。

對一個簡單單片機來說,實現跨平臺運行毫無意義。還要在單片機編制JAⅤA虛擬機解釋程序,卻換來更慢的運行結果。單片機用JAVA純屬累贅。

C語言編譯生成本地直接機器指令代碼。語法簡潔,生成的指令質量接近彙編語言,運行速度極快,可控制硬件細節,是最適合單片機的高級語言。

JAⅤA語言雖模仿C語言語法,但生成的目標程序運行方式卻不一樣,兩者用處自然有區別。


溫情憶鴻564


不是絕對不可以,但的確不合適,原因:1、單片機通常是x86或arm架構的,8位或16位,內存較小,指令精簡,完成專用領域的控制及處理任務,通常直接運行彙編程序,或者c程序,而不會採用java之類的高級編程語言,這是由機器硬件特性決定的 2、從運行機制原理及語言特點來講,彙編指令種類基本固定有限,並且c程序通常可以操作數、操作位、操作內存地址,函數可映射尋址彙編代碼,系統功能調用也可對應彙編子程序代碼,c程序編譯後可直接運行於單片機,而java就不適合了,類及對象分配不方便直接對應操作數、操作位、操作內存地址,方法也不能直接尋址彙編代碼,並且java編譯生成中間字節碼,不能運行於單片機,需要安裝虛擬機環境,而對應cpu架構指令是不通用的,只適合i386及以上,不適合單片機,綜上所述,c或彙編語言適合單片機開發,而java不適合


紅塵匆匆過客夢


我就呵呵了,題主剛學的java嗎,這門語言最初就是用來搞硬件開發的,做烤箱冰箱手機等等,後來因為發展過快,虛擬機和軟件包越來越龐大,普通的家電存儲器小處理器頻率低再用這麼龐大的語言已經有些浪費,適合運行精煉速度快的程序,所以還在沿用c,但並不表示java不可以開發硬件。所以說c小有他的好處,可以用最原始的方法實現想要的系統功能,用太多別人的包不知會出啥問題。java大當然更好,雖然效率會有所降低,但是可以輕鬆開發應用,不然安卓不會選java做殼。


人生還要什麼


只要有JVM就能用JAVA,現在高端單片機已經有能力嵌入LINUX系統了。但沒必要再支持JAVA,因為成本高。硬件不會經常變動,公司選一個單片機型號用十年以上是常事。單片機程序也不需要跨平臺,JAVA在單片機上沒多大用處,需要操作系統和JVM支持,需要大內存和高端型號單片機,成本太高。


分享到:


相關文章: