Python 与 C/C++ 在嵌入式系统中的比较

6 位读者喜欢这篇文章。
One lightbulb lit out of several

Opensource.com

C/C++ 编程语言在嵌入式系统编程中占据主导地位,尽管它们存在许多缺点。另一方面,Python 有许多优点,使其成为嵌入式系统的出色语言。让我们看看每种语言的优缺点,以及为什么您应该考虑使用 Python 进行嵌入式编程。

C/C++ 是编译型语言,而 Python 是解释型语言。C/C++ 已经存在很久了;C 语言最早于 1969 年开发,C++ 于 1983 年问世。Python 相对年轻,因为它是由 Guido van Rossum 于 1989 年创建的。从那时起,它已成为最流行的开源编程语言之一。所有 Python 版本都是开源的,可以免费使用和分发,甚至用于商业项目。(如果您正在寻找商业级支持和保障,可以使用 ActivePython 等发行版。)

支持 Python 的理由

Python 是美国顶尖计算机科学 (CS) 系最受欢迎的入门编程语言。根据 Barr Group 的一项研究,排名前十的 CS 系中有八个目前使用 Python 教授编码。如果您愿意,可以争论它的优点,但简单的事实是,应届毕业生招聘中最广泛理解的语言是 Python。应届毕业生理解如何用 Python 编码的可能性远高于 C/C++。

业余开发者可能有一些 Python 经验,并且他们精通 Python 的可能性高于 C/C++。由于只有约 40% 的计算机软件工程师和系统分析师拥有计算机科学学位,因此许多行业雇员来自业余背景。但是当涉及到嵌入式系统时,数字会严重颠倒。Barr Group 的研究 表明,超过 95% 的嵌入式系统代码是用 C/C++ 编写的。这种在嵌入式系统上的传统可能很难让 Python 克服,但它的属性以及大量使用 Python 编码的人员可能会帮助它在未来超越 C/C++。

Python 不仅是入门 CS 课程中最流行的语言,它也是嵌入式计算领域增长最快的语言。当您再次扫描数字并意识到它是剩余 5% 的非 C/C++ 嵌入式系统代码中增长最快的语言时,这听起来可能很傻,但在未来几年,Python 将开始更多地蚕食 C/C++ 的垄断地位。迁移到行业且具有无人机、机器人或其他项目编程经验的业余爱好者通常具有 Arduino 或 Raspberry Pi 背景。他们很可能在那段时间内与 Python 打过交道,并且他们也很可能接触过一些嵌入式系统编程。

虽然 C/C++ 编写速度慢、容易出错且经常难以阅读,但 Python 以其可写性、减少错误和可读性而闻名。可读性的重要性再怎么强调也不为过:当您在团队中工作时,可读性对于维护代码至关重要。它必须易于理解,除非您愿意花费更多时间和金钱在调试和质量保证上。Python 的设计重用远远超过 C/C++,而在当今的敏捷环境中,设计重用可能是保持领先地位或落后于竞争对手的关键。

嵌入式算法正变得越来越复杂。简单的控制回路正在被神经网络和其他高度复杂的过程所取代,这有助于 Python 获得立足之地。有一些 Python 库(如 Theano)可以优化 Python 代码以用于这些过程。虽然 Theano 主要用 C/C++ 编写,但 Python 用于以人性化的方式与高性能库交互。Python 库正在蓬勃发展——PyPI,Python 包索引,拥有超过 80,000 个模块,这些庞大的纲要通过让程序员可以选择跳过一些步骤并在自己的代码中使用已建立的函数,从而极大地提高了程序员的生产力。

支持 C/C++ 的理由

支持 C/C++ 的理由非常明显:它创建了更紧凑、更快的运行时代码,并且它已经是 95% 的嵌入式系统代码的首选语言,因此它拥有 Python 必须克服的整个传统。然而,当涉及到速度时,运行时速度不是唯一要考虑的开发方面——您还必须考虑开发速度。虽然 Python 在运行时可能不如 C/C++ 高效,但在开发过程中它效率更高。解释器读取代码的每一行,解析它,执行运行时检查并调用例程以执行代码中的操作。这比运行 C/C++ 代码的活动要多得多,在 C/C++ 代码中,同一行代码可能被编译成几个指令。这可能会导致 Python 的运行时速度较慢和能耗较高。

