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

Τι είναι η Τζούλια; Μια νέα προσέγγιση στον αριθμητικό υπολογισμό

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

Στην ανάρτηση ιστολογίου που ανακοίνωσε την αρχική κυκλοφορία της Τζούλια το 2012, οι συγγραφείς της γλώσσας - Jeff Bezanson, Stefan Karpinski, Viral Shah και Alan Edelman - δήλωσαν ότι πέρασαν τρία χρόνια δημιουργώντας τη Julia επειδή ήταν άπληστος. Ήταν κουρασμένοι από τις ανταλλαγές μεταξύ Matlab, Lisp, Python, Ruby, Perl, Mathematica, R και C και ήθελαν μια μόνο γλώσσα που θα ήταν καλή για επιστημονική πληροφορική, μηχανική μάθηση, εξόρυξη δεδομένων, γραμμική άλγεβρα μεγάλης κλίμακας , παράλληλος υπολογισμός και κατανεμημένος υπολογισμός.

Για ποιον είναι η Τζούλια; Εκτός από το ότι είναι ελκυστικό για ερευνητές και μηχανικούς, η Julia είναι επίσης ελκυστική για επιστήμονες δεδομένων και οικονομικούς αναλυτές και ποσοτικά.

Οι σχεδιαστές της γλώσσας και δύο άλλοι ίδρυσαν τον Julia Computing τον Ιούλιο του 2015 για να «αναπτύξουν προϊόντα που κάνουν τη Julia εύχρηστη, εύκολη στην ανάπτυξη και εύκολη κλιμάκωση». Από αυτή τη συγγραφή, η εταιρεία έχει προσωπικό 28 ατόμων και πελάτες που κυμαίνονται από εθνικά εργαστήρια έως τράπεζες έως οικονομολόγους έως αυτόνομους ερευνητές οχημάτων. Εκτός από τη διατήρηση των αποθετηρίων ανοιχτού κώδικα της Julia στο GitHub, η Julia Computing προσφέρει εμπορικά προϊόντα, συμπεριλαμβανομένου του JuliaPro, το οποίο διατίθεται σε δωρεάν και επί πληρωμή εκδόσεις.

Γιατί η Τζούλια;

Η Julia «στοχεύει να δημιουργήσει έναν άνευ προηγουμένου συνδυασμό ευκολίας χρήσης, ισχύος και αποτελεσματικότητας σε μία μόνο γλώσσα». Για το ζήτημα της αποδοτικότητας, εξετάστε το παρακάτω γράφημα:

Τζούλια Πληροφορική

Σημεία αναφοράς της Τζούλια

Αυτό που βλέπουμε εδώ είναι ότι ο κωδικός Julia μπορεί να είναι ταχύτερος από το C για μερικά είδη λειτουργιών και όχι περισσότερο από μερικές φορές πιο αργός από το C για άλλους. Συγκρίνετε αυτό με, για παράδειγμα, το R, το οποίο μπορεί να είναι σχεδόν 1.000 φορές πιο αργό από το C για ορισμένες λειτουργίες.

Σημειώστε ότι ένα από τα πιο αργά τεστ για τη Julia είναι η αναδρομή Fibonacci. αυτό οφείλεται στο γεγονός ότι η Julia δεν διαθέτει βελτιστοποίηση αναδρομής ουράς. Η αναδρομή είναι εγγενώς πιο αργή από το βρόχο. Για πραγματικά προγράμματα Julia που θέλετε να εκτελέσετε στην παραγωγή, θα θέλετε να εφαρμόσετε τη μορφή βρόχου (επανάληψη) τέτοιων αλγορίθμων.

Συλλογή Julia JIT

