Ποια είναι η διαφορά μεταξύ CPython, MicroPython, & CircuitPython ούτως ή άλλως?
Το CPython, το MicroPython και το CircuitPython κατέχουν μια αγαπημένη θέση στις καρδιές πολλών μαστόρων. Αλλά δεν είναι πάντα σαφές ποιες είναι οι διαφορές. Και αν χαζεύετε για πρώτη φορά με μικροελεγκτές, αυτές οι διακρίσεις μπορεί να παίξουν καθοριστικό ρόλο στην κατανόηση του τι συμβαίνει με τον κώδικά σας.
Έτσι, σε αυτό το άρθρο, θα εξηγήσω ποιες είναι αυτές οι τρεις υλοποιήσεις της Python και πώς συγκρίνονται και αντιδιαστέλλονται.
Είναι σημαντικό να θυμόμαστε ότι η Python είναι και μια γλώσσα και ένα πρόγραμμα. Σε αυτό το πλαίσιο, η υλοποίηση είναι το πρόγραμμα που ερμηνεύει και εκτελεί τον κώδικα Python.
Έτσι, μιλάμε κυρίως για τρία προγράμματα (τα οποία περιλαμβάνουν περιβάλλοντα χρόνου εκτέλεσης, τυποποιημένες βιβλιοθήκες και άλλα εργαλεία) που μπορούν να εκτελέσουν κώδικα Python. Ας ξεκινήσουμε λοιπόν με το πρόγραμμα αναφοράς - το CPython.
CPython
Η CPython είναι η προεπιλεγμένη και πιο ευρέως χρησιμοποιούμενη υλοποίηση της γλώσσας προγραμματισμού Python. Συνήθως, όταν οι άνθρωποι μιλούν για την Python, μιλούν για την Python που εκτελείται στην CPython.
Όπως είναι αναμενόμενο, είναι γραμμένο σε C (εξ ου και το "C") και χρησιμεύει ως η υλοποίηση αναφοράς για τη γλώσσα Python. Αν θέλετε όλες τις βρώμικες λεπτομέρειες, μπορείτε να δείτε την τεκμηρίωση της CPython εδώ.
Το CPython ερμηνεύει και εκτελεί κώδικα Python και παρέχει τις βασικές λειτουργίες και χαρακτηριστικά της Python. Και επειδή είναι η πιο συχνά χρησιμοποιούμενη, έχει επίσης πρόσβαση στο πιο εκτεταμένο οικοσύστημα βιβλιοθηκών και πακέτων, συμπεριλαμβανομένων βιβλιοθηκών όπως η NumPy, η Django, η Flask, η TensorFlow κ.λπ.
Το CPython διαθέτει επίσης περιβάλλον χρόνου εκτέλεσης με δυναμική διαχείριση μνήμης (συμπεριλαμβανομένης της αυτόματης κατανομής μνήμης μέσω της καταμέτρησης αναφορών καθώς και της συλλογής σκουπιδιών).
Όσον αφορά το χειρισμό σφαλμάτων, η CPython σας προσφέρει τη δυνατότητα διαχείρισης σφαλμάτων και εξαιρέσεων μέσω των μπλοκ try-except.
Επίσης, φυσικά, διαθέτει ενσωματωμένη μονάδα εντοπισμού σφαλμάτων, pdb
, το οποίο υποστηρίζει σημεία διακοπής και μονό βήμα. Μπορείτε να το δοκιμάσετε τρέχοντας:
import pdb; pdb.set_trace()
Τέλος, η CPython χρησιμοποιεί ένα Global Interpreter Lock (GIL), το οποίο επιτρέπει μόνο σε ένα κύριο νήμα να εκτελεί bytecode Python μέσα σε μία μόνο διεργασία. Με άλλα λόγια, η CPython υποστηρίζει ασύγχρονο προγραμματισμό, αλλά όχι παράλληλο προγραμματισμό. Περισσότερα για τον ασύγχρονο και τον παράλληλο προγραμματισμό σε μια επόμενη δημοσίευση!
Ορισμένες άλλες υλοποιήσεις δεν χρησιμοποιούν το GIL, ώστε να μπορούν να προσφέρουν διαφορετικές προσεγγίσεις για την ταυτόχρονη εκτέλεση και τον παραλληλισμό.
Για παράδειγμα, η Jython τρέχει στην εικονική μηχανή Java.
Το IronPython τρέχει σε .NET.
Και η PyPy τρέχει σε Συναλλακτική Μνήμη Λογισμικού.
Οι CPython, MicroPython και CircuitPython, ωστόσο, τρέχουν με το GIL στη θέση του.
MicroPython
Σε αντίθεση με την CPython, η οποία είναι σχεδιασμένη για γενικούς σκοπούς (επιτραπέζιους υπολογιστές, διακομιστές, ενσωματωμένα συστήματα κ.λπ.), η MicroPython είναι μια υλοποίηση της Python ειδικά βελτιστοποιημένη για μικροελεγκτές (όπως ο Pico!) και ενσωματωμένα συστήματα.
Αξίζει να αναφέρουμε εδώ ότι το MicroPython μερικές φορές γράφεται ως uPython, λόγω του ελληνικού γράμματος μ ("mu", όπως το πρώτο γράμμα του "mikrós").
Το MicroPython δεν απαιτεί λειτουργικό σύστημα, μπορείτε να το τρέξετε αποτελεσματικά ως το λειτουργικό σύστημα σε έναν μικροελεγκτή.
Συνήθως, για να γίνει αυτό, οι άνθρωποι βασίζονται σε το Thonny IDE, το οποίο διαθέτει μια σειρά από εξαιρετικά χρήσιμα εργαλεία για την αντιμετώπιση της MicroPython.
Αν και εξακολουθεί να είναι γραμμένο σε C, το MicroPython έχει ως στόχο την παροχή ενός συμπαγούς χρόνου εκτέλεσης για λιγότερο ισχυρές συσκευές - έτσι χρησιμοποιεί λιγότερη μνήμη και παρέχει μόνο συγκεκριμένες ενότητες και βιβλιοθήκες για ενσωματωμένα συστήματα, όπως machine
, utime
, και network
.
Αν ψάχνετε για μερικές φοβερές βιβλιοθήκες MicroPython, μπορείτε να δείτε Φοβερό MicroPython.
Η CPython χρησιμοποιεί την καταμέτρηση αναφοράς ως κύριο αλγόριθμο συλλογής σκουπιδιών, αλλά Το MicroPython χρησιμοποιεί Mark και Sweep ως τον κύριο αλγόριθμο συλλογής σκουπιδιών για τη διαχείριση της μνήμης.
Δημιουργήθηκε από τον Damien George πριν από 10 χρόνια και αν θέλετε να τον ακούσετε να μιλάει γι' αυτό, μπορείτε να δείτε αυτή τη διάλεξη:
Έτσι, η MicroPython δεν διαθέτει όλα τα χαρακτηριστικά της τυπικής βιβλιοθήκης της CPython.
Σε αντίθεση με την CPython, η MicroPython δεν έχει ενσωματωμένη υποστήριξη για pdb
ως εργαλείο εντοπισμού σφαλμάτων. Αντίθετα, αν χρησιμοποιείτε το MicroPython, θα πρέπει να βασιστείτε σε άλλες τεχνικές, όπως οι εντολές εκτύπωσης.
Αν σας ενδιαφέρει η χρήση εξωτερικών προγραμμάτων εντοπισμού σφαλμάτων, μπορείτε να ελέγξετε το αυτό το πολύ καλό MicroPython Debugger στο GitHub. Στόχος του είναι να παρέχει pdb
χαρακτηριστικά στη MicroPython.
Αν σας ενδιαφέρει να δείτε την τεκμηρίωση του MicroPython για πιο λεπτομερή πράγματα, μπορείτε να ακολουθήσετε αυτός ο σύνδεσμος για να δείτε όλες τις λεπτομέρειες.
Έτσι, η MicroPython είναι μια πιο περιορισμένη υλοποίηση της CPython, αλλά εξακολουθεί να είναι θαυμάσια ισχυρή και συχνά το ιδανικό εργαλείο για πολλά έργα.
CircuitPython
Ένα άλλο σπουδαίο εργαλείο όμως είναι το CircuitPython.
Το CircuitPython είναι μια διακλάδωση του MicroPython που σχετίζεται με Adafruit και στοχεύει στο να είναι πιο φιλική προς τους αρχάριους (το αν η MicroPython δεν είναι αρκετά φιλική προς τους αρχάριους είναι σίγουρα ένα θέμα συζήτησης).
Στην πραγματικότητα, οι διαφορές μεταξύ της MicroPython και της CircuitPython είναι εξαιρετικά μικρές.
Μια αξιοσημείωτη διαφορά είναι ότι το CircuitPython έχει σχεδιαστεί για να μεταφέρονται τα αρχεία στην πλακέτα, εμφανιζόμενο ως εξωτερικός δίσκος (όπως ακριβώς θα έκανε ένα USB). Η ιδέα εκεί είναι ότι δεν χρειάζεται να ανεβάσετε ένα αρχείο μέσω του Thonny (αν και μπορείτε ακόμα να το κάνετε).
Για παράδειγμα, το CircuitPython έχει συγκεκριμένες βιβλιοθήκες, όπως η adafruit_neopixel
, adafruit_bmp280
, και adafruit_dotstar
, τα οποία απευθύνονται σε συγκεκριμένο υλικό.
Κάτι που πραγματικά ξεχωρίζει το CircuitPython είναι η ζωντανή κοινότητα που έχει αναπτύξει η Adafruit γύρω από αυτό. Μπορείτε να δείτε το CircuitPython forum και το Διαφωνία για να δείτε και μόνοι σας. (Θα πρέπει να επισημάνω ότι το MicroPython έχει επίσης ένα forum και ένα Διαφωνία, αν και με πολύ λιγότερη επισκεψιμότητα, αφού οι περισσότερες συζητήσεις για τη MicroPython γίνονται στο GitHub).
Αν θέλετε να μάθετε περισσότερα για το CircuitPython και τις διαφορές του με το MicroPython (και το CPython), μπορείτε να δείτε τη σελίδα τεκμηρίωσής του εδώ. Ακόμα και η τεκμηρίωσή του μοιάζει με την τεκμηρίωση της MicroPython!
Διαφορετικά, μπορείτε να δείτε αυτό το βίντεο που δημοσίευσε η Adafruit:
Αν υπάρχουν άλλες ενδιαφέρουσες διαφορές που γνωρίζετε, ενημερώστε μας στα σχόλια παρακάτω!