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

23
在这个多语言时代,似乎每项任务都有合适的编程语言。然而,我在职业生涯中一直与“只有C语言才快”的信条抗争,其中“快”实际上意味着“足够快”。我与非常理性、开明的同事共事,他们喜欢比较数字,而我只有思想和观点。你能帮助我摆脱主观看法,并进入“现实世界”吗?
你能否帮我找到相关研究,了解嵌入式和(Linux)系统编程是否可使用其他编程语言?我很可能在推销一个虚假的假设,因此非常感激有研究结果来证明或否定我的想法。请提供良好数据或链接,以尽量减少“那只是他/她的观点”的评论。
所以,这是我的特殊要求:
- 内存不是严重的限制。 - 可移植性不是严重的问题。 - 这不是实时系统。

2
很难找到能证明某些实际上是错误的东西的数字。 - Otávio Décio
15
对于过早优化的争论,应保持谨慎。如果处理能力有限,需要在实时或接近实时完成一定量的工作,并且您选择了一种需要比您拥有的更多处理能力的语言进行工作,则您将处于非常被动的境地,因为现在您必须重新选择适合的语言。更多信息请参见http://weblogs.mozillazine.org/roc/archives/2005/11/immature_optimization.html。 - Robert Harvey
1
这个问题的语法和内容有些混乱。 - Mark Rogers
1
一份写得好的VB程序可以胜过一份写得糟糕的C程序。速度快与否并不取决于编程语言本身(我可以写一个生成极慢代码的C编译器),而在于你如何使用这门语言。 - Skizz
1
“过早优化是万恶之源”,但是过早优化和过早悲观之间有一条细微的界限。应该避免后者和前者。例如,在嵌入式系统上尝试使用Python编写光线追踪器已经相当悲观了。使用解释器永远无法实现这样的目标,这是不现实的。 - stinky472
显示剩余6条评论
19个回答

49

根据我的经验,在嵌入式和系统编程中使用C语言并不一定是性能问题,而往往是可移植性问题。C语言往往是几乎所有平台上最具可移植性和良好支持的语言,特别是在嵌入式系统平台上。

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


1
确实。由于嵌入式软件的编写方式多年来一直是采用C语言,因此嵌入式软件工程师比其他任何语言更有可能精通C语言。因此,编译器生产商将选择销售最佳的语言,即C语言和可能的C ++。 - Steve Melnikoff
1
当然,Python是用C语言编写的,许多解释型工具也是如此。只要稍加努力,您就可以在许多平台上使用Python。 - Christopher
3
没问题 - Python可以做到。我甚至使用过Lua(因为它在开销方面非常小)。对于像Python这样的东西,内存开销和库支持可能是一个问题。 - Reed Copsey
5
是的,我完全同意这个观点。在我之前的雇主那里,当然存在一种文化精神,偏向于只支持C语言(和汇编语言),但底线是除了C语言之外,几乎没有任何支持嵌入式系统的专业级工具集。你可能会找到支持C++的工具集,在极为罕见的情况下,也可能有Java的支持。还有一些针对其他语言的垂直堆叠平台(例如Erlang),但是这些平台几乎不可能卖给管理层,特别是对于现有系统而言。 - Ben Collins
1
没错,如果性能是您的主要关注点,那么为什么要止步于C语言呢?首先用C语言编写第一版(编译器非常好,这是一个很好的起点),然后手动检查汇编代码。许多系统有一些效率技巧,这些技巧通常不被编译器支持。 - Ken
显示剩余3条评论

29
“唯有C语言才足够快”是早期优化的一种错误思想,其错误之处和其他早期优化的原因一样。如果你的系统具有足够的复杂性,需要使用除C语言以外的其他语言,则该系统的某些部分必须“足够快”,而其他部分则需求不那么严格。
例如,在编写代码时,如果使用Python可以更快地完成项目,并减少bug,那么您可以使用一些C或汇编代码来加速时间敏感的部分。
即使最终发现必须使用C或汇编语言编写整个代码来满足性能要求,使用Python等语言进行原型设计也有实际好处。您可以使用工作正常的Python原型,逐步将其部分替换为C代码,直到达到所需的性能。
因此,使用能让您正确、快速完成开发工作的工具,然后使用真实数据来确定需要进行优化的部分。有时候C可能是开始的最合适工具,但在嵌入式系统中甚至不总是这样。请注意保留html标记格式。