Υπάρχει ένα κόστος για την προσέγγιση μεταγλωττιστή JIT (just-in-time) σε αντίθεση με έναν καθαρό διερμηνέα: Ο μεταγλωττιστής πρέπει να αναλύσει τον πηγαίο κώδικα και να δημιουργήσει τον κώδικα του μηχανήματος πριν να εκτελεστεί ο κώδικάς σας. Αυτό μπορεί να σημαίνει μια αξιοσημείωτη ώρα εκκίνησης για τα προγράμματα της Julia την πρώτη φορά που κάθε συνάρτηση και μακροεντολή εκτελείται σε μια συνεδρία. Έτσι, στο παρακάτω στιγμιότυπο οθόνης, βλέπουμε ότι τη δεύτερη φορά που δημιουργούμε έναν εκατομμύριο τυχαίους αριθμούς κυμαινόμενου σημείου, ο χρόνος που απαιτείται είναι μια τάξη μεγέθους μικρότερη από την πρώτη εκτέλεση. Και τα δύο @χρόνος μακροεντολή και το άκρα() Η συνάρτηση έπρεπε να καταρτιστεί την πρώτη φορά μέσω του κώδικα, επειδή οι βιβλιοθήκες Julia είναι γραμμένες στη Julia.

julia> @time rand (10 ^ 6);

0,62081 δευτερόλεπτα (κατανομές 14,44 k: 8,415 MiB)

julia> @time rand (10 ^ 6);

0,004881 δευτερόλεπτα (7 κατανομές: 7,630 MiB)

Οι οπαδοί της Julia ισχυρίζονται, με διαφορετικό τρόπο, ότι έχει την ευκολία χρήσης των Python, R ή ακόμα και του Matlab. Αυτές οι συγκρίσεις ελέγχονται, καθώς η γλώσσα της Julia είναι κομψή, ισχυρή και προσανατολισμένη προς την επιστημονική πληροφορική και οι βιβλιοθήκες παρέχουν ένα ευρύ φάσμα προηγμένων λειτουργιών προγραμματισμού.

Τζούλια παράδειγμα

Ως ένα γρήγορο παράδειγμα γλώσσας Julia, σκεφτείτε τον ακόλουθο κωδικό αναφοράς Mandelbrot.

Όπως μπορείτε να δείτε, η αριθμητική του σύνθετου αριθμού είναι ενσωματωμένη στη γλώσσα, όπως και οι μακροεντολές για δοκιμές και συγχρονισμό. Όπως μπορείτε επίσης να δείτε, τα πίσω ερωτηματικά που μαστίζουν γλώσσες τύπου C και οι ένθετες παρενθέσεις που μαστίζουν γλώσσες τύπου Λισπ, απουσιάζουν από την Τζούλια. Σημειώστε ότι μαντελπερφ () καλείται δύο φορές, στις γραμμές 61 και 62. Η πρώτη κλήση ελέγχει το αποτέλεσμα για την ορθότητα και κάνει τη συλλογή JIT. η δεύτερη κλήση παίρνει το χρονοδιάγραμμα.

Προγραμματισμός της Τζούλια

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

Για ένα άλλο, η ενσωματωμένη διαμόρφωση κώδικα της Julia σημαίνει ότι δεν υπάρχει ανάγκη για προγραμματιστή ο διανυσματικός κώδικας για απόδοση. ο συνηθισμένος αποκωδικοποιημένος κώδικας είναι γρήγορος. Ο μεταγλωττιστής μπορεί να επωφεληθεί από τις οδηγίες SIMD και τους καταχωρητές, εάν υπάρχουν στην υποκείμενη CPU, και να ξετυλίξει τους βρόχους σε μια διαδοχική διαδικασία για να τους φορέσει όσο το επιτρέπει το υλικό. Μπορείτε να επισημάνετε τους βρόχους ως vectorizable με το @simd σχόλιο.

Τζούλια παραλληλισμός

