Veröffentlichung der Programmiersprache Julia 1.12

Die Veröffentlichung von Julia 1.12, einer Programmiersprache, die hohe Leistung, Unterstützung für dynamische Typisierung und integrierte Werkzeuge für paralleles Programmieren vereint, ist erfolgt. Die Syntax von Julia ist MATLAB ähnlich, mit Anleihen aus Ruby und Lisp. Die Stringmanipulation erinnert an Perl. Der Quellcode des Projekts wird unter der MIT-Lizenz veröffentlicht.

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.

Hauptänderungen in Julia 1.12:

  • Neue Sprachfeatures
    • Ein experimenteller Parameter „—trim“, der es ermöglicht, kompaktere Binärdateien zu erstellen, indem Code entfernt wird, der von den angegebenen Einstiegspunkten nicht erreicht werden kann. Einstiegspunkte können mit „Base.Experimental.entrypoint“ markiert werden. Nicht jeder Code kann mit dieser Option umgehen.
    • Die Neuinterpretation von Konstanten ist nun klar definiert und folgt der Semantik des „Weltalters“. Zusätzliche Neuinterpretationen (z. B. von Typen) sind zulässig.
    • Der Funktion „names“ wurde ein neuer Parameter „usings::Bool“ hinzugefügt, der die Funktion anweist, alle Namen zurückzugeben, die durch „using“ sichtbar sind.
    • Die @atomic-Makrofamilie unterstützt jetzt die Syntax der Zuweisung von Referenzen, beispielsweise: «@atomic :monotonic v[3] += 4», die «v[3]» atomar mit der Semantik der monotonen Anordnung verändert. Die unterstützte Syntax umfasst:
      • atomare Leseoperation («x = @atomic v[3]»),
      • atomare Zuweisung («@atomic v[3] = 4»),
      • atomare Änderung («@atomic v[3] += 2»),
      • atomare einmalige Zuweisung («@atomiconce v[3] = 2»),
      • atomarer Austausch («x = @atomicswap v[3] = 2»),
      • atomarer Austausch («x = @atomicreplace v[3] 2=>5»).
    • Ein neuer Parameter «—task-metrics=yes», der die Erfassung von Informationen über die Ausführungszeit jeder Aufgabe ermöglicht, die während des Betriebs über «Base.Experimental.task_metrics(::Bool)» ein- oder ausgeschaltet werden kann. Verfügbare Metriken:
      • tatsächliche Ausführungszeit der Aufgabe, einschließlich Kompilierung und Garbage Collection («Base.Experimental.task_running_time_ns»),
      • die Zeit vom Beginn der Ausführung der Aufgabe bis zu deren Abschluss («Base.Experimental.task_wall_time_ns»).
    • Unterstützung für Unicode 16.
    • «Threads.@spawn» akzeptiert jetzt das Argument «:samepool», um denselben Thread-Pool wie der aufrufende Code anzugeben. «Threads.@spawn :samepool foo()» ist eine Abkürzung für «Threads.@spawn Threads.threadpool() foo()».
    • Das Makro «@ccall» kann jetzt das Argument «gc_safe» akzeptieren. Wenn es auf true gesetzt ist, kann die Laufzeitumgebung während des «ccall»-Aufrufs die Garbage Collection parallel durchführen.
  • Änderungen der Sprache
    • Beim Ersetzen einer Methode durch eine signature-äquivalente Methode wird die bestehende Methode nicht entfernt. Stattdessen wird die neue Methode priorisiert. Wenn die neue Methode entfernt wird, kommt die alte Methode wieder zum Einsatz. Dies ist nützlich in Testframeworks mit Substitution (SparseArrays, Pluto, Mocking usw.), da das alte Verhalten nicht explizit wiederhergestellt werden muss. Derzeit ist für diese Situation eine erneute Kompilierung erforderlich, aber es ist möglich, dass in Zukunft alte Ergebnisse wiederverwendet werden können.
    • Die Entfaltung von Makros wird nicht mehr sofort rekursiv in die Ausdrücke «Expr(:toplevel)» von Makros eingreifen. Stattdessen wird die Entfaltung von «:toplevel» bis zur Laufzeit verschoben. Dies ermöglicht es späteren Ausdrücken im selben «:toplevel», zuvor definierte Makros zu verwenden.
    • Einfache unendliche Schleifen (wie „while true; end“) werden nicht mehr als undefiniertes Verhalten betrachtet. Unendliche Schleifen, in denen etwas passiert (zum Beispiel mit Nebenwirkungen oder sleep), waren niemals und sind kein undefiniertes Verhalten.
    • Die gleichzeitige Kennzeichnung einer Identifikation als „public“ und „export“ ist jetzt ein Fehler.
    • Laufzeitfehler bei „getfield“ erzeugen jetzt einen neuen Ausnahme-Typ „FieldError“ statt der allgemeinen „ErrorException“.
    • Makros in Funktionsdeklarationen erfordern jetzt keine runden Klammern mehr. Beispielsweise ist „function @main(args) … end“ zulässig, während zuvor „function (@main)(args) … end“ erforderlich war.
    • Ein „using“-Aufruf nach Name des Pakets innerhalb des Pakets selbst (besonders relevant für verschachtelte Module) verwendet nun explizit dieses Paket, ohne das Manifest und die Umgebung zu prüfen, genau wie „..Name“. Dies entspricht besser dem erwarteten Verhalten.
  • Verbesserungen des Compilers/Runtimes
    • Der generierte LLVM Intermediate Code (IR) verwendet jetzt Zeigertypen anstelle der Übergabe von Zeigern in Form von Ganzzahlen. Dies betrifft «llvmcall»: Der eingebaute LLVM IR sollte aktualisiert werden, indem «i32»/«i64» durch «i8*» oder «ptr» ersetzt wird und unnötige Konversionen «ptrtoint»/«inttoptr» entfernt werden. Die Kompatibilität des IR mit Ganzzahlzeigern wird weiterhin unterstützt, jedoch mit Warnhinweisen.
  • Änderungen der Befehlszeilenparameter
    • Das Flag «-m/—module» kann übergeben werden, um die Funktion «main» innerhalb des Pakets mit Argumenten auszuführen. Diese Funktion muss mit «@main» deklariert sein, um darauf hinzuweisen, dass dies der Einstiegspunkt ist.
    • Die Aktivierung/Deaktivierung der farbigen Ausgabe in Julia kann jetzt über die Umgebungsvariablen «NO_COLOR» und «FORCE_COLOR» gesteuert werden. Diese Variablen werden ebenfalls vom Julia-Bausystem berücksichtigt.
    • «—project=@temp» startet Julia mit einer temporären Umgebung.
    • Der neue Parameter «—trace-compile-timing» gibt die Kompilierungszeit jedes mit «—trace-compile» ausgegebenen Methoden in Millisekunden aus.
    • «—trace-compile» gibt jetzt neu kompilierte Methoden in gelber Farbe aus oder fügt einen Kommentar hinzu, falls die Farbe nicht verfügbar ist.
    • Der neue Parameter «—trace-dispatch» gibt Methoden aus, die dynamisch verteilt werden.
  • Änderungen der Multithreading-Funktionen
    • Julia verwendet jetzt standardmäßig 1 „interaktiven“ Thread zusätzlich zu 1 Haupt-„Arbeits“-Thread, d.h. „-t1,1“. Das bedeutet, dass die Hauptaufgabe und REPL (im interaktiven Modus), die beide im Thread 1 laufen, jetzt im interaktiven Pool ausgeführt werden. Die I/O-Schleife von libuv läuft ebenfalls im Thread 1, was eine effiziente Nutzung des Arbeits-Pools ermöglicht, der von „Threads.@spawn“ verwendet wird. Die Anforderung von genau 1 Thread („-t1“/„JULIA_NUM_THREADS=1“) oder 0 interaktiven Threads deaktiviert den interaktiven Thread: „-t1,0“, „JULIA_NUM_THREADS=1,0“ oder „-tauto,0“. Die Anforderung von mehr als 1 Thread schließt den interaktiven Thread ein; z.B. ist „-t2“ gleichwertig mit „-t2,1“. Hinweis: Buffers sollten nicht an „threadid()“ gebunden werden.
    • Neue Typen für den Code-Template wurden definiert, die einmal pro Prozess ausgeführt werden sollen – der Typ „OncePerProcess{T}“ ermöglicht es, eine Funktion zu definieren, die genau einmal ausgeführt wird, wenn sie zum ersten Mal aufgerufen wird, und danach bei allen weiteren Aufrufen immer denselben Wert des Typs „T“ zurückgibt. Es gibt auch die Typen „OncePerThread{T}“ und „OncePerTask{T}“ für eine ähnliche Verwendung mit Threads oder Aufgaben.
  • Änderungen im Build-System
    • Neue Makefile-Dateien wurden hinzugefügt, um Julia und LLVM mit BOLT (Binary Optimization and Layout Tool) zu erstellen. Siehe «contrib/bolt» und «contrib/pgo-lto-bolt».
  • Neue Bibliotheksfunktionen
    • «logrange(start, stop; length)» erzeugt einen Bereich mit konstantem Verhältnis (ratio) anstelle eines konstanten Schrittes.
    • Die neue Funktion «isfull(c::Channel)» überprüft, ob «put!(c, some_value)» blockiert wird.
    • «waitany(tasks; throw=false)» und «waitall(tasks; failfast=false, throw=false)» warten auf die gleichzeitige Beendigung mehrerer Aufgaben.
    • «uuid7()» erstellt eine UUID der Version 7, die RFC 9562 entspricht.
    • «insertdims(array; dims)» fügt ein-elementige Dimensionen in ein Array ein – eine Operation, die «dropdims» rückgängig macht.
    • Der neue Typ «Fix» generalisiert «Fix1/Fix2» zur Fixierung eines Arguments.
    • «Sys.detectwsl()» überprüft, ob Julia innerhalb von WSL zur Laufzeit ausgeführt wird.
  • Neue Funktionen der Bibliotheken
    • «escape_string» akzeptiert zusätzliche Parameter «ascii=true» (zum Maskieren aller nicht-ASCII-Zeichen) und «fullhex=true» (zum Verwenden des vollständigen 4-/8-stelligen Hex-Formats in der u/U-Maskierung, z.B. zur Kompatibilität mit C).
    • «tempname» kann jetzt eine Suffix-Zeichenfolge akzeptieren, sodass der Dateiname dieses Suffix enthält und bei der Einzigartigkeit berücksichtigt wird.
    • Objekte «RegexMatch» können jetzt zur Erstellung von «NamedTuple» und «Dict» verwendet werden.
    • «Lockable» wird jetzt exportiert.
    • Die Funktionen «Base.require_one_based_indexing» und «Base.has_offset_axes» sind nun öffentlich.
    • Neue Funktionen «ltruncate», «rtruncate» und «ctruncate» wurden hinzugefügt, um Zeichenfolgen unter Berücksichtigung der Schriftbreite auf die Textbreite zu kürzen.
    • Die Funktion «isless» (und damit «cmp», Sortierung usw.) wird jetzt für nulldimensions «AbstractArray» unterstützt.
    • Mit «invoke» kann jetzt anstelle der Typ-Signatur ein «Method» übergeben werden.
    • Die Methode «invoke» akzeptiert jetzt «CodeInstance» anstelle des Typs, was einige Compiler-Plugin-Arbeitsabläufe beschleunigen kann.
    • «Timer(f, …)» erbt nun die «Stickiness» der übergeordneten Aufgabe, wenn Timer-Aktivitäten erstellt werden; dies kann durch das neue Argument «spawn» überschrieben werden. Damit wird das Problem gelöst, dass durch «@async» erzeugte, klebrige Aufgaben die übergeordnete Aufgabe klebrig machten.
    • «Timer» hat nun lesbare Eigenschaften «timeout» und «interval» sowie eine beschreibendere Methode «show».
    • Die Funktion «sort» unterstützt jetzt Tuple «NTuple».
    • «map!(f, A)» speichert jetzt die Ergebnisse in «A», wie «map!(f, A, A)» oder «A .= f.(A)».
    • Die Funktion «setprecision» mit einem Funktionsparameter (normalerweise über einen Block «do») ist nun threadsicher. Andere Formen sollten vermieden werden, und die Typen sollten zu einer Implementierung übergehen, die «ScopedValue» verwendet.
  • Änderungen an der Standardbibliothek.
    • Die Funktion «gcdx(0, 0)» gibt jetzt «(0, 0, 0)» statt «(0, 1, 0)» zurück.
    • «fd» gibt «RawFD» anstelle von «Int» zurück.
    • JuliaSyntaxHighlighting-Paket
      • Ein neues Standardpaket zur Anwendung der Syntaxhervorhebung auf Julia-Code, das «JuliaSyntax» und «StyledStrings» zur Implementierung der Funktion «highlight» verwendet, die «AnnotatedString» mit angewandter Hervorhebung erstellt.
    • LinearAlgebra-Paket.
      • «rank» kann jetzt die Matrix «QRPivoted» zur Bewertung des Rangs über die QR-Faktorisierung akzeptieren.
      • Ein neuer Schlüsselparameter «alg» für «eigen», «eigen!», «eigvals» und «eigvals!» für Arten selbstadjungierter Matrizen (Typüberlagerung «RealHermSymComplexHerm») wurde hinzugefügt, um zwischen verschiedenen Algorithmen zur Eigenwertbestimmung zu wechseln.
      • Eine allgemeine Version der blockfreien Cholesky-Zerlegung mit Pivot-Auswahl wurde hinzugefügt (aufgerufen über «cholesky[!](A, RowMaximum())»).
      • Die Anzahl der BLAS-Threads berücksichtigt jetzt standardmäßig die Prozessbindung (process affinity) und nicht nur die Anzahl der logischen Threads des Systems.
      • Eine Funktion «zeroslike» wurde hinzugefügt, die Null-Elemente für Matrizen mit Bandbreiten-Speicherung zurückgibt. Benutzerdefinierte Array-Typen können diese Funktion für das korrekte Ergebnis spezialisieren.
      • Die Matrixmultiplikation „A * B“ ruft jetzt „matprod_dest(A, B, T::Type)“ auf, um einen Empfänger zu generieren. Diese Funktion ist nun öffentlich.
      • Die Funktion „haszero(T::Type)“ wird verwendet, um zu überprüfen, ob der Typ „T“ ein einzigartiges Null-Element hat, das als „zero(T)“ definiert ist. Sie ist jetzt öffentlich.
      • Die Funktion „diagview“ wurde hinzugefügt, die eine Ansicht (view) auf eine bestimmte Diagonale der Matrix „AbstractMatrix“ zurückgibt.
    • Paket Profile
      • „Profile.take_heap_snapshot“ akzeptiert nun einen neuen Parameter „redact_data::Bool“, der standardmäßig auf „true“ gesetzt ist. Wenn dies zulässig ist, werden die Inhalte von Julia-Objekten (z. B. Strings) nicht in den Speicherabbild aufgenommen.
      • „Profile.print()“ färbt jetzt die Module Base/Core/Package ebenfalls so, wie es in Stack-Tracings geschieht, und die Pfade (auch der gekürzte) sind jetzt klickbar in Terminals, die URI-Links unterstützen und das angegebene Datei und Zeile im Editor öffnen, der durch „JULIA_EDITOR“ festgelegt ist.
    • REPL
      • Mit der neuen Möglichkeit „usings=true“ in der Funktion „names()“ kann die Autovervollständigung im REPL Namen ergänzen, die über „using“ sichtbar sind.
      • Die Autovervollständigung im REPL kann jetzt auch Ausdrücke der Form „[import|using] Mod: xxx|“ vervollständigen, z. B. „using Base.Experimental: @op“ bis zu „using Base.Experimental: @opaque“.
      • REPL gibt jetzt eine Warnung aus, wenn der Name über ein Modul aufgerufen wird, das ihn nicht definiert (und kein Untermodul hat, das ihn definiert), und der Name in diesem Modul nicht öffentlich ist. Zum Beispiel ist „map“ in Base definiert, und die Ausführung von „LinearAlgebra.map“ in REPL gibt jetzt eine Warnung bei der ersten solchen Aufforderung aus.
      • Bei der Ausgabe des Eingabewertes in REPL wird die Ausgabe jetzt auf 20 KiB gekürzt. Dies hat keinen Einfluss auf manuelle Aufrufe von „show“, „print“ usw.
      • Die Autovervollständigung durch das Symbol „\“ zeigt jetzt das entsprechende Symbol oder Emoji neben jedem entsprechenden Schlüsselwort an.
    • Paket Test
      • Wenn der Testsatz „DefaultTestSet“ fehlschlägt, wird der Zufallszahlengenerator (RNG) dieses Satzes auf dem Bildschirm angezeigt, um das stochastische Problem, das nur vom Zustand des RNG abhängt, zu reproduzieren. Der RNG für den Testsatz kann auch festgelegt werden, indem das Argument „rng“ im Makro „@testset“ übergeben wird: julia using Test, Random @testset rng=Xoshiro(0x2e026445595ed28e, 0x07bb81ac4c54926d, 0x83d7d70843e8bad6, 0xdbef927d150af80b, 0xdbf91ddf2534f850) begin @test rand() == 0.559472630416976 end
    • Paket InteractiveUtils
      • Die neuen Makros „@trace_compile“ und „@trace_dispatch“ dienen zur Ausführung von Ausdrücken mit den Parametern „—trace-compile=stderr —trace-compile-timing“ und „—trace-dispatch=stderr“.
  • Externe Abhängigkeiten
    • Die Datenbank terminal info („terminfo“) ist jetzt standardmäßig in Julia enthalten, was die REPL-Nutzung verbessert, wenn „terminfo“ im System nicht verfügbar ist. Julia kann ohne die Einbettung der Datenbank kompiliert werden, indem der Makefile-Parameter „WITH_TERMINFO=0“ verwendet wird.
  • Verbesserungen der Werkzeuge
    • Der „Wall-Time“-Profiler steht Benutzern zur Verfügung, die einen Profiler benötigen, der Aufgaben unabhängig von ihrem Status (geplant/ausgeführt) erfasst. Dieser Profiler ermöglicht die Profilierung von I/O-intensiven Aufgaben und hilft, Bereiche mit starker Konkurrenz im System zu identifizieren.

Quelle: opennet.ru

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster