我不喜欢这个问题,因为它不容易回答,但也许我可以改写:“是什么阻止 Embedded 改变语言?”
例如,我们几乎看到 C/C++ 用于嵌入式(我想我之前也听说过 ADA?如果我错了请纠正我)
但是究竟是什么阻止了嵌入式世界改变语言呢?仅仅是C太容易使用还是因为C做的一切都很好,所以真的没有“需要”进行改变?
这一直让我感到困惑,而不是我在抱怨。由于将其保留为几种语言可以使事情标准化。但问题仍然存在。
我意识到这是一个主观问题,但是我的主要问题是“为什么”而不是“如果/何时”
我不喜欢这个问题,因为它不容易回答,但也许我可以改写:“是什么阻止 Embedded 改变语言?”
例如,我们几乎看到 C/C++ 用于嵌入式(我想我之前也听说过 ADA?如果我错了请纠正我)
但是究竟是什么阻止了嵌入式世界改变语言呢?仅仅是C太容易使用还是因为C做的一切都很好,所以真的没有“需要”进行改变?
这一直让我感到困惑,而不是我在抱怨。由于将其保留为几种语言可以使事情标准化。但问题仍然存在。
我意识到这是一个主观问题,但是我的主要问题是“为什么”而不是“如果/何时”
首先:忘记“嵌入式”,因为这不是一个有用的区别。最重要的属性是“资源受限”。最重要的资源通常是时间,在这种情况下,我们谈论实时系统,但它也可以是内存或电源。
新语言的采用是困难且罕见的。它需要重新培训、新工具以及找到使用新语言的好方法。这是昂贵的,特别是对于早期采用者。这也是一个先有鸡还是先有蛋的问题:没有庞大的用户群,就不会有优质的工具和库,但没有这些,就不会有庞大的用户群。因此,一种新语言必须比现有语言具有很大的优势,否则它将没有机会。
大多数“最近”的语言新发展一直在填补可用 CPU 能力与用户需求之间的差距。换句话说:它们在速度上可能效率低下,但通过对程序员来说更容易来弥补。想想 Java、Python、Perl、Tcl 等语言的兴起,它们本质上由解释器运行(可能经过一些编译)并大量使用动态内存管理。但这与资源受限的世界并不匹配,我们希望 a) 充分利用可用资源,即使以更多的编程工作为代价,以及 b) 可预测的资源使用。
C 和 C++(或合适的子集)仍然是常用的最高级别语言(足够好的工具、足够的训练有素的程序员和广泛的库都可用),可以满足不远的可预测的空间和时间要求从当前硬件上的可能性来看。我认为唯一的竞争者是 Ada,但它的开端很糟糕:第一个实现(被认为是?)太慢且效率低下,现在(即使有很好的实现)该语言在功能(与 C++ 相比)。我个人认为这是一个遗憾,在其他条件相同的情况下,我宁愿乘坐用 Ada 编程的飞机,也不愿乘坐用 C 或 C++ 编写的飞机。
使用基于 8 位和 16 位微控制器的嵌入式系统,可以更轻松地开发能够适应这些非常有限的存储限制的有限资源的软件(对于低端 8 位微控制器,可能需要几个 100字节的 RAM ,带有 2-8 KiB 的 ROM 或 EPROM/Flash 用于代码存储)。
在这些情况下,像 C 或汇编这样的小型语言往往是最常用的开发语言。作为一个非常粗略的相对比较,一个完整的汇编器和 C99 编译器可以放在一张软盘上,而现代 C++ 开发系统(使用 STL 等)则需要几个MiB 。
当您在嵌入式环境中查看高端微处理器(高端 16 位,主要是 32 位,很少有 64 位)和DSP时,限制会减弱,软件开发可能占开发的大部分努力,因此使用最高效的开发工具是有意义的,包括具有诸如 C++ 等面向对象编程 (OOP) 语言和更新语言(Java、Perl、Ruby、Python)等功能的更高级语言。
在汇编和 C 语言中可以预测正在使用多少内存,因此空间受限的设计是可行的,但是模板、异常处理和运行时绑定等高级特性使得无法准确知道必要的内存占用量提前准备一个标准的 C++ 程序。我对MISRA C++(它是 C++ 的一个子集)了解不足,无法对此发表评论。
基于运行字节码的虚拟机(Java、Perl、Python)的语言在嵌入式开发人员的经验中还不够成熟,并且由于这些语言旨在将程序员与特定硬件隔离开来,因此也更难有良心这样的嵌入式硬件系统的局限性和限制。对于具有 MiB(如果不是 GiB 的 RAM)的快速 32 位处理器(例如 ARMv7),这些问题不大。
我所知道的所有 BASIC 实现在语言特性上都非常简单,很大程度上保持了 1960 年代达特茅斯 BASIC 的传统。这意味着该语言没有任何复杂的运行时库或异常处理,并且解释器或编译器编写起来相当简单,而且文件大小也很小。大多数微控制器至少有一个可用的 BASIC 编译器。
我希望概括地概述您会发现 C 和汇编主要用于较小或较旧的嵌入式系统的原因,并且由于较新的中高端嵌入式系统的局限性,它们与传统的台式个人计算机仅略有不同。
在嵌入式世界中,提供软件更新可能要困难得多(或不可能),因此保证正确性就显得尤为重要。可悲的是,C 在这方面提供的帮助很少,并且允许程序员玩得又快又松。
将 C 用于嵌入式系统让我很痛苦,并且希望我至少可以升级到 C++,因为它以约束形式提供的许多好处,如 const、引用、字符串类型等。
我想答案很简单,因为改变在商业上不可行,所以我们被 C 困住了。每个人都知道 C,有大量的编译器、库和生成它的工具。使用新语言,我们将从头开始。
我想这就是人们仍然使用 PHP的原因。
这里没有人听说过 SPARK Ada 吗?
这是用于嵌入式系统的 Ada 语言和相关开发工具的“小型”版本,例如航空电子设备和医疗设备等其他安全关键应用程序。
研究表明,与使用更可靠的 SPARK 编码的 C/C++ 相比,处理速度仅损失 5-10%。
我认为 C 在嵌入式系统中的普及是由于经济原因:
它已经存在并且通常适用于大多数应用程序 - 而且大多数基于体积的应用程序都是非关键的,如果洗衣机溢出,没有人会死 - 那么为什么要改变呢?
SPARK 工具集本身和培训员工使用它是一项额外费用。
SPARK(或其他非 C 语言)对嵌入式控制器/管理系统的额外好处可能不足以证明产品价格在消费者眼中的必要溢价——尤其是当他们看到明显“好”的竞争对手品牌销售时以更低的价格。
AdaCore 公司小心翼翼地不深入大众市场应用,因为这将不可避免地需要大量增加技术支持人员来处理非核心问题。AdaCore 是一家高水平的专业公司,并以此为荣,并在高科技公司推销其产品和服务。除非其主要利益相关者真的想要,否则一种语言进入新市场是不寻常的。
所以,@Wouter,你不必担心因为缺少 Ada 嵌入式代码而死在天空中!
它已经在飞机系统中使用了很多年。同样适用于您的起搏器。
但是对于洗碗机、楼宇服务控制系统、实验室炉子控制器和其他不受严格监管的领域——在经济上值得多做些工作吗?