Η Julia σχεδιάστηκε επίσης για παραλληλισμό και κατανεμημένο υπολογισμό, χρησιμοποιώντας δύο πρωτόγονα: απομακρυσμένες αναφορές και απομακρυσμένες κλήσεις. Οι απομακρυσμένες αναφορές διατίθενται σε δύο γεύσεις:Μελλοντικός καιΑπομακρυσμένο κανάλι. ΕΝΑ Μελλοντικός είναι το ισοδύναμο ενός JavaScript υπόσχεση; ένα Απομακρυσμένο κανάλι είναι επανεγγράψιμο και μπορεί να χρησιμοποιηθεί για επικοινωνία μεταξύ διεργασιών, όπως ένα Unix σωλήνας ή Go Κανάλι. Υποθέτοντας ότι έχετε ξεκινήσει τη Julia με πολλές διαδικασίες (π.χ. julia -p 8 για οκτώ πυρήνες CPU, όπως Intel Core i7), μπορείτε @ώα ψαριών ή απομακρυσμένη κλήση () Λειτουργία κλήσεις για εκτέλεση σε άλλη διαδικασία Julia ασύγχρονα και αργότερα φέρω() ο Μελλοντικός επέστρεψε όταν θέλετε να συγχρονίσετε και να χρησιμοποιήσετε το αποτέλεσμα.

Εάν δεν χρειάζεται να τρέχετε σε πολλούς πυρήνες, μπορείτε να χρησιμοποιήσετε ελαφρύ «πράσινο» σπείρωμα, που ονομάζεται α Εργο() στην Τζούλια και μια κορουτίνα σε ορισμένες άλλες γλώσσες. ΕΝΑ Εργο() ή @έργο λειτουργεί σε συνδυασμό με ένα Κανάλι, η οποία είναι η έκδοση μιας διαδικασίας του Απομακρυσμένο κανάλι.

Σύστημα τύπου Julia

Η Julia έχει ένα διακριτικό αλλά ισχυρό σύστημα τύπου που είναι δυναμικό με προεπιλογή τύπου χρόνου εκτέλεσης, αλλά επιτρέπει προαιρετικούς σχολιασμούς τύπου. Αυτό είναι παρόμοιο με το TypeScript. Για παράδειγμα:

julia> (1 + 2) :: AbstractFloat

ΣΦΑΛΜΑ: TypeError: typeassert: Αναμένεται AbstractFloat, πήρε Int64

julia> (1 + 2) :: Int

3

Εδώ ισχυριζόμαστε έναν ασύμβατο τύπο την πρώτη φορά, προκαλώντας ένα σφάλμα και έναν συμβατό τύπο τη δεύτερη φορά.

Τζούλια χορδές

Η Julia έχει αποτελεσματική υποστήριξη για συμβολοσειρές και χαρακτήρες Unicode, αποθηκευμένες σε μορφή UTF-8, καθώς και αποτελεσματική υποστήριξη για χαρακτήρες ASCII, καθώς στο UTF-8 τα σημεία κωδικού είναι μικρότερα από 0x80 (128) κωδικοποιούνται σε έναν μόνο χαρακτήρα. Διαφορετικά, το UTF-8 είναι κωδικοποίηση μεταβλητού μήκους, επομένως δεν μπορείτε να υποθέσετε ότι το μήκος μιας συμβολοσειράς Julia είναι ίσο με το τελευταίο ευρετήριο χαρακτήρων.

Η πλήρης υποστήριξη για το UTF-8 σημαίνει, μεταξύ άλλων, ότι μπορείτε εύκολα να ορίσετε μεταβλητές χρησιμοποιώντας ελληνικά γράμματα, τα οποία μπορούν να κάνουν τον επιστημονικό κώδικα Julia να μοιάζει πολύ με τις εξηγήσεις του εγχειριδίου των τύπων, π.χ. αμαρτία (2π). ΕΝΑ transcode () παρέχεται λειτουργία για τη μετατροπή UTF-8 σε και από άλλες κωδικοποιήσεις Unicode.

Λειτουργίες C και Fortran

