JAVA、C、C++、Python同樣是高級語言,為什麼只有C和C++可以編寫單片機程序?

星沉大海3


從事編程十幾年,JAVA、C、C++、Python這四種編程語言都玩過,前三種玩的比較多,python做為興趣愛好或者玩腳本的時候弄過,編程語言在使用的時候主要還是適合不合適,單片機使用的場景屬於功能簡單,成本相對較低,現在也有高配版的單片機,本來單片機是不帶系統的,非要硬扯到帶系統的,從成本上考量就不是那回事了,成本主要包括兩個方面有硬件成本,還有研發難度的成本這都是需要考慮的事情。



單片機開發語言C語言和彙編,別的語言還真不好上手,編程語言能力強大與否關鍵無外乎是不是能夠控制底層的硬件,往往是一些門外漢喜歡編排一些故事,搞成什麼編程語言的鄙視鏈條,真正的程序員底層的編程語言會羨慕上層編程語言的靈活性,上層的編程語言羨慕底層的編程人員能夠控制硬件覺得是一件很神奇的事情,曾經面試過一個做了很多年java的工程師,居然想著拿出兩年的時間來學習C語言,最後真還是降低工資標準進來了公司。


單片機編程主要是操作硬件的寄存器多一點,在編程語言方面使用的指針多一些,基本上while搭配中斷把編程工作就差不多搞定了,如果硬要上java,python主要運行環境受不了,在運行java之前首先要把虛擬機給移植上,就單片機那點內存壓根不是個,所以不同的編程環境不同的搭配,沒有必要強求,無論是C/C++編程還是高級語言java,python在使用過程中編程套路都接近。

如果真要想在單片機上運行虛擬機還不如直接找個有操作系統的嵌入式設備,單片機完成的就是簡單能夠容易實現的功能,太多功能模塊化的功能就不適合在這上面,解釋性的語言執行需要一個運行環境不像單片機那麼單純,直接把全套的環境都運行在一個程序裡面,單片機編程的時候有時候發現明明只有幾行代碼編譯出來卻有幾百k,主要所有的驅動以及底層的實現都統統打包在一個可執行文件裡面,嵌入式的運行環境相對來講就比較複雜了,首先要把操作系統給安裝到位,還有各種驅動提前準備好。



越是高級語言的編程越是框架性強,可移植性強,單片機編程適合簡單功能的產品,比如常見的MP3,掃地機,以及玩具功能來回就是幾個功能,沒有特別複雜的功能,如果後續功能非常多而且界面操作非常繁瑣就可以考慮使用嵌入式編程或者更加高級一點的編程語言了,永遠都是適當的場景適用適當的編程語言,無所謂對錯。

希望能幫到你。


大學生編程指南


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

高級語言與低級語言

也許你早就好奇了,什麼是高級語言,那對應的有沒有低級語言?

簡單粗暴的解釋,人類直接使用的語言就算高級語言,比如題主提到的,都是程序員編程時候直接使用的,相對於低級語言來說,更具有邏輯性,更容易閱讀和編寫。高級語言可以認為是對低級語言的封裝,因此實現同樣的功能,使用高級語言編寫的程序更加短小精悍。

而與低級語言相對,就不是給人看的,而是給機器看的語言。所有高級語言在真正執行的時候,都要編譯為低級語言,畢竟真正的執行者是機器。這裡我們可以將機器語言和彙編看為低級語言,它們通常使用的是機器識別的01代碼已經一些符號。

單片機

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

這些單片機通常都是用C/C++編寫的。因為他們是編譯型語言,是可以直接生成exe文件,然後直接放在單片機內部運行的。而像Java,屬於解釋型語言,它編譯後的class文件是要放在jvm中才能運行的,直接放進單片機,人家根本理解不了。