提高 Python 的速度

因此,反对 Python 而支持 C/C++ 的主要理由是其运行时速度,但有几种方法可以优化代码,使其运行效率更高。除了像 Theano 这样的库之外,还有像 Cython 这样的 Python 优化扩展,它本质上是带有静态类型和关键字的 Python,可以更快地运行数学运算。由于 Cython 是静态类型的,因此您可以轻松编译为 C/C++ 并以 C/C++ 速度运行。

即时 (JIT) 编译器是提高 Python 运行时速度的另一种好方法。这些编译器与 Python 解释器并行工作,为循环内的代码生成编译后的机器指令。这允许解释器的后续传递执行得更快。PyPy JIT 编译器能够将 Python 的执行速度提高近两倍。但是,只有在有足够空间的情况下才应使用 JIT 编译器,而嵌入式系统通常没有太多空间可以节省。最好的优化是使用更好的数据结构和算法,但这是软件设计和实现中最困难的任务,因此最好根据您的技能水平利用上述工具之一。

使用 Python 与嵌入式系统通信

当 Python 用作用户与其正在使用的嵌入式系统之间的通信中间人时,它可能是最强大的。通过 Python 向嵌入式系统发送消息或从嵌入式系统接收消息,用户可以自动化测试。Python 脚本可以将系统置于不同的状态、设置配置并测试各种真实世界的用例。Python 也可以用于接收嵌入式系统数据,这些数据可以存储起来进行分析。然后,程序员可以使用 Python 开发参数和其他分析数据的方法。

目前,关于 Python 和 C/C++ 优点的主要争论归结为对您的团队而言,开发速度还是运行时速度更重要。然而,在未来,可能不是 Python 程序员为在嵌入式系统中使用 Python 辩护,而是嵌入式系统设计人员弄清楚如何适应 Python 不断增长的普及性。

标签
User profile image.
Tom Radcliffe 在学术界和工业界的软件开发和管理方面拥有超过 20 年的经验。他是一名专业工程师(PEO 和 APEGBC),并拥有金斯顿女王大学的物理学博士学位。Tom 将对定量、数据驱动流程的热情带到了 ActiveState。

24 条评论

我对 Python 没有意见,但我认为如果您要嵌入软件,您必须首先考虑使用 Lua。

嗯,您给出了误导性信息。很大一部分嵌入式系统甚至没有操作系统。C/C++ 程序可以在没有操作系统的情况下运行。您忘记说这一点了。您还忘记说 Python 以及 Java、C# 和 Ruby 不仅需要操作系统,还需要虚拟机、JIT 和垃圾收集器。这使得它对于嵌入式系统来说太臃肿了。好吧,RPi 有很多资源,但是 Python 慢得像地狱一样,所以它在嵌入式系统上的唯一目的是驱动 GUI(如果存在 GUI 的话)。最后但并非最不重要的一点是,Python 允许您编写(或编码)程序,但这并不意味着您知道如何编程。arduino 也存在同样的问题,任何人都可以随意编写任何东西,而不知道正在做什么。对于我们这些学习编程的人来说,真是可悲。

我完全同意你的看法。
这篇文章甚至没有考虑 C/C++ 本身的优化,以及您如何才能将 Python 程序资源使用量与另一个用 C/汇编语言编写的相同用途的程序竞争?
我将编程语言视为解决问题的工具,而将 Python 用于专用嵌入式驱动程序或嵌入式软件就像用锤子敲螺丝钉。

回复 作者:Xavier

那是不对的。
存在伟大的 Micropython 项目,它是专门为嵌入式设备设计的
https://micropython.org/
它远非缓慢,并且使用 esp8266 端口,您可以在 2 美元的设备上运行带有 wlan 的 Python。

因此,对于将开关、传感器或继电器连接到互联网,没有什么比在 esp8266 上使用 micropython 更容易的了。

回复 作者:Xavier

那里有一个操作系统 - 只有足够运行 uPython,但它仍然是一个操作系统。

回复 作者:STuart (未验证)