Η Julia μπορεί να καλέσει απευθείας τις συναρτήσεις C και Fortran, χωρίς περιτυλίγματα ή ειδικά API που απαιτούνται, αν και πρέπει να γνωρίζετε το όνομα "διακοσμημένο" που εκπέμπεται από τον μεταγλωττιστή Fortran. Η εξωτερική συνάρτηση C ή Fortran πρέπει να βρίσκεται σε κοινόχρηστη βιβλιοθήκη. χρησιμοποιείτε το Julia ccall () λειτουργία για την πραγματική κλήση. Για παράδειγμα, σε ένα σύστημα τύπου Unix μπορείτε να χρησιμοποιήσετε αυτόν τον κωδικό Julia για να λάβετε την τιμή μιας μεταβλητής περιβάλλοντος χρησιμοποιώντας το getenv συνάρτηση στο libc:

συνάρτηση getenv (var :: AbstractString)

val = ccall ((: getenv, "libc"),

Cstring, (Cstring,), var)

αν val == C_NULL

σφάλμα ("getenv: undefined variable:", var)

τέλος

μη ασφαλής χορδή (val)

τέλος

julia> getenv ("SHELL")

"/ bin / bash"

Μακροεντολές της Τζούλια

Η Julia έχει μακροεντολές τύπου Lisp, όπως διακρίνεται από τους μακροπροεπεξεργαστές που χρησιμοποιούνται από τα C και C ++. Η Julia διαθέτει επίσης άλλες εγκαταστάσεις μετα-προγραμματισμού, όπως αντανάκλαση, δημιουργία κώδικα, σύμβολο (π.χ. : φουο) και έκφραση (π.χ. : (a + b * c + 1) ) αντικείμενα, eval ()και δημιουργήθηκαν συναρτήσεις. Οι μακροεντολές της Julia αξιολογούνται κατά τον χρόνο ανάλυσης.

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

Υποστήριξη GPU

Η Julia έχει υποστήριξη GPU χρησιμοποιώντας, μεταξύ άλλων, το πακέτο βαθιάς μάθησης MXNet, τη βιβλιοθήκη ArrayFire GPU array, τις βιβλιοθήκες γραμμικής άλγεβρας cuBLAS και cuDNN και βιβλιοθήκες βαθύ νευρωνικού δικτύου και το πλαίσιο CUDA για υπολογιστές GPU γενικής χρήσης. Τα περιτυλίγματα Julia και οι αντίστοιχες βιβλιοθήκες τους φαίνονται στο παρακάτω διάγραμμα.

Τζούλια Πληροφορική

JuliaPro και Juno IDE

Μπορείτε να κατεβάσετε τη δωρεάν γραμμή εντολών ανοιχτού κώδικα Julia για Windows, MacOS, γενικό Linux ή γενικό FreeBSD από τον ιστότοπο της γλώσσας Julia. Μπορείτε να κλωνοποιήσετε το αποθετήριο πηγαίου κώδικα Julia από το GitHub.

Εναλλακτικά μπορείτε να κατεβάσετε το JuliaPro από το Julia Computing. Εκτός από τον μεταγλωττιστή, το JuliaPro σας παρέχει το Juno IDE που βασίζεται στο Atom (φαίνεται παρακάτω) και περισσότερα από 160 πακέτα επιμέλειας, συμπεριλαμβανομένης της οπτικοποίησης και της σχεδίασης.

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

Σημειωματάρια Jupyter και IJulia

Εκτός από τη χρήση του Juno ως Julia IDE, μπορείτε να χρησιμοποιήσετε το Visual Studio Code με την επέκταση Julia (φαίνεται απευθείας παρακάτω) και τα σημειωματάρια Jupyter με τον πυρήνα IJulia (εμφανίζονται στο δεύτερο και τρίτο στιγμιότυπο οθόνης παρακάτω). Ίσως χρειαστεί να εγκαταστήσετε φορητούς υπολογιστές Jupyter για Python 2 ή (κατά προτίμηση) Python 3 με Anaconda ή pip.

JuliaBox

