Εισαγωγή
Γεια σε όλους! Ελπίζω να πάνε όλα καλά.
Η χρονιά περνάει γρήγορα και φτάσαμε στον Mindshifting May, πιθανώς τον μήνα που περιμένω με τη μεγαλύτερη ανυπομονησία, κυρίως επειδή περιλαμβάνει τη Prolog!
Ελπίζω να απόλαυσες τον Analytical April. Πάρα πολλοί πήραν μέρος και νομίζω ότι ήταν ένας από τους πιο επιτυχημένους μήνες μέχρι τώρα. Μίλησα επίσης με τον Simon Peyton Jones μέσα στον Απρίλιο, ως καθυστερημένη συνέντευξη για τον Functional February. Ήταν πραγματικά εξαιρετικό και σου προτείνω ανεπιφύλακτα να το ξαναδείς, έστω και μόνο για την υπέροχη φράση: "Όταν ο ασβεστόλιθος του προστακτικού προγραμματισμού φθαρεί, ο γρανίτης του συναρτησιακού προγραμματισμού θα αποκαλυφθεί από κάτω".
Λοιπόν, ας πάμε στον Mindshifting May! Όπως πάντα, ο Erik κι εγώ θα σου δώσουμε μια γρήγορη επισκόπηση του τι αφορούν οι μήνες και των διαφορετικών γλωσσών που θα εξερευνήσουμε.
Έχουμε λοιπόν έξι ολόκληρες γλώσσες αυτόν τον μήνα: Ballerina, Pharo, Prolog, Red, Tcl (Tickle) και Unison. Καθεμία από αυτές τις γλώσσες είναι αρκετά διαφορετική από τις πιο "συνηθισμένες" γλώσσες, οπότε σου προτείνουμε να δοκιμάσεις περισσότερες από μία για να καταλάβεις πώς διαφέρουν. Σου προτείνω ανεπιφύλακτα τη Prolog, γιατί είναι μία από τις γλώσσες με τις οποίες έχω απολαύσει περισσότερο τον προγραμματισμό στη ζωή μου. Ο Erik είναι επίσης πολύ ενθουσιασμένος με τη Unison, οπότε κι αυτή είναι μια καλή επιλογή για να δοκιμάσεις.
Τα badges
Για να πάρεις το badge του Mindshifting May, πρέπει να ολοκληρώσεις πέντε ασκήσεις σε μία από αυτές τις γλώσσες μέσα στον Μάιο.
Υπάρχει επίσης το badge 12in23, για όλη τη χρονιά. Για να το πάρεις, πρέπει να λύσεις πέντε από τις επιλεγμένες ασκήσεις μας στη γλώσσα. Αν το βλέπεις αυτό μετά τον Μάιο, μπορείς να το κάνεις οποιαδήποτε στιγμή μέσα στη χρονιά, οπότε δεν έχεις χάσει τίποτα. Η επιλογή αυτών των ασκήσεων ήταν δύσκολη, καθώς οι γλώσσες είναι όλες τόσο διαφορετικές, οπότε προτιμήσαμε πιο γενικές ασκήσεις που είναι διασκεδαστικές στη λύση και ενδιαφέρουσες για να εξερευνήσεις διαφορετικές προσεγγίσεις.
- Ακρώνυμο: μετατρέπει μια φράση στο ακρώνυμό της
- Ίσογραμμα: ελέγχει αν μια φράση περιέχει γράμματα που επαναλαμβάνονται
- Ρωμαϊκοί αριθμοί: μετατρέπει έναν δεκαδικό αριθμό σε ρωμαϊκούς αριθμούς
- Σταγόνες βροχής: μετατρέπει έναν αριθμό σε ήχους σταγόνων βροχής
- Διαστημική εποχή: υπολογίζει πόσο χρονών θα ήταν κάποιος στους πλανήτες του ηλιακού μας συστήματος
Αυτές οι ασκήσεις και εκείνες των προηγούμενων μηνών βρίσκονται όλες στη σελίδα #12in23.
Επισκοπήσεις
Ας βουτήξουμε και ας εξερευνήσουμε τις γλώσσες, με μια επισκόπηση της καθεμιάς.
Prolog:
- Διαφορετικός τρόπος σκέψης. Ένα πρόγραμμα ορίζεται ως ένα σύνολο σχέσεων. Στη συνέχεια "ρωτάς" τη βάση δεδομένων των σχέσεων για να βρεις απαντήσεις, χρησιμοποιώντας ενοποίηση (αντιστοίχιση προτύπων). Ιδανικό για συστήματα βασισμένα σε κανόνες
- Λίγη σύνταξη, μόνο ένας τύπος δεδομένων (όροι) και ένα δομικό στοιχείο της γλώσσας (ρήτρες). Οι ρήτρες χτίζονται εξ ολοκλήρου από όρους και μπορούν να ορίσουν γεγονότα ή κανόνες.
- Πολύ δηλωτική. Ανησυχείς λιγότερο για το πώς υπολογίζονται τα πράγματα και περισσότερο για το τι πρέπει να υπολογιστεί. Σε πολλές περιπτώσεις, αυτό σημαίνει λιγότερος κώδικας
- Σχεδιασμένη να λειτουργεί καλά για την αναζήτηση σε μεγάλους χώρους αναζήτησης. Διαφορετικές στρατηγικές αναζήτησης (κατά βάθος, κατά πλάτος), υποστηρίζει αυτόματο κλάδεμα
Unison
- Δεν υπάρχουν συγκρούσεις εκδόσεων στον κώδικα της Unison! Μια συνάρτηση Unison γνωρίζει τα hash των εξαρτήσεών της, οπότε μπορεί να βρει τη σωστή έκδοση του κώδικα που χρειάζεται.
- Η Unison υποστηρίζει ζωντανή περιήγηση κώδικα στο τοπικό UI ανάπτυξης και σε φιλοξενούμενα αποθετήρια, ώστε να μπορείς πάντα να κάνεις κλικ και να δεις τον πηγαίο κώδικα των βιβλιοθηκών από τις οποίες εξαρτάσαι.
- Οι Abilities είναι ένας τρόπος να διαχειρίζεσαι τα "effects" (π.χ. IO) με καθαρά συναρτησιακό τρόπο
Pharo
- Ελάχιστη σύνταξη, ολόκληρη η σύνταξη χωράει σε μια κάρτα (μόνο 6 δεσμευμένες λέξεις!). Η σύνταξη των μηνυμάτων μιμείται τις φυσικές γλώσσες, με υποκείμενο, ρήμα και συμπληρώματα (between: 1 and: 2 +). Η σημασιολογία είναι επίσης απλή (π.χ. εξαιρετικά απλοί κανόνες προτεραιότητας). Την κάνει ευκολότερη στην εκμάθηση και την ανάγνωση
- Η παραγωγικότητα είναι εξαιρετική, μόλις περάσει κανείς την αρχική καμπύλη εκμάθησης. Υπάρχουν πολλοί λόγοι γι' αυτό, όπως η απλή σημασιολογία και η ελάχιστη σύνταξη, αλλά και μερικά από τα ξεχωριστά χαρακτηριστικά της Pharo που αναφέρονται παρακάτω
- Τρέχει στις περισσότερες πλατφόρμες (Windows, macOS, Linux + υποστήριξη ARM) πάνω σε μια γρήγορη εικονική μηχανή (OpenSmalltalk)
- Δεν είναι απλώς μια υλοποίηση της Smalltalk, αναπτύσσεται ακόμα ενεργά (η τελευταία έκδοση της Smalltalk είναι η Smalltalk 80 από το 1980)
- Φιλική κοινότητα
Tcl (προφέρεται "tickle")
- Ελάχιστη σύνταξη, μόνο 12 κανόνες και χωράει σε ένα φύλλο χαρτί. Η σημασιολογία είναι επίσης σχετικά απλή. Κάνει τα προγράμματα εύκολα στην ανάγνωση και την εκμάθηση
- Απλή παραλληλία μέσω coroutines, που επιτρέπει να γράφεται ασύγχρονος κώδικας όπως ο σύγχρονος
- Ενσωματωμένος βρόχος γεγονότων για προγραμματισμό δικτύου και ασύγχρονη είσοδο/έξοδο αρχείων
- Ώριμη, αλλά ακόμα εξελίσσεται
Ballerina
- Υποστήριξη πρώτης κατηγορίας για ασφαλή ως προς τον τύπο, δηλωτική επεξεργασία δεδομένων JSON, XML και πινακοποιημένων δεδομένων με ερωτήματα ενσωματωμένα στη γλώσσα
- Ευέλικτοι τύποι, με τη δομική τυποποίηση (duck typing) να κυριαρχεί. Οι κλειστοί τύποι είναι ένας τρόπος για υποτυποποίηση, ενώ οι ανοιχτοί τύποι χειρίζονται με χάρη την αποστολή υπερβολικά πολλών δεδομένων. Ενσωματωμένη δέσμευση και επικύρωση δεδομένων όταν χρησιμοποιούνται σε πόρους HTTP
- Ενσωματωμένη υποστήριξη για συνήθη πρότυπα ενσωμάτωσης και connectors, όπως κατανεμημένες συναλλαγές, αντιστάθμιση και διακόπτες κυκλώματος
- Κάθε πρόγραμμα Ballerina είναι αυτόματα παρατηρήσιμο από οποιοδήποτε εργαλείο Open Telemetry, δίνοντάς σου πλήρη έλεγχο και ορατότητα στη συμπεριφορά και την απόδοση του κώδικα.
- Εξαιρετική παραλληλία μέσω strands, που είναι ελαφριά νήματα. Οι μη αποκλείουσες κλήσεις I/O είναι εύκολες. Ο μεταγλωττιστής μπορεί να βοηθήσει στον έλεγχο των κλήσεων αποστολής και λήψης μεταξύ workers, αποφεύγοντας τα αδιέξοδα. Η αμεταβλητότητα είναι επίσης εξαιρετική για δικτύωση
- Ρητός χειρισμός σφαλμάτων μέσω τύπων ένωσης και της συντακτικής ζάχαρης
checkπου βοηθάει σε αυτό
Red
- Ελαφρύ. Ολόκληρη η αλυσίδα εργαλείων είναι περίπου 1,5 MB λήψη, ένα μόνο εκτελέσιμο.
- Φορητό. Εύκολη διασταυρούμενη μεταγλώττιση. Παράγει μικρά δυαδικά αρχεία χωρίς εξαρτήσεις. Μικρό αποτύπωμα μνήμης.
- Η Red είναι η δική της μεταγλώσσα και δικό της μορφότυπο δεδομένων (όπως οι LISP). Τα προγράμματα μπορούν να μετασχηματίζουν/διαβάζουν κώδικα.
- Αντιδραστική: Τα αντικείμενα μπορούν να συνδεθούν για να μειώσουν το μέγεθος και την πολυπλοκότητα του προγράμματος (σκέψου τα φύλλα του Excel)
Πού χρησιμοποιούνται αυτές οι γλώσσες;
Prolog:
- Τεχνητή νοημοσύνη (το Watson της IBM)
- Επεξεργασία (φυσικής) γλώσσας
- Κατανεμημένη βάση δεδομένων για βάσεις γνώσης (TerminusDB)
- Χρησιμοποιείται ακόμα και για τον καθορισμό των κανόνων τύπων της Εικονικής Μηχανής Java
Unison
- Χρησιμοποιείται για τη συγγραφή κατανεμημένων συστημάτων
- Γενικές υπηρεσίες web
- Εργασίες υπολογισμού κατά παρτίδες
Pharo
- Χρησιμοποιείται για διαδραστικά εργαλεία
- Χρησιμοποιείται σε πολύ διαφορετικούς τομείς: πλατφόρμα διαδικτυακών συναλλαγών και εργαλείο διαχείρισης επενδύσεων στο cloud
- Προτυποποίηση διεπαφών χρήστη και αλληλεπίδρασης στη βιομηχανία άμυνας
- Διαδικτυακή εφαρμογή για τον σχεδιασμό εκδηλώσεων
- Εργαλείο εύπλαστου περιβάλλοντος ανάπτυξης για εξερεύνηση API, δεδομένων και συστημάτων
Tcl
- Χρησιμοποιείται ως κώδικας συγκόλλησης ή ενσωματωμένο
- Χρησιμοποιείται σε GUIs δρομολογητών CISCO
- Διάφορα συστήματα παραγωγής
- Η NASA το έχει χρησιμοποιήσει πολλές φορές
- Άλλες μεγάλες εταιρείες περιλαμβάνουν τις Pixar, Boeing, Intel, NBC και πολλές ακόμα.
- Το Tk, η εργαλειοθήκη για παράθυρα, έχει υιοθετηθεί από άλλες γλώσσες "σεναρίων" όπως η perl/python/ruby.
- Το Expect, ένα εργαλείο για την αυτοματοποίηση διαδραστικών εφαρμογών γραμμής εντολών
Ballerina
- Χρήση για cloud native εφαρμογές
- Χρησιμοποιείται από το MOSIP, μια πλατφόρμα θεμελιώδους ταυτότητας που βοηθά κυβερνήσεις και άλλους οργανισμούς να υλοποιούν ψηφιακά συστήματα ταυτότητας και συστήματα θεμελιώδους ταυτότητας με οικονομικά αποδοτικό τρόπο.
Τι κάνει αυτές τις γλώσσες ενδιαφέρουσες από τη σκοπιά του προγραμματισμού;
Prolog:
- Γλώσσα λογικού προγραμματισμού (από τις πρώτες), που αποτελεί δικό της παράδειγμα (όπως ο αντικειμενοστρεφής και ο συναρτησιακός προγραμματισμός)
- Δυναμικά τυποποιημένη
Unison
- Καθαρά συναρτησιακή γλώσσα
- Στατικά τυποποιημένη
Pharo
- Αντικειμενοστρεφής γλώσσα, αλλά με την έννοια της Smalltalk. Διαφέρει από τις "κανονικές" αντικειμενοστρεφείς γλώσσες: χωρίς κατασκευαστές, χωρίς δηλώσεις τύπων, χωρίς διεπαφές, χωρίς πρωτογενείς τύπους.
- Δυναμικά τυποποιημένη
Tcl
- Πολυπαραδειγματική: υποστηρίζει αντικειμενοστρεφές, προστακτικό και συναρτησιακό στυλ
- Δυναμικά τυποποιημένη
Ballerina
- Πολυπαραδειγματική: αντικειμενοστρεφής, συναρτησιακή και δηλωτική
- Στατικά τυποποιημένη
Red
- Πολυπαραδειγματική: προστακτική, συναρτησιακή, αντικειμενοστρεφής, συμβολική, αντιδραστική
- Στατικά τυποποιημένη
Ποια είναι τα ξεχωριστά χαρακτηριστικά τους;
Prolog:
- Ευέλικτη. Πολλά ενσωματωμένα κατηγορήματα λειτουργούν προς πολλές κατευθύνσεις. Επιτρέπει σε κάποιον να ρωτά και να δημιουργεί δεδομένα με την ίδια σύνταξη. Κάποια προβλήματα που είναι δύσκολα σε άλλες γλώσσες είναι ασήμαντα
- Το DCG είναι σαν ένας ενσωματωμένος συνδυαστής συντακτικών αναλυτών που είναι εξαιρετικός για ανάλυση, παραγωγή, συμπλήρωση και έλεγχο ακολουθιών
- Το CLP είναι ένας αποδοτικός τρόπος να ορίσεις ένα πρόγραμμα με περιορισμούς
Unison
- Ο κώδικας δεν είναι κείμενο αλλά (αμετάβλητα) δεδομένα. Ο κώδικας αποθηκεύεται σε μια βάση δεδομένων και προσπελαύνεται και ενημερώνεται μέσω του Unison Codebase Manager. Τα αρχεία κειμένου είναι απλώς ένας τρόπος να βάλεις κώδικα στη βάση δεδομένων. Τα αμετάβλητα δεδομένα σημαίνουν επίσης ότι τα αποτελέσματα των δοκιμών μπορούν να αποθηκευτούν στην cache και ότι ο έλεγχος τύπων χρειάζεται να γίνει μόνο μία φορά
- Οι ορισμοί αναφέρονται με hash, όχι με όνομα. Αυτό ονομάζεται κώδικας "με διεύθυνση περιεχομένου". Το συντακτικό δέντρο ενός ορισμού καθορίζει το hash του. Χωρίς συγκρούσεις εκδόσεων, οι μετονομασίες είναι ασήμαντες.
- Τα docs της Unison είναι οντότητες πρώτης κατηγορίας στη γλώσσα και είναι πάντα συγχρονισμένα με τις συναρτήσεις που περιγράφουν. Μπορείς να ενσωματώνεις ζωντανά παραδείγματα σε αυτά και να διασφαλίζεις ότι ο κώδικας του παραδείγματός σου μεταγλωττίζεται.
- Ιδανική για υπολογισμούς στο cloud: δεν υπάρχουν builds, οι συναρτήσεις μπορούν να διανεμηθούν εν κινήσει και ξοδεύεται λιγότερος χρόνος γράφοντας κωδικοποιητές και αποκωδικοποιητές για την επικοινωνία υπηρεσίας προς υπηρεσία της Unison.
Pharo
- Απλό μοντέλο εκτέλεσης: τα πάντα είναι αντικείμενα και η εκτέλεση γίνεται αποκλειστικά μέσω μηνυμάτων (τα οποία είναι κι αυτά αντικείμενα). Ακόμα και η ροή ελέγχου γίνεται μέσω μηνυμάτων. Αν και το μοντέλο είναι απλό, είναι πολύ ισχυρό. Αρκετά διαφορετικό από άλλες αντικειμενοστρεφείς γλώσσες.
- Ο κώδικάς σου βρίσκεται σε ένα image της Pharo, όχι σε αρχεία κειμένου. Ένα image της Pharo περιέχει ολόκληρη την κατάσταση της εφαρμογής σου και μπορεί να εκτελεστεί σε μια εικονική μηχανή Pharo. Όταν αποθηκεύεις τη δουλειά σου, η Pharo αποθηκεύει ολόκληρη την κατάσταση του περιβάλλοντος ως αρχείο image. Αυτό το αρχείο περιέχει όλα τα αντικείμενα, τις σχέσεις τους και το πλαίσιο εκτέλεσης. Τα αρχεία image μπορούν να μοιραστούν με άλλους και να φορτωθούν σε διαφορετικά μηχανήματα ή πλατφόρμες. Αυτό επιτρέπει στους προγραμματιστές να συνεργάζονται εύκολα σε ένα έργο ή να διανέμουν εφαρμογές φτιαγμένες σε Pharo
- Ζωντανό και καθηλωτικό, με άμεση ανατροφοδότηση κατά τη διάρκεια της εκτέλεσης μέσω του IDE της Pharo. Τρέξε και άλλαξε το πρόγραμμά σου εν κινήσει, ακόμα και όσο αυτό εκτελείται! Ισχυρός debugger που υποστηρίζει επανεκκίνηση μεθόδων και διόρθωση bugs εν κινήσει
Tcl
- Απλό σύστημα τύπων: τα πάντα είναι συμβολοσειρά. Το "Τα πάντα είναι συμβολοσειρά" ήταν ο τρόπος με τον οποίο υλοποιούνταν παλιά η Tcl. Τώρα, κάτω από το καπό, υπάρχει ένα ισχυρό σύστημα τύπων, όπου η οντότητα της Tcl (είτε είναι συμβολοσειρά, float, λίστα, λεξικό) έχει μια αναπαράσταση ειδική για τον τύπο της καθώς και μια αναπαράσταση συμβολοσειράς. Αυτό βελτιώνει πολύ την απόδοση του κώδικα Tcl, καθώς δεν χρειάζεται πλέον να μετατρέπει συνεχώς από και προς συμβολοσειρές.
- "Τα πάντα εκτελούνται ως εντολές". Δεν υπάρχουν ενσωματωμένες εντολές. Η Tcl συνοδεύεται από μια "τυποποιημένη βιβλιοθήκη" εντολών, όπως οι if και while, κ.λπ. Είναι πολύ απλό να προσθέσεις νέες εντολές ροής ελέγχου: για παράδειγμα έναν βρόχο until. Είναι επίσης εύκολο να παρακάμψεις μια εντολή της Tcl.
- Λόγω του ότι είναι συμπαγής, με απλή σημασιολογία και υλοποιημένη ως βιβλιοθήκη C, είναι εύκολη στην ενσωμάτωση
Ballerina
- Cloud native. Ενσωματωμένες μετατροπές από JSON σε τύπους που ορίζει ο χρήστης. Πανάλαφρη σύνταξη για τη δημιουργία (μικρο)υπηρεσιών. Ενσωματωμένη παράλληλη εκτέλεση υπηρεσιών. Υποστήριξη HTTP (1 και 2), graphql και gRPC χωρίς επιπλέον ρυθμίσεις
- Αυτόματη δημιουργία artifacts για να κάνεις deploy τον κώδικά σου σε διαφορετικά clouds. Αυτά τα artifacts μπορούν να είναι Dockerfiles, Docker images, αρχεία YAML του Kubernetes ή serverless συναρτήσεις.
- Ενσωματωμένη οπτικοποίηση του κώδικα ως διαγράμματα ακολουθίας. Εξαιρετική για την οπτικοποίηση της ροής του κώδικα. Μπορεί να οπτικοποιήσει ακόμα και κλήσεις HTTP
Red
- Εξαιρετική για τη δημιουργία/ανάλυση Γλωσσών Ειδικού Σκοπού/"διαλέκτων" (ορολογία της Rebol). Αρκετές ενσωματωμένες διάλεκτοι:
- Red/System: μια γλώσσα προγραμματισμού συστημάτων επιπέδου C, μεταγλωττισμένη σε εγγενή κώδικα
- Parse: ένας ισχυρός αναλυτής PEG
- VID: μια απλή διάλεκτος δημιουργίας διάταξης GUI
- Draw: μια διάλεκτος διανυσματικής 2D σχεδίασης
- Rich-text: μια διάλεκτος περιγραφής εμπλουτισμένου κειμένου
- Εύκολα GUIs. Πλήρως cross-platform και εγγενή. Υποστηρίζει αμφίδρομη δέσμευση, ζωντανή ενημέρωση, γεγονότα και παρέχει πρόσβαση στα χαρακτηριστικά του λειτουργικού συστήματος
Ποιες αξίζει να δοκιμάσεις τον Μάιο;
Είναι όλες ενδιαφέρουσες γλώσσες από μόνες τους, οπότε θα μπορούσες να υποστηρίξεις οποιαδήποτε από αυτές.
- Αν σε ενδιαφέρει το cloud computing, η Ballerina και η Unison είναι εξαιρετικές επιλογές. Η Tcl έχει επίσης εξαιρετικά χαρακτηριστικά παραλληλίας
- Αν είσαι εξοικειωμένος με τον αντικειμενοστρεφή προγραμματισμό αλλά θέλεις να δεις μια διαφορετική προσέγγιση, δοκίμασε τη Pharo
- Αν θέλεις να ζήσεις πώς είναι να προγραμματίζεις σε μια γλώσσα που δεν στηρίζεται σε αρχεία κειμένου, δοκίμασε είτε τη Pharo με το μοναδικό και ισχυρό IDE της, είτε τη Unison με τον Unison Codebase Manager.
- Αν σου αρέσει ο μινιμαλισμός, η Tcl, η Prolog, η Pharo και η Red έχουν όλες αρκετά λίγη σύνταξη και σχετικά απλή σημασιολογία
- Αν θέλεις να δεις ένα ενδιαφέρον μείγμα παραδειγμάτων, η Ballerina, η Tcl και η Red υποστηρίζουν όλες διαφορετικά παραδείγματα
- Αν θέλεις να δοκιμάσεις μερικά πιο ασυνήθιστα παραδείγματα, δοκίμασε τη Prolog για λογικό προγραμματισμό, τη Red για αντιδραστικό προγραμματισμό και τη Ballerina για δηλωτικό προγραμματισμό
- Αν σου αρέσει ο συναρτησιακός προγραμματισμός, ρίξε μια ματιά στη Unison, και ειδικότερα στις Abilities της.
- Αν σε ενδιαφέρει ο μεταπρογραμματισμός, η Tcl, η Prolog, η Pharo και η Red έχουν όλες εξαιρετική υποστήριξη
Φυσικά, αν έχεις χρόνο, θα σου πρότεινα να δοκιμάσεις δύο-τρεις! Είναι όλες αρκετά μοναδικές. Λύσε την ίδια άσκηση σε δύο-τρεις από τις επιλεγμένες γλώσσες και δες πόσο διαφορετική είναι η υλοποίηση.