C/C++ 和 Python 服务于不同的目的。
就像比较苹果和橙子,两者都是水果,但仍然不同。一个极简的 C++ Hello World 程序大约有 8.8KB,而 Python 解释器+共享库是一个更大的组合,并且通常慢很多倍。
显然,Python 代码的速度可以大幅提高,但在这方面仍有许多工作要做。Python 更适合以快速、RAD 风格进行应用程序原型设计。
Python 本身主要是用 C 语言编写的。

http://svn.python.org/view/python/branches/release32-maint/Python/

使用嵌入式系统不是为了业余爱好者。它主要用于工业,是电子工程师的严肃工作,而不是软件工程师。

当应用于工业时,不能将任何事情留给偶然。您需要一种健壮的编程语言,接近底层。嵌入式系统中的许多代码都有汇编器部分,其他部分有 RTOS,其中收敛至关重要。说真的,如果出了问题,气垫可能会撕裂某人的手臂。

您不可能更正确了。业余爱好者或爱好者可能知道足够多的东西,但在效率和安全性方面,没有什么可以确保系统的完整性。即使业余爱好者组装无人机或摩托车,对危险的意识也不普遍,当涉及到这一点时,零售商/供应商必须承担责任,但很难控制如此大的市场,所以无论如何都会发生糟糕的事情。可悲但却是事实

回复 作者:tute_avalos (未验证)

MicroPython 在多个嵌入式设备(STM32F4、ESP8266 等)上运行

我实际上相信嵌入式编程的未来在于源到源编译器。您可以使用 C/C++ 性能获得高级别的安全性和易用性。只有硬件抽象层真正需要用 C/C++ 编写。
Vala 语言已在台式计算机上证明了这一概念。

比较 C++ 和 Python 不是一个好主意。实际上,当您将 Java 或 Python 用于嵌入式系统时。您编写的 C/C++ 代码比 Java 或 Python 更多。在链接您的 Java 或 Python vm 代码之后,您编写 C/C++ 代码。实际上这是狗屎。您无法使用 Python 或 Java 语言的所有功能。您已经在使用 C/C++。您可以使用 C/C++ 在嵌入式平台上完成每个项目。Java 或 Python 适用于服务器、Web、云等。

我认为未来排名前 3 的编程语言是:Javascript、C/C++ 和 Java。

我比其他语言更喜欢 nodejs。因为 node js 将成为工业 4.0、物联网、大数据、云最流行的语言。

到底是什么让 C++ 如此“难以阅读”?编写良好的 C++ 将比编写糟糕的 Python 更容易阅读。我不确定我是否理解语言倡导。每种严肃的语言都几乎做同样的事情,只是表达方式略有不同。您花费更多的时间来弄清楚 API 的细微差别,而不是语言语法。

这些评论大多很中肯。对不起,Tom,我相信你是个聪明人,但你错过了一艘船,错过了 20 年。像你这样的人多年来一直在说 Python、Python、Python 用于嵌入式系统,如果它真的那么好,早就流行起来了。实际上,Python 对于你所倡导的用途来说是一种可怕的语言。在任何系统关键环境中不使用它的原因有很多。当然,ActiveState 修改了 Python,就像 Microsoft 修改了它曾经遇到的每种语言一样,但这并不能使它成为一种万能的语言。你基本上是在说解释型(企业修改型)与编译型。Python 没有取代市场,原因与 Java 没有取代嵌入式市场的原因相同。你只是 ActiveState 公司的另一个营销人员。人们需要理解这篇文章的写作目的是为了做广告。企业界已经有 20 年的经验,年龄在 55 岁以上,这意味着你是一个翻新货,在你,让我猜猜,“市场营销学位”不再值钱之前,你对计算/工程学没有任何兴趣。突然流行起来了,对吗?骗子。

天哪,根本没有“C/C++”这种语言。
有 C 语言,也有 C++ 语言。
其中一种语言在过去几年中取得了巨大的进步,有时感觉非常接近 Python
http://preshing.com/20141202/cpp-has-become-more-pythonic/

此外,使用 C/C++ 来提高 Python 的速度是没有意义的。最后你还是在使用 C/C++

@Tom Radcliffe;

是啊,不。从一个在嵌入式开发领域工作过的 Python 狂热粉丝的角度来看:Python 永远不会是任何嵌入式系统上唯一使用的语言。空间限制、真正的实时响应要求、高性能将阻止这种情况发生。

