为什么面向对象的语言在嵌入式世界中不受欢迎?

时间:2013-10-28 08:35:28

标签: oop embedded

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

5 个答案:

答案 0 :(得分:6)

真正的原因:因为概念上的复杂性。 C和程序集提供了一个简单的心智模型来跟踪系统中发生的事情。面向对象的程序需要一个更复杂的模型,这使得更难以推断出正在发生的事情。

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

一般的面向对象语言,特别是C ++,抽象出代码执行时系统中发生的事情的许多细节,从而使得更难以推断系统的内部工作。

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

i++;

在C程序中看到这一点,我们可以大致准确地了解它的作用以及使用了多少CPU周期,涉及多少寄存器等等的数量级。

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

这些都不是说C ++或面向对象很糟糕。它不是。如果人们对系统中真正发生的事情的细节感兴趣,它确实需要一个更复杂的心智模型,正如许多嵌入式开发人员认为他们需要的那样。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

“OO语言”太广泛了。有许多面向对象的语言具有完全不同的特征。 “它可以在C ++中完成”并不意味着“它可以在任何OO语言中完成”。例如,为功能较弱的AVR MCU编写Python程序会好运。该器件具有2kB的RAM和32kB的闪存,Python解释器本身甚至不适合它们。


C ++是一种同时具有高级低级部分的语言。它是面向对象的,但最后,你的优秀OO代码将会被编译成原始机器代码,就像你用C或汇编直接编写它一样。一些其他面向对象的语言被认为是“更高级别”(或者仅仅是高级别的),它们不能做同样的事情。这完全取决于特定语言的实现。

答案 3 :(得分:2)

所有其他人所说的一个补充:

我们不会编写太多C ++嵌入式代码,因为客户需要它。在我的现场代码可能需要获得认证,并且认证指南仅适用于C,而不是C ++。

因此,即使C ++能够产生更好的产品,项目也必须在C中实现。

答案 4 :(得分:0)

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

我强烈建议您阅读those slides,其中讨论的是C ++用于嵌入式和谈论C ++的神话:

“膨胀”神话!

“表现不佳”的神话!

许多针对嵌入式目标的编译器供应商提供C ++编译器,如Keil,IAR,CodeRed,处理器制造商也为C ++编译器提供工具链,例如:德州仪器,飞思卡尔,...

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