{eval=Array;=+count(Array);}
從事嵌入式開發(fā)多年,C語言和Java兩種編程語言都拿來做過項(xiàng)目,凡是沒有那么絕對(duì),不同的編程語言適用于不同的編程場景,對(duì)于單片機(jī)來講運(yùn)行個(gè)操作系統(tǒng)就已經(jīng)是很奢侈的事情,再讓運(yùn)行java的虛擬機(jī)還讓人玩不,一旦涉及到操作系統(tǒng)或者java的虛擬機(jī)基本上已經(jīng)超乎單片機(jī)的范疇了,單片機(jī)再次擴(kuò)展化就是嵌入式開發(fā)了,運(yùn)行個(gè)操作系統(tǒng)或者java虛擬機(jī)也不是什么很難的事情。
術(shù)業(yè)有專攻,對(duì)于單片機(jī)而言應(yīng)用場景非常簡單,用最小的開支控制硬件電路,只要是單片機(jī)在的地方,軟件要求都不是太強(qiáng)大,但性能要求非常高,成本普遍比較低,常見一些小的控制設(shè)備基本上都是單片機(jī)完成,前天部門一個(gè)做單片機(jī)開發(fā)的程序員還在抱怨在嵌入式linux上寫的代碼直接平移到單片機(jī)上沒法用,占用內(nèi)存太厲害,相同的功能只好重新寫一遍,系統(tǒng)資源特別是內(nèi)存資源必須要考慮的事情,又不能增加做太多外圍的擴(kuò)展畢竟成本有限制,基于以上種種原因,單片機(jī)能跑個(gè)操作系統(tǒng)都是一件很難的事情更何況是Java,任何公司開發(fā)產(chǎn)品都需要從實(shí)際情況出發(fā)。
java目前主流語言里面的第一編程語言受眾最多,相關(guān)從業(yè)人數(shù)也是最多的,主要在應(yīng)用級(jí)開發(fā)以及后臺(tái)服務(wù)器開發(fā)方面有比較大的優(yōu)勢,可用類庫非常多,所以開發(fā)一個(gè)功能只要思路確定功能實(shí)現(xiàn)起來非常迅速,大部分的基本功能已經(jīng)封裝成類庫,而且由于受眾比較多,簡單的功能直直接在網(wǎng)上就能搜到然后復(fù)制粘貼出來,修改下就能使用,這也是強(qiáng)大的生態(tài)鏈支持。
Java也是可以直接調(diào)用底層硬件的,通過jni方式只是一個(gè)通道而已。在開發(fā)安卓框架的時(shí)候,有個(gè)同事做了多年的java,想轉(zhuǎn)行做底層的軟件開發(fā),結(jié)果搞了三個(gè)月堅(jiān)持不下去了,最后又回歸到j(luò)ava開發(fā)去了,不僅僅是語法方面的差異主要是編程方式以及編程思想差異太大,本質(zhì)上還是面向?qū)ο蠛兔嫦蜻^程的差異,現(xiàn)在的程序員特別是剛?cè)胄械南矚g拿比較各種編程語言的差異,更夸張還有鄙視鏈。
1.C語言屬于面向過程的編程語言,java面向?qū)ο笳Z言,編程思路有差異
2.C語言主要用在操作系統(tǒng),通訊行業(yè),驅(qū)動(dòng)開發(fā)等底層語言開發(fā),java主要在app以及后端服務(wù)器開發(fā),現(xiàn)在大數(shù)據(jù)領(lǐng)域應(yīng)用場景也很多。
3.編程語言發(fā)展正在向著集成化發(fā)展像java這種在編程領(lǐng)域會(huì)越來越受到重視,C語言這種底層語言會(huì)越來越走向后臺(tái),并不意味著落伍,只不過從前臺(tái)走向了后端,而且從業(yè)的門檻也提升了,但重要程度不會(huì)因此降低。
術(shù)業(yè)有專攻任何一種編程語言都不是萬能的,能在合適的場景下解決問題就夠了,沒有必要在一些無關(guān)的選擇上浪費(fèi)太多的時(shí)間。
希望能幫到你。
根據(jù)我所知道的回答一下這個(gè)問題。
在學(xué)生時(shí)代,我用過C語言編程也用過JAVA語言編程,工作之后都還給老師了,但是基本的概念還是知道一些。
C語言和JAVA語言同樣是高級(jí)語言,但是還是不同的,C語言要更低級(jí)一些,對(duì)硬件的控制更加直接,JAVA語言的運(yùn)行需要使用JAVA虛擬機(jī)。下面分別對(duì)C語言和JAVA語言說一說。
C語言是我大學(xué)時(shí)的必修課,記得那時(shí)還是用的譚浩強(qiáng)老師的C語言教材,現(xiàn)在回想起來歷歷在目;
C語言更加接近機(jī)器語言,可以使用指針等直接對(duì)內(nèi)存的地址進(jìn)行操作;
C語言是面向過程的編程語言,說的直白點(diǎn)兒,使用C語言編程,腦海中首先得有一個(gè)流程圖,第一步干什么、第二步干什么,直到把這個(gè)事情做完;
C語言需要使用編譯器編譯成機(jī)器語言,然后就可以運(yùn)行了,不需要運(yùn)行在虛擬機(jī)上,JAVA是運(yùn)行在虛擬機(jī)上的,所以運(yùn)行速率有點(diǎn)兒慢,但是跨平臺(tái)效果好。
JAVA是面向?qū)ο蟮母呒?jí)語言,說直白點(diǎn)兒就是,編程時(shí),首先要把所有的東西抽象成類,這個(gè)類包含了各種屬性和方法,然后封裝起來,更加接近人類世界;
JAVA的運(yùn)行需要解釋器,轉(zhuǎn)換成字節(jié)碼,然后在JAVA虛擬機(jī)上運(yùn)行,相比與C語言是不需要的虛擬機(jī)的,編譯成機(jī)器語言,直接在硬件上運(yùn)行。
單片機(jī)的性能一般不是很好,CPU、內(nèi)存可以說是“寸土寸金”,要省著點(diǎn)而用;
假如單片機(jī)使用JAVA語言,那么首先需要運(yùn)行一個(gè)JAVA虛擬機(jī),性能不是很好的單片機(jī)是“跑”不起來的;
單片機(jī)使用C語言就不一樣了,C語言編譯后直接轉(zhuǎn)換成機(jī)器語言,直接對(duì)硬件進(jìn)行控制,效率要高很多,而且很節(jié)省CPU和內(nèi)存空間。
對(duì)于C語言和JAVA語言的使用區(qū)別,大家有什么看法呢,歡迎在評(píng)論區(qū),留言討論。
如需更多幫助,請(qǐng)私信關(guān)注,謝謝。
作為985院校的本碩畢業(yè)生以及BAT的Java開發(fā)工程師來回答這個(gè)問題。
因?yàn)橥瑸楦呒?jí)語言的C語言是編譯型語言,而Java是解釋型語言。
也許你早就好奇了,什么是解釋型語言,那什么是編譯型語言?
我們最開始說C/C++是編譯型語言,原因是相對(duì)于java這樣的解釋性語言,C/C++需要通過編譯器,把源代碼編譯成中間文件,然后通過連接器和匯編器生成機(jī)器碼,即一系列基本操作序列,可以直接讓計(jì)算機(jī)執(zhí)行。
而java程序從源代碼到被計(jì)算機(jī)執(zhí)行,也要經(jīng)歷上述步驟。不同的地方在于,C/C++會(huì)把那些從源代碼“變”來的機(jī)器碼保存起來,而java直接將這些生成的基本操作序列指令丟給java虛擬機(jī),也就是我們常說的JVM(java virtual machine),執(zhí)行然后產(chǎn)生動(dòng)作了。這就是我們所說的解釋型語言。
所以我們看到的現(xiàn)象是,編譯型語言要先編譯再運(yùn)行,而解釋性語言直接“運(yùn)行”源代碼。
單片機(jī)其實(shí)就是一個(gè)微型電腦,除了功能和性能上比我們家用電腦弱很多,其他內(nèi)部重要構(gòu)造一應(yīng)俱全,用來做一些控制家用電器的工作足夠了,比如洗衣機(jī),微波爐什么的。
單片機(jī)程序通常都是用C/C++編寫的。因?yàn)樗麄兩傻膃xe文件,是可以直接放在單片機(jī)內(nèi)部運(yùn)行的。而像Java,作為解釋型語言,它編譯后的產(chǎn)生的文件是要放在java的虛擬機(jī)中才能運(yùn)行的,直接交給單片機(jī),根本無法運(yùn)行。
如果一定用Java寫單片機(jī)程序,也不是不可以,就是比較麻煩,需要把它的解釋器寫進(jìn)單片機(jī)內(nèi)部。但是這樣做簡直就是自找麻煩,第一占用單片機(jī)有限的空間資源,第二會(huì)影響執(zhí)行速度。我想所有人都不想點(diǎn)擊洗衣機(jī)的開始按鈕之后,過了十秒鐘,才開始加水吧。
以上是我的淺見,如果對(duì)你有所幫助,歡迎點(diǎn)贊留言與我交流。
我是蘇蘇思量,來自BAT的Java開發(fā)工程師,每日分享科技類見聞,歡迎關(guān)注我,與我共同進(jìn)步。
這兩種語言的運(yùn)行機(jī)制不一樣。
C語言是直接編譯成二進(jìn)制格式的機(jī)器可運(yùn)行代碼。比如在windows平臺(tái)上的exe文件,雙擊可直接運(yùn)行。
而JAVA不同,JAVA是運(yùn)行在各種版本的JAVA虛擬機(jī)之上的。JAVA虛擬機(jī),可以理解為運(yùn)行在各個(gè)平臺(tái)之上的可執(zhí)行文件,這個(gè)程序負(fù)責(zé)給windows等各個(gè)平臺(tái)翻譯編譯后的JAVA語言。
舉個(gè)例子,C語言就好比你精通各國語言,直接和老外交流,而JAVA則是帶個(gè)翻譯(JAVA虛擬機(jī))來和系統(tǒng)交流的。執(zhí)行效率肯定是C語言更高一些了。
51單片機(jī),機(jī)器運(yùn)行資源相對(duì)比較緊湊,在上面跑個(gè)JAVA虛擬機(jī)的話開銷有些大。另外,JAVA官方也沒有提供51平臺(tái)的虛擬機(jī)。
另外,C可以直接操作內(nèi)存,可以調(diào)用匯編指令,操作起來更加靈活。而JAVA受虛擬機(jī)功能限制,可完成的工作就比較局限了。
從JAVA語言誕生之日起,JAVA就是為了大規(guī)模開發(fā)應(yīng)運(yùn)而生的。C則擅長直接和硬件打交道。所以,從各方面看,JAVA都不適合開發(fā)單片機(jī)程序。
一直從事單片機(jī)和嵌入式方面的軟硬件設(shè)計(jì)。這個(gè)問題其實(shí)跟容易搞明白。先說一下答案吧,因?yàn)镃語言的語言特性更適合跟硬件打交道,所以選擇C而不是Java。那具體為什么呢,下面詳細(xì)說一下。
首先明白什么是單片機(jī),單片機(jī)說白了可以理解為一個(gè)微電腦,它上面集成了ROM(可以理解為電腦硬盤)、RAM(理解為內(nèi)存條)、CPU以及IO端口、串口、SPI IIC等板載總線,一些高級(jí)單片機(jī)還集成了USB、LCD以及以太網(wǎng)接口,看上去是不是很像一個(gè)微型電腦。當(dāng)然專業(yè)點(diǎn)講,單片機(jī)從51到ARM從8位到32位種類很多,性能也千差萬別,根據(jù)具體應(yīng)用選擇型號(hào)。所以說到底操作單片機(jī)和操作一臺(tái)沒有操作系統(tǒng)的裸機(jī)是很類似的(也有區(qū)別)。
那好了,搞明白了什么是單片機(jī)再來說一下編程語言的歷史。早期操作cpu是用的機(jī)器語言,機(jī)器語言就是只有0和1的一串?dāng)?shù)字編碼,CPU通過執(zhí)行機(jī)器語言進(jìn)行相關(guān)的操作。后來覺得機(jī)器語言不好記,就發(fā)明了匯編語言,匯編語言可以理解為,把機(jī)器語言差不多一對(duì)一翻譯成英文字符,這樣方便記憶,寫代碼快啊。
后來又發(fā)現(xiàn)不同的CPU使用的機(jī)器語言不一樣,自然對(duì)應(yīng)的匯編也就不同,給一個(gè)CPU寫的程序在另一個(gè)cpu上不能用,于是又把匯編抽象了一下就有了C語言,對(duì)不同的CPU只需要用對(duì)應(yīng)的編譯器編譯一下就可以了,為了適應(yīng)匯編語言便于編譯,C語言保留了許多匯編的特性,比如對(duì)內(nèi)存地址的操作(指針),那時(shí)候C語言算是高級(jí)語言,但它仍然距離硬件非常近。
再后來人們開發(fā)的軟件逐漸龐大起來,C語言讓程序員很為難,在開發(fā)大型軟件的時(shí)候C語言開發(fā)效率太低。于是就有了面向?qū)ο蟮恼Z言C++ JAVA 等。這些面向?qū)ο蟮恼Z言編譯起來比較復(fù)雜,在形成可執(zhí)行語言的時(shí)候容易出現(xiàn)問題,因?yàn)榫幾g器也是軟件也會(huì)有BUG,所以在底層使用的時(shí)候盡量使用簡單的語言,如C語言。面相對(duì)象的語言讓程序員輕松了,但是代碼效率卻下降了,越高級(jí)抽象的語言執(zhí)行效率越低,低效率的程序直接運(yùn)行在硬件層是一件很可怕的事情。另外JAVA還不同于C++,JAVA不是直接被編譯成機(jī)器代碼的,而是編譯成字節(jié)碼,運(yùn)行在虛擬機(jī)上的(這部分內(nèi)容這里就不談了),直接理解就是它本身需要?jiǎng)e的軟件支持,不能直接運(yùn)行在硬件層。
最后說C語言的指針可以讓程序員直接操作內(nèi)存地址以及CPU的寄存器,這是使用C語言操作單片機(jī)的最根本的原因。它既避免了匯編語言的不可跨平臺(tái),又提高了編程效率,還能保持和匯編差不多的執(zhí)行效率。JAVA是做不到的
雖然都是高級(jí)語言,但是還是有區(qū)別的,c是面向過程的高級(jí)語言,適用于對(duì)硬件對(duì)過程的控制。java是面向?qū)ο蟮母呒?jí)語言,適用于對(duì)抽象業(yè)務(wù)的處理。都是高級(jí)語言,但c的抽象程度不及java,高級(jí)程度不及java。單片機(jī)資源非常有限,不適合使用java。
這是因?yàn)樵绞堑讓映绦騿T邏輯思維能力越強(qiáng),對(duì)OOP越不感冒,這就好比你家離超市300公尺,底層程序員喜歡直接跑過去,跑的過程還會(huì)選擇一條最短的捷徑。而上層程序員則會(huì)按百度地圖坐公交到下一站再打個(gè)專車。
就跟你想去百米開外的商店買東西一樣,
你走去很方便,
你說這個(gè)路程,可以考慮抽象一下,我要有個(gè)交通工具,這樣以后商店遠(yuǎn)了,我也能方便去,所以你開車去了~~
最后發(fā)現(xiàn),還是走著方便~
1、C語言寶刀不老的優(yōu)勢就是:代碼簡潔且與單片機(jī)關(guān)系密切。
2、玩單片機(jī)就是用C語言,別整別的幺蛾子。你搞別的會(huì)被人笑話。
3、C語言入門其實(shí)很快的,多學(xué)一門編程語言沒壞處。
4、JAVA是基于C的,最后轉(zhuǎn)換成機(jī)器代碼比C繁瑣(匯編語言轉(zhuǎn)換更快,但寫起來麻煩,500行匯編代碼用C語言100行就夠了)。
5、單片機(jī)的各種庫基本都是C語言(我說的是基本都是,不是全是),一些系統(tǒng)底層的程序也基本都是C語言寫的(STM32單片機(jī)啟動(dòng)程序有匯編文件)。要是把這些東西全用JAVA寫好那也行,但沒人懶得開發(fā)。
6、單片機(jī)寫程序用的主流軟件Keil、IAR、Arduino,基本都是用C語言寫程序;現(xiàn)在還沒聽說過哪個(gè)軟件將單片機(jī)和JAVA聯(lián)系在一起的。
7、高手都是會(huì)4種以上編程語言的,只會(huì)一種,算不算高手。
10
回答10
回答3
回答9
回答10
回答4
回答0
回答8
回答6
回答2
回答