【问题标题】:Why aren't object oriented languages popular in the embedded world? [closed]为什么面向对象的语言在嵌入式世界中不流行? [关闭]
【发布时间】:2013-10-28 08:35:27
【问题描述】:

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

【问题讨论】:

标签: oop embedded


【解决方案1】:

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

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

一般的面向对象语言,尤其是 C++,在代码执行时抽象出系统中发生的许多细节,因此更难推理系统的内部工作。

这里有一个例子来解释我的意思。考虑以下代码 sn-p:

i++;

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

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

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

【讨论】:

  • “真正的原因:因为概念的复杂性。” - 那么为什么可以用 C++ 对 MCU 或其他嵌入式设备进行编程? (提示:这不是真正的原因。也许编译 C++ 代码比汇编汇编或编译 C 更难,但最终结果看起来是一样的。)
  • @H2CO3 我不认为你理解我的回答。当然,也可以用 C++ 编写嵌入式系统。我的观点是嵌入式系统程序员不喜欢使用 C++,因为它要求他们维护一个更复杂的 mental 模型来了解正在发生的事情。这与您使用的编译器无关。它与程序员头脑中的“编译器”有关。
  • 我明白了。是的,这也是事实。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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


    C++ 是一门同时包含高级低级部分的语言。它是面向对象的,但最终,你的好 OO 代码会被编译成原始机器代码,就像你直接用 C 或汇编编写一样。其他一些被认为是“高级”(或仅高级)的面向对象语言不能做同样的事情。这完全是关于特定语言的实现,真的。

    【讨论】:

    • 您可以在汇编中编写OO代码。汇编肯定是用在嵌入式中的。
    • @dwelch 然后呢?我没有断言你不能在汇编中编写 OO 代码。我说过某些 OO 语言需要比嵌入式系统更多的功能。
    • OO 太宽泛了,发帖人假设 OO 在嵌入式中不起作用,这根本不正确,C++ 也没有在嵌入式等中使用。整个问题是基于缺乏知识。你的回答是最好的。
    • 这里可能最有效的一点是,具有少量 RAM 的系统不适合大量使用数据结构(即对象)的运行时分配的方法
    • @hhachem C++ 经常用于嵌入式,不知道为什么你认为它不是。与使用的任何语言(java、forth、basic 等)一样,如果我们从语言和工具的角度谈论裸机(必须从您的问题中假设),您需要管理缺少操作系统。并且还管理高级语言的膨胀,无论是 C、C++ 等什么高级语言。如果没有其他原因,C+asm 使这些事情更容易管理。长期以来一直这样做,很难将其他东西作为主要解决方案。
    【解决方案4】:

    对所有其他人所说的补充一点:

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

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

    【讨论】:

      【解决方案5】:

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

      我强烈建议您阅读those slides,其中讨论了嵌入式 C++ 的使用以及讨论 C++ 的神话,例如:

      “膨胀”神话!

      “表现不佳”的神话!

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        相关资源
        最近更新 更多