如果偏要Java寫單片機程序,就需要把它的解釋器燒進單片機且與單片機對接才行。這樣做第一佔用單片機有限的空間資源,第二也會影響執行速度。你總不希望你點擊微波爐的加熱按鈕,三秒鐘之後它才反應過來開始加熱吧。

其實講到這裡,大家基本就明白了為什麼C/C++可以編寫單片機程序了,因為C本身就是為了編寫UNIX操作系統而發明出來的,截止1973年,Unix操作系統已經完全使用C來編寫了。作為一個誕生本是為系統開發的語言,它本身就是與單片機編程匹配的,只不過由於種種原因,C語言進一步發展,成為了一種廣泛使用可上可下的編程語言,看起來與Java,Python能做一樣的事情,但是要銘記的是C大爺永遠是大爺。

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

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


一個存在感小透明


單片機能否提供程序所需的運行環境決定了某種語言能否用於單片機程序的開發。單片機的總線寬度決定了單片機存儲空間的大小。其中,擁有32位總線的單片機的存儲空間可達4GB,裝個Linux差不多可以跑各種程序了。這裡我們只討論總線寬度在16位以下的單片機。

單片機上沒有I/O設備,只有I/O接口,程序要以機器碼的形式寫入隨機存儲器(就是PC的內存)。主流單片機的總線寬度一般是16位,比如,51單片機。存儲器空間最大能做到64K。一些單片機的存儲空間只有256個字節甚至更小。這麼小的存儲空間容不下操作系統,所以能在單片機上跑的程序都得是原生的機器碼。C/C++都能直接編譯成原生的機器碼程序,因此,廣泛用於單片機程序開發。Java需要虛擬機,基本上不能在單片上運行(JVM有幾百M)。Python可以編譯成C語言的原生程序,有可能在單片機上運行。但是,Python的程序裡一般都帶著一龐大的標準庫,簡單移植到單片機上不太可行,需要做一些定製化改造才有可能。這類語言不能移植到單片機上的原因主要是他們為了能在不同的操作系統上移植,使用了獨立的運行環境,而這個環境的體量太大裝不到單片機上。

最後科普一下高級語言的概念。機器碼被稱為第一代語言,彙編被稱為第二代語言。其他語言都是高級語言。C/C++是第三代語言。Java和Python被稱為3.5代或者是第四代語言。主要是因為他們廢除了內存操作指令。還有更高級的語言,SQL因為沒有了變量定義(準備內存空間)被稱為第四代或第五代語言。


日衝信息 黃


問題裡說的是單片機,那首先你得知道什麼是單片機。根據不同的內核,單片機一般有51內核單片機和ARM內核單片機,根據位數不同分為8位、16位、32位單片機。單片機不同於電腦的CPU,它集成了CPU、ROM(理解為電腦硬盤)、RAM(理解為內存)以及板載通信總線(SPI、IIC、UART等),高端的單片機還會集成以太網、LCD和USB等功能,看起來就像一臺微型電腦一樣。

說完單片機再說一下單片機編程,一般的單片機編程都是裸機編程,也就是沒有操作系統的單進程程序。程序員通過代碼直接操作單片機的CPU寄存器、內存以及其集成的所有外設,所以單片機編程不同於基於操作系統的編程。前者直接操作硬件層,從選擇編程語言上來講,彙編是最好的選擇,因為它執行效率高,可以直接對寄存器、內存進行操作。但是不同的單片機指令集是不同的,彙編可移植性太差,給一個單片機寫的程序在不同指令集的單片機上不能運行。

說到這很多人會想到可以用高級語言代替彙編語言,然後再通過編譯器將高級語言編譯成彙編,最後生成機器語言給單片機執行。這是個不錯的想法,那如何選擇高級語言呢C、C++、JAVA、Python還是C#等。這裡面最好的就是C語言,為什麼呢?通俗來講,C語言誕生之初就是用來替代彙編的,提高代碼可移植性,而且C語言具有彙編的很多特性,比如其可以通過指針操作寄存器、內存地址,C語言語法簡單,更貼近硬件層,執行效率高。

這裡提到了執行效率,計算機專業的同學都知道彙編語言效率最高,C語言效率僅次於彙編,因為C語言在通過編譯器生成彙編的時候會產生一些冗餘指令。因為編譯器也是一個程序,它的編譯性能再好,也不如程序員直接寫一個彙編程序的執行效率高。

說到這差不多快明白了,C++、Java、Python這類語言我們也可以用於寫單片機程序,只要有適應的編譯器,將其編譯成單片機的機器語言就行了。但是這類面向對象的語言,其語法格式比較複雜,而且執行效率不如C語言,其特性不利於操作硬件寄存器、內存地址等,比如Java設計之初為了避免程序員操作地址,就取消了C++裡的指針的概念,另外編譯器也是一個程序,編譯器也會有bug,編譯複雜語言出問題的概率也會增加。

因此,在單片機執行的程序,直接接觸硬件層,這類程序要求效率高,出現異常的概率要小,還要具有可移植性,滿足這些條件的,好像只有C語言了。

(*^▽^*) 寥寥數語,不知道有沒有表達清楚,歡迎對編程、硬件感興趣的小夥伴點贊加關注。


HeloneTech


首先,C語言是比彙編高一個等級的語言,編程風格是面向過程編程,數據操作比較簡單,且易實現,編寫起來比彙編容易;C++是繼C語言上起來的語言,有自己的庫和很多通用的模板類,編程風格是面向對象,對數據處理進行了嚴格的封裝,處理起來不太方便;Python就比較高級了,有更為專業的庫,使用時只需調用接口函數。


張友玉GlennWhelan


這還要根據計算利的發展來說計算機能直接理解語言是機器語言。
後來因為機器語言對人來說難以理解,發明創造出了便於人理解的彙編語言,但最後為了更加便於人理解發展了彙編語言產生了C語言等高級彙編語言,但又發現C語言的缺點進一步發展出了C++,之所C語言能對單片機進行編程是因為C語言是一門面向過程的語言,而Python,亅AvA等是面向對象的語言,而且C語言能通過指針對硬件內的數據進行操控。


小星250955187


菜農從1981年開始就涉足與嵌入式領域的編程,開始是彙編語言和宏彙編語言,後來是C語言及C++語言,其他語言可能有,但很少且無大出路。

因為嵌入式領域的編程與硬件有關,特別是芯片裡的中斷向量即函數指針,而C和C++被其他編程語言攻擊和被拋棄的就是函數指針!

而嵌入式領域最需要的就是函數指針,它與結構和聯合,可以構成“COM接口技術”,為芯片的中斷向量或函數指針即地址加密。

而其他編程語言大多沒有函數指針,故無法滿足嵌入式領域編程的特殊需要,故以後或永遠不可能完全替代C或C++,除非他不想保護他的代碼被篡改或產品的克隆。








雁塔菜農


並非不可以,而是芯片廠家沒有提供底層支持。


例如java程序的運行需要虛擬機來解釋運行,如果廠家所設計的單片機,為其提供了虛擬機支持的話,就能運行java編寫的程序。同理Python也行。


但由於單片機對成本和效率要求較高,基於這些考慮,廠家一般都只提供C語言的支持(相關編譯工具鏈、開發工具)


而稍微高階一點,廠家為單片機提供了C++的工具鏈,支援了C++編程語言,所以這些芯片平臺,也可以用C++來開發單片機程序


阿迷創客


這個問題很簡單,python,java是解釋型語言,需要有虛擬機解釋器支持,需要更多的內存和cpu處理速度,而c,c++可以直接由編譯器生成機器指令,所需要的資源少,單片機可以正常運行。另外python,現在java在設計時就是為了大型程序而生,不適合單片機。


Simonyam


什麼對什麼啊,這都什麼破問題,頭條最近越來越弱智化了


分享到:


相關文章: