Die Programmiersprache Julia 1.9 ist verfügbar.

Die Veröffentlichung von Julia 1.9, einer Programmiersprache mit hoher Leistungsfähigkeit, Unterstützung dynamischer Typisierung und integrierten Mitteln für paralleles Programmieren, ist erfolgt. Der Syntax von Julia ähnelt MATLAB und entlehnt einige Elemente aus Ruby und Lisp. Die String-Manipulationsmethoden erinnern an Perl. Der Code des Projekts wird unter der MIT-Lizenz verbreitet.

Hauptmerkmale der Sprache:

  • Hohe Leistung: Eines der Hauptziele des Projekts ist es, eine Leistung zu erreichen, die mit C-Programmen vergleichbar ist. Der Compiler von Julia basiert auf den Errungenschaften des LLVM-Projekts und generiert effektiven nativen Maschinencode für viele Zielplattformen.
  • Unterstützung verschiedener Programmierparadigmen, einschließlich objektorientierter und funktionaler Programmierung. Die Standardbibliothek bietet unter anderem Funktionen für asynchronen Input/Output, Prozessverwaltung, Protokollierung, Profilierung und Paketverwaltung.
  • Dynamische Typisierung: Die Sprache erfordert keine explizite Typdefinition für Variablen, ähnlich wie bei Skriptprogrammiersprachen. Ein interaktiver Modus wird unterstützt;
  • Optionale Möglichkeit zur expliziten Angabe von Typen;
  • Syntax, die hervorragend für numerische Berechnungen, wissenschaftliche Berechnungen, Machine Learning-Systeme und Datenvisualisierung geeignet ist. Unterstützung für viele numerische Datentypen und Werkzeuge zur Parallelisierung von Berechnungen.
  • Direkter Aufruf von Funktionen aus C-Bibliotheken ohne zusätzliche Schichten.

