Προγραμματισμός

Για ποια είναι η καλή γλώσσα Go;

Κατά τη διάρκεια των εννέα και πλέον χρόνων στην άγρια ​​φύση, η γλώσσα Go της Google, γνωστή και ως Golang - με την έκδοση 1,13 από τον Σεπτέμβριο του 2019 - έχει εξελιχθεί από το να είναι μια περιέργεια για τους alpha geeks σε μια γλώσσα προγραμματισμού δοκιμασμένη από τη μάχη πίσω από μερικές από τις πιο σημαντικές στον κόσμο έργα με επίκεντρο το cloud.

Γιατί επιλέχθηκε το Go από τους προγραμματιστές έργων όπως το Docker και το Kubernetes; Ποια είναι τα καθοριστικά χαρακτηριστικά της Go, πώς διαφέρει από άλλες γλώσσες προγραμματισμού και τι είδους έργα είναι πιο κατάλληλα για κατασκευή; Σε αυτό το άρθρο, θα διερευνήσουμε το σύνολο δυνατοτήτων του Go, τις βέλτιστες περιπτώσεις χρήσης, τις παραλείψεις και τους περιορισμούς της γλώσσας και πού μπορεί να πηγαίνει το Go από εδώ.

Η γλώσσα Go είναι μικρή και απλή

Το Go, ή το Golang, όπως λέγεται συχνά, αναπτύχθηκε από υπαλλήλους της Google - κυρίως για μεγάλο χρονικό διάστημα ο γκουρού της Unix και ο διακεκριμένος μηχανικός της Google Rob Pike - αλλά δεν μιλά αυστηρά για ένα "έργο Google". Αντίθετα, το Go αναπτύσσεται ως έργο ανοιχτού κώδικα υπό την ηγεσία της κοινότητας, με επικεφαλής την ηγεσία που έχει ισχυρές απόψεις σχετικά με τον τρόπο χρήσης του Go και την κατεύθυνση που πρέπει να ακολουθήσει η γλώσσα.

Το Go προορίζεται να είναι απλό στη μάθηση, απλό στη συνεργασία και εύκολο να το διαβάσει από άλλους προγραμματιστές. Το Go δεν διαθέτει μεγάλο σύνολο λειτουργιών, ειδικά σε σύγκριση με γλώσσες όπως το C ++. Το Go θυμίζει C στη σύνταξή του, καθιστώντας σχετικά εύκολο για τους μακροχρόνιους προγραμματιστές C να μάθουν. Τούτου λεχθέντος, πολλά χαρακτηριστικά του Go, ειδικά τα χαρακτηριστικά ταυτότητας και λειτουργικού προγραμματισμού του, επαναφέρονται σε γλώσσες όπως η Erlang.

Ως γλώσσα τύπου C για τη δημιουργία και τη συντήρηση εταιρικών εφαρμογών πολλαπλών πλατφορμών όλων των ειδών, η Go έχει πολλά κοινά με την Java. Και ως μέσο για την ταχεία ανάπτυξη κώδικα που μπορεί να τρέχει οπουδήποτε, θα μπορούσατε να σχεδιάσετε έναν παράλληλο μεταξύ Go και Python, αν και οι διαφορές είναι πολύ μεγαλύτερες από τις ομοιότητες.

Η γλώσσα Go έχει κάτι για όλους

Η τεκμηρίωση Go περιγράφει το Go ως «μια γρήγορη, στατικά δακτυλογραφημένη, μεταγλωττισμένη γλώσσα που μοιάζει με μια δυναμικά δακτυλογραφημένη, ερμηνευμένη γλώσσα». Ακόμα και ένα μεγάλο πρόγραμμα Go θα μεταγλωττιστεί σε λίγα δευτερόλεπτα. Επιπλέον, το Go αποφεύγει μεγάλο μέρος των γενικών εξόδων του στυλ C, συμπεριλαμβανομένων αρχείων και βιβλιοθηκών.

