{eval=Array;=+count(Array);}
從事編程十幾年,JAVA、C、C++、Python這四種編程語言都玩過,前三種玩的比較多,python做為興趣愛好或者玩腳本的時候弄過,編程語言在使用的時候主要還是適合不合適,單片機(jī)使用的場景屬于功能簡單,成本相對較低,現(xiàn)在也有高配版的單片機(jī),本來單片機(jī)是不帶系統(tǒng)的,非要硬扯到帶系統(tǒng)的,從成本上考量就不是那回事了,成本主要包括兩個方面有硬件成本,還有研發(fā)難度的成本這都是需要考慮的事情。
單片機(jī)開發(fā)語言C語言和匯編,別的語言還真不好上手,編程語言能力強(qiáng)大與否關(guān)鍵無外乎是不是能夠控制底層的硬件,往往是一些門外漢喜歡編排一些故事,搞成什么編程語言的鄙視鏈條,真正的程序員底層的編程語言會羨慕上層編程語言的靈活性,上層的編程語言羨慕底層的編程人員能夠控制硬件覺得是一件很神奇的事情,曾經(jīng)面試過一個做了很多年java的工程師,居然想著拿出兩年的時間來學(xué)習(xí)C語言,最后真還是降低工資標(biāo)準(zhǔn)進(jìn)來了公司。
單片機(jī)編程主要是操作硬件的寄存器多一點(diǎn),在編程語言方面使用的指針多一些,基本上while搭配中斷把編程工作就差不多搞定了,如果硬要上java,python主要運(yùn)行環(huán)境受不了,在運(yùn)行java之前首先要把虛擬機(jī)給移植上,就單片機(jī)那點(diǎn)內(nèi)存壓根不是個,所以不同的編程環(huán)境不同的搭配,沒有必要強(qiáng)求,無論是C/C++編程還是高級語言java,python在使用過程中編程套路都接近。
如果真要想在單片機(jī)上運(yùn)行虛擬機(jī)還不如直接找個有操作系統(tǒng)的嵌入式設(shè)備,單片機(jī)完成的就是簡單能夠容易實(shí)現(xiàn)的功能,太多功能模塊化的功能就不適合在這上面,解釋性的語言執(zhí)行需要一個運(yùn)行環(huán)境不像單片機(jī)那么單純,直接把全套的環(huán)境都運(yùn)行在一個程序里面,單片機(jī)編程的時候有時候發(fā)現(xiàn)明明只有幾行代碼編譯出來卻有幾百k,主要所有的驅(qū)動以及底層的實(shí)現(xiàn)都統(tǒng)統(tǒng)打包在一個可執(zhí)行文件里面,嵌入式的運(yùn)行環(huán)境相對來講就比較復(fù)雜了,首先要把操作系統(tǒng)給安裝到位,還有各種驅(qū)動提前準(zhǔn)備好。
越是高級語言的編程越是框架性強(qiáng),可移植性強(qiáng),單片機(jī)編程適合簡單功能的產(chǎn)品,比如常見的MP3,掃地機(jī),以及玩具功能來回就是幾個功能,沒有特別復(fù)雜的功能,如果后續(xù)功能非常多而且界面操作非常繁瑣就可以考慮使用嵌入式編程或者更加高級一點(diǎn)的編程語言了,永遠(yuǎn)都是適當(dāng)?shù)膱鼍斑m用適當(dāng)?shù)木幊陶Z言,無所謂對錯。
希望能幫到你。
菜農(nóng)從1981年開始就涉足與嵌入式領(lǐng)域的編程,開始是匯編語言和宏匯編語言,后來是C語言及C++語言,其他語言可能有,但很少且無大出路。
因為嵌入式領(lǐng)域的編程與硬件有關(guān),特別是芯片里的中斷向量即函數(shù)指針,而C和C++被其他編程語言攻擊和被拋棄的就是函數(shù)指針!
而嵌入式領(lǐng)域最需要的就是函數(shù)指針,它與結(jié)構(gòu)和聯(lián)合,可以構(gòu)成“COM接口技術(shù)”,為芯片的中斷向量或函數(shù)指針即地址加密。
而其他編程語言大多沒有函數(shù)指針,故無法滿足嵌入式領(lǐng)域編程的特殊需要,故以后或永遠(yuǎn)不可能完全替代C或C++,除非他不想保護(hù)他的代碼被篡改或產(chǎn)品的克隆。
謝邀。之前回答過類似的問題,這里再解釋一下。
問題里說的是單片機(jī),那首先你得知道什么是單片機(jī)。根據(jù)不同的內(nèi)核,單片機(jī)一般有51內(nèi)核單片機(jī)和ARM內(nèi)核單片機(jī),根據(jù)位數(shù)不同分為8位、16位、32位單片機(jī)。單片機(jī)不同于電腦的CPU,它集成了CPU、ROM(理解為電腦硬盤)、RAM(理解為內(nèi)存)以及板載通信總線(SPI、IIC、UART等),高端的單片機(jī)還會集成以太網(wǎng)、LCD和USB等功能,看起來就像一臺微型電腦一樣。
說完單片機(jī)再說一下單片機(jī)編程,一般的單片機(jī)編程都是裸機(jī)編程,也就是沒有操作系統(tǒng)的單進(jìn)程程序。程序員通過代碼直接操作單片機(jī)的CPU寄存器、內(nèi)存以及其集成的所有外設(shè),所以單片機(jī)編程不同于基于操作系統(tǒng)的編程。前者直接操作硬件層,從選擇編程語言上來講,匯編是最好的選擇,因為它執(zhí)行效率高,可以直接對寄存器、內(nèi)存進(jìn)行操作。但是不同的單片機(jī)指令集是不同的,匯編可移植性太差,給一個單片機(jī)寫的程序在不同指令集的單片機(jī)上不能運(yùn)行。
說到這很多人會想到可以用高級語言代替匯編語言,然后再通過編譯器將高級語言編譯成匯編,最后生成機(jī)器語言給單片機(jī)執(zhí)行。這是個不錯的想法,那如何選擇高級語言呢C、C++、JAVA、Python還是C#等。這里面最好的就是C語言,為什么呢?通俗來講,C語言誕生之初就是用來替代匯編的,提高代碼可移植性,而且C語言具有匯編的很多特性,比如其可以通過指針操作寄存器、內(nèi)存地址,C語言語法簡單,更貼近硬件層,執(zhí)行效率高。
這里提到了執(zhí)行效率,計算機(jī)專業(yè)的同學(xué)都知道匯編語言效率最高,C語言效率僅次于匯編,因為C語言在通過編譯器生成匯編的時候會產(chǎn)生一些冗余指令。因為編譯器也是一個程序,它的編譯性能再好,也不如程序員直接寫一個匯編程序的執(zhí)行效率高。
說到這差不多快明白了,C++、Java、Python這類語言我們也可以用于寫單片機(jī)程序,只要有適應(yīng)的編譯器,將其編譯成單片機(jī)的機(jī)器語言就行了。但是這類面向?qū)ο蟮恼Z言,其語法格式比較復(fù)雜,而且執(zhí)行效率不如C語言,其特性不利于操作硬件寄存器、內(nèi)存地址等,比如Java設(shè)計之初為了避免程序員操作地址,就取消了C++里的指針的概念,另外編譯器也是一個程序,編譯器也會有bug,編譯復(fù)雜語言出問題的概率也會增加。
因此,在單片機(jī)執(zhí)行的程序,直接接觸硬件層,這類程序要求效率高,出現(xiàn)異常的概率要小,還要具有可移植性,滿足這些條件的,好像只有C語言了。
(*^▽^*) 寥寥數(shù)語,不知道有沒有表達(dá)清楚,歡迎對編程、硬件感興趣的小伙伴點(diǎn)贊加關(guān)注。
作為985院校的本碩畢業(yè)生以及BAT的Java開發(fā)工程師來回答這個問題。
也許你早就好奇了,什么是高級語言,那對應(yīng)的有沒有低級語言?
簡單粗暴的解釋,人類直接使用的語言就算高級語言,比如題主提到的,都是程序員編程時候直接使用的,相對于低級語言來說,更具有邏輯性,更容易閱讀和編寫。高級語言可以認(rèn)為是對低級語言的封裝,因此實(shí)現(xiàn)同樣的功能,使用高級語言編寫的程序更加短小精悍。
而與低級語言相對,就不是給人看的,而是給機(jī)器看的語言。所有高級語言在真正執(zhí)行的時候,都要編譯為低級語言,畢竟真正的執(zhí)行者是機(jī)器。這里我們可以將機(jī)器語言和匯編看為低級語言,它們通常使用的是機(jī)器識別的01代碼已經(jīng)一些符號。
單片機(jī)其實(shí)就是一個微型電腦,除了功能和性能上比我們家用電腦弱很多,其他內(nèi)部重要構(gòu)造一應(yīng)俱全,用來做一些控制家用電器的工作足夠了,比如洗衣機(jī),微波爐什么的。
這些單片機(jī)通常都是用C/C++編寫的。因為他們是編譯型語言,是可以直接生成exe文件,然后直接放在單片機(jī)內(nèi)部運(yùn)行的。而像Java,屬于解釋型語言,它編譯后的class文件是要放在jvm中才能運(yùn)行的,直接放進(jìn)單片機(jī),人家根本理解不了。
如果偏要Java寫單片機(jī)程序,就需要把它的解釋器燒進(jìn)單片機(jī)且與單片機(jī)對接才行。這樣做第一占用單片機(jī)有限的空間資源,第二也會影響執(zhí)行速度。你總不希望你點(diǎn)擊微波爐的加熱按鈕,三秒鐘之后它才反應(yīng)過來開始加熱吧。
其實(shí)講到這里,大家基本就明白了為什么C/C++可以編寫單片機(jī)程序了,因為C本身就是為了編寫UNIX操作系統(tǒng)而發(fā)明出來的,截止1973年,Unix操作系統(tǒng)已經(jīng)完全使用C來編寫了。作為一個誕生本是為系統(tǒng)開發(fā)的語言,它本身就是與單片機(jī)編程匹配的,只不過由于種種原因,C語言進(jìn)一步發(fā)展,成為了一種廣泛使用可上可下的編程語言,看起來與Java,Python能做一樣的事情,但是要銘記的是C大爺永遠(yuǎn)是大爺。
以上是我的淺見,如果對你有所幫助,歡迎點(diǎn)贊留言與我交流。
我是蘇蘇思量,來自BAT的Java開發(fā)工程師,每日分享科技類見聞,歡迎關(guān)注我,與我共同進(jìn)步。
這個問題很簡單,python,java是解釋型語言,需要有虛擬機(jī)解釋器支持,需要更多的內(nèi)存和cpu處理速度,而c,c++可以直接由編譯器生成機(jī)器指令,所需要的資源少,單片機(jī)可以正常運(yùn)行。另外python,現(xiàn)在java在設(shè)計時就是為了大型程序而生,不適合單片機(jī)。
單片機(jī)能否提供程序所需的運(yùn)行環(huán)境決定了某種語言能否用于單片機(jī)程序的開發(fā)。單片機(jī)的總線寬度決定了單片機(jī)存儲空間的大小。其中,擁有32位總線的單片機(jī)的存儲空間可達(dá)4GB,裝個Linux差不多可以跑各種程序了。這里我們只討論總線寬度在16位以下的單片機(jī)。
單片機(jī)上沒有I/O設(shè)備,只有I/O接口,程序要以機(jī)器碼的形式寫入隨機(jī)存儲器(就是PC的內(nèi)存)。主流單片機(jī)的總線寬度一般是16位,比如,51單片機(jī)。存儲器空間最大能做到64K。一些單片機(jī)的存儲空間只有256個字節(jié)甚至更小。這么小的存儲空間容不下操作系統(tǒng),所以能在單片機(jī)上跑的程序都得是原生的機(jī)器碼。C/C++都能直接編譯成原生的機(jī)器碼程序,因此,廣泛用于單片機(jī)程序開發(fā)。Java需要虛擬機(jī),基本上不能在單片上運(yùn)行(JVM有幾百M(fèi))。Python可以編譯成C語言的原生程序,有可能在單片機(jī)上運(yùn)行。但是,Python的程序里一般都帶著一龐大的標(biāo)準(zhǔn)庫,簡單移植到單片機(jī)上不太可行,需要做一些定制化改造才有可能。這類語言不能移植到單片機(jī)上的原因主要是他們?yōu)榱四茉诓煌牟僮飨到y(tǒng)上移植,使用了獨(dú)立的運(yùn)行環(huán)境,而這個環(huán)境的體量太大裝不到單片機(jī)上。
最后科普一下高級語言的概念。機(jī)器碼被稱為第一代語言,匯編被稱為第二代語言。其他語言都是高級語言。C/C++是第三代語言。Java和Python被稱為3.5代或者是第四代語言。主要是因為他們廢除了內(nèi)存操作指令。還有更高級的語言,SQL因為沒有了變量定義(準(zhǔn)備內(nèi)存空間)被稱為第四代或第五代語言。
這還要根據(jù)計算利的發(fā)展來說計算機(jī)能直接理解語言是機(jī)器語言。
后來因為機(jī)器語言對人來說難以理解,發(fā)明創(chuàng)造出了便于人理解的匯編語言,但最后為了更加便于人理解發(fā)展了匯編語言產(chǎn)生了C語言等高級匯編語言,但又發(fā)現(xiàn)C語言的缺點(diǎn)進(jìn)一步發(fā)展出了C++,之所C語言能對單片機(jī)進(jìn)行編程是因為C語言是一門面向過程的語言,而Python,亅AvA等是面向?qū)ο蟮恼Z言,而且C語言能通過指針對硬件內(nèi)的數(shù)據(jù)進(jìn)行操控。
本圖片來源于百度
并非不可以,而是芯片廠家沒有提供底層支持。
例如java程序的運(yùn)行需要虛擬機(jī)來解釋運(yùn)行,如果廠家所設(shè)計的單片機(jī),為其提供了虛擬機(jī)支持的話,就能運(yùn)行java編寫的程序。同理Python也行。
但由于單片機(jī)對成本和效率要求較高,基于這些考慮,廠家一般都只提供C語言的支持(相關(guān)編譯工具鏈、開發(fā)工具)
而稍微高階一點(diǎn),廠家為單片機(jī)提供了C++的工具鏈,支援了C++編程語言,所以這些芯片平臺,也可以用C++來開發(fā)單片機(jī)程序
首先,C語言是比匯編高一個等級的語言,編程風(fēng)格是面向過程編程,數(shù)據(jù)操作比較簡單,且易實(shí)現(xiàn),編寫起來比匯編容易;C++是繼C語言上起來的語言,有自己的庫和很多通用的模板類,編程風(fēng)格是面向?qū)ο?,對?shù)據(jù)處理進(jìn)行了嚴(yán)格的封裝,處理起來不太方便;Python就比較高級了,有更為專業(yè)的庫,使用時只需調(diào)用接口函數(shù)。
簡單的說就是單片機(jī)的內(nèi)存及cpu速度有限。像Java 這類需要JVM吃內(nèi)存怪獸的直接淘汰,因為別說在上面開發(fā)java,連jvm能否po上單片機(jī)都是問題。Python 雖說可以編譯成機(jī)械碼,但遠(yuǎn)不如c來的簡潔扼要,所以c是最佳選擇。
10
回答10
回答9
回答3
回答2
回答10
回答4
回答0
回答10
回答1
回答