Vad är egentligen skillnaden mellan CPython, MicroPython och CircuitPython?

CPython, MicroPython och CircuitPython har en kär plats i hjärtat hos många som pysslar. Men det är inte alltid klart vad skillnaderna är. Och om du för första gången håller på med mikrokontroller kan dessa skillnader spela en viktig roll för att förstå vad som är fel med din kod.

Så i den här artikeln kommer jag att förklara vad dessa tre implementeringar av Python är och hur de jämför och kontrasterar.

Det är viktigt att komma ihåg att Python är både ett språk och ett program. I detta sammanhang är implementeringen det program som tolkar och exekverar Python-koden.

Vi pratar alltså mest om tre program (som inkluderar runtime-miljöer, standardbibliotek och andra verktyg) som kan köra Python-kod. Så låt oss börja med referensprogrammet - CPython.

CPython

CPython är den standardiserade och mest använda implementeringen av programmeringsspråket Python. När man talar om Python menar man vanligtvis Python som körs på CPython.

Föga förvånande är det skrivet i C (därav "C") och fungerar som referensimplementering för Python-språket. Om du vill ha alla de smutsiga detaljerna kan du kolla in CPythons dokumentation här.

CPython tolkar och kör Python-kod och tillhandahåller Pythons kärnfunktioner och egenskaper. Och eftersom det är det mest använda har det också tillgång till det mest omfattande ekosystemet av bibliotek och paket, inklusive bibliotek som NumPy, Django, Flask, TensorFlow, etc.

CPython har också en runtime-miljö med dynamisk minneshantering (inklusive automatisk minnesallokering genom referensräkning samt garbage collection).

När det gäller felhantering ger CPython dig möjlighet att hantera fel och undantag genom try-except-block.

Den har naturligtvis också en inbyggd debugger-modul, pdb, som stöder brytpunkter och single stepping. Du kan testa det genom att köra:

import pdb; pdb.set_trace()

Slutligen använder CPython ett Global Interpreter Lock (GIL), som endast tillåter en huvudtråd att exekvera Python-bytecode inom en enda process. Med andra ord stöder CPython asynkron programmering, men inte parallell programmering. Mer om Async- och parallellprogrammering i ett kommande inlägg!

Vissa andra implementeringar använder inte GIL så att de kan erbjuda olika metoder för samtidighet och parallellism.

Jython körs t.ex. på Java Virtual Machine.

IronPython körs på .NET.

Och PyPy körs på Software Transactional Memory.

CPython, MicroPython och CircuitPython körs dock alla med GIL på plats.

MicroPython

Till skillnad från CPython, som är utformat för allmänna ändamål (stationära datorer, servrar, inbyggda system etc.), är MicroPython en implementering av Python som är särskilt optimerad för mikrokontroller (som Pico!) och inbyggda system.

Det är värt att nämna att MicroPython ibland skrivs som uPython, på grund av den grekiska bokstaven μ ("mu", som i den första bokstaven i "mikrós").

MicroPython kräver därmed inget operativsystem, du kan köra det effektivt som operativsystemet på en mikrokontroller.

För att göra det förlitar sig människor vanligtvis på Thonny IDEsom har ett antal mycket användbara verktyg för hantering av MicroPython.

MicroPython är fortfarande skrivet i C, men handlar om att tillhandahålla en kompakt runtime för mindre kraftfulla enheter - så det använder mindre minne och tillhandahåller egentligen bara specifika moduler och bibliotek för inbyggda system, t.ex. machine, utime, och network.

Om du letar efter några fantastiska MicroPython-bibliotek kan du kolla in Fantastisk MicroPython.

CPython använder referensräkning som sin huvudsakliga garbage collection-algoritm, men MicroPython använder Mark and Sweep som huvudalgoritm för skräpsamling att hantera minnet.

Det skapades av Damien George för 10 år sedan och om du vill höra honom prata om det kan du kolla in den här föreläsningen:

MicroPython har alltså inte alla de funktioner som standardbiblioteket i CPython har.

Till skillnad från CPython har MicroPython inget inbyggt stöd för pdb som felsökningsverktyg. Om du använder MicroPython kommer du istället att behöva förlita dig på andra tekniker som utskriftssatser.

Om du är intresserad av att använda externa debuggers kan du kolla in denna mycket coola MicroPython Debugger på GitHub. Syftet är att tillhandahålla pdb funktioner för MicroPython.

Om du är intresserad av att kolla in MicroPython-dokumentationen för mer djupgående saker kan du följa denna länk för att se alla detaljer.

MicroPython är alltså en mer begränsad implementering av CPython, men det är fortfarande fantastiskt kraftfullt och ofta det perfekta verktyget för många projekt.

CircuitPython

Ett annat bra verktyg är CircuitPython.

CircuitPython är en förgrening av MicroPython associerad med Adafruit och syftar till att vara mer nybörjarvänligt (huruvida MicroPython inte är tillräckligt nybörjarvänligt är verkligen en fråga som kan diskuteras).

Faktum är att skillnaderna mellan MicroPython och CircuitPython är extremt små.

En anmärkningsvärd skillnad är att CircuitPython är utformat för att filer ska flyttas till kortet genom att visas som en extern disk (precis som en USB skulle göra). Tanken är att du inte behöver ladda upp en fil via Thonny (även om du fortfarande kan göra det).

CircuitPython har till exempel specifika bibliotek, såsom adafruit_neopixel, adafruit_bmp280, och adafruit_dotstar, som alla är inriktade på specifik hårdvara.

Något som verkligen utmärker CircuitPython är den livliga gemenskap som Adafruit har skapat kring det. Du kan kolla in CircuitPython forum och diskord för att se själv. (Jag bör påpeka att MicroPython också har en forum och en diskord, om än mycket mindre frekvent, eftersom de flesta MicroPython-diskussioner sker på GitHub).

Om du vill lära dig mer om CircuitPython och dess skillnader jämfört med MicroPython (och CPython) kan du kolla in dess dokumentationssida här. Även dess dokumentation liknar MicroPython-dokumentationen!

Annars kan du kolla in den här videon från Adafruit:

Om du känner till några andra intressanta skillnader, låt oss veta det i kommentarerna nedan!

Lämna en kommentar