22

在这个语言众多的时代,几乎每项任务似乎都有一门很棒的语言,我发现自己在专业上与“只有 C 是快”的口头禅作斗争,其中“快”的真正意思是“足够快”。我与非常理性、思想开放的人一起工作,他们喜欢比较数字,而我所拥有的只是想法和意见。你能帮我找到超越主观意见进入“现实世界”的方法吗?

您能帮我找到有关是否可以将任何其他语言用于嵌入式和(Linux)系统编程的研究吗?我很可能会提出一个错误的假设,并且非常感谢研究向我展示这一点。您能否链接或包含好的数字,以帮助将“这只是他/她的意见”评论保持在最低限度。


所以这些是我的特殊要求

  • 记忆力不是一个严重的限制
  • 便携性不是一个严重的问题
  • 这不是一个实时系统
4

19 回答 19

49

根据我的经验,使用 C 进行嵌入式和系统编程不一定是性能问题 - 它通常是可移植性问题。C 往往是几乎所有平台上最可移植、最受支持的语言,尤其是在嵌入式系统平台上。

如果您希望在嵌入式系统中使用其他东西,通常需要弄清楚哪些选项可用,然后确定性能、内存消耗、库支持等是否适合您的情况。

于 2009-08-03T18:04:08.457 回答
29

“只有 C 很快 [足够]”是一种早期优化,并且由于早期优化错误的所有原因都是错误的。如果您的系统具有足够的复杂性以至于需要 C 以外的其他东西,那么系统的某些部分必须“足够快”,而某些部分的约束更轻。例如,如果用 Python 编写代码会使项目完成得更快,错误更少,那么您可以跟进一些 C 或汇编代码来加快时间关键部分的速度。

即使事实证明整个代码必须用 C 或汇编语言编写才能满足性能要求,使用 Python 等语言进行原型设计也可以带来真正的好处。您可以使用您的工作 Python 原型并逐渐用 C 代码替换部分,直到达到必要的性能。

因此,使用可以让您最正确、最快速地完成开发工作的工具,然后使用真实数据来确定您需要优化的地方。有时,C 语言可能是最合适的入门工具,但肯定并非总是如此,即使在嵌入式系统中也是如此。

于 2009-08-03T22:16:18.697 回答
18

将 C 用于嵌入式系统有一些很好的理由,其中“性能”只是次要因素之一。嵌入式非常接近硬件,需要手动进行内存寻址才能与硬件通信。所有 API 和 SDK 大部分都可用于 C。

只有少数平台可以为 Java 或 Mono 运行 VM,这部分是由于性能影响,也由于实施成本高昂。

于 2009-08-03T18:03:59.640 回答
14

除了性能之外,还有另一个考虑因素:您很可能会处理设计用于 C 或 C++ 的低级 API

如果你不能使用一些 SDK,你只会给自己带来麻烦,而不是节省使用高级语言进行开发的时间。至少,你最终会重做一堆函数声明和常量定义。

于 2009-08-03T18:10:12.203 回答
9

对于 C:

  • C 通常是处理器编译器支持的唯一语言。
  • 大多数库和示例代码也是 C 语言中的概率。
  • 大多数嵌入式开发人员都有多年的 C 经验,但在其他方面的经验却很少。
  • 允许直接硬件接口和手动内存管理。
  • 易于与汇编语言集成。

C 将在未来许多年中存在。在嵌入式开发中,它是一种垄断,扼杀了任何改变的尝试。需要像 Java 或 Lua 这样的 VM 的语言永远不会成为嵌入式环境的主流。如果编译语言提供了优于 C 的引人注目的新特性,它可能会有机会。

于 2009-08-04T12:59:36.397 回答
8

网络上有几个不同语言之间的基准测试。他们中的大多数你会在顶部找到一个 C 或 C++ 实现,因为它们给你更多的控制来真正优化事物。

示例:计算机语言基准游戏

于 2009-08-03T18:12:08.533 回答
7

很难反对 C(或其他过程语言,如 Pascal、Modula-2、Ada)和嵌入式汇编。这些语言有着悠久的成功历史。通常,您希望消除未知风险。在我看来,尝试使用 C 或汇编以外的任何东西都是未知数。话虽如此,混合模型并没有错,在这种模型中,您使用 C、Python、Lua 或 JavaScript 作为脚本语言的方案之一。

您想要的是在必要时能够快速轻松地转到 C 语言。

如果您说服团队采用他们未经证实的东西,那么该项目就是您的 cookie。如果它崩溃了,它可能会被视为你的错。

于 2009-08-03T18:34:22.093 回答
6

在某些情况下,您需要实时性能,尤其是在嵌入式系统中。你也有严重的内存限制。像 C 这样的语言可以让您更好地控制执行时间和执行空间。

因此,根据您在做什么,C 可能会“更好”或更合适。

查看以下文章

于 2009-08-03T18:03:40.173 回答
6