Το Go διευκολύνει τη ζωή του προγραμματιστή με πολλούς τρόπους:

  • Ευκολία. Το Go έχει συγκριθεί με τις γλώσσες σεναρίου όπως η Python στην ικανότητά της να ικανοποιεί πολλές κοινές ανάγκες προγραμματισμού. Ορισμένες από αυτές τις λειτουργίες είναι ενσωματωμένες στην ίδια τη γλώσσα, όπως "goroutines" για παράλληλη συμπεριφορά και συμπεριφορά νήματος, ενώ επιπλέον δυνατότητες είναι διαθέσιμες σε στάνταρ πακέτα βιβλιοθηκών Go, όπως το πακέτο http του Go. Όπως η Python, το Go παρέχει δυνατότητες αυτόματης διαχείρισης μνήμης, συμπεριλαμβανομένης της συλλογής απορριμμάτων.

    Σε αντίθεση με τις γλώσσες δέσμης ενεργειών όπως το Python, ο κώδικας Go μεταγλωττίζεται σε ένα ταχέως εγγενές δυαδικό δυαδικό. Και σε αντίθεση με το C ή το C ++, η μεταγλώττιση του Go είναι εξαιρετικά γρήγορη - αρκετά γρήγορη για να κάνει την εργασία με το Go να μοιάζει περισσότερο με τη χρήση μιας γλώσσας σεναρίου παρά μιας μεταγλωττισμένης γλώσσας. Επιπλέον, το σύστημα κατασκευής Go είναι λιγότερο περίπλοκο από εκείνο άλλων μεταγλωττισμένων γλωσσών. Χρειάζονται λίγα βήματα και λίγη τήρηση βιβλίων για την κατασκευή και εκτέλεση ενός έργου Go.

  • Ταχύτητα. Τα δυαδικά αρχεία Go λειτουργούν πιο αργά από τα αντίστοιχα C, αλλά η διαφορά στην ταχύτητα είναι αμελητέα για τις περισσότερες εφαρμογές. Η απόδοση του Go είναι τόσο καλή όσο η C για τη συντριπτική πλειοψηφία της εργασίας και γενικά πολύ πιο γρήγορη από άλλες γλώσσες που είναι γνωστές για την ταχύτητα ανάπτυξης (π.χ. JavaScript, Python και Ruby).
  • Φορητότητα. Τα εκτελέσιμα που έχουν δημιουργηθεί με την αλυσίδα εργαλείων Go μπορούν να είναι ανεξάρτητα, χωρίς προεπιλεγμένες εξωτερικές εξαρτήσεις. Η αλυσίδα εργαλείων Go είναι διαθέσιμη για μια μεγάλη ποικιλία λειτουργικών συστημάτων και πλατφορμών υλικού και μπορεί να χρησιμοποιηθεί για τη συλλογή δυαδικών αρχείων σε διάφορες πλατφόρμες.
  • Διαλειτουργικότητα. Η Go παρέχει όλα τα παραπάνω χωρίς να θυσιάζει την πρόσβαση στο υποκείμενο σύστημα. Τα προγράμματα Go μπορούν να μιλούν σε εξωτερικές βιβλιοθήκες C ή να πραγματοποιούν κλήσεις εγγενών συστημάτων. Στο Docker, για παράδειγμα, πηγαίνετε διεπαφές με λειτουργίες Linux χαμηλού επιπέδου, ομαδοποιήσεις και χώρους ονομάτων, για να δουλέψετε το magic container.
  • Υποστήριξη. Η εργαλειοθήκη Go είναι ελεύθερα διαθέσιμη ως δυαδικό Linux, MacOS ή Windows ή ως κοντέινερ Docker. Το Go περιλαμβάνεται από προεπιλογή σε πολλές δημοφιλείς διανομές Linux, όπως το Red Hat Enterprise Linux και το Fedora, καθιστώντας κάπως πιο εύκολο να αναπτύξετε την πηγή Go σε αυτές τις πλατφόρμες. Η υποστήριξη για Go είναι επίσης ισχυρή σε πολλά περιβάλλοντα ανάπτυξης τρίτων, από τον κώδικα Microsoft Visual Studio έως το Komodo IDE του ActiveState.

Η γλώσσα Go λειτουργεί καλύτερα

Καμία γλώσσα δεν είναι κατάλληλη για κάθε εργασία, αλλά ορισμένες γλώσσες είναι κατάλληλες για περισσότερες εργασίες από άλλες.

Το Go λάμπει φωτεινότερα για την ανάπτυξη των ακόλουθων τύπων εφαρμογών:

  • Κατανεμημένες δικτυακές υπηρεσίες.Οι εφαρμογές δικτύου ζουν και πεθαίνουν από ταυτόχρονη χρήση και οι εγγενείς λειτουργίες ταυτόχρονης Go - γοροτίνες και κανάλια, κυρίως - είναι κατάλληλες για τέτοια εργασία. Κατά συνέπεια, πολλά έργα Go προορίζονται για τη δικτύωση, τις κατανεμημένες λειτουργίες και τις υπηρεσίες cloud: API, διακομιστές ιστού, ελάχιστα πλαίσια για εφαρμογές ιστού και παρόμοια.
  • Ανάπτυξη φυσικού νέφους.Τα χαρακτηριστικά ταυτότητας και δικτύωσης του Go, καθώς και ο υψηλός βαθμός φορητότητάς του, το καθιστούν κατάλληλο για τη δημιουργία εφαρμογών εγγενών cloud. Στην πραγματικότητα, το Go χρησιμοποιήθηκε για την κατασκευή αρκετών ακρογωνιαίων λίθων υπολογιστών που είναι εγγενείς στο cloud, συμπεριλαμβανομένων των Docker, Kubernetes και Istio.
  • Αντικαταστάσεις για υπάρχουσα υποδομή.Μεγάλο μέρος του λογισμικού στο οποίο βασίζουμε για την υποδομή του Διαδικτύου είναι γήρανση και εκτελείται με εκμεταλλεύσεις. Η επανεγγραφή τέτοιων πραγμάτων στο Go παρέχει πολλά πλεονεκτήματα - καλύτερη ασφάλεια μνήμης, ευκολότερη ανάπτυξη μεταξύ πλατφορμών και καθαρή βάση κώδικα για την προώθηση μελλοντικής συντήρησης. Ένας νέος διακομιστής SSH που ονομάζεται Teleport και μια νέα έκδοση του Network Time Protocol γράφονται στο Go και προσφέρονται ως αντικαταστάσεις για τους συμβατικούς ομολόγους τους.
  • Βοηθητικά προγράμματα και αυτόνομα εργαλεία.Τα προγράμματα Go μεταγλωττίζονται σε δυαδικά αρχεία με ελάχιστες εξωτερικές εξαρτήσεις. Αυτό τα καθιστά ιδανικά κατάλληλα για τη δημιουργία βοηθητικών προγραμμάτων και άλλων εργαλείων, επειδή ξεκινούν γρήγορα και μπορούν να συσκευαστούν εύκολα για αναδιανομή.

Περιορισμοί γλώσσας Go

Το σύνολο των χαρακτηριστικών του Go έχει δώσει έπαινο και κριτική. Το Go έχει σχεδιαστεί για να είναι λάθος από την πλευρά του ότι είναι μικρό και εύκολο στην κατανόηση, με ορισμένα χαρακτηριστικά που παραλείπονται σκόπιμα. Το αποτέλεσμα είναι ότι ορισμένες λειτουργίες που είναι κοινές σε άλλες γλώσσες απλώς δεν είναι διαθέσιμες στο Go - επίτηδες.

Ένα τέτοιο χαρακτηριστικό είναι τα γενικά, τα οποία επιτρέπουν σε μια συνάρτηση να δέχεται πολλούς διαφορετικούς τύπους μεταβλητών. Το Go δεν περιλαμβάνει γενικά και οι υπεύθυνοι της γλώσσας είναι αντίθετοι με την προσθήκη τους, με την προϋπόθεση ότι τα γενικά θα διακυβεύσουν την απλότητα της γλώσσας. Είναι πιθανό να επιλύσετε αυτόν τον περιορισμό, αλλά πολλοί προγραμματιστές εξακολουθούν να φαίνονται να βλέπουν κάποια γενικά να έχουν προστεθεί στο Go με κάποιο τρόπο. Έχει τεθεί τουλάχιστον μία πρόταση για την εφαρμογή γενικών στο Go, αλλά τίποτα δεν έχει τεθεί σε πέτρα.

