Εισαγωγή
Γεια σε όλους. Καλώς ήρθες στον Δεκέμβριο. Ελπίζω να είσαι καλά.
Είχαμε έναν εξαιρετικά γεμάτο Οκτώβριο. Μόλις κυκλοφορήσαμε μια μεγάλη βελτίωση στις λύσεις της κοινότητας. Τώρα τις ενοποιούμε, ώστε οι παρόμοιες λύσεις να εμφανίζονται μόνο μία φορά, προσθέσαμε νέες επιλογές ταξινόμησης, τη δυνατότητα αναζήτησης με κώδικα, και αν κοιτάξεις τη C#, θα δεις ότι προσθέσαμε και τη δυνατότητα φιλτραρίσματος με βάση διαφορετικές έννοιες προγραμματισμού. Έτσι μπορείς να ψάξεις για λύσεις που χρησιμοποιούν ολισθήσεις bit, αναδρομή ή ό,τι άλλο σου αρέσει. Θα το επεκτείνουμε και σε άλλες διαδρομές την εβδομάδα της κοινότητας.
Για την ώρα όμως, ας επικεντρωθούμε στο #12in23. Ο Νοέμβριος ήταν ένας ενδιαφέρων μήνας, με εξερεύνηση των γλωσσών assembly, αλλά αυτόν τον μήνα πάμε για ένα πολύ ποικίλο σύνολο γλωσσών, συγκεκριμένα ColdFusion, Groovy, Lua, VimScript και Wren. Ως συνήθως, ο Erik θα μας εξηγήσει τι κάνει αυτές τις γλώσσες ενδιαφέρουσες και ξεχωριστές.
Τα σήματα
Όπως πάντα, μπορείς να κερδίσεις το σήμα Διασκεδάσεις του Δεκεμβρίου ολοκληρώνοντας 5 ασκήσεις σε αυτές τις γλώσσες. Έχουμε επίσης το σήμα της χρονιάς, τον στόχο που ξέρω πως πολλοί έχουν βάλει. Για αυτό έχουμε 5 προτεινόμενες ασκήσεις για να ολοκληρώσεις. Είναι οι εξής:
- All Your Base: μετέτρεψε έναν αριθμό, που αναπαρίσταται ως ακολουθία ψηφίων, σε άλλη βάση.
- Flatten Array: πάρε μια εμφωλευμένη συλλογή και επέστρεψε μία απλή, μη εμφωλευμένη συλλογή.
- Queen Attack: προσδιόρισε αν δύο βασίλισσες σε μια σκακιέρα μπορούν να επιτεθούν η μία στην άλλη.
- D&D Character: δημιούργησε τυχαία χαρακτήρες Dungeons & Dragons.
- Run-Length Encoding: υλοποίησε κωδικοποίηση και αποκωδικοποίηση run-length.
Επισκόπηση
ColdFusion
- Δημιουργήθηκε το 1995 από την Allaire Corporation, την οποία αγόρασε η Macromedia το 2001 και στη συνέχεια η Adobe το 2005.
- Σχεδιάστηκε ως πλατφόρμα ταχείας ανάπτυξης διαδικτυακών εφαρμογών
- Τρέχει στο Java Virtual Machine (JVM)
- Υπάρχουν δύο ξεχωριστές συντακτικές μορφές, που φαίνονται διαφορετικές αλλά είναι σημασιολογικά ταυτόσημες:
- Η παλαιότερη σύνταξη σήμανσης βασισμένη σε ετικέτες, η οποία επεκτείνει την HTML για την εμφάνιση δυναμικού περιεχομένου.
- Η νεότερη σύνταξη, παρόμοια με την ECMAScript, μπορεί να χρησιμοποιηθεί όπου χρησιμοποιείται η σύνταξη με ετικέτες, αλλά και σε ξεχωριστά αρχεία σεναρίων. Ο στόχος ήταν να μεταφερθεί η επιχειρησιακή λογική από τη σήμανση σε ένα ξεχωριστό αρχείο σεναρίου
- Η CFScript είναι μια γλώσσα γενικού σκοπού που τρέχει στο JVM, και έτσι τη χρησιμοποιεί το Exercism. Στην πράξη, δεν απομακρύνθηκε ποτέ πραγματικά από τις ρίζες της ως web server.
- Η ColdFusion είναι εμπορικό προϊόν, αλλά το Ίδρυμα Lucee (ένας μη κερδοσκοπικός οργανισμός με έδρα την Ελβετία) εξακολουθεί να αναπτύσσει ενεργά τον server ColdFusion ανοιχτού κώδικα, του οποίου τον Lucee Server χρησιμοποιούμε για τη διαδρομή του Exercism.
- Εξακολουθεί να αναπτύσσεται ενεργά
- Χρησιμοποιείται κυρίως σε εταιρικό λογισμικό· πελάτες περιλαμβάνουν τις Apple, Adobe, General Motors και άλλες
Groovy
- Αναπτύχθηκε από τον James Strachan ξεκινώντας το 2003. Το έργο υιοθετήθηκε από το Apache το 2015.
- Στόχος ήταν η ανάπτυξη μιας δυναμικά τυποποιημένης γλώσσας στο JVM (σε αντίθεση με τη στατική τυποποίηση της Java) που θα μείωνε επίσης τον επαναλαμβανόμενο κώδικα
- Ενώ ο περισσότερος κώδικας Java είναι και έγκυρος κώδικας Groovy, υπάρχουν πολλές διαφορές (π.χ. η Groovy επιτρέπει δυναμική τυποποίηση και προηγμένο μεταπρογραμματισμό). Η γλώσσα επηρεάστηκε επίσης πολύ από την Python και τη Ruby.
- Χρησιμοποιείται για scripting, για εργαλεία build (Gradle), για συνεχή ενσωμάτωση (CI, π.χ. Jenkins), για διαδικτυακές εφαρμογές (Grails) και για δοκιμές (Spock). Ένα δημοφιλές πρόσθετο τρίτων για τα εργαλεία της Atlassian επιτρέπει scripting σε Groovy.
Lua
- Η Lua δημιουργήθηκε το 1993 από τους Roberto Lerusalimschy, Luiz Henrique de Figueiredo και Waldemar Celes στο Pontifical Catholic University of Rio de Janeiro, στη Βραζιλία.
- Το όνομα προφέρεται LOO-ah, που σημαίνει Σελήνη στα πορτογαλικά, και παραπέμπει στη γλώσσα Sol από την οποία εμπνεύστηκε εν μέρει, που σημαίνει "Ήλιος" στα πορτογαλικά
- Σχεδιάστηκε κυρίως για ενσωμάτωση, με έμφαση στην ταχύτητα, τη φορητότητα, την επεκτασιμότητα και την ευκολία χρήσης κατά την ανάπτυξη.
- Επηρεάστηκε από τις Modula, CLU, C++, SNOBOL και AWK. Όπως η LISP και η Scheme είχαν έναν μοναδικό, πανταχού παρόντα μηχανισμό δομών δεδομένων (τη λίστα), έτσι και η Lua το έχει αυτό με τον πίνακά της.
- Ερμηνεύεται μέσω bytecode, συνήθως κατά την εκτέλεση, αλλά μπορεί να γίνει και εκ των προτέρων.
- Χρησιμοποιείται κυρίως για scripting, π.χ. σε παιχνίδια όπως το World of Warcraft, το Dota 2 και το Crysis ή σε εφαρμογές όπως το Adobe Lightroom και ορισμένα συστήματα του FreeBSD. Χρησιμοποιείται επίσης πολύ για την προσθήκη επεκτασιμότητας, π.χ. στο Redis, το Neovim και το Nginx.
VimScript
- Η VimScript (επίσης γνωστή ως Vim Script, με κενό, ή VimL, από το Vim Language) είναι η γλώσσα σεναρίων που χρησιμοποιείται στον επεξεργαστή κειμένου Vim.
- Προέρχεται από το ex, τον προσανατολισμένο σε γραμμές οπτικό επεξεργαστή που προηγήθηκε του Vi
- Δεν είναι γλώσσα γενικού σκοπού, αλλά μια εξειδικευμένη γλώσσα που παρέχει ένα αποτελεσματικό και βελτιστοποιημένο περιβάλλον σεναρίων για την επέκταση και την προσαρμογή της λειτουργικότητας του Vim μέσω πρόσθετων, ρυθμίσεων, μακροεντολών και συναρτήσεων.
- Ενώ ο Vim είναι γραμμένος κυρίως σε C, η Vimscript επιτρέπει στους χρήστες να προσαρμόζουν και να επεκτείνουν τον Vim μέσω μιας γλώσσας σεναρίων υψηλού επιπέδου.
- Χρησιμοποιείται στον, λοιπόν, Vim, αλλά και στο NeoVim, ένα fork του Vim
Wren
- Γράφτηκε το 2016 από τον Bob Nystrom, συγγραφέα του βιβλίου Crafting Interpreters
- Στόχοι: μικρή, απλή, γρήγορη.
- Σχεδιάστηκε για να ενσωματώνεται σε άλλες εφαρμογές. Ο δημιουργός της έκρινε ανεπαρκείς τις υπάρχουσες επιλογές (όπως τη Lua και τη TCL) και ήθελε μια απλή, ενσωματώσιμη γλώσσα που θα έμοιαζε φυσική σε όσους έχουν αντικειμενοστρεφές υπόβαθρο
- Χρησιμοποιείται σε:
- TIC-80 - έναν fantasy υπολογιστή για τη δημιουργία, το παίξιμο και τον διαμοιρασμό μικροσκοπικών παιχνιδιών (παρόμοιο με το PICO8)
- DOME - ένα cross-platform framework για τη δημιουργία παιχνιδιών.
- luxe - μια cross-platform μηχανή παιχνιδιών για ταχεία ανάπτυξη.
- Wren Console - ένα REPL και ένα CLI για τη Wren, γραμμένο σε μεγάλο βαθμό στην ίδια τη Wren από τον Josh Goebel, επί χρόνια συνεισφέροντα στο Exercism, και το χρησιμοποιούμε για τη διαδρομή της Wren
Και από προγραμματιστική σκοπιά, πώς διαφέρουν;
ColdFusion
- Δυναμικά τυποποιημένη
- Πολυπαραδειγματική, κυρίως αντικειμενοστρεφής αλλά ολοένα και περισσότερο συναρτησιακή.
Groovy
- Συνήθως δυναμικά τυποποιημένη, αλλά μπορεί να είναι και στατικά (και βαθμιαία) τυποποιημένη
- Μπορεί να είναι και ερμηνευόμενη και μεταγλωττισμένη (από την έκδοση 2). Για αυτόν τον λόγο χρησιμοποιείται συχνά σε σενάρια
- Πολυπαραδειγματική: κυρίως αντικειμενοστρεφής, αλλά και προστακτική, συναρτησιακή, δηλωτική
Lua
- Δυναμικά τυποποιημένη και συνήθως ερμηνευόμενη, αλλά μπορεί να προ-μεταγλωττιστεί
- Πολυπαραδειγματική: διαδικαστική, αντικειμενοστρεφής (έστω και λίγο διαφορετικά), συναρτησιακή και καθοδηγούμενη από δεδομένα
VimScript
- Δυναμικά τυποποιημένη και ερμηνευόμενη
- Πολυπαραδειγματική: προστακτική, συναρτησιακή και μια απλή μορφή αντικειμενοστρεφούς προγραμματισμού
Wren
- Δυναμικά τυποποιημένη, αλλά στατικά ορισμένη· επιτρέπει στον μεταγλωττιστή να είναι πολύ γρήγορος.
- Κυρίως αντικειμενοστρεφής γλώσσα, αλλά και προστακτική, με λίγο συναρτησιακό προγραμματισμό
Τι κάνει αυτές τις γλώσσες σπουδαίες;
ColdFusion
- Εξαιρετικός διαχωρισμός μεταξύ διαχείρισης server και δημιουργίας εφαρμογών. Η κονσόλα διαχείρισης ρυθμίζει τις συνδέσεις βάσης δεδομένων και την παρακολούθηση του server (και οτιδήποτε άλλο), ενώ όσοι δημιουργούν εφαρμογές χρειάζονται μόνο το όνομα μιας πηγής δεδομένων (ένα αντικείμενο CF με τις απαραίτητες μεθόδους, προ-συνδεδεμένο στα κατάλληλα μέρη του DBMS), καθώς και δικαίωμα εγγραφής σε έναν κατάλογο για τα αρχεία της εφαρμογής.
- Αξιοποιεί τη δύναμη του JVM και του οικοσυστήματος της Java, που περιλαμβάνει τη δυνατότητα εισαγωγής οποιασδήποτε βιβλιοθήκης Java και χρήσης της μέσα στο CF
Groovy
- Γενικού σκοπού: μπορεί να χρησιμοποιηθεί για σχεδόν οποιονδήποτε φόρτο εργασίας, συμπεριλαμβανομένων εφαρμογών και ιστοτόπων.
- Επειδή τρέχει στο JVM, ισχύουν όλα τα πλεονεκτήματά του: ώριμη, εξαιρετικά αποδοτική εικονική μηχανή και τεράστιος αριθμός διαθέσιμων βιβλιοθηκών. Διαλειτουργεί καλά με τη Java
- Μετριάζει πολλά από τα προβλήματα που μπορεί να έχει κάποιος με τη Java, όπως οι ελεγχόμενες εξαιρέσεις,
- η ασφάλεια έναντι null, η πολυλογία και η έλλειψη προηγμένου μεταπρογραμματισμού
- Σύγχρονη γλώσσα: προηγμένη εξαγωγή τύπων, closures, ενσωματωμένη σύνταξη για κανονικές εκφράσεις, αυτόματη δημιουργία getters και setters
- Εξαιρετική υποστήριξη συναρτησιακού προγραμματισμού: closures (όπως τα blocks της Ruby), currying (μερική εφαρμογή), οκνηρή αξιολόγηση, αμεταβλητότητα και άλλα
Lua
- Γενικού σκοπού: χρησιμοποιείται σε ενσωματωμένα συστήματα, για prototyping, scripting, ανάπτυξη παιχνιδιών, διαδικτυακών εφαρμογών και backend
- Απλή: σχετικά λίγη σύνταξη, που κάνει τη γλώσσα εύκολη στην εκμάθηση. Μόνο μερικοί ατομικοί τύποι δεδομένων και ένας μόνο ενσωματωμένος σύνθετος τύπος δεδομένων: ο πίνακας. Η μνήμη διαχειρίζεται με garbage collection
- Φορητή: ο διερμηνευτής είναι γραμμένος σε ANSI C, για την οποία υπάρχει μεταγλωττιστής σχεδόν για κάθε πλατφόρμα
VimScript
- Απλή: ελαφριά σύνταξη που είναι εύκολη στην εκμάθηση και τη χρήση.
- Διαλειτουργικότητα: εύκολη πρόσβαση σε αρχεία, κελύφη και άλλα προγράμματα. Όλη η δύναμη των εξωτερικών εργαλείων χωρίς να φύγεις από τον Vim.
- Εκφραστική: κάνε πολλά με λίγα. Γράψε συμπαγή σενάρια που διαβάζονται εύκολα.
- Ισχυρή μηχανή κανονικών εκφράσεων: η υλοποίηση κανονικών εκφράσεων της Vimscript είναι εμπνευσμένη από αυτή της Emacs Lisp, παρέχοντας ένα ισχυρό εργαλείο για τον χειρισμό κειμένου.
Wren
- Μικρή: η εικονική μηχανή υλοποιείται σε λιγότερες από 4000 γραμμές κώδικα
- Υποδειγματική: η υλοποίηση της εικονικής μηχανής έχει σχόλια γραμμένα με αγάπη, είναι γραμμένη σε C και δεν είναι και τόσο δύσκολη στην ανάγνωση. Εξαιρετικός τρόπος να μάθεις πώς χτίζεται μια γλώσσα. Το μεγαλύτερο μέρος της βασικής βιβλιοθήκης είναι υλοποιημένο στη Wren, οπότε μπορείς να δεις και πώς υλοποιείται.
- Οικεία: η σύνταξη σε βοηθά να εξοικειωθείς πιο γρήγορα. Αν γνωρίζεις Java ή C++, θα νιώσεις σαν στο σπίτι σου. Επιτρέπει υπερφόρτωση μεθόδων με βάση τον αριθμό των ορισμάτων
- Πραγματικά καλή τεκμηρίωση: τα έγγραφα της γλώσσας και της βασικής βιβλιοθήκης είναι ευανάγνωστα, εκτενή και έχουν πολλά παραδείγματα.
- Μικρή αλλά εντυπωσιακά πλήρης βασική βιβλιοθήκη.
Ξεχωριστά χαρακτηριστικά
ColdFusion
- Τα πάντα ενσωματωμένα: ένα σωρό πράγματα είναι έτοιμα: εργασία με PDF, ZIP, Excel, XML, JSON, δημιουργία API, email, ενσωμάτωση με S3, πολλές διαφορετικές βάσεις δεδομένων… χωρίς να εγκαταστήσεις επιπλέον πακέτα. Ιδανικό για τη μείωση των ασυμβατοτήτων μεταξύ εκδόσεων
- Κλιμακώσιμη και ασφαλής, ιδανική για εταιρικό λογισμικό
- Απλός, διαισθητικός προγραμματισμός, που σημαίνει ότι οι αρχάριοι μπορούν να στήσουν πολύ γρήγορα σύνθετες, καθοδηγούμενες από δεδομένα ιστοσελίδες. Η ενσωμάτωση με το DreamWeaver είναι εξαιρετική.
Groovy
- Ευέλικτη σύνταξη: οι τελείες και οι παρενθέσεις μπορούν να παραλειφθούν, κάτι που επιτρέπει τη δημιουργία πολύ ωραίων γλωσσών ειδικού τομέα
- Μεταπρογραμματισμός: υποστηρίζει μεταπρογραμματισμό και κατά την εκτέλεση και κατά τη μεταγλώττιση. Για παράδειγμα, μια σημείωση @ToString θα δημιουργήσει μια υλοποίηση ToString κατά τη μεταγλώττιση, και αλλάζοντας τη μετακλάση ενός αντικειμένου κατά την εκτέλεση μπορείς να κάνεις monkey-patching.
- Builders: χειρίσου και χτίσε γρήγορα JSON, XML, HTML μέσω ευανάγνωστου κώδικα. Χτίσε με Swing για γρήγορη ανάπτυξη GUI.
- Traits: τα Traits της Groovy σου επιτρέπουν να συνθέτεις συμπεριφορές και ιδιότητες σε επαναχρησιμοποιήσιμα τμήματα. Παρόμοια με τα mixins της Ruby.
Lua
- Ενσωματώσιμη: σχεδιασμένη ώστε να ενσωματώνεται εύκολα. Έχει ένα σχετικά απλό API σε C που επιτρέπει την εύκολη ενσωμάτωση. Το μέγεθος δεν είναι πρόβλημα: ο πλήρης διερμηνευτής αναφοράς είναι μόλις 247 kB!
- Επεκτάσιμη: η βασική γλώσσα κρατιέται επίτηδες σχετικά μικρή, αλλά αυτό που επιτρέπει είναι η εύκολη επέκτασή της. Αυτό κάνει τη γλώσσα πιο απλή στην εκμάθηση, πιο ελαφριά στην ενσωμάτωση και πολύ ευέλικτη
- Γρήγορη: η Lua είναι συχνά μία από τις πιο γρήγορες δυναμικές γλώσσες, ειδικά όταν χρησιμοποιείς τον διερμηνευτή LuaJit
VimScript
- Επεκτασιμότητα: η Vimscript σου επιτρέπει να επεκτείνεις τον επεξεργαστή σου με νέες λειτουργίες
- Προσαρμόσιμη: προσάρμοσε τον επεξεργαστή σου ώστε να δουλεύει ακριβώς όπως θέλεις (τα ίδια τα πρόσθετα Vimscript είναι κατά κύριο λόγο γραμμένα σε Vimscript)
- Καθοδηγούμενη από γεγονότα: αυτόματη εκτέλεση κώδικα με βάση ορισμένα γεγονότα ή συνθήκες, όπως το άνοιγμα ενός αρχείου ή η αποθήκευση ενός buffer.
- Αξιοποίησε τη δύναμη του Vim: ενσωματωμένη πρόσβαση στις λειτουργίες και τα API του Vim, που επιτρέπει στα σενάρια να χειρίζονται κείμενο, buffers, παράθυρα και άλλα.
Wren
- Γρήγορη: εξαιρετικές επιδόσεις για μια δυναμική γλώσσα
- Ενσωματώσιμη: εύκολη ενσωμάτωση σε άλλο λογισμικό. Ο δημιουργός της γλώσσας ήταν πρώην προγραμματιστής παιχνιδιών: ήθελε να μπορεί να προσθέτει δυνατότητες scripting σε παιχνίδια. Το API σε C είναι αρκετά καθαρό και απλό.
- Ταυτόχρονη: εύκολος παραλληλισμός και coroutines με fibers, που είναι μια πολύ ελαφριά δομή (όπως τα goroutines ή οι διεργασίες της Erlang) και μπορούν να επικοινωνούν εύκολα μεταξύ τους
Ποια να επιλέξεις
- Αν θέλεις να φτιάξεις διαδικτυακές εφαρμογές, οι ColdFusion και Groovy είναι καλές επιλογές
- Αν σε ενδιαφέρει μια γλώσσα που μπορεί να ενσωματωθεί, οι Lua και Wren είναι οι βασικές επιλογές, αλλά και η Groovy μπορεί να αξίζει μια ματιά
- Οι ίδιες τρεις γλώσσες, Lua, Wren και Groovy, έχουν επίσης νόημα αν θέλεις να γράψεις σενάρια γενικού σκοπού
- Αν δουλεύεις με το JVM, οι ColdFusion και Groovy είναι φυσικές επιλογές
- Αν εκτιμάς τις επιδόσεις, οι Lua και Wren είναι πιθανότατα οι καλύτερες επιλογές σου
- Αν ο βασικός σου επεξεργαστής είναι ο Vim ή το NeoVim, η VimScript είναι προφανώς εξαιρετική επιλογή
- Αν σε ενδιαφέρει να μάθεις για μεταγλωττιστές και εικονικές μηχανές ή να φτιάξεις έναν, η Wren είναι ιδανική για σένα
- Αν έχεις αντικειμενοστρεφές υπόβαθρο, η Wren είναι πιθανώς η πιο εύκολη γλώσσα για να μάθεις
- Αν σου άρεσε ο μοναδικός, πανταχού παρών σχεδιασμός δομών δεδομένων της LISP, δοκίμασε τη Lua
- Αν θέλεις να δοκιμάσεις τον προγραμματισμό καθοδηγούμενο από γεγονότα, ρίξε μια ματιά στη VimScript