Ada 是一种高级编程语言,专为嵌入式系统和关键任务系统而设计。

它是一种快速安全的语言,在任何地方都内置了数据检查功能。这是飞机上的自动驾驶仪的程序。

此链接中,您可以比较 Ada 和 C。

于 2009-08-03T18:14:57.920 回答
6

这篇文章(由 Michael Barr 撰写)讨论了 C、C++、汇编程序和其他语言在嵌入式系统中的使用,并包含一个图表,显示了每种语言的相对用法。

这是另一篇文章,标题恰如其分,拒绝 C++ 的糟糕理由

于 2009-08-04T18:19:08.273 回答
4

C 无处不在,几乎可用于任何架构,通常从处理器可用的第一天开始。C++ 紧随其后。如果您的系统可以支持 C++ 并且您具有必要的专业知识,请优先使用它而不是 C - 这就是 C 的全部内容,甚至更多,因此几乎没有理由不使用它。

C++ 是一种更大的语言,并且支持的结构和技术可能会消耗资源或在嵌入式系统中以不可接受的方式运行,但这不是不使用该语言的理由,而是如何适当地使用它。

Java 和 C#(在 Micro.Net 或 WinCE 上)可能是非实时的可行替代方案。

于 2009-09-05T13:08:43.610 回答
3

您可能想查看D编程语言。它可以使用一些性能调整,因为 Python 在某些领域可以胜过它。由于没有列出清单,我无法真正指出基准比较,但正如 Peter Olsson 所指出的那样,Benchmarks & Language Implementations拥有 D Digital Mars。

您可能还想看看这些可爱的问题:

于 2009-08-03T21:13:01.990 回答
2

我并不是真正的系统/嵌入式程序员,但在我看来,嵌入式程序通常需要确定性的性能——这立即排除了许多垃圾收集语言,因为它们通常不是确定性的。然而,已经有关于确定性垃圾收集的工作(例如,Java 的节拍器:http: //www.ibm.com/developerworks/java/library/j-rtj4/index.html

问题是约束之一——语言/运行时是否满足确定性、内存使用等要求。

于 2009-08-03T18:05:20.870 回答
2

C真的是你最好的选择。

编写可移植的 C 代码和深入了解特定编译器的 ghee whiz 特性或语言的极端情况(所有这些都应该避免)是有区别的。但是跨编译器和编译器版本的可移植性。能够开发或维护代码的员工数量。编译器将更轻松地使用它,并生成更好、更清洁、更可靠的代码。

C 不会去任何地方,所有新语言都旨在修复所有先前语言中的缺陷。C,尽管这些新语言试图修复的所有缺陷,仍然很强大。

于 2009-08-04T14:20:41.207 回答
1

根据嵌入式平台,如果内存限制是一个问题,您很可能需要使用非垃圾收集的编程语言。

在这方面,C 可能是团队中最知名的,并且可用库和工具得到最广泛的支持。

于 2009-08-03T18:02:47.070 回答
1

这里有几篇比较 C# 和 C++ 的文章:

http://systematicgaming.wordpress.com/2009/01/03/performance-c-vs-c/

http://journal.stuffwithstuff.com/2009/01/03/debunking-c-vs-c-performance/

不完全符合您的要求,因为它不关注嵌入式 C 编程。但这仍然很有趣。第一个演示了 C++ 的性能以及将“不安全”代码用于处理器密集型任务的好处。第二个在某种程度上揭穿了第一个,并表明如果您编写的 C# 代码稍有不同,那么性能几乎相同。

所以我会说,在许多情况下,C 或 C++ 在性能方面可以成为明显的赢家。但很多时候,利润是微乎其微的。是否使用 C 完全是另一个话题。在我看来,这真的应该取决于手头的任务。但是在嵌入式系统中,您通常没有太多选择。

于 2009-08-03T18:11:03.043 回答
1

有几个人提到了 Lua。我认识的使用过嵌入式系统的人都说 Lua 很有用,但它本身并不是它自己的语言,而更像是一个可以嵌入到 C 中的库。它的目标是在嵌入式系统中使用,通常你会想要从 C 调用 Lua 代码。但是纯 C 使得维护更简单(尽管不一定更容易),因为每个人都知道这一点。

于 2009-08-03T20:10:25.020 回答
0

事实是——并非总是如此。

似乎 .NET 运行时(但可以以任何其他运行时为例)强加了几 MB 的运行时开销。如果这就是你所拥有的(在 RAM 中),那么你就不走运了。JavaME 似乎更紧凑,但它仍然完全取决于您拥有的资源。

于 2009-08-03T18:02:06.337 回答
-2

即使在桌面系统上,C 编译器也快得多,因为与 C++ 相比,语言功能很少,所以我想在嵌入式系统上差异不小。这转化为更快的迭代时间,尽管 OTOH 您没有 C++ 的便利(例如集合),从长远来看这可能会减慢您的速度。

于 2015-08-27T06:46:57.690 回答