Wesentliche Änderungen in Julia 1.9:

  • Neue Sprachfeatures
    • Zuweisungen in einem anderen Modul sind jetzt mit „setproperty!(::Module, ::Symbol, x)“ erlaubt.
    • Mehrfache Zuweisungen sind nicht nur an der Endposition erlaubt. Zum Beispiel wird die Zeile „a, b…, c = 1, 2, 3, 4“ als „a = 1; b…, = 2, 3; c = 4“ verarbeitet. Dies wird durch Base.split_rest behandelt.
    • Einzelne Symbolliterale unterstützen nun denselben Syntax wie Stringliterale; d.h. der Syntax kann ungültige UTF-8-Sequenzen darstellen, wie es vom Typ Char erlaubt ist.
    • Unterstützung für die Unicode-Spezifikation 15 hinzugefügt.
    • Verschachtelte Kombinationen von Tupeln und benannte Tupel von Symbolen können jetzt als Typparameter verwendet werden.
    • Neue eingebaute Funktionen „getglobal(::Module, ::Symbol[, order])“ und „setglobal!(::Module, ::Symbol, x[, order])“ zum Lesen und Schreiben ausschließlich in globale Variablen. Die Methode getglobal sollte jetzt bevorzugt zur Abfrage von globalen Variablen verwendet werden, anstelle der Methode getfield.
  • Änderungen in der Sprache
    • Das in Version 1.7 eingeführte Makro „@invoke“ wird jetzt exportiert und kann verwendet werden. Darüber hinaus verwendet es jetzt die Methode „Core.Typeof(x)“ anstelle von „Any“, wenn die Typannotation für das Argument „x“ weggelassen wird. Dies ist notwendig, damit die Typen, die als Argumente übergeben werden, korrekt verarbeitet werden.
    • Export der Funktion „invokelatest“ und des Makros „@invokelatest“, die in Version 1.7 eingeführt wurden.
  • Verbesserungen des Compilers/Laufzeitumgebung
    • Die Zeit bis zur ersten Ausführung (TTFX – Time to First Execution) wurde erheblich reduziert. Die Vorabkompilierung des Pakets speichert nun den Maschinencode in „pkgimage“, was bedeutet, dass der während der Vorabkompilierung generierte Code keine erneute Kompilierung nach dem Laden des Pakets benötigt. Der Einsatz des Pakete-Modus kann mit der Option „—pkgimages=no“ deaktiviert werden.
    • Ein bekanntes Problem mit der quadratischen Komplexität bei der Typableitung wurde behoben, und insgesamt verwendet die Ausgabe weniger Speicher. Einige Grenzfälle mit automatisch generierten langen Funktionen (z. B. ModelingToolkit.jl mit partiellen Differentialgleichungen und großen kausalen Modellen) kompilieren deutlich schneller.
    • Aufrufe mit Argumenten ohne spezifische Typen können nun durch die Methode des Union-Splittings für Injektionen oder statische Bindung optimiert werden, selbst wenn es mehrere unterschiedlich typisierte Kandidaten für die Dispatching gibt. Dies kann in bestimmten Situationen die Leistung verbessern, wenn die Objekt-Typen nicht vollständig statisch gebunden sind, durch die statische Auflösung der Aufrufseiten '@nospecialize-d' und die Vermeidung von neuerlicher Kompilierung.
    • Alle Verwendungszwecke des Makros @pure im Modul Base wurden durch Base.@assume_effects ersetzt.
    • Aufrufe invoke(f, invokesig, args…) mit weniger spezifischen Typen als üblich für f(args…) führen nicht mehr zur Neukompilierung des Pakets.
  • Änderungen der Befehlszeilenparameter
    • Unter Linux und Windows versucht der Parameter ‘—threads=auto’ nun, die verfügbare Anzahl an Prozessoren basierend auf der CPU-Affinität zu bestimmen, deren Maske typischerweise in Hochleistungsrechenumgebungen und Cloud-Umgebungen gesetzt wird.
    • Der Parameter ‘—math-mode=fast’ wurde deaktiviert, stattdessen wird empfohlen, das Makro ‘@fastmath’ zu verwenden, das eine klar definierte Semantik aufweist.
    • Der Parameter «—threads» hat jetzt das Format «auto | N[,auto|M]», wobei M die Anzahl der zu erstellenden interaktiven Threads angibt (derzeit bedeutet auto 1).
    • Es wurde die Option «—heap-size-hint=<size>» hinzugefügt, die einen Schwellenwert festlegt, ab dem die aktive Speicherbereinigung beginnt. Die Größe kann in Bytes, Kilobytes (1000 KB), Megabytes (300 MB) oder Gigabytes (1,5 GB) angegeben werden.
  • Änderungen bei Multithreading
    • «Threads.@spawn» hat jetzt ein optionales erstes Argument mit dem Wert «:default» oder «:interactive». Eine interaktive Aufgabe erfordert eine geringe Reaktionszeit und ist für kurze oder häufig ausgeführte Aufgaben ausgelegt. Interaktive Aufgaben werden in interaktiven Threads ausgeführt, wenn sie beim Start von Julia angegeben werden.
    • Threads, die außerhalb der Julia-Laufzeitumgebung (z. B. aus C oder Java) gestartet wurden, können jetzt Julia-Code aufrufen, indem sie «jl_adopt_thread» verwenden. Dies geschieht automatisch, wenn Julia-Code über «cfunction» oder den Eingabepunkt «@ccallable» eingegeben wird. Infolgedessen kann die Anzahl der Threads jetzt zur Laufzeit geändert werden.
  • Neue Bibliotheksfunktionen
    • Neue Funktion «Iterators.flatmap».
    • Die neue Funktion „pkgversion(m::Module)“ zur Ermittlung der Paketversion, die dieses Modul geladen hat, funktioniert ähnlich wie „pkgdir(m::Module)“.
    • Die neue Funktion „stack(x)“ generalisiert „reduce(hcat, x::Vector{<:Vector})“ auf beliebige Dimensionen und akzeptiert beliebige Iteratoren von Iteratoren. Die Methode „stack(f, x)“ generalisiert „mapreduce(f, hcat, x)“ und ist effizienter.
    • Ein neues Makro zur Analyse des Speicherverbrauchs „@allocations“, ähnlich wie „@allocated“, gibt jedoch die Anzahl der Speicherallokationen zurück anstelle der gesamten Größe des zugewiesenen Speichers.
  • Neue Funktionen der Bibliothek
    • „RoundFromZero“ funktioniert jetzt auch für Typen, die nicht „BigFloat“ sind.
    • „Dict“ kann nun manuell mit „sizehint!“ verkleinert werden.
    • „@time“ zeigt jetzt den Prozentsatz der Zeit an, die für die Rekompilierung ungültiger Methoden benötigt wurde.
  • Änderungen in der Standardbibliothek
    • Ein Problem mit dem parallelen Zugriff in den Iterationsmethoden für Dict und andere abgeleitete Objekte wie keys(::Dict), values(::Dict) und Set wurde behoben. Diese Iterationsmethoden können jetzt parallel für Dict oder Set mit einer unbegrenzten Anzahl von Threads aufgerufen werden, vorausgesetzt, es gibt keine Operationen, die das Dictionary oder das Set verändern.
    • Die Negation der Prädikatsfunktion "!f" gibt nun eine zusammengesetzte Funktion „(!) ∘ f“ zurück, anstelle einer anonymen Funktion.
    • Die Dimension-Slicing-Funktionen funktionieren jetzt in mehreren Dimensionen: „eachslice“, „eachrow“ und „eachcol“ geben ein Objekt „Slices“ zurück, das die Dispatching ermöglicht, um effizientere Methoden bereitzustellen.
    • Der Makro "@kwdef" wurde zur öffentlichen API hinzugefügt.
    • Ein Problem mit der Reihenfolge der Operationen in „fld1“ wurde behoben.
    • Sortierung ist jetzt immer zeitstabil (QuickSort wurde überarbeitet).
    • "Base.splat" wird jetzt exportiert. Der Rückgabewert ist vom Typ „Base.Splat“ und nicht eine anonyme Funktion, was eine bessere Ausgabe ermöglicht.
  • Paket-Manager
    • "Package Extensions": Unterstützung für das Laden von Code-Snippets aus anderen Paketen, die in der Julia-Sitzung geladen werden. Die Anwendung ist ähnlich wie beim Paket „Requires.jl“, unterstützt jedoch die Vorabkompilierung und Kompatibilität von Einstellungen.
  • Die LinearAlgebra-Bibliothek
    • Aufgrund des Verwechslungsrisikos mit elementweiser Division wurden die Methoden „a / b“ und „b \ a“ mit dem Skalar „a“ und dem Vektor „b“ entfernt, die äquivalent zu „a * pinv(b)“ waren.
    • Für den Aufruf von BLAS und LAPACK wird jetzt «libblastrampoline (LBT)» verwendet. OpenBLAS wird standardmäßig bereitgestellt, aber der Aufbau des Systemabbilds mit anderen BLAS/LAPACK-Bibliotheken wird nicht unterstützt. Es wird empfohlen, den LBT-Mechanismus zu verwenden, um BLAS/LAPACK durch ein anderes verfügbares Bibliothekspaket zu ersetzen.
    • «lu» unterstützt jetzt eine neue Strategie zur Matrixdrehung namens «RowNonZero()», die das erste nicht-null Element der Drehung auswählt, um es mit neuen arithmetischen Typen und zu Bildungszwecken zu verwenden.
    • «normalize(x, p=2)» unterstützt jetzt jeden normierten Vektorraum «x», einschließlich Skalaren.
    • Die Anzahl der BLAS-Threads beträgt standardmäßig nun die Anzahl der CPU-Threads auf ARM-Architekturen und die Hälfte der CPU-Threads auf anderen Architekturen.
  • Printf: Zur besseren Lesbarkeit wurden die Fehlermeldungen für falsch formatierte Strings überarbeitet.
  • Profile: Neue Funktion «Profile.take_heap_snapshot(file)», die eine Datei im Format «.heapsnapshot» basierend auf JSON aufzeichnet, das von Chrome unterstützt wird.
  • Random: randn und randexp funktionieren jetzt für jeden Typ von AbstractFloat, der rand definiert.
  • REPL
    • Durch Drücken der Tastenkombination «Alt-e» wird jetzt die aktuelle Eingabe im Editor geöffnet. Der Inhalt (sofern er geändert wurde) wird beim Verlassen des Editors ausgeführt.
    • Der aktuelle Kontext des Moduls, das im REPL aktiv ist (standardmäßig Main), kann mit der Funktion «REPL.activate(::Module)» oder durch Eingabe des Moduls im REPL und Drücken der Tastenkombination «Alt-m» geändert werden.
    • Der Modus «nummerierte Eingabeaufforderung», der Zahlen für jede Eingabe und Ausgabe anzeigt und die bewerteten Ergebnisse in Out speichert, kann mit «REPL.numbered_prompt!()» aktiviert werden.
    • Die Autovervollständigung mit der Tabulatortaste zeigt verfügbare Schlüsselwortargumente an.
  • SuiteSparse: Der Code für den «SuiteSparse»-Löser wurde nach «SparseArrays.jl» verschoben. Die Solver werden jetzt über «SuiteSparse.jl» erneut exportiert.
  • SparseArrays
    • Die «SuiteSparse»-Solver sind jetzt als Untermodule von «SparseArrays» verfügbar.
    • Die Schutzmodi von UMFPACK und CHOLMOD wurden verbessert, indem globale Variablen ausgeschlossen und Sperren verwendet wurden. Der mehrkernige «ldiv!» von UMFPACK-Objekten kann jetzt sicher ausgeführt werden.
    • Die experimentelle Funktion „SparseArrays.allowscalar(::Bool)“ ermöglicht das Aktivieren oder Deaktivieren der skalaren Indizierung von spärlichen Arrays. Diese Funktion dient dazu, zufällige skalare Indizierungen von „SparseMatrixCSC“-Objekten zu erkennen, die eine häufige Quelle für Leistungsprobleme darstellen.
  • Ein neuer fehlertoleranter Modus für Testsets, der die Testausführung im Falle eines Fehlers oder einer Ausnahme vorzeitig beendet. Dies kann entweder über „@testset kwarg failfast=true“ oder „export JULIA_TEST_FAILFAST=true“ festgelegt werden. Dies ist in CI-Durchläufen notwendig, um frühzeitig Fehlermeldungen zu erhalten.
  • Daten: Leere Zeichenfolgen werden jetzt nicht mehr fälschlicherweise als gültige Werte für „DateTime“, „Dates“ oder „Times“ interpretiert und geben stattdessen den Fehler „ArgumentError“ in Konstruktoren und beim Parsen aus, während „tryparse“ nichts zurückgibt.
  • Paket Distributed
    • Die Konfiguration des Pakets (aktives Projekt, „LOAD_PATH“, „DEPOT_PATH“) wird jetzt bei der Hinzufügung lokaler Arbeitsprozesse verbreitet (zum Beispiel mit „addprocs(N::Int)“ oder dem Kommandozeilenflag „—procs=N“).
    • «addprocs» für lokale Arbeitsprozesse akzeptiert jetzt ein Argument mit dem Namen «env», um Umgebungsvariablen an die Arbeitsprozesse zu übergeben.
  • Unicode: «graphemes(s, m:n)» gibt den Teilstring von der m-ten bis zur n-ten Grapheme in «s» zurück.
  • Das Paket DelimitedFiles wurde aus den Systembibliotheken entfernt und wird jetzt als eigenes Paket bereitgestellt, das explizit installiert werden muss, um verwendet zu werden.
  • Externe Abhängigkeiten
    • In Linux wird die Version der Systembibliothek libstdc++ automatisch erkannt, und wenn sie neuer ist, wird sie geladen. Das alte Verhalten, die integrierte libstdc++ unabhängig von der Systemversion zu laden, kann wiederhergestellt werden, indem die Umgebungsvariable «JULIA_PROBE_LIBSTDCXX=0» gesetzt wird.
    • Das «RPATH» wurde aus der Binary-Datei julia entfernt, was in Linux zu Problemen mit Bibliotheken führen kann, die die Variable «RUNPATH» nicht ermitteln konnten.
    • Verbesserungen der Werkzeuge: Die Ausgabe von «MethodError» und Methoden (z. B. aus «methods(my_func)») ist nun formatiert und farblich gestaltet, um dem Prinzip der Methodenausgabe während der Stack-Tracing zu entsprechen.

    Quelle: opennet.ru

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster