我不喜歡這個問題,因為它不容易回答,但也許我可以改寫:“是什麼使嵌入式語言無法更改語言?”
例如,我們幾乎看到了C / C ++嵌入式(我想我也聽說過ADA?如果我錯了,請糾正我)
但是究竟是什麼使嵌入式世界免於更改語言?僅僅是C太容易使用還是因為C一切都很好,所以真的沒有改變的“需求”嗎?
這總是讓我感到困惑,而不是因為我抱怨。由於將其保留為幾種語言,因此可以使事情標準化。但是問題仍然存在。
我意識到這是一個主觀問題,但是我的主要問題是“為什麼”而不是“ IF / WHEN”
我不喜歡這個問題,因為它不容易回答,但也許我可以改寫:“是什麼使嵌入式語言無法更改語言?”
例如,我們幾乎看到了C / C ++嵌入式(我想我也聽說過ADA?如果我錯了,請糾正我)
但是究竟是什麼使嵌入式世界免於更改語言?僅僅是C太容易使用還是因為C一切都很好,所以真的沒有改變的“需求”嗎?
這總是讓我感到困惑,而不是因為我抱怨。由於將其保留為幾種語言,因此可以使事情標準化。但是問題仍然存在。
我意識到這是一個主觀問題,但是我的主要問題是“為什麼”而不是“ IF / WHEN”
首先:忘記“嵌入式”,因為這不是有用的區分。最重要的屬性是“資源受限的”。最重要的資源通常是時間,在這種情況下,我們談論的是實時系統,但它也可以是內存或功能。
採用新語言非常困難且罕見。它需要重新培訓,新工具,並找到一種使用新語言的好方法。這是昂貴的,特別是對於早期採用者。這也是一個雞與蛋的問題:沒有龐大的用戶群,就不會有高質量的工具和庫,但是沒有那些,就不會有龐大的用戶群。因此,一種新的語言必須比現有的語言具有更大的優勢,否則就不會有機會。
大多數語言的“最新”新發展正在填補空白。在可用的CPU能力和用戶需求之間。換句話說:它們的速度效率低下,但是可以通過簡化程序員來彌補。考慮一下諸如Java,Python,Perl,Tcl之類的語言的興起,這些語言實際上是由解釋器運行的(也許經過一些編譯),並且大量使用了動態內存管理。但這與資源受限的世界並不十分匹配,在該世界中,我們希望a)充分利用可用資源,即使以更多的編程工作為代價,以及b)可預測的資源使用。
C和C ++(或合適的子集)仍然是可以滿足可預測的空間和時間使用的通用高級語言(足夠好的工具,訓練有素的程序員和豐富的庫都可用)要求與當前硬件的要求相差不遠。我認為唯一的競爭者是Ada,但它的起點很差:第一個實現(被認為是?)太慢且效率低下,而現在(即使有很好的實現可用),該語言也落後了一段時間。功能(與C ++相比)。我個人認為這很遺憾,在其他條件相同的情況下,我寧願乘坐Ada編程的飛機,也不願使用C或C ++進行飛機飛行。
使用基於8位和16位微控制器的嵌入式系統,可以更輕鬆地開發適合這些有限存儲限制(可能只有幾百個字節)的有限資源的軟件。用於低端8位微控制器的RAM,帶有2-8 KiB的ROM或EPROM / Flash用於代碼存儲。)
在這種情況下,諸如C或彙編語言之類的小語言是最常用的開發語言。作為一個非常粗略的相對比較,一個完整的彙編器和C99編譯器可以放在單個軟盤上,而對於現代C ++開發系統(帶有STL等),則需要多個 MiB。
當您在嵌入式環境中查看高端微處理器(高端16位,大部分為32位,很少使用64位)和 DSP時,限制會減弱,軟件開發可能會佔據開發工作的大部分,因此使用最高效的開發工具是有意義的,其中包括具有諸如面向對象編程(OOP)語言(例如C ++)等功能的更高級的語言,以及更新的語言(Java, Perl,Ruby,Python)。
可以在彙編和C語言中預測正在使用的內存量,以便進行空間受限的設計是可行的,但是高級功能(例如模板,異常處理和運行時綁定)使其不可能提前準確了解標準C ++程序所需的內存佔用量。我對 MISRA C ++(它是C ++的一個子集)一無所知,無法對此發表評論。
基於運行字節碼的虛擬機(Java,Perl, Python)在嵌入式開發人員的經驗中還不那麼成熟,並且由於這些語言旨在使程序員與特定的硬件隔離,因此也更加難以意識到此類嵌入式硬件系統的局限性。如果不是RAM的GiB,對於帶有MiB的快速32位處理器(例如ARMv7)來說,這些問題就不那麼重要了。
我所知道的所有BASIC實現在語言功能上都非常簡單,在很大程度上保留了1960年代Dartmouth BASIC的傳統。這意味著該語言沒有任何復雜的運行時庫或異常處理,並且解釋器或編譯器編寫起來相當簡單,並且文件大小也很小,大多數微控制器至少可以使用一個BASIC編譯器。
我希望能粗略地概述您會發現C和彙編語言主要用於較小或較舊的嵌入式系統的原因,以及較新的中高端嵌入式系統的局限性與傳統台式個人計算機。
大多數答案已經說明了歷史原因(眾所周知,每個人都在使用它,改變習慣並不容易,等等)。雖然我同意他們的觀點,但我們應該記住,還有另一個重要原因。習慣”(例如QWERTY鍵盤)。
C本身對於嵌入式開發(尤其是在時間緊迫的應用程序中)是非常好的選擇。為什麼?
它的級別足夠低,可以輕鬆地用於實現實時程序。如果您需要以納秒為單位測量時間,必須每5微秒捕獲一次中斷,或者必須完全使用 64字節的總RAM,那麼使用高級語言時,通常是無法解決或很難解決。與高級語言相比, C使您可以更好地控制硬件,這是嵌入式與PC開發之間最重要的區別之一。
因此,C是速度之間最好的(或最好的一種)折衷並直接訪問Assembly的硬件,以及易於閱讀和理解高級語言。
這與正則編程中(最常用的)語言不會(真的)更改的原因完全相同:
在嵌入式世界中,提供軟件更新可能更加困難(或不可能),因此,確保正確性就變得尤為關鍵。遺憾的是,C在這方面幾乎沒有提供幫助,並且允許程序員快速靈活地玩遊戲。
在嵌入式系統上使用C會讓我很痛苦,希望我至少可以升級到C ++,以獲得C以約束,常量,引用,字符串鍵入等約束的形式提供的許多好處。
我想答案很簡單,因為在商業上不可行,因此我們只能堅持使用C。每個人都知道C,C有很多編譯器,C有很多庫以及生成它的工具。有了新的語言,我們將從頭開始。
我想這就是人們仍然使用PHP的原因。
這裡沒有人聽說過SPARK Ada嗎?
這是Ada語言和嵌入式系統相關開發工具的“小版本”,例如航空電子和其他對安全至關重要的應用(例如醫療設備)。
研究表明,與採用更可靠SPARK編碼的C / C ++相比,處理速度僅損失5-10%。
我認為C在嵌入式系統中的擴散是出於經濟原因:
它已經存在並且通常可用於大多數應用程序-而且大多數應用程序在數量上都是非關鍵的,如果洗衣機超負荷,沒有人會死-那麼為什麼要更換?
SPARK工具集本身將是一項額外的支出,而且會培訓員工使用它。
SPARK(或其他非C語言)對嵌入式控制器/管理系統的附加好處可能不足以證明在消費者眼中產品價格有必要的溢價-尤其是當他們看到明顯的“好”競爭對手品牌以更低的價格出售時。
AdaCore公司非常注意不要太深入地進入大眾市場應用e將不可避免地要求大量增加技術支持人員來處理非核心問題。 AdaCore是一家高水平的專業公司,因此而引以自豪,並向高科技公司推銷其產品和服務。除非語言的主要利益相關者真的想要,否則它不會進入新市場。
所以,@ Wouter,您不必擔心會因為缺少Ada而死在天空中。嵌入式代碼!
它已經在飛機系統中使用了很多年。起搏器也是如此。
但是對於洗碗機,建築服務控制系統,實驗室爐控制器和其他設備則沒有。如此嚴格管制的競技場-在經濟上值得加倍努力嗎?
我猜想C受歡迎的主要原因是:首先是C流行起來,而且很多人都知道它;其次:Java,C#甚至C ++的許多方面都不適合嵌入式工作。基本上,我提到的其他3種語言在很大程度上依賴於動態內存,這帶來了不確定的程序執行,對像也帶來了動態內存,因此對內存的需求也很大(因為OO最重要的方面之一是使用更多的類),及時編譯的流行度越來越高(許多嵌入式平台甚至根本無法編譯自己的C代碼)...
還有一個事實是,許多庫Java或C#附帶的代碼對於大量嵌入式項目是沒有用的。
另一方面,我們有較舊的語言,例如Pascal或Basic。從我的角度來看,它們並不那麼受歡迎,因為C本身已成為“行業標準”語言,並且當今有大量的程序員和工程師學習C。在某些學校,甚至沒有學過Pascal或Basic。還有一個事實是,當今流行的許多語言都具有類似C的語法,而使用Pascal會使C程序員感到奇怪。
對於FORTRAN,我想它進入了一個利基市場,主要由在適合使用其生態系統的地區工作的工程師和科學家使用。我沒有看到任何特殊原因(除了我在Pascal和Basic中提到的那些原因)沒有在嵌入式系統上使用。
請注意,在此答案中,我主要關注較小的系統。也有許多嵌入式設備使用更複雜的操作系統,例如GNU / Linux或其他Unix派生產品,並且對其進行編程,或多或少可以使用任何popualr語言。
C是一種非常簡單的語言,並且已經多次被稱為 fancy彙編語言。這幾乎是您可以在上面的彙編代碼上提供的最少抽象量,因為C構造直接映射到機器級構造。
由於這個原因和其他幾個原因,實現新芯片上的C編譯器。大部分工作已經完成,複雜性或出錯情況相對較少,低級控制使您可以輕鬆地處理硬件的任何怪癖。
C ++可以(實際上最初是)實現為C之上的源代碼翻譯層,這意味著您可以使用C編譯器免費獲得C ++(或至少它的某些版本)。新芯片還需要其他所有功能,因此這是一個合理的起點。
其他人未提及的一些原因:
問題空間:C適用於小型和簡單的系統。如果您要做的只是對外部信號做出反應,並向周圍推幾個數字,那麼C的效果就很好(沒有復雜的數據結構,沒有malloc,沒有復雜的錯誤處理)。
生產數量:如果您的生產量很大,那麼從經濟上考慮,節省每個硬件單元並在程序員上花更多的錢,因為編程是一次性的成本。
我認為這是因為C / C ++是最低級別的高級語言。
實際上,對於小型嵌入式系統,C比C ++流行得多。其原因與不使用其他語言的原因相同。 C ++需要一個運行時,除非您放棄了大多數使其不同於C的功能。
除彙編程序外,C是我所知唯一可編譯為本機代碼和 em的語言>對於它,運行時是可選的。因此,在有限的環境中(除非使用彙編程序,否則)保證了最小的佔用空間和最快的執行時間。
另一方面,在中型和大型嵌入式系統中(這意味著更多的內存)和時鐘,更大的字長)我不會說C(或C ++)如此流行。我見過支持Python,Forth甚至Java的系統。
但是,顯然,出於與我上面提到的相同的原因,您幾乎總是可以選擇使用C / C ++。有了選擇,並成為一個已經對小型嵌入式C感到滿意的人,為什麼還要選擇另一種語言?