Ένα άλλο μειονέκτημα στο Go είναι το μέγεθος των δυαδικών αρχείων που δημιουργούνται. Τα δυαδικά αρχεία Go καταρτίζονται στατικά από προεπιλογή, πράγμα που σημαίνει ότι όλα όσα χρειάζονται κατά το χρόνο εκτέλεσης περιλαμβάνονται στη δυαδική εικόνα. Αυτή η προσέγγιση απλοποιεί τη διαδικασία κατασκευής και ανάπτυξης, αλλά με κόστος ένα απλό "Γεια, κόσμος!" ζυγίζει περίπου 1,5MB σε Windows 64-bit. Η ομάδα Go εργάζεται για να μειώσει το μέγεθος αυτών των δυαδικών αρχείων με κάθε διαδοχική κυκλοφορία. Είναι επίσης δυνατό να συρρικνωθούν τα δυαδικά αρχεία Go με συμπίεση ή αφαιρώντας τις πληροφορίες εντοπισμού σφαλμάτων του Go. Αυτή η τελευταία επιλογή μπορεί να λειτουργήσει καλύτερα για αυτόνομες κατανεμημένες εφαρμογές από ό, τι για υπηρεσίες cloud ή δικτύου, όπου η ύπαρξη πληροφοριών εντοπισμού σφαλμάτων είναι χρήσιμη εάν μια υπηρεσία αποτύχει.

Ένα ακόμη χαρακτηριστικό γνώρισμα του Go, η αυτόματη διαχείριση μνήμης, μπορεί να θεωρηθεί μειονέκτημα, καθώς η συλλογή απορριμμάτων απαιτεί ένα ορισμένο ποσό επεξεργασίας. Σχετικά με το σχεδιασμό, η Go δεν παρέχει μη αυτόματη διαχείριση μνήμης και η συλλογή απορριμμάτων στο Go έχει επικριθεί για το ότι δεν ασχολείται καλά με τα είδη φορτίων μνήμης που εμφανίζονται σε εταιρικές εφαρμογές. Από τη θετική πλευρά, το Go 1.8 προσφέρει πολλές βελτιώσεις στη διαχείριση μνήμης και τη συλλογή απορριμμάτων που μειώνουν τον χρόνο καθυστέρησης. Φυσικά, οι προγραμματιστές Go έχουν τη δυνατότητα να χρησιμοποιούν μη αυτόματη κατανομή μνήμης σε επέκταση C ή μέσω βιβλιοθήκης μη αυτόματης διαχείρισης μνήμης τρίτου μέρους.

Η κουλτούρα του λογισμικού γύρω από τη δημιουργία πλούσιων GUI για εφαρμογές Go, όπως αυτές σε εφαρμογές επιτραπέζιων υπολογιστών, εξακολουθεί να είναι διασκορπισμένη.

Οι περισσότερες εφαρμογές Go είναι εργαλεία γραμμής εντολών ή υπηρεσίες δικτύου. Τούτου λεχθέντος, διάφορα έργα εργάζονται για να φέρουν πλούσια GUI για εφαρμογές Go. Υπάρχουν δεσμεύσεις για τα πλαίσια GTK και GTK3. Ένα άλλο έργο προορίζεται να παρέχει UI εγγενείς σε πλατφόρμες, αν και βασίζονται σε δεσμεύσεις C και δεν είναι γραμμένες σε καθαρό Go. Και οι χρήστες των Windows μπορούν να δοκιμάσουν το περπάτημα. Ωστόσο, δεν έχει εμφανιστεί σαφής νικητής ή ασφαλές μακροπρόθεσμο στοίχημα σε αυτό το χώρο, και ορισμένα έργα, όπως μια προσπάθεια της Google να δημιουργήσει μια βιβλιοθήκη GUI πολλαπλών πλατφορμών, δεν έχουν περάσει από το δρόμο. Επίσης, επειδή το Go είναι ανεξάρτητο από την πλατφόρμα από τη σχεδίαση, είναι απίθανο οποιοδήποτε από αυτά να γίνει μέρος του τυπικού συνόλου πακέτων.

Παρόλο που η Go μπορεί να μιλήσει σε λειτουργίες του εγγενούς συστήματος, δεν έχει σχεδιαστεί για τη δημιουργία εξαρτημάτων συστήματος χαμηλού επιπέδου, όπως πυρήνες ή προγράμματα οδήγησης συσκευών ή ενσωματωμένα συστήματα. Σε τελική ανάλυση, ο χρόνος εκτέλεσης Go και ο συλλέκτης απορριμμάτων για εφαρμογές Go εξαρτώνται από το υποκείμενο λειτουργικό σύστημα. (Οι προγραμματιστές που ενδιαφέρονται για μια πρωτοποριακή γλώσσα για αυτό το είδος εργασίας μπορεί να εξετάσουν τη γλώσσα Rust.)

Πηγαίνετε μελλοντικά γλώσσας

Η επόμενη φάση της ανάπτυξης του Go μπορεί κάλλιστα να καθοδηγείται περισσότερο από τις επιθυμίες και τις ανάγκες της βάσης προγραμματιστών της, με το μυαλό της Go να αλλάζει τη γλώσσα για να φιλοξενήσει καλύτερα αυτό το κοινό, και όχι απλώς να οδηγεί σε πεισματικό παράδειγμα. Με άλλα λόγια, το Go μπορεί να αποκτήσει τα χαρακτηριστικά που αρχικά δεν προορίζονταν για αυτό, όπως τα γενόσημα.

Είναι σαφές ότι οι προγραμματιστές του Golang θέλουν αυτά τα πράγματα. Η έρευνα χρηστών του 2018 Go έθεσε τα γενικά μεταξύ των κορυφαίων τριών προκλήσεων στον τρόπο ευρύτερης υιοθέτησης Go, μαζί με καλύτερη εξάρτηση και διαχείριση πακέτων. Και μια υπάρχουσα πρόταση στο GitHub για γενικά παραμένει ενεργή ως πρόταση για το Go 2.x. Αλλαγές όπως αυτές μπορεί να βοηθήσουν το Go να αποκτήσει μια πιο κεντρική θέση στην ανάπτυξη της επιχείρησης, όπου η Java, η JavaScript και η Python κυριαρχούν σήμερα.

Ακόμη και χωρίς σημαντικές αλλαγές, μπορούμε να αναμένουμε αυξημένη χρήση του Go για έργα ανακατασκευής υποδομής, σύμφωνα με τις αντικαταστάσεις για SSH και NTP που περιγράφονται παραπάνω, και ως μέρος πολυγλωσσικών έργων.

Οι υλοποιήσεις τρίτων μερών της εργαλειοθήκης Go έχουν επίσης πολλαπλασιαστεί. Το ActiveGo του ActiveState παρέχει μια εμπορικά υποστηριζόμενη έκδοση της γλώσσας Go, και τα έργα LLVM και gccgo παρέχουν υλοποιήσεις ανοιχτού κώδικα με άδεια χρήσης Go μέσω εναλλακτικών εργαλειοθηκών.

Τέλος, το Go χρησίμευσε επίσης ως βάση για την ανάπτυξη εντελώς νέων γλωσσών, αν και δύο παραδείγματα αυτού έχουν σταματήσει την ενεργό ανάπτυξη. Ένα παράδειγμα ήταν η γλώσσα Have, η οποία βελτιστοποίησε τη σύνταξη Go, εφάρμοσε μερικές από τις ίδιες έννοιες με τον δικό της τρόπο και μεταφέρθηκε στο Go για εύκολη εκτέλεση. Ένα άλλο ανενεργό έργο, ο Oden, χρησιμοποίησε το συναρμολογητή και την αλυσίδα εργαλείων της Go για να συντάξει μια νέα σχεδιασμένη γλώσσα που πήρε επιπλέον έμπνευση από γλώσσες όπως οι Lisp και Haskell.

Αυτό το τελευταίο σύνολο έργων απεικονίζει έναν από τους τρόπους με τους οποίους οποιαδήποτε καινοτομία πληροφορικής γίνεται πραγματικά επαναστατική - όταν οι άνθρωποι την ξεχωρίζουν και την επαναχρησιμοποιούν, βρίσκοντας χρήσεις που οι σχεδιαστές της δεν σκόπευαν ποτέ. Το μέλλον της γλώσσας Go ως έργο με δυνατότητα hackable μόλις ξεκινά. Αλλά το μέλλον του ως μια μεγάλη γλώσσα προγραμματισμού είναι ήδη εξασφαλισμένο, σίγουρα στο cloud, όπου η ταχύτητα και η απλότητα του Go διευκολύνουν την ανάπτυξη κλιμακούμενης υποδομής που μπορεί να διατηρηθεί μακροπρόθεσμα.