我不喜欢这个问题,因为这个问题很难回答,但也许我可以改写:“是什么使嵌入式语言无法更改语言?”
例如,我们几乎看到了用于嵌入式的C / C ++(我想我也听说过ADA?如果我错了,请纠正我)
但是究竟是什么使嵌入式世界避免语言的变化呢?仅仅是C太容易使用还是因为C一切都很好,所以真的没有改变的“需求”吗?
这总是让我感到困惑,而不是我在抱怨。由于将其保留为几种语言,因此可以使事情标准化。但是问题仍然存在。
我意识到这是一个主观问题,但是我的主要问题是“为什么”而不是“ IF / WHEN”
我不喜欢这个问题,因为这个问题很难回答,但也许我可以改写:“是什么使嵌入式语言无法更改语言?”
例如,我们几乎看到了用于嵌入式的C / C ++(我想我也听说过ADA?如果我错了,请纠正我)
但是究竟是什么使嵌入式世界避免语言的变化呢?仅仅是C太容易使用还是因为C一切都很好,所以真的没有改变的“需求”吗?
这总是让我感到困惑,而不是我在抱怨。由于将其保留为几种语言,因此可以使事情标准化。但是问题仍然存在。
我意识到这是一个主观问题,但是我的主要问题是“为什么”而不是“ IF / WHEN”
Answers:
首先:忘记“嵌入式”,因为这不是有用的区别。最重要的属性是“资源受限的”。最重要的资源通常是时间,在这种情况下,我们谈论的是实时系统,但也可以是内存或电源。
采用新语言很难而且很少。它需要重新培训,新工具,并找到一种使用新语言的好方法。这是昂贵的,特别是对于早期采用者。这也是一个鸡与蛋的问题:没有庞大的用户群,就不会有高质量的工具和库,但是没有那些,就不会有庞大的用户群。因此,一种新的语言必须比现有的语言具有更大的优势,否则它将没有机会。
语言的大多数“最新”新发展都在填补可用的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和汇编语言主要用于较小或较旧的嵌入式系统的原因,以及较新的中高端嵌入式系统的局限性与传统台式个人计算机之间的微小差异。
大多数答案已经说明了历史原因(众所周知,每个人都在使用它,改变习惯并不容易,等等)。在我同意他们的同时,我们应该记住,还有另一个重要原因。
它的 不是说“C是一个坏或过时的选择,但我们仍然使用它的习惯”(如QWERTY键盘)。
C本身对于嵌入式开发是一个非常好的选择,特别是在时间紧迫的应用程序中。为什么?
它的级别足够低,可以轻松地用于实施实时程序。如果您需要以纳秒为单位测量时间,必须每5微秒捕获一次中断,或者必须使用完全 64字节的总RAM,那么使用非常高级的语言,通常将是不可能或很难解决它。C使您可以更好地控制硬件与高级语言相比,,这是嵌入式开发与PC开发之间最重要的区别之一。
与Assembly相比,它足够高,可以快速且易于编写代码。
因此,C是汇编语言的速度和直接硬件访问以及易于阅读和理解高级语言之间最好的(或最好的之一)。
unsigned char i=63,j=128; do {something;} while(--j); while(--i);不如可读unsigned int i=16000; do {something;} while(--i);,但在PIC上它将运行得更快,效率更高。如果将代码移至ARM,则第二种方法会更有效,但第一种方法仍然有效。
在嵌入式世界中,提供软件更新可能会更加困难(或不可能),因此确保正确性就变得尤为关键。遗憾的是,C在这方面几乎没有提供帮助,并且允许程序员快速灵活地玩游戏。
我为嵌入式系统使用C感到很痛苦,希望我至少可以升级到C ++,以获得C以约束,常量,引用,字符串键入等约束形式提供的许多好处。
我猜答案只是因为我们在C语言上受困,因为更改在商业上不可行。每个人都知道C,它有很多编译器,有很多库和生成它的工具。使用新的语言,我们将从头开始。
我想这就是为什么人们仍然使用PHP的原因。

这里没有人听说过SPARK Ada吗?
这是Ada语言和相关开发工具的“小版本”,适用于嵌入式系统,例如航空电子设备和其他对安全至关重要的应用程序,例如医疗设备。
研究表明,与使用更可靠的SPARK编码的C / C ++相比,处理速度仅损失5-10%。
我认为C在嵌入式系统中的普及是由于经济原因:
它已经存在并且通常可用于大多数应用程序-并且大多数应用程序在数量上都不重要,如果洗衣机超负荷,没人会死-那么为什么要更换?
SPARK工具集本身将是额外的支出,并且会培训员工使用它。
SPARK(或其他非C语言)给嵌入式控制器/管理系统带来的额外好处可能不足以证明在消费者眼中产品价格具有必要的溢价,尤其是当他们看到明显“好的”竞争对手品牌在销售时以较低的价格。
AdaCore公司小心谨慎,不要深入大众市场,因为这些应用将不可避免地需要大量增加技术支持人员来处理非核心问题。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 / C ++是最低级别的高级语言。
实际上,对于小型嵌入式系统,C比C ++流行得多。其原因与不使用其他语言的原因相同。C ++需要运行时,除非您放弃了使其与C不同的大多数功能。
除了汇编之外,C是我所知道的唯一一种可编译为本机代码并且具有运行时可选的语言。因此,在受限的环境中(除非您使用汇编程序),它保证是最小的占用空间和最快的执行时间。
另一方面,在中型和大型嵌入式系统中(我的意思是更多的内存和时钟,更大的字长),我不会说C(或C ++)如此流行。我见过支持Python,Forth甚至Java的系统。
但是,显然,出于与我上面提到的相同的原因,您几乎总是可以选择使用C / C ++。有了选择,并成为一个已经对小型嵌入式C感到满意的人,为什么还要选择另一种语言?