1
最好使用英文(文字)、流程图、数据结构图等进行原型设计,然后再编写应用程序。在任何语言中进行原型设计,知道它将无法满足您的要求是一个非常糟糕的想法。就个人而言,我发现C/C++非常好地混合在一起,并且依靠相同的技能集,而Java、Python等则会产生很多学习干扰,因为它们与C有足够的差异,当你回到C时,C会惩罚你。”练习穿过轮胎的足球运动员擅长穿过轮胎”。 - user1899861
在Python中完成项目会更快,但它的运行速度可能会慢100倍,并且很可能会消耗大量资源,导致程序在大多数运行时应用程序上出现故障和延迟。如果您关心性能,Python绝对不是一个好选择,即使是在非生产代码中使用Python也只是一个好的选择,如果您想要在生产代码中使用Python,请至少包含一个C框架... - Yunfei Chen
你可以使用工作中的Python原型,逐步替换部分C代码,直到达到所需的性能。通常情况下,混合语言格式会使代码更难调试而不是更容易。如果我要求他们维护带有Python代码片段的C代码,我的大多数同事都会抱怨... - Yunfei Chen
有时候,C语言可能是开始编程的最合适工具,但并非总是如此,即使在嵌入式系统中也是如此。在嵌入式系统中,有4种语言可以满足性能要求,其中两种是相当新的,分别是C、C++、Rust和Go语言。当然,这忽略了古老的语言,如汇编语言、机器语言、Fortran和Lisp。 - Yunfei Chen

18

使用 C 语言进行嵌入式系统开发有很多好处,其中 "性能" 只是其中一个较小的原因。嵌入式系统与硬件非常接近,您需要手动管理内存地址以与硬件通信。大多数 API 和 SDK 都适用于 C 语言。

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


14
除了性能之外,还有另一个考虑因素:你很可能要处理设计为在C或C++中使用的低级API
如果你不能使用某些SDK,那么使用高级语言进行开发将会让你陷入麻烦而不是节省时间。至少,你最终会重新做一堆函数声明和常量定义。

9

对于C语言:

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

C语言将在未来许多年内继续存在。在嵌入式开发中,它是一种垄断性语言,扼杀了任何改变的尝试。像Java或Lua这样需要虚拟机的语言永远不会在嵌入式环境中流行。如果编译语言提供比C语言更具吸引力的新功能,则可能有机会成为主流。


eLua在嵌入式设备的荒野中相当常用。 - Kamiccolo
数据库具有ACID属性,FAT已被故障安全的ext4、HFS+和NTFS所取代,同样地,C语言也必须逐步淘汰。也许不是完全淘汰,就像FAT总是在附近,但不在敏感的地方。使用C语言会推迟进展。 - OCTAGRAM
@OCTAGRAM: 为什么要踩?ext4是用C语言编写的。从您的例子中可以看出,使用C语言编写似乎带来了进步。是的,C并不是到处都适用,但对于嵌入式和操作系统环境来说,它是一个很好的匹配。 - Gerhard
C必须首先与Ada、Modula-2和Pascal进行比较。你提到了Java和Lua,那是一个稻草人谬误,非常危险。关于编译器的可用性,Ada和SPARK可用于AVR、MIPS和ARM,涵盖了大多数嵌入式需求。进展是ext4本身,但它的实现语言是一场悲剧。 - OCTAGRAM

8

网络上有很多关于不同编程语言之间的基准测试。大部分情况下,你会发现C或C++实现位居榜首,因为它们可以给你更多的控制权来真正优化程序。

例如:计算机语言基准测试游戏


7
很难反驳在嵌入式领域使用C语言(或其他过程语言,如Pascal、Modula-2、Ada)和汇编语言的优势。这些语言有着较长时间的成功历史。一般来说,您希望排除未知风险。在我看来,尝试使用除C或汇编外的任何语言都是未知的。话虽如此,使用转到C的某些Scheme,或Python或Lua或JavaScript作为脚本语言的混合模型也没有问题。
您需要的是能够快速轻松地转到C语言的能力。
如果您说服团队选择他们不熟悉的东西,那么项目就成了你的饼干。如果它崩溃了,很可能会被视为您的错。

6
有些情况下,尤其是在嵌入式系统中,您需要实时性能。此外,您还有严格的内存限制。像C这样的语言可以让您更好地控制执行时间和执行空间。因此,根据您所做的事情,C可能会更“好”或更合适。
请查看以下文章:

1
www.pythononachip.org 是一个项目,它在没有操作系统、没有内存管理单元和仅有8 KB RAM的微控制器上运行PyMite虚拟机。 - dwhall

6

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

它是一种快速和安全的语言,到处都内置了数据检查。这就是飞机自动驾驶员所编程的语言。

此链接上,您可以比较Ada和C语言。


3
我曾经使用过ADA,现在仍想使用它,但我找不到一个能够在我2K ROM/256字节RAM环境下运行的版本。 - uɐɪ

6

这篇文章(作者Michael Barr)谈论了在嵌入式系统中使用C、C++、汇编和其他语言,并包含了一个显示每种语言相对使用情况的图表。

还有一篇文章,恰如其名,拒绝使用C++的不充分理由


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接