但是,我可以看到它被用来快速开发代码,然后看到大部分代码被 C、C++ 和/或汇编程序模块替换。毕竟,这是 Python 在许多应用程序开发场景中的主要用途。它可以实现极快的原型设计,以快速使函数正常工作。

一旦性能分析完成,开发人员就可以专注于代码运行速度过慢的区域。这种方法通常比试图提前猜测代码可能导致性能问题的位置更有效。但是,这仍然假设有足够的板载存储空间来加载 Python。并非所有设备都允许这样做。

对于今天从事嵌入式开发的工程师来说,他们不相信 Python 在您的工具包中有任何地位,我只能说您最好环顾四周。如果您忽视所有为小型化成熟计算机所做的令人兴奋的工作,那么您对自己或您的雇主没有任何好处。在过去五年左右的时间里,您的设备类型选择呈爆炸式增长。当您调查市场时,请保持开放的心态。

如果在这个行业中您应该始终牢记一个真理,那就是基本原则不会改变,但技术每天都在变化。如果您不掌握最新技术,您将被掌握技术的人所取代。

我 100% 同意,我的目标是 C++,但我开始用 Python 进行原型设计,因为用 C++ 进行原型设计真是太痛苦了。
但是,如果您真的精通 C++,那么就没有理由在 Python 中进行部署。就像在大学里一样,我们快速、脏乱、无索引、草率地做笔记,在旁边做笔记...然后建议是花时间将其复制到更干净、索引化的文档中,以尽可能降低认知工作量,并在学习时为您提供更好的性能优势。

回复 作者:sgtrock (未验证)

您试过 ROOT - https://root.cern.ch/ - 它有点像解释型 C++。
如果我不是试图教人们编码,我会用 ROOT 重写 Zim,并使用它来记录目前从中生成的 C++ 代码。目前,我很高兴教授 Python,并希望他们学到足够多的东西来切换到 C++,而不是使用现在几乎无处不在的 Python 接口!

回复 作者:Guillem

我之前的项目对代码/数据存储有 128 KB 的限制,对 RAM 有 32 KB 的限制。请告诉我 Python 什么时候能适应这种环境!

micro:bit 使用 micropython - 16Kram 和 256K Flash 内存。我仍然会在愤怒中使用 C++(或者可能是用于更大批量生产的机器代码),但是您可以用 micropython 教很多东西,并且您必须学习很多东西才能正确使用 C++ - 但随后您必须学习相同的东西才能正确使用编程。

回复 作者:Yongwei Wu (未验证)

恐怕您关于 Python 可读性的论点站不住脚,可读性主要(虽然不是完全)是开发者技能的函数。正如您指出的那样,Python 社区中的许多人是业余爱好者和非计算机科学家,坦率地说,这很明显。我不得不查找/修复错误或为许多用 Python 编写的开源项目创建解决方法,并且发现许多情况下代码中几乎没有或根本没有文档,在一个实例中,一个 1200 行的模块中没有一个注释。每当人们声明一种语言更具可读性时,较新的程序员就会开始认为他们不需要记录任何内容,这使得该语言的代码平均而言不如其他更成熟的语言可读。在我多年来使用过的约 60 种语言中,Ada 可能是最易读的,但是,这很可能是因为当时使用该语言的人的技能水平。虽然不同语言确实使编写可读代码变得更容易或更难,但优秀的程序员可以用任何语言编写良好、可读的代码,而糟糕的程序员可以用任何语言编写糟糕、难以阅读的代码。

仅供参考。

二十年前,您可能是正确的。今天,您可以在 RaspberryPi Zero 上编写完全可以接受的 Python 代码,它可以创造奇迹并完成工作。我宁愿他们选择 ROOT,但 Python(和 micro-python)作为一种学习编码工具的势头已经足够强大,不容忽视。一旦您学习了编码的基础知识,那么切换到另一种语言就非常容易,并且本身就是一次很棒的学习经历。关于计算机语言的偏见太多了,这比任何语言都造成了更多的问题 - 重要的是要记住,无论您用什么编码,最终都只是与、或和非。

回复 作者:Guillem

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.