关于oop:为什么面向对象语言在嵌入式世界中不流行?

Why aren't object oriented languages popular in the embedded world?

我是固件开发人员,通常使用C或Assembly开发固件。 但是,我在嵌入式库中遇到了一个完全用C ++实现的项目。 现在,我知道可以在硬件级别上使用面向对象的语言,但是我想知道为什么在开发嵌入式系统时它们不那么流行。


真正的原因:由于概念上的复杂性。 C和汇编语言提供了一个简单的思维模型来跟踪系统中正在发生的事情。面向对象的程序需要一个更复杂的模型,这使得很难对正在发生的事情进行推理。

与更开放的服务器和PC环境相比,嵌入式系统往往要求对系统中发生的事情进行非常严格的控制。这需要简单和透明的编程结构。 C语言和汇编语言都可以以最低的硬件级别提供对系统中实际发生情况的高度可见性。

通常,面向对象的语言,尤其是C ++,在执行代码时抽象出了系统中正在发生的事情的许多细节,因此使推理系统内部工作变得更加困难。

这是一个解释我的意思的例子。考虑以下代码片段:

1
i++;

在C程序中看到这一点,可以使我们对其执行的操作有一个最准确的了解,并且可以知道使用了多少个CPU周期,涉及多少个寄存器等等。

现在,同一行在C ++程序中将做什么?这得看情况。取决于我是什么类型以及++运算符如何重载。明白了吗?

这些都没有说C ++或面向对象是不好的。它不是。如果要对许多嵌入式开发人员认为他们需要的关于系统实际运行的详细信息感兴趣,则确实需要更复杂的思维模型。


从技术角度来看,嵌入式系统的资源有限。面向对象的语言倾向于创建比纯过程语言更大的二进制文件,因此许多人会选择尽可能轻的二进制文件。例如,我在一家智能卡公司工作,我的团队是处理极低成本卡的人,RAM仅介于1.5-1.75 KB,而EEPROM从96-136 KB。对于这种嵌入式环境,大多数面向对象的语言(尤其是Java之类的繁重语言)都不适合。我们甚至不使用任何标准C库,所有内容都是从头开始编写的,以供参考。 C ++可能适合,采用适当的编码技术并使用不会生成rtti,最小化vmt,仅使用基于堆栈的对象等的编译器选项,但这只是我的猜测。


所有其他人所说的话:

我们不会编写太多的C ++嵌入式代码,因为客户需要它。 在我的领域中,代码可能需要获得认证,并且认证准则仅适用于C,而不适用于C ++。

因此,即使C ++会带来更好的产品,该项目也必须用C实现。


" OO语言"太宽泛。有许多面向对象的语言具有完全不同的特征。"可以用C ++完成"并不意味着"可以用任何OO语言完成"。例如,为功能欠佳的AVR MCU编写Python程序而带来的好运。该设备具有2kB的RAM和32kB的闪存,Python解释器本身甚至不适合它们。

C ++是同时包含高级部分和低级部分的一种语言。它是面向对象的,但是最后,您的漂亮的OO代码将被编译为原始机器代码,就像您直接用C或汇编语言编写一样。其他一些面向对象的语言被认为是"高级"(或仅高级)。确实,这全都与特定语言的实现有关。


因为许多开发人员"认为" C ++根本不适合嵌入式环境,原因是代码大小和性能!在大多数情况下,这是不正确的!

我强烈建议阅读这些幻灯片,这些幻灯片讨论嵌入式C ++的用法,并讨论C ++的神话,例如:

"膨胀"神话!

"表现不佳"的神话!

许多嵌入式目标的编译器供应商都提供C ++编译器,例如Keil,IAR,CodeRed以及处理器制造商为其工具链提供C ++编译器,例如德州仪器(TI),飞思卡尔(Freescale),...

通常,开发人员在开始新项目时需要考虑c ++并根据项目需求以及OOP / C ++可以提供什么来按时按成本完成工作来决定是否使用它!