CPython、MicroPython 和 CircuitPython 之间到底有什么区别?

CPython、MicroPython 和 CircuitPython 在许多工匠心中都占有重要地位。但它们之间的区别并不总是很明显。如果你是第一次接触微控制器,这些区别对你理解代码中的问题会起到关键作用。

因此,在这篇文章中,我将解释 Python 的这三种实现是什么,以及它们之间的对比。

重要的是要记住 Python 既是一种语言 程序。在这里,实现是解释和执行 Python 代码的程序。

因此,我们主要讨论的是可以运行 Python 代码的三个程序(包括运行环境、标准库和其他工具)。让我们从 CPython 这个参考程序开始。

CPython

CPython是Python编程语言的默认实现,也是使用最广泛的实现。通常,当人们谈论Python时,他们谈论的是运行在CPython上的Python。

不出所料,它是用 C 语言编写的(所以是 "C"),是 Python 语言的参考实现。如果您想了解所有不为人知的细节,可以 在此查看 CPython 文档.

CPython 可解释和执行 Python 代码,并提供 Python 的核心功能和特性。由于 CPython 的使用率最高,它还能访问最广泛的库和包生态系统,包括 NumPy、Django、Flask、TensorFlow 等库。

CPython还具有动态内存管理的运行环境(包括通过引用计数和垃圾回收自动分配内存)。

在错误处理方面,CPython提供了通过try-except块来管理错误和异常的能力。

当然,它还内置了调试器模块、 pdb,它支持断点和单步。您可以通过运行

import pdb; pdb.set_trace()

最后,CPython使用全局解释器锁(GIL),它只允许一个主线程在一个进程中执行Python字节码。换句话说,CPython支持异步编程,但不支持并行编程。 更多关于异步和并行编程的内容,请参见下一篇文章!

其他一些实现并不使用 GIL,因此它们可以提供不同的并发和并行方法。

例如,Jython在Java虚拟机上运行。

IronPython在.NET上运行。

PyPy运行在软件事务内存上。

然而,CPython、MicroPython和CircuitPython都是在GIL到位的情况下运行的。

微蟒

CPython是为通用目的(台式机、服务器、嵌入式系统等)设计的,而MicroPython则是专为微控制器(如Pico!)和嵌入式系统优化的Python实现。

值得一提的是,MicroPython 有时被写成 uPython,这是因为希腊字母 μ("mu","mikrós "的第一个字母)的缘故。

MicroPython 因此不需要操作系统,你可以有效地运行它。 作为 微控制器上的操作系统。

通常情况下,为了做到这一点,人们依赖于 索尼 IDE,它有许多非常有用的工具来处理MicroPython。

MicroPython 虽然仍使用 C 语言编写,但其目的是为功能较弱的设备提供紧凑的运行时,因此内存用量较少,而且实际上只为嵌入式系统提供特定的模块和库,如 machine, utime,以及 network.

如果您正在寻找一些超棒的 MicroPython 库,可以查看 令人敬畏的MicroPython.

CPython使用引用计数作为其主要的垃圾回收算法,但是 MicroPython使用Mark和Sweep作为主要的垃圾回收算法。 来管理内存。

如果您想听他讲述,您可以查看这个讲座:

因此,MicroPython 并不具备 CPython 标准库的所有功能。

与 CPython 不同,MicroPython 没有内置对 pdb 作为调试工具。相反,如果你使用的是 MicroPython,则需要依赖其他技术,如打印语句。

如果您对使用外部调试器感兴趣,可以查看 GitHub上这个非常酷的MicroPython调试器.它旨在提供 pdb 功能到MicroPython。

如果您有兴趣查看 MicroPython 文档,以了解更深入的内容,可以关注 查看所有详细信息.

因此,MicroPython 是 CPython 更受限制的实现,但它仍然非常强大,通常是许多项目的理想工具。

循环器(CircuitPython

另一个很好的工具是CircuitPython。

CircuitPython是MicroPython的一个分叉,它与 阿达福 MicroPython 的目标是更方便初学者使用(MicroPython 是否不够方便初学者使用当然还有争议)。

事实上,MicroPython和CircuitPython之间的差别非常小。

一个显著的不同点是,CircuitPython 的设计是将文件作为外部磁盘(就像 USB 一样)移动到电路板上。这样做的目的是让你无需通过 Thonny 上传文件(尽管你仍然可以)。

例如,CircuitPython有特定的库,如 adafruit_neopixel, adafruit_bmp280,以及 adafruit_dotstar它们都针对特定的硬件。

真正让 CircuitPython 与众不同的是 Adafruit 围绕 CircuitPython 所建立的充满活力的社区。您可以查看 CircuitPython 论坛不和 来亲自体验一下。(我应该指出,MicroPython也有一个 论坛 和一个 不和上讨论 MicroPython,尽管很少有人访问,因为大多数 MicroPython 讨论都在 GitHub).

如果您想了解更多关于CircuitPython及其与MicroPython(和CPython)的区别,您可以查阅 其文档页面在这里.甚至其文档看起来也与MicroPython文档相似!

否则,您可以查看 Adafruit 发布的视频:

如果您还知道其他有趣的不同之处,请在下面的评论中告诉我们!

发表评论