Διαθέσιμη γλώσσα προγραμματισμού Julia 1.9

Δημοσιεύτηκε η έκδοση της γλώσσας προγραμματισμού Julia 1.9, η οποία συνδυάζει ιδιότητες όπως υψηλή απόδοση, υποστήριξη για δυναμική πληκτρολόγηση και ενσωματωμένα εργαλεία για παράλληλο προγραμματισμό. Η σύνταξη της Julia είναι κοντά στο MATLAB, δανειζόμενος κάποια στοιχεία από τους Ruby και Lisp. Η μέθοδος χειρισμού χορδών θυμίζει Perl. Ο κωδικός του έργου διανέμεται με την άδεια MIT.

Βασικά χαρακτηριστικά της γλώσσας:

  • Υψηλή απόδοση: ένας από τους βασικούς στόχους του έργου είναι η επίτευξη απόδοσης κοντά στα προγράμματα C. Ο μεταγλωττιστής Julia βασίζεται στην εργασία του έργου LLVM και δημιουργεί αποτελεσματικό εγγενή κώδικα μηχανής για πολλές πλατφόρμες-στόχους.
  • Υποστηρίζει διάφορα παραδείγματα προγραμματισμού, συμπεριλαμβανομένων στοιχείων αντικειμενοστρεφούς και λειτουργικού προγραμματισμού. Η τυπική βιβλιοθήκη παρέχει, μεταξύ άλλων, λειτουργίες για ασύγχρονη I/O, έλεγχο διεργασιών, καταγραφή, δημιουργία προφίλ και διαχείριση πακέτων.
  • Δυναμική πληκτρολόγηση: η γλώσσα δεν απαιτεί ρητό ορισμό τύπων για μεταβλητές, παρόμοιο με τις γλώσσες προγραμματισμού δέσμης ενεργειών. Υποστηρίζεται η διαδραστική λειτουργία.
  • Προαιρετική δυνατότητα ρητού προσδιορισμού τύπων.
  • Μια σύνταξη ιδανική για αριθμητικούς υπολογισμούς, επιστημονικούς υπολογισμούς, μηχανική μάθηση και οπτικοποίηση δεδομένων. Υποστήριξη πολλών τύπων αριθμητικών δεδομένων και εργαλείων για παραλληλοποίηση υπολογισμών.
  • Η δυνατότητα απευθείας κλήσης συναρτήσεων από βιβλιοθήκες C χωρίς πρόσθετα επίπεδα.

