Programmiersprache Julia 1.9 verfügbar

Die Veröffentlichung der Programmiersprache Julia 1.9 wurde veröffentlicht und vereint Eigenschaften wie hohe Leistung, Unterstützung für dynamische Typisierung und integrierte Tools für die parallele Programmierung. Die Syntax von Julia ähnelt MATLAB, wobei einige Elemente von Ruby und Lisp übernommen wurden. Die String-Manipulationsmethode erinnert an Perl. Der Projektcode wird unter der MIT-Lizenz vertrieben.

Hauptmerkmale der Sprache:

  • Hohe Leistung: Eines der Hauptziele des Projekts ist es, eine Leistung zu erreichen, die der von C-Programmen nahe kommt. Der Julia-Compiler basiert auf dem LLVM-Projekt und generiert effizienten nativen Maschinencode für viele Zielplattformen;
  • Unterstützung verschiedener Programmierparadigmen, einschließlich Elementen der objektorientierten und funktionalen Programmierung. Die Standardbibliothek stellt unter anderem Funktionen für asynchrone I/O, Prozessverwaltung, Protokollierung, Profilierung und Paketverwaltung bereit;
  • Dynamische Typisierung: Die Sprache erfordert keine explizite Definition von Typen für Variablen, analog zu Skript-Programmiersprachen. Unterstützt den interaktiven Modus;
  • Optionale Möglichkeit, Typen explizit anzugeben;
  • Syntax, die sich hervorragend für numerische Berechnungen, wissenschaftliche Berechnungen, maschinelle Lernsysteme und Datenvisualisierung eignet. Unterstützung für viele numerische Datentypen und Tools zur Parallelisierung von Berechnungen.
  • Möglichkeit, Funktionen ohne zusätzliche Ebenen direkt aus C-Bibliotheken aufzurufen.

Wesentliche Änderungen in Julia 1.9:

  • Neue Sprachfunktionen
    • Erlauben Sie Zuweisungen in einem anderen Modul mit „setproperty!(::Module, ::Symbol, x)“.
    • Eine Mehrfachbelegung außerhalb der endgültigen Position ist zulässig. Beispielsweise wird die Zeichenfolge „a, b..., c = 1, 2, 3, 4“ als „a = 1; b…, = 2, 3; c = 4". Dies wird über Base.split_rest gehandhabt.
    • Einzelzeichenliterale unterstützen jetzt dieselbe Syntax wie Zeichenfolgenliterale. diese. Die Syntax kann ungültige UTF-8-Sequenzen darstellen, wie es der Char-Typ zulässt.
    • Unterstützung für die Unicode 15-Spezifikation hinzugefügt.
    • Als Typparameter können nun verschachtelte Kombinationen von Tupeln und benannte Tupel von Zeichen verwendet werden.
    • Neue integrierte Funktionen „getglobal(::Module, ::Symbol[, order])“ und „setglobal!(::Module, ::Symbol, x[, order])“ zum ausschließlichen Lesen und Schreiben von globalen Variablen. Für den Zugriff auf globale Variablen sollte nun die Methode getglobal der Methode getfield vorgezogen werden.
  • Sprachänderungen
    • Das in Version 1.7 eingeführte „@invoke“-Makro ist jetzt exportiert und zur Verwendung verfügbar. Außerdem wird jetzt die Methode „Core.Typeof(x)“ anstelle von „Any“ verwendet, wenn die Typanmerkung für das Argument „x“ weggelassen wird. Dies ist notwendig, damit als Argumente übergebene Typen korrekt verarbeitet werden.
    • Der Export der Funktion „invoketest“ und des Makros „@invoketest“ wurde in Version 1.7 eingeführt.
  • Compiler-/Laufzeitverbesserungen
    • Erheblich verkürzte Zeit bis zur ersten Ausführung (TTFX – Time to First Execution). Die Paketvorkompilierung speichert jetzt den nativen Code in „pkgimage“, was bedeutet, dass der während der Vorkompilierung generierte Code nach dem Laden des Pakets nicht erneut kompiliert werden muss. Die Verwendung des pkgimages-Modus kann mit der Option „--pkgimages=no“ deaktiviert werden.
    • Das bekannte Problem der quadratischen Komplexität der Typinferenz wurde behoben, und die Inferenz verbraucht im Allgemeinen weniger Speicher. Einige Randfälle mit automatisch generierten langen Funktionen (z. B. ModelingToolkit.jl mit partiellen Differentialgleichungen und großen Kausalmodellen) werden viel schneller kompiliert.
    • Aufrufe mit nicht typspezifischen Argumenten können jetzt durch Union-Splitting für die Injektion oder statische Auflösung optimiert werden, selbst wenn mehrere verschiedene Arten von Dispatch-Kandidaten vorhanden sind. Dies kann die Leistung in bestimmten Situationen verbessern, in denen Objekttypen nicht vollständig statisch aufgelöst werden, indem „@nospecialize-d“-Aufrufseiten statisch aufgelöst und eine Neukompilierung vermieden wird.
    • Alle Verwendungen des @pure-Makros im Base-Modul wurden durch Base.@assume_effects ersetzt.
    • Aufrufe von invoke(f, invokesig, args...) mit Typen, die weniger spezifisch sind als die normalerweise für f(args...) verwendeten Typen, führen nicht mehr dazu, dass das Paket neu kompiliert wird.
  • Änderungen der Befehlszeilenparameter
    • Unter Linux und Windows versucht die Option „--threads=auto“ nun, die verfügbare Anzahl von Prozessoren basierend auf der CPU-Affinität zu ermitteln, einer Maske, die normalerweise in HPC- und Cloud-Umgebungen festgelegt wird.
    • Die Option „--math-mode=fast“ wurde deaktiviert. Stattdessen wird empfohlen, das Makro „@fastmath“ zu verwenden, das über eine klar definierte Semantik verfügt.
    • 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).
    • Option „--heap-size-hint=“ hinzugefügt “, der den Schwellenwert festlegt, nach dem die aktive Speicherbereinigung beginnt. Die Größe kann in Bytes, Kilobyte (1000 KB), Megabyte (300 MB) oder Gigabyte (1,5 GB) angegeben werden.
  • Multithreading-Änderungen
    • „Threads.@spawn“ hat jetzt ein optionales erstes Argument mit dem Wert „:default“ oder „:interactive“. Eine interaktive Aufgabe erfordert eine geringe Antwortlatenz und ist so konzipiert, dass sie kurz ist oder häufig ausgeführt wird. Interaktive Aufgaben werden in interaktiven Threads ausgeführt, wenn sie beim Starten von Julia angegeben werden.
    • Threads, die außerhalb der Julia-Laufzeit gestartet werden (z. B. von C oder Java), können jetzt Julia-Code mit „jl_adopt_thread“ aufrufen. Dies geschieht automatisch, wenn Sie Julia-Code über „cfunction“ oder den Einstiegspunkt „@ccallable“ eingeben. Dies hat zur Folge, dass sich die Anzahl der Threads nun zur Laufzeit ändern kann.
  • Neue Bibliotheksfunktionen
    • Neue Funktion „Iterators.flatmap“.
    • Neue Funktion „pkgversion(m::Module)“, um die Version des Pakets abzurufen, das ein bestimmtes Modul geladen hat, ähnlich wie „pkgdir(m::Module)“.
    • Neue Funktion „stack(x)“, die „reduce(hcat, x::Vector{<:Vector})“ auf jede Dimension verallgemeinert und jeden Iterator von Iteratoren zulässt. Die Methode „stack(f, x)“ verallgemeinert „mapreduce(f, hcat, x)“ und ist effizienter.
    • Neues Makro zum Parsen des zugewiesenen Speichers „@allocations“, ähnlich „@allocated“, außer dass es die Anzahl der Speicherzuweisungen zurückgibt, nicht die Gesamtgröße des zugewiesenen Speichers.
  • Neue Funktionen der Bibliothek
    • „RoundFromZero“ funktioniert jetzt für andere Typen als „BigFloat“.
    • „Dict“ kann nun manuell mit „sizehint!“ verkleinert werden.
    • „@time“ gibt jetzt separat den Prozentsatz der Zeit an, die für die Neukompilierung ungültiger Methoden aufgewendet wurde.
  • Änderungen in der Standardbibliothek
    • Ein Parallelitätsproblem in Iterationsmethoden für Dict und andere abgeleitete Objekte wie „keys(::Dict), Values(::Dict)“ und „Set“ wurde behoben. Diese Iterationsmethoden können jetzt für ein Dict oder Set parallel in einer unbegrenzten Anzahl von Threads aufgerufen werden, solange keine Aktionen vorhanden sind, die das Wörterbuch oder den Set ändern.
    • Das Negieren der Prädikatfunktion „!f“ gibt nun eine zusammengesetzte Funktion „(!) ∘ f“ statt einer anonymen Funktion zurück.
    • Dimension-Slice-Funktionen funktionieren jetzt über mehrere Dimensionen hinweg: „eachslice“, „eachrow“ und „eachcol“ geben ein „Slices“-Objekt zurück, das das Dispatching ermöglicht, um effizientere Methoden bereitzustellen.
    • „@kwdef“-Makro zur öffentlichen API hinzugefügt.
    • Ein Problem mit der Reihenfolge der Operationen in „fld1“ wurde behoben.
    • Die Sortierung ist jetzt immer zeitstabil (neu gestaltetes QuickSort).
    • „Base.splat“ wird nun exportiert. Der Rückgabewert ist vom Typ „Base.Splat“ und nicht von einer anonymen Funktion, wodurch er gut abgeleitet werden kann.
  • Paket-Manager
    • „Paketerweiterungen“: Unterstützung für das Laden eines Codeausschnitts aus anderen Paketen, die in einer Julia-Sitzung geladen wurden. Die Anwendung ähnelt dem Paket „Requires.jl“, jedoch werden Vorkompilierung und Konfigurationskompatibilität unterstützt.
  • LinearAlgebra-Bibliothek
    • Aufgrund der Verwechslungsgefahr mit der elementweisen Division wurden die Methoden „a / b“ und „b \ a“ mit Skalar „a“ und Vektor „b“ entfernt, die äquivalent zu „a * pinv(b)“ waren.
    • BLAS- und LAPACK-Aufrufe verwenden jetzt „libblastrampoline (LBT)“. OpenBLAS wird standardmäßig mitgeliefert, das Erstellen eines Systemabbilds mit anderen BLAS/LAPACK-Bibliotheken wird jedoch nicht unterstützt. Stattdessen wird empfohlen, den LBT-Mechanismus zu verwenden, um BLAS/LAPACK durch einen anderen verfügbaren Satz von Bibliotheken zu ersetzen.
    • „lu“ unterstützt die neue Matrixrotationsstrategie „RowNonZero()“, die das erste Rotationselement ungleich Null für die Verwendung mit den neuen Arithmetiktypen und für Bildungszwecke auswählt.
    • „normalize(x, p=2)“ unterstützt jetzt jeden normalisierten Vektorraum „x“, einschließlich Skalaren.
    • Die Standardanzahl der BLAS-Threads entspricht jetzt der Anzahl der CPU-Threads auf der ARM-Architektur und der Hälfte der Anzahl der CPU-Threads auf anderen Architekturen.
  • Printf: Fehlermeldungen für fehlerhafte Zeichenfolgen zur besseren Lesbarkeit überarbeitet.
  • Profil: Neue Funktion „Profile.take_heap_snapshot(file)“, die eine Datei im JSON-basierten „.heapsnapshot“-Format erfasst, das von Chrome unterstützt wird.
  • Zufällig: Randn und Randexp funktionieren jetzt für jeden AbstractFloat-Typ, der Rand definiert.
  • ERSATZ
    • Durch Drücken der Tastenkombination „Alt-e“ wird nun die aktuelle Eingabe im Editor geöffnet. Der Inhalt (sofern geändert) wird beim Beenden des Editors ausgeführt.
    • Der aktuelle Modulkontext, der in der REPL aktiv ist, kann mit der Funktion „REPL.activate(::Module)“ oder durch Eingabe des Moduls in die REPL und Drücken der „Alt-m“-Taste geändert werden (standardmäßig ist er Main). Kombination.
    • Mit „REPL.numbered_prompt!()“ kann der Modus „Nummerierte Eingabeaufforderung“ aktiviert werden, der für jeden Ein- und Ausgang Nummern ausgibt und die ausgewerteten Ergebnisse in Out speichert.
    • Durch die Tab-Vervollständigung werden die verfügbaren Schlüsselwortargumente angezeigt.
  • SuiteSparse: Code für den Solver „SuiteSparse“ nach „SparseArrays.jl“ verschoben. Solver werden jetzt von „SuiteSparse.jl“ erneut exportiert.
  • SparseArrays
    • SuiteSparse-Löser sind jetzt als Submodule von SparseArrays verfügbar.
    • Die Stream-Schutzmodi UMFPACK und CHOLMOD wurden durch die Eliminierung globaler Variablen und die Verwendung von Sperren verbessert. Multithreaded „ldiv!“ UMFPACK-Objekte können jetzt sicher ausgeführt werden.
    • Mit der experimentellen Funktion „SparseArrays.allowscalar(::Bool)“ können Sie die skalare Indizierung von Sparse-Arrays deaktivieren oder aktivieren. Diese Funktion dient dazu, die zufällige Skalarindizierung von „SparseMatrixCSC“-Objekten zu erkennen, die eine häufige Ursache für Leistungsprobleme darstellt.
  • Neuer Failover-Modus für Testsuiten, der einen Testlauf im Falle eines Fehlers oder Fehlers vorzeitig beendet. Wird entweder über „@testset kwarg failfast=true“ oder „export JULIA_TEST_FAILFAST=true“ gesetzt. Dies kann bei CI-Starts erforderlich sein, um frühzeitig Fehlermeldungen zu erhalten.
  • Datumsangaben: Leere Zeichenfolgen werden nicht mehr fälschlicherweise als gültige „DateTime“-, „Dates“- oder „Times“-Werte geparst und werfen stattdessen einen „ArgumentError“-Fehler in Konstruktoren und beim Parsen, während „tryparse“ nichts zurückgibt.
  • Verteiltes Paket
    • Die Paketkonfiguration (aktives Projekt, „LOAD_PATH“, „DEPOT_PATH“) wird nun propagiert, wenn lokale Worker-Prozesse hinzugefügt werden (z. B. mit „addprocs(N::Int)“ oder mit dem Kommandozeilen-Flag „-procs=N“).
    • „addprocs“ für lokale Arbeitsprozesse benötigt jetzt ein Argument namens „env“, um Umgebungsvariablen an Arbeitsprozesse zu übergeben.
  • Unicode: „graphemes(s, m:n)“ gibt den Teilstring vom m-ten bis n-ten Graphem in „s“ zurück.
  • Das DelimitedFiles-Paket wurde aus den Systembibliotheken entfernt und wird nun als separates Paket verteilt, das zur Verwendung explizit installiert werden muss.
  • Externe Abhängigkeiten
    • Linux erkennt automatisch die Version der Systembibliothek libstdc++ und lädt sie, wenn sie neuer ist. Das alte Verhalten beim Laden der integrierten libstdc++ unabhängig von der Systemversion kann durch Setzen der Umgebungsvariablen „JULIA_PROBE_LIBSTDCXX=0“ wiederhergestellt werden.
    • „RPATH“ wurde aus der Julia-Binärdatei entfernt, wodurch Bibliotheken unter Linux beschädigt werden können, die die Variable „RUNPATH“ nicht definieren.
    • Tool-Verbesserungen: Die Ausgabe von „MethodError“ und Methoden (z. B. von „methods(my_func)“) wird jetzt entsprechend der Ausgabe von Methoden in Stack-Traces formatiert und gefärbt.

    Source: opennet.ru

Kommentar hinzufügen