Μπορείτε να εκτελέσετε το Julia σε φορητούς υπολογιστές Jupyter online χρησιμοποιώντας το JuliaBox (φαίνεται παρακάτω), ένα άλλο προϊόν της Julia Computing, χωρίς να κάνετε καμία εγκατάσταση στον τοπικό υπολογιστή σας. Το JuliaBox περιλαμβάνει επί του παρόντος περισσότερα από 300 πακέτα, εκτελεί το Julia 0.6.2 και περιέχει δεκάδες φορητούς υπολογιστές Jupyter. Η λίστα ανώτατου επιπέδου φακέλων φροντιστηρίου εμφανίζεται παρακάτω. Το δωρεάν επίπεδο πρόσβασης στο JuliaBox σας δίνει 90 λεπτά συνεδρίες με τρεις πυρήνες CPU. Η προσωπική συνδρομή 14 $ ανά μήνα σάς παρέχει τετράωρες συνεδρίες με πέντε πυρήνες. και η συνδρομή 70 $ ανά μήνα σας παρέχει οκτώ ώρες συνεδρίες με 32 πυρήνες. Η πρόσβαση GPU δεν είναι ακόμη διαθέσιμη από τον Ιούνιο του 2018.

Πακέτα της Τζούλια

Η Τζούλια «περπατάει σαν τον Πύθωνα, αλλά τρέχει σαν τον Γ.» Όπως έγραψε ο συνάδελφός μου Serdar Yegulalp τον Δεκέμβριο του 2017, η Julia αρχίζει να προκαλεί την Python για προγραμματισμό της επιστήμης δεδομένων και και οι δύο γλώσσες έχουν πλεονεκτήματα. Ως ένδειξη της ταχέως ωριμάζουσας υποστήριξης για την επιστήμη δεδομένων στη Julia, θεωρήστε ότι υπάρχουν ήδη δύο βιβλία με τίτλο Τζούλια για την Επιστήμη των Δεδομένων, το ένα από τον Ζαχαρία Βούλγαρη, και το άλλο από τον Anshul Joshi, αν και δεν μπορώ να μιλήσω για την ποιότητα των δύο.

Αν δείτε τα συνολικά πακέτα Julia με την υψηλότερη βαθμολογία από τον Julia Observer, που φαίνεται παρακάτω, θα δείτε έναν πυρήνα Julia για φορητούς υπολογιστές Jupyter, το πακέτο γραφικών Gadfly (παρόμοιο με ggplot2 σε R), μια γενική διεπαφή σχεδίασης, πολλά πακέτα βαθιάς μάθησης και μηχανικής μάθησης, λύσεις διαφορικής εξίσωσης, DataFrames, μοντέλα δυναμικής στοχαστικής γενικής ισορροπίας (DSGE) της Νέας Υόρκης, μια γλώσσα μοντελοποίησης βελτιστοποίησης και διασυνδέσεις με Python και C ++. Αν προχωρήσετε λίγο πιο κάτω από αυτήν τη γενική λίστα, θα βρείτε επίσης QuantEcon, PyPlot, ScikitLearn, ένα πακέτο βιοπληροφορικής και μια εφαρμογή τεμπέλης λιστών για λειτουργικό προγραμματισμό.

Εάν τα πακέτα Julia δεν επαρκούν για τις ανάγκες σας και η διεπαφή Python δεν σας φέρνει εκεί που θέλετε να πάτε, μπορείτε επίσης να εγκαταστήσετε ένα πακέτο που σας παρέχει γενικές διεπαφές σε R (RCall) και Matlab.

Τζούλια για οικονομικούς αναλυτές και ποσοστά

Οι Quants και οι οικονομικοί αναλυτές θα βρουν πολλά δωρεάν πακέτα για να επιταχύνουν τη δουλειά τους, όπως φαίνεται στο παρακάτω στιγμιότυπο οθόνης. Επιπλέον, η Julia Computing προσφέρει τη σουίτα JuliaFin, που αποτελείται από Μίλητος (DSL για χρηματοοικονομικές συμβάσεις),JuliaDB (βάση δεδομένων υψηλής απόδοσης στη μνήμη και κατανεμημένη),JuliaInXL (καλέστε τη Julia από φύλλα Excel) καιBloomberg συνδεσιμότητα (πρόσβαση σε δεδομένα αγοράς σε πραγματικό χρόνο και ιστορικό).