【发布时间】:2013-10-28 08:35:27
【问题描述】:
我是一名固件开发人员,我通常使用 C 或汇编开发固件。但是,我在我们的嵌入式库中遇到了一个完全用 C++ 实现的项目。现在我知道面向对象语言可以在硬件级别上使用,但我想知道为什么它们在开发嵌入式系统时不那么流行。
【问题讨论】:
-
Java 无处不在。
-
内存/处理能力限制往往是原因。
我是一名固件开发人员,我通常使用 C 或汇编开发固件。但是,我在我们的嵌入式库中遇到了一个完全用 C++ 实现的项目。现在我知道面向对象语言可以在硬件级别上使用,但我想知道为什么它们在开发嵌入式系统时不那么流行。
【问题讨论】:
真正的原因:因为概念的复杂性。 C 和汇编提供了一个简单的思维模型来跟踪系统中发生的事情。面向对象的程序需要一个更复杂的模型,这使得对正在发生的事情进行推理变得更加困难。
嵌入式系统往往是需要对系统中发生的事情进行非常严格控制的环境,而不是更开放的服务器和 PC 环境。这需要简单和透明的编程结构。 C 语言和汇编语言都在最低硬件级别上提供了对系统中实际情况的高度可见性。
一般的面向对象语言,尤其是 C++,在代码执行时抽象出系统中发生的许多细节,因此更难推理系统的内部工作。
这里有一个例子来解释我的意思。考虑以下代码 sn-p:
i++;
在 C 程序中看到这一点可以让我们大致准确地了解它的作用,以及使用多少 CPU 周期、涉及多少寄存器等等。
现在同一行在 C++ 程序中会做什么?这要看情况。取决于 i 是什么类型以及 ++ 运算符是如何重载的。明白我的意思了吗?
这些都不是说 C++ 或面向对象是不好的。它不是。如果人们对系统中真正发生的事情的微小细节感兴趣,它确实需要一个更复杂的心智模型,因为许多嵌入式开发人员认为他们需要。
【讨论】:
从技术角度来看,嵌入式系统资源有限。面向对象的语言倾向于创建比纯过程语言更大的二进制文件,因此许多人会选择尽可能轻的东西。例如,我在一家智能卡公司工作,我的团队负责处理成本极低的卡,RAM 的范围仅为 1.5 - 1.75 KB,EEPROM 的范围为 96 - 136 KB。对于这种嵌入式环境,大多数面向对象的语言(尤其是 Java 等重度语言)都不适合。我们甚至不使用任何标准 C 库,所有内容都是从头开始编写的。 C++ 可能适合,通过适当的编码技术和使用不生成 rtti、最小化 vmt、仅使用基于堆栈的对象等的编译器选项,但这只是我的猜测。
【讨论】:
“OO 语言”过于宽泛。有许多面向对象的语言具有完全不同的特征。 “它可以用 C++ 完成”并不意味着“它可以用任何 OO 语言完成”。 祝你好运,例如为功能较弱的 AVR MCU 编写 Python 程序。该设备有 2kB 的 RAM 和 32kB 的闪存,Python 解释器本身甚至不适合它们。
C++ 是一门同时包含高级和低级部分的语言。它是面向对象的,但最终,你的好 OO 代码会被编译成原始机器代码,就像你直接用 C 或汇编编写一样。其他一些被认为是“高级”(或仅高级)的面向对象语言不能做同样的事情。这完全是关于特定语言的实现,真的。
【讨论】:
对所有其他人所说的补充一点:
我们不会编写太多 C++ 嵌入式代码,因为客户需要它。在我的领域代码中可能需要获得认证,并且认证指南仅适用于 C,而不是 C++。
因此,即使 C++ 会带来更好的产品,项目也必须用 C 来实现。
【讨论】:
因为很多开发者“认为”C++因为代码大小和性能的原因根本不适合嵌入式环境!在大多数情况下这不是真的!
我强烈建议您阅读those slides,其中讨论了嵌入式 C++ 的使用以及讨论 C++ 的神话,例如:
“膨胀”神话!
“表现不佳”的神话!
许多嵌入式目标的编译器供应商提供 C++ 编译器,例如 Keil、IAR、CodeRed,处理器制造商也为其工具链提供 C++ 编译器,例如德州仪器、飞思卡尔、...
一般来说,开发人员在开始一个新项目时需要考虑 C++,并根据项目需求以及 OOP/C++ 可以提供什么来按时按成本完成工作!
【讨论】: