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

在许多语言的这个时代,对于每一项任务来说,似乎都有一种伟大的语言,我发现自己在专业上反对“ 只有C很快 ”的口头禅,在这个口号中,速度确实意味着“足够快”。 我和非常理性的开放的人一起工作,他们喜欢比较数字,我只有思想和意见。 你能帮我find通过主观意见,进入“现实世界”的方式吗?

您是否可以帮助我find有关其他语言是否可用于embedded式和(Linux)系统编程的研究? 我很可能会推出一个虚假的假设,将非常感谢研究向我展示这一点。 你能否连接或包括好的数字,以便将“这只是他/她的意见”的意见保持在最低限度。


所以这些是我特别的要求

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

“只有C很快[足够]”是一个早期的优化和错误的早期优化是错误的所有原因。 如果您的系统具有足够的复杂性,而C以外的其他部分是可取的,那么系统中的某些部分必须“足够快”,部分的约束较轻。 例如,如果使用Python编写代码,可以使项目更快完成,并减少错误,那么可以使用一些C或汇编代码来加速时间关键的部分。

即使事实证明,为了满足性能要求,整个代码必须用C语言或汇编语言编写,但使用像Python这样的语言进行原型开发可能会有实际的好处。 你可以把你的工作Python原型,并逐渐取代C代码的部分,直到你达到必要的性能。

因此,使用这些工具可以让您以最快,最准确的方式完成开发工作,然后使用实际数据确定需要优化的位置。 C可能是最适合的工具,有时甚至在嵌入式系统中也是如此。

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

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

将C用于嵌入式系统有一些很好的理由,其中“性能”只是其中的一个。 嵌入式硬件非常接近, 需要手动存储器来与硬件通信。 所有的API和SDK都可用于C语言。

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

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

如果你不能使用某个SDK,那么只会让自己陷入困境,而不是使用更高级的语言开发,从而节省时间。 至少,你会最终重做一堆函数声明和常量定义。

对于C:

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

C将在未来很多年左右。 在嵌入式开发中,它是一个扼杀任何改变企图的垄断者。 需要像Java或Lua这样的VM的语言永远不会成为嵌入式环境的主流。 如果编译语言提供了令人信服的新特性,它可能会有机会。

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

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

很难与C(或其他程序语言,如Pascal,modulea-2,Ada)和嵌入式程序集争论。 这些语言有很大的成功历史。 一般来说,你想消除未知的风险。 试图使用除C或汇编以外的任何东西,在我看来,是未知的。 话虽如此,混合模式并没有什么错,您可以使用其中一种使用C语言的方案,或Python或Lua或JavaScript作为脚本语言。

你想要的是当你必须快速和容易地去C的能力。

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

本文 (由Michael Barr 撰写 )介绍了在嵌入式系统中使用C,C ++,汇编程序和其他语言,并包括一个显示每个语言相对用法的图表。

这里有另外一篇文章,合适的名字, 拒绝C ++的可怜的理由

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

所以,根据你在做什么,C很可能是“更好”或更合适的。

看看下面的文章

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

这是一种快速安全的语言,内置了数据检查功能。 这是飞机上的自动驾驶员编程的内容。

在这个环节,你可以比较Ada和C.

你可能想看看D编程语言。 它可以使用一些性能调优,因为有一些领域的Python可以超越它。 我不能指出你做基准比较,因为还没有列出清单,但正如彼得·奥尔森(Peter Olsson)所指出的,“ 基准与语言实施” ( Benchmarks&Language Implementations)有D数字火星。

你可能也想看看这些可爱的问题:

  • D嵌入式(编程语言)
  • 如何在嵌入式实时环境中使用D?

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

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

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

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

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

C真的是你最好的选择。

编写可移植的C代码有一个区别,并且深入到特定编译器的酥油特性或者语言的角落案例(所有这些都应该避免)。 但是在编译器和编译器版本之间的可移植性。 将能够开发或维护代码的员工数量。 编译器将有一个更容易的时间,并产生更好,更干净,更可靠的代码。

C不会去任何地方,所有的新语言都是为了解决所有先前语言中的缺陷而设计的。 C,所有这些新语言都试图解决的缺陷,仍然很强大。

以下是一些将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是另一个话题。 我认为这应该取决于手头的任务。 但在嵌入式系统中,通常没有多少选择。

有几个人提到了Lua。 我认识的曾经与嵌入式系统合作过的人说Lua是有用的,但它本身不是真正的自己的语言,而更像是一个可以嵌入到C中的库。它的目标是在嵌入式系统中使用,一般来说,从C调用Lua代码。但是纯C使得维护更简单(虽然不一定更容易),因为每个人都知道它。

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

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

事实是 – 并不总是。

看来.NET运行时(但其他任何运行时可以作为一个例子)强加几MB的运行时间开销。 如果这是你所有的(在RAM中),那么你是不幸的。 JavaME似乎更紧凑,但是它依然取决于你拥有的资源。

很多C代码运行得非常快,因为写这个代码的人是Zen Masters的软件。 他们必须咬牙切齿,不仅要学习用户想要的东西,而且还要学习编译器需要什么,操作系统需要什么,硬件需要什么,了解数据结构和算法(如手背),知道如何最大限度地利用片上高速缓存,以及下一代CPU和GPU将对其代码执行什么操作。

编写能够正常工作的软件并不难。 编写运行10x-5,000X的软件是非常困难的(是的,这是快5000倍),它仍然易于阅读和理解,可以以合理的成本进行扩展,并将继续在特殊水平上执行几代CPU来了。

C比任何其他语言都强迫软件工程师考虑成千上万的必要的小事情来制作真正的代码。 如果你不是那样的话,那就选另一种语言,给C程序员应有的尊重。

在编写C代码20多年后,我最近写了一个超出10,000X要求的应用程序。 我恰巧正在审查今天所有的500行代码。 对于网页上的每一行代码,我至少写了十多条,对它们进行了基准测试,对它们进行了审查,最终将它们丢弃了。 在超出规定范围的情况下,表现如何呢? 因为在某些时候,少一些就会失败。

用户通常不了解他们的要求,特别是性能要求。 这就解释了为什么这么多的代码被扔在垃圾桶里。 如果一个企业取得成功,最终他们将需要这样的表现才能在竞争中取得优势,并跟上需求。

可悲的事实是“没有失败就像成功”。 我宁愿有我不需要的表现,也不需要我没有的表现。 如果你在第二种情况下遇到任何问题,你的公司就会离开商业圈,而且可能比你想象的要早得多。 我不喜欢写“失败的鲸鱼”,它的成功就是破坏它们。 C从我的方式中走出来,让我用一种其他语言没有的方式进行创新。

C编译器即使在桌面系统上也要快得多,因为C是一种只有少数特性的语言(例如与C ++相比)。 所以,我可以想象在嵌入式系统上这种差异是不平凡的。

这意味着更快的迭代时间,尽管OTOH你没有C ++的便利(比如集合),从长远来看这可能会让你放慢速度。