Wat is eigenlijk het verschil tussen CPython, MicroPython en CircuitPython?
CPython, MicroPython en CircuitPython hebben een warm plekje in het hart van menig knutselaar. Maar het is niet altijd duidelijk wat de verschillen zijn. En als je voor het eerst met microcontrollers aan het knoeien bent, kan dit onderscheid een sleutelrol spelen bij het begrijpen van wat er aan de hand is met je code.
Dus in dit artikel zal ik uitleggen wat deze drie implementaties van Python zijn en hoe ze zich tot elkaar verhouden.
Het is belangrijk om te onthouden dat Python zowel een taal is en een programma. In deze context is de implementatie het programma dat Python-code interpreteert en uitvoert.
We hebben het dus vooral over drie programma's (waaronder runtime-omgevingen, standaardbibliotheken en andere tools) die Python-code kunnen uitvoeren. Laten we beginnen met het referentieprogramma CPython.
CPython
CPython is de standaard en meest gebruikte implementatie van de programmeertaal Python. Als mensen het over Python hebben, hebben ze het meestal over Python dat draait op CPython.
Het is dan ook geschreven in C (vandaar de "C") en dient als referentie-implementatie voor de Python-taal. Als je alle vuile details wilt weten, kun je Bekijk de documentatie van CPython hier.
CPython interpreteert en voert Python-code uit en biedt de kernfuncties en mogelijkheden van Python. En omdat het het meest gebruikt wordt, heeft het ook toegang tot het meest uitgebreide ecosysteem van bibliotheken en pakketten, waaronder bibliotheken als NumPy, Django, Flask, TensorFlow, enz.
CPython heeft ook een runtime-omgeving met dynamisch geheugenbeheer (inclusief automatische geheugentoewijzing via referentietelling en afvalverzameling).
Als het aankomt op foutafhandeling, biedt CPython je de mogelijkheid om fouten en uitzonderingen te beheren via try-except blokken.
Het heeft natuurlijk ook een ingebouwde debuggermodule, pdb
die breakpoints en single stepping ondersteunt. U kunt het uitproberen door uit te voeren:
import pdb; pdb.set_trace()
Tot slot gebruikt CPython een Global Interpreter Lock (GIL), waardoor slechts één hoofdthread Python-bytecode kan uitvoeren binnen één proces. Met andere woorden, CPython ondersteunt asynchroon programmeren, maar niet parallel programmeren. Meer over Async en Parallel programmeren in een volgende post!
Sommige andere implementaties gebruiken de GIL niet zodat ze verschillende benaderingen van concurrency en parallellisme kunnen aanbieden.
Jython draait bijvoorbeeld op de Java Virtual Machine.
IronPython draait op .NET.
En PyPy draait op Software Transactional Memory.
CPython, MicroPython en CircuitPython draaien echter allemaal met de GIL op zijn plaats.
MicroPython
In tegenstelling tot CPython, dat is ontworpen voor algemene doeleinden (desktops, servers, ingebedde systemen, enz.), is MicroPython een implementatie van Python die specifiek is geoptimaliseerd voor microcontrollers (zoals de Pico!) en ingebedde systemen.
Het is het vermelden waard dat MicroPython soms wordt geschreven als uPython, vanwege de Griekse letter μ ("mu", zoals in de eerste letter van "mikrós").
MicroPython heeft daarbij geen besturingssysteem nodig, je kunt het effectief uitvoeren als het besturingssysteem op een microcontroller.
Om dat te doen, vertrouwen mensen meestal op de Thonny IDEdie een aantal zeer nuttige gereedschappen heeft voor MicroPython.
Hoewel MicroPython nog steeds in C is geschreven, draait het allemaal om het bieden van een compacte runtime voor minder krachtige apparaten - het gebruikt dus minder geheugen en biedt eigenlijk alleen specifieke modules en bibliotheken voor ingebedde systemen, zoals machine
, utime
en network
.
Als je op zoek bent naar een aantal geweldige MicroPython bibliotheken, kun je kijken naar Geweldig MicroPython.
CPython gebruikt referentietelling als belangrijkste algoritme voor afvalverzameling, maar MicroPython gebruikt Mark en Sweep als het belangrijkste algoritme voor afvalverzameling om het geheugen te beheren.
Het werd 10 jaar geleden gecreëerd door Damien George en als je wilt luisteren hoe hij erover praat, kun je deze lezing bekijken:
MicroPython heeft dus niet alle mogelijkheden van de standaardbibliotheek in CPython.
In tegenstelling tot CPython heeft MicroPython geen ingebouwde ondersteuning voor pdb
als debug-gereedschap. In plaats daarvan, als je MicroPython gebruikt, zul je moeten vertrouwen op andere technieken zoals afdrukstatements.
Als je geïnteresseerd bent in het gebruik van externe debuggers, kun je kijken naar deze zeer coole MicroPython Debugger op GitHub. Het is gericht op het bieden van pdb
functies naar MicroPython.
Als je geïnteresseerd bent in het bekijken van de MicroPython documentatie voor meer diepgaande dingen, kun je het volgende volgen deze link voor alle details.
MicroPython is dus een beperktere implementatie van CPython, maar het is nog steeds geweldig krachtig en vaak het ideale gereedschap voor veel projecten.
CircuitPython
Een ander geweldig hulpmiddel is CircuitPython.
CircuitPython is een fork van MicroPython geassocieerd met Adafruit en is gericht op meer beginnersvriendelijkheid (of MicroPython niet beginnersvriendelijk genoeg is, is zeker een punt van discussie).
In feite zijn de verschillen tussen MicroPython en CircuitPython extreem klein.
Een opvallend verschil is dat CircuitPython is ontworpen om bestanden naar het bord te verplaatsen door ze als een externe schijf te laten verschijnen (net zoals een USB zou doen). Het idee hierachter is dat je een bestand niet hoeft te uploaden via Thonny (hoewel dat nog steeds kan).
CircuitPython heeft bijvoorbeeld specifieke bibliotheken, zoals adafruit_neopixel
, adafruit_bmp280
en adafruit_dotstar
die allemaal gericht zijn op specifieke hardware.
Wat CircuitPython echt anders maakt, is de levendige gemeenschap die Adafruit eromheen heeft opgebouwd. Je kunt de CircuitPython forum en de discord om het zelf te zien. (Ik moet erop wijzen dat MicroPython ook een forum en een discordhoewel veel minder bezocht, aangezien de meeste MicroPython-discussies plaatsvinden op GitHub).
Als je meer wilt weten over CircuitPython en de verschillen met MicroPython (en CPython), kun je kijken op de documentatiepagina hier. Zelfs de documentatie lijkt op die van MicroPython!
Anders kun je deze video van Adafruit bekijken:
Als je nog andere interessante verschillen kent, laat het ons dan hieronder weten!