我们必须使用C“出于性能原因”

时间:2009-08-03 17:57:54

标签: c linux embedded systems-programming

在这个多语言的时代,几乎每一项任务似乎都有一种很好的语言,而且我发现自己在专业上挣扎着“除了C很快”之外的一句咒语,其中快速是真的意思是“足够快”。我和非常理性的思想开放的人合作,他们喜欢比较数字,而我所拥有的只是想法和意见。你能帮助我找到主观意见并进入“现实世界”吗?

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


所以这些是我的特殊要求

  • 记忆不是一个严重的约束
  • 便携性不是一个严重的问题
  • 这不是一个实时系统

18 个答案:

答案 0 :(得分:49)

根据我的经验,将C用于嵌入式和系统编程不一定是性能问题 - 它通常是一个可移植性问题。 C往往是几乎所有平台上最便携,支持最好的语言,特别是在嵌入式系统平台上。

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

答案 1 :(得分:28)

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

即使事实证明整个代码必须用C或汇编语言编写以满足性能要求,使用像Python这样的语言进行原型设计可以带来真正的好处。您可以使用正在运行的Python原型并逐步用C代码替换部件,直到达到必要的性能。

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

答案 2 :(得分:18)

将C用于嵌入式系统有一些很好的理由,其中“性能”只是次要的一个。嵌入式非常接近硬件,您需要手动内存以便与硬件进行通信。所有API和SDK主要适用于C.

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

答案 3 :(得分:14)

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

如果您不能使用某些SDK,那么您只会遇到麻烦而不是节省使用更高级语言开发的时间。至少,你最终会重做一堆函数声明和常量定义。

答案 4 :(得分:9)

对于C:

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

C将会存在很多年。在嵌入式开发中,它是垄断企业,可以扼杀任何改变的企图。需要像Java或Lua这样的VM的语言永远不会成为嵌入式环境中的主流。如果编译语言提供了超过C的引人注目的新功能,则可能有机会。

答案 5 :(得分:8)

不同语言之间的网络有几个基准。其中大多数你会在顶部找到一个C或C ++实现,因为它们可以为你提供更多控制来真正优化。

示例:The Computer Language Benchmarks Game

答案 6 :(得分:7)

很难与C(或Pascal,Modula-2,Ada等其他程序语言)和嵌入式程序集进行争论。这些语言有很大的成功历史。通常,您希望消除未知的风险。在我看来,尝试使用除C或汇编之外的任何东西都是未知数。话虽如此,混合模型没有任何问题,您可以使用其中一个转到C或者Python或Lua或JavaScript作为脚本语言的方案。

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

如果你说服团队去做一些未经证实的事情,项目就是你的cookie。如果它崩溃了,它可能会被视为你的错。

答案 7 :(得分:6)

This article(Michael Barr)谈到在嵌入式系统中使用C,C ++,汇编程序和其他语言,并包含一个显示每个语言的相对用法的图表。

这是另一篇恰当的文章Poor reasons for rejecting C++

答案 8 :(得分:6)

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

因此,根据您的工作,C可能会“更好”或更合适。

查看以下文章

答案 9 :(得分:5)

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

这是一种快速安全的语言,可以在任何地方内置数据检查。这就是飞机上的自动驾驶员编程的原因。

this link,您可以比较Ada和C.

答案 10 :(得分:3)

C无处不在,几乎适用于任何架构,通常从处理器可用性的第一天开始。 C ++紧随其后。如果您的系统可以支持C ++并且您具有必要的专业知识,那么优先使用C - C就是C等等,所以没有理由不使用它。

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

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

答案 11 :(得分:3)

您可能需要查看D编程语言。它可以使用一些性能调优,因为有些领域Python可以胜过它。我没有真正指出你进行基准比较,因为没有列出清单,但正如彼得奥尔森指出的那样,Benchmarks & Language Implementations有D数字火星。

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

答案 12 :(得分:2)

我不是一个真正的系统/嵌入式程序员,但在我看来,嵌入式程序通常需要确定性的性能 - 这会立即排除许多垃圾收集语言,因为它们确定性一般。但是,已经开展了确定性垃圾收集工作(例如,Metronome for Java:http://www.ibm.com/developerworks/java/library/j-rtj4/index.html

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

答案 13 :(得分:2)

C真的是你最好的选择。

编写可移植的C代码并深入了解特定编译器的焦点特征或语言的角落情况(应该避免所有这些)都有所不同。但是编译器和编译器版本之间的可移植性。能够开发或维护代码的员工数量。编译器将更容易使用它并生成更好,更清晰,更可靠的代码。

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

答案 14 :(得分:1)

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

答案 15 :(得分: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是另一个主题。在我看来,它真的应该取决于手头的任务。但是在嵌入式系统中,您通常没有太多选择。

答案 16 :(得分:1)

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

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

答案 17 :(得分:0)

事实是 - 并非总是如此。

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