Σημαντικές αλλαγές στο Julia 1.9:

  • Νέα χαρακτηριστικά γλώσσας
    • Επιτρέψτε την πραγματοποίηση αναθέσεων σε άλλη λειτουργική μονάδα χρησιμοποιώντας "setproperty!(::Module, ::Symbol, x)".
    • Επιτρέπονται πολλαπλές εργασίες που δεν βρίσκονται στην τελική θέση. Για παράδειγμα, η συμβολοσειρά "a, b…, c = 1, 2, 3, 4" θα υποβληθεί σε επεξεργασία ως "a = 1; β…, = 2, 3; c = 4". Αυτό γίνεται μέσω του Base.split_rest.
    • Τα κυριολεκτικά ενός χαρακτήρα υποστηρίζουν πλέον την ίδια σύνταξη με τα κυριολεκτικά συμβολοσειρών. εκείνοι. Η σύνταξη μπορεί να αντιπροσωπεύει μη έγκυρες ακολουθίες UTF-8, όπως επιτρέπεται από τον τύπο Char.
    • Προστέθηκε υποστήριξη για τις προδιαγραφές Unicode 15.
    • Οι ένθετοι συνδυασμοί πλειάδων και ονομασμένων πλειάδων χαρακτήρων μπορούν τώρα να χρησιμοποιηθούν ως παράμετροι τύπου.
    • Νέες ενσωματωμένες συναρτήσεις "getglobal(::Module, ::Symbol[, order])" και "setglobal!(::Module, ::Symbol, x[, order])" για ανάγνωση και εγγραφή αποκλειστικά σε καθολικές μεταβλητές. Η μέθοδος getglobal θα πρέπει τώρα να προτιμάται έναντι της μεθόδου getfield για την πρόσβαση σε καθολικές μεταβλητές.
  • Αλλαγές στη γλώσσα
    • Η μακροεντολή "@invoke" που εισήχθη στην έκδοση 1.7 έχει πλέον εξαχθεί και είναι διαθέσιμη για χρήση. Επιπλέον, τώρα χρησιμοποιεί τη μέθοδο "Core.Typeof(x)" αντί "Any" στην περίπτωση που ο σχολιασμός τύπου παραλείπεται για το όρισμα "x". Αυτό είναι απαραίτητο για να διασφαλιστεί ότι οι τύποι που διαβιβάζονται ως ορίσματα επεξεργάζονται σωστά.
    • Ενεργοποιήθηκε η εξαγωγή της συνάρτησης "invokelatest" και της μακροεντολής "@invokelatest", που παρουσιάστηκε στην έκδοση 1.7.
  • Βελτιώσεις μεταγλωττιστή/χρόνου εκτέλεσης
    • Σημαντικά μειωμένος χρόνος μέχρι την πρώτη εκτέλεση (TTFX - Time to first execution). Η προμεταγλώττιση ενός πακέτου αποθηκεύει πλέον τον εγγενή κώδικα στο "pkgimage", που σημαίνει ότι ο κώδικας που δημιουργείται από τη διαδικασία προμεταγλώττισης δεν θα χρειάζεται να επαναμεταγλωττιστεί μετά τη φόρτωση του πακέτου. Η χρήση της λειτουργίας pkgimages μπορεί να απενεργοποιηθεί χρησιμοποιώντας την επιλογή "--pkgimages=no".
    • Το γνωστό ζήτημα τετραγωνικής πολυπλοκότητας του συμπερασματικού τύπου έχει διορθωθεί και η εξαγωγή συμπερασμάτων χρησιμοποιεί συνολικά λιγότερη μνήμη. Ορισμένες περιπτώσεις ακμών με συναρτήσεις μεγάλου μήκους που δημιουργούνται αυτόματα (όπως το ModelingToolkit.jl με μερικές διαφορικές εξισώσεις και μεγάλα μοντέλα αιτιατού) μεταγλωττίζονται πολύ πιο γρήγορα.
    • Οι κλήσεις με επιχειρήματα χωρίς συγκεκριμένους τύπους μπορούν τώρα να βελτιστοποιηθούν με διαχωρισμό της Ένωσης για έγχυση ή στατική ανάλυση, ακόμα κι αν υπάρχουν πολλοί υποψήφιοι διαφορετικού τύπου για αποστολή. Αυτό μπορεί να βελτιώσει την απόδοση σε ορισμένες περιπτώσεις όπου οι τύποι αντικειμένων δεν επιλύονται πλήρως στατικά, επιλύοντας στατικά τοποθεσίες κλήσεων "@nospecialize-d" και αποφεύγοντας την εκ νέου μεταγλώττιση.
    • Όλες οι χρήσεις της μακροεντολής @pure στη λειτουργική μονάδα Base έχουν αντικατασταθεί με το Base.@assume_effects.
    • Οι κλήσεις για invoke(f, invokesig, args...) με λιγότερο συγκεκριμένους τύπους από αυτούς που χρησιμοποιούνται συνήθως για το f(args...) δεν προκαλούν πλέον την εκ νέου μεταγλώττιση του πακέτου.
  • Αλλαγές στις Επιλογές Γραμμής Εντολών
    • Σε Linux και Windows, η επιλογή "--threads=auto" επιχειρεί τώρα να προσδιορίσει τον διαθέσιμο αριθμό επεξεργαστών με βάση τη συγγένεια της CPU, μια μάσκα που συνήθως ορίζεται σε περιβάλλοντα HPC και cloud.
    • Η παράμετρος «--math-mode=fast» είναι απενεργοποιημένη, αντί της οποίας συνιστάται η χρήση της μακροεντολής «@fastmath», η οποία έχει σαφώς καθορισμένη σημασιολογία.
    • Η επιλογή "--threads" έχει πλέον τη μορφή "auto | N[,auto|M]", όπου το M υποδεικνύει τον αριθμό των διαδραστικών νημάτων που πρέπει να δημιουργηθούν (προς το παρόν αυτόματο σημαίνει 1).
    • Προστέθηκε η επιλογή "-heap-size-hint=" ", το οποίο ορίζει το όριο μετά το οποίο ξεκινά η ενεργή συλλογή απορριμμάτων. Το μέγεθος μπορεί να καθοριστεί σε byte, kilobyte (1000 KB), megabyte (300 MB) ή gigabyte (1,5 GB).
  • Αλλαγές στο multithreading
    • Το "Threads.@spawn" έχει τώρα ένα προαιρετικό πρώτο όρισμα με την τιμή ":default" ή ":interactive". Μια διαδραστική εργασία απαιτεί χαμηλό λανθάνοντα χρόνο απόκρισης και έχει σχεδιαστεί για να είναι σύντομη ή να εκτελείται συχνά. Οι διαδραστικές εργασίες θα εκτελούνται σε διαδραστικά νήματα εάν καθορίζονται κατά την εκκίνηση του Julia.
    • Τα νήματα που εκτελούνται εκτός του χρόνου εκτέλεσης της Julia (όπως από C ή Java) μπορούν πλέον να καλούν τον κώδικα Julia χρησιμοποιώντας "jl_adopt_thread". Αυτό συμβαίνει αυτόματα όταν εισάγετε τον κωδικό Julia μέσω του "cfunction" ή του σημείου εισόδου "@callable". Κατά συνέπεια, ο αριθμός των νημάτων μπορεί πλέον να αλλάξει κατά την εκτέλεση.
  • Νέες λειτουργίες βιβλιοθήκης
    • Νέα λειτουργία "Iterators.flatmap".
    • Νέα συνάρτηση "pkgversion(m::Module)" για να λάβετε την έκδοση του πακέτου που φόρτωσε μια δεδομένη ενότητα, παρόμοια με την "pkgdir(m::Module)".
    • Νέα συνάρτηση "stack(x)" που γενικεύει το "reduce(hcat, x::Vector{<:Vector})" σε οποιαδήποτε διάσταση και επιτρέπει οποιονδήποτε επαναλήπτη επαναλήπτη. Η μέθοδος "stack(f, x)" γενικεύει το "mapreduce(f, hcat, x)" και είναι πιο αποτελεσματική.
    • Νέα μακροεντολή για την ανάλυση της εκχωρημένης μνήμης "@allocations", παρόμοια με την "@allocated", με τη διαφορά ότι επιστρέφει τον αριθμό των εκχωρήσεων μνήμης και όχι το συνολικό μέγεθος της εκχωρημένης μνήμης.
  • Νέες δυνατότητες βιβλιοθήκης
    • Το "RoundFromZero" λειτουργεί πλέον για άλλους τύπους εκτός του "BigFloat".
    • Το "Dict" μπορεί τώρα να μειωθεί χειροκίνητα χρησιμοποιώντας "sizehint!"
    • Το "@time" καθορίζει πλέον ξεχωριστά το ποσοστό του χρόνου που δαπανάται για την εκ νέου μεταγλώττιση μη έγκυρων μεθόδων.
  • Αλλαγές στην τυπική βιβλιοθήκη
    • Διορθώθηκε ένα πρόβλημα ταυτόχρονης χρήσης στις μεθόδους επανάληψης για Dict και άλλα παράγωγα αντικείμενα, όπως keys(::Dict), values(::Dict) και Set. Αυτές οι μέθοδοι επανάληψης μπορούν τώρα να καλούνται σε ένα Dict ή σε ένα σύνολο παράλληλα για απεριόριστο αριθμό νημάτων, εφόσον δεν υπάρχουν ενέργειες που να τροποποιούν το λεξικό ή το σύνολο.
    • Η άρνηση μιας κατηγορηματικής συνάρτησης "!f" επιστρέφει τώρα μια σύνθετη συνάρτηση "(!) ∘ f" αντί για μια ανώνυμη συνάρτηση.
    • Οι συναρτήσεις τομής διάστασης λειτουργούν πλέον σε πολλαπλές διαστάσεις: "κάθε φέτα", "κάθε φέτα" και "κάθεκολ" επιστρέφουν ένα αντικείμενο "Φέτες" που επιτρέπει την αποστολή για να παρέχει πιο αποτελεσματικές μεθόδους.
    • Προστέθηκε η μακροεντολή "@kwdef" στο δημόσιο API.
    • Διορθώθηκε ένα πρόβλημα με τη σειρά των εργασιών στο "fld1".
    • Η ταξινόμηση είναι πλέον πάντα σταθερή στο χρόνο (το QuickSort έχει επανασχεδιαστεί).
    • Το "Base.splat" εξάγεται τώρα. Η επιστρεφόμενη τιμή είναι ένας τύπος "Base.Splat" και όχι μια ανώνυμη συνάρτηση, επιτρέποντάς της να εξάγεται όμορφα.
  • Διαχειριστής πακέτων
    • "Επεκτάσεις πακέτου": Υποστήριξη για τη φόρτωση ενός αποσπάσματος κώδικα από άλλα πακέτα που έχουν φορτωθεί σε μια περίοδο λειτουργίας Julia. Η εφαρμογή είναι παρόμοια με το πακέτο "Requires.jl", αλλά υποστηρίζεται η προ-μεταγλώττιση και η συμβατότητα ρυθμίσεων.
  • LinearAlgebra Library
    • Λόγω του κινδύνου σύγχυσης με τη διαίρεση βάσει στοιχείων, αφαιρέθηκαν οι μέθοδοι "a/b" και "b\a" με βαθμωτό "a" και διάνυσμα "b", που ήταν ισοδύναμα με "a * pinv(b)".
    • Η κλήση BLAS και LAPACK χρησιμοποιεί πλέον "libblastrampoline (LBT)". Το OpenBLAS παρέχεται από προεπιλογή, αλλά η δημιουργία της εικόνας του συστήματος με άλλες βιβλιοθήκες BLAS/LAPACK δεν υποστηρίζεται. Αντίθετα, συνιστάται η χρήση του μηχανισμού LBT για την αντικατάσταση του BLAS/LAPACK με ένα άλλο υπάρχον σύνολο βιβλιοθηκών.
    • Το "lu" υποστηρίζει μια νέα στρατηγική περιστροφής πίνακα, "RowNonZero()", η οποία επιλέγει το πρώτο μη μηδενικό στοιχείο περιστροφής για χρήση με νέους τύπους αριθμητικής και για εκπαιδευτικούς σκοπούς.
    • Το "normalize(x, p=2)" υποστηρίζει πλέον κάθε κανονικοποιημένο διανυσματικό χώρο "x", συμπεριλαμβανομένων των βαθμωτών.
    • Ο προεπιλεγμένος αριθμός νημάτων BLAS είναι πλέον ίσος με τον αριθμό των νημάτων της CPU στις αρχιτεκτονικές ARM και με το ήμισυ του αριθμού των νημάτων της CPU σε άλλες αρχιτεκτονικές.
  • Printf: Επανεπεξεργασμένα μηνύματα σφάλματος για λανθασμένα μορφοποιημένες συμβολοσειρές για καλύτερη αναγνωσιμότητα.
  • Προφίλ: Νέα συνάρτηση "Profile.take_heap_snapshot(file)", η οποία γράφει ένα αρχείο στη μορφή ".heapsnapshot" που βασίζεται σε JSON που υποστηρίζεται στο Chrome.
  • Τυχαία: Το randn και το randexp λειτουργούν τώρα για οποιονδήποτε τύπο AbstractFloat που ορίζει το rand.
  • ΑΠΑΝΤΗΣΗ
    • Πατώντας το συνδυασμό πλήκτρων "Alt-e" ανοίγει τώρα η τρέχουσα είσοδος στον επεξεργαστή. Το περιεχόμενο (αν τροποποιηθεί) θα εκτελεστεί όταν βγείτε από το πρόγραμμα επεξεργασίας.
    • Το τρέχον περιβάλλον της μονάδας που είναι ενεργό στο REPL μπορεί να αλλάξει (Κύριο από προεπιλογή) χρησιμοποιώντας τη λειτουργία "REPL.activate(::Module)" ή εισάγοντας τη μονάδα στο REPL και πατώντας το συνδυασμό πλήκτρων "Alt-m".
    • Η λειτουργία "numbered prompt", η οποία εκτυπώνει αριθμούς για κάθε είσοδο και έξοδο και αποθηκεύει τα βαθμολογημένα αποτελέσματα στο Out, μπορεί να ενεργοποιηθεί χρησιμοποιώντας το "REPL.numbered_prompt!()".
    • Η ολοκλήρωση καρτέλας εμφανίζει διαθέσιμα ορίσματα λέξεων-κλειδιών.
  • SuiteSparse: Μετακινήθηκε ο κώδικας για τη λύση "SuiteSparse" στο "SparseArrays.jl". Οι επιλύτες επανεξάγονται πλέον από το "SuiteSparse.jl".
  • SparseArrays
    • Οι επιλύτες "SuiteSparse" είναι πλέον διαθέσιμοι ως υπομονάδες "SparseArrays".
    • Οι λειτουργίες προστασίας νήματος UMFPACK και CHOLMOD έχουν βελτιωθεί με την εξάλειψη των καθολικών μεταβλητών και τη χρήση κλειδαριών. Πολλαπλών νημάτων "ldiv!" Τα αντικείμενα UMFPACK μπορούν πλέον να εκτελεστούν με ασφάλεια.
    • Η πειραματική συνάρτηση "SparseArrays.allowscalar(::Bool)" σάς επιτρέπει να απενεργοποιήσετε ή να ενεργοποιήσετε τη βαθμιδωτή ευρετηρίαση αραιών πινάκων. Αυτή η συνάρτηση έχει σχεδιαστεί για να ανιχνεύει τυχαία βαθμωτή ευρετηρίαση αντικειμένων "SparseMatrixCSC", η οποία είναι μια κοινή πηγή προβλημάτων απόδοσης.
  • Νέα λειτουργία ασφαλούς λειτουργίας για δοκιμαστικές σουίτες που τερματίζει νωρίς μια δοκιμαστική εκτέλεση σε περίπτωση αποτυχίας ή σφάλματος. Ορίστε είτε μέσω "@testset kwarg failfast=true" είτε μέσω "export JULIA_TEST_FAILFAST=true". Αυτό είναι μερικές φορές απαραίτητο σε εκτελέσεις CI για τη λήψη μηνυμάτων σφάλματος έγκαιρα.
  • Ημερομηνίες: Οι κενές συμβολοσειρές δεν αναλύονται πλέον εσφαλμένα ως έγκυρες τιμές "DateTime", "Dates" ή "Times" και αντίθετα ρίχνουν ένα "ArgumentError" στους κατασκευαστές και την ανάλυση, ενώ το "tryparse" δεν επιστρέφει τίποτα.
  • Το πακέτο διανεμήθηκε
    • Η διαμόρφωση πακέτου (ενεργό έργο, "LOAD_PATH", "DEPOT_PATH") διαδίδεται τώρα κατά την προσθήκη τοπικών διεργασιών εργαζόμενου (π.χ. χρησιμοποιώντας "addprocs(N::Int)" ή χρησιμοποιώντας τη σημαία γραμμής εντολών "--procs=N").
    • Το "addprocs" για τοπικές διεργασίες εργαζόμενου δέχεται τώρα ένα όρισμα με το όνομα "env" για να μεταβιβάσει μεταβλητές περιβάλλοντος στις διεργασίες εργασίας.
  • Unicode: "graphemes(s, m:n)" επιστρέφει την υποσυμβολοσειρά από τα mth στα nth graphemes στο "s".
  • Το πακέτο DelimitedFiles έχει αφαιρεθεί από τις βιβλιοθήκες συστήματος και τώρα διανέμεται ως ξεχωριστό πακέτο που πρέπει να εγκατασταθεί ρητά για να χρησιμοποιηθεί.
  • Εξωτερικές εξαρτήσεις
    • Στο Linux, η έκδοση της βιβλιοθήκης συστήματος libstdc++ εντοπίζεται αυτόματα και, εάν είναι νεότερη, φορτώνεται. Η παλιά ενσωματωμένη συμπεριφορά φόρτωσης libstdc++, ανεξάρτητα από την έκδοση συστήματος, μπορεί να αποκατασταθεί ορίζοντας τη μεταβλητή περιβάλλοντος "JULIA_PROBE_LIBSTDCXX=0".
    • Καταργήθηκε το "RPATH" από το δυαδικό αρχείο julia, το οποίο μπορεί να σπάσει βιβλιοθήκες στο Linux που δεν μπορούν να ορίσουν τη μεταβλητή "RUNPATH".
    • Βελτιώσεις εργαλείων: Η έξοδος του "MethodError" και των μεθόδων (για παράδειγμα από το "methods(my_func)") έχει πλέον μορφοποιηθεί και χρωματιστεί σύμφωνα με την αρχή της εξόδου των μεθόδων σε ένα ίχνος στοίβας.

    Πηγή: opennet.ru

Προσθέστε ένα σχόλιο