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 越来越受欢迎的趋势。
24 条评论