Die Veröffentlichung von Julia 1.11, einer Programmiersprache, die hohe Leistung, Unterstützung für dynamische Typisierung und eingebaute Tools für paralleles Programmieren kombiniert, wurde bekannt gegeben. Die Syntax von Julia ähnelt MATLAB und enthält einige Elemente aus Ruby und Lisp. Die Methoden zur String-Manipulation sind Perl ähnlich. Der Quellcode 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.
Die wichtigsten Änderungen in Julia 1.11:
- Neue Sprachfeatures
- Der neue Typ Memory wurde hinzugefügt, der eine niedrigere Ebene als der Typ Array darstellt. Der Typ Memory benötigt weniger Ressourcen und bietet einen schnellen Konstruktor, wobei er eine Alternative zum Array ist, wo nicht der volle Funktionsumfang erforderlich ist, z. B. bei mehrdimensionalen Arrays. In der internen Implementierung sind die meisten Methoden des Typs Array auf dem Typ Memory aufgebaut, was die Ausführung bestimmter Funktionen, wie zum Beispiel push, erheblich beschleunigt hat.
- Das Schlüsselwort „public“ wurde hinzugefügt. Bezeichner, die als „public“ gekennzeichnet sind, gelten als öffentliche Programmierschnittstelle. Bezeichner mit dem Schlüsselwort „export“ werden ähnlich behandelt. Der grundlegende Unterschied zwischen „public“ und „export“ besteht darin, dass Namen, die mit „public“ gekennzeichnet sind, nicht in den Modulkontext einbezogen werden, wenn „using“ in abhängigen Modulen verwendet wird.
- Das Paket ScopedValue implementiert dynamische Sichtbarkeit in der parallelen Programmierung von Threads\/Tasks.
- Die Datei Manifest.toml kann jetzt im Format Manifest-v{major}.{minor}.toml umbenannt werden, um eine bestimmte Julia-Version zu verwenden. Beispielsweise wird die Datei Manifest-v1.11.toml von Version 1.11 verwendet, während die Datei Manifest.toml im selben Verzeichnis von anderen Julia-Versionen verwendet wird.
- Unterstützung für Unicode 15.1 wurde hinzugefügt.
- Änderungen in der Sprache
- Im Precompilierungsprozess wird der „atexit“-Handler vor der Erstellung der Ausgabedatei ausgeführt. Dies ermöglicht es Benutzern, im Hintergrund laufende Prozesse sicher zu beenden (z. B. Timer-Trigger oder regelmäßige Benachrichtigungen) sowie Ressourcen explizit vor dem Programmabbruch freizugeben.
- Code Coverage- und Speicherauslagerungsdateien werden während der Vorkompilierung nicht mehr erstellt. Zudem werden in diesen Modi die pkgimage-Caches für Pakete verwendet, die ebenfalls nicht verfolgt werden. Das bedeutet, dass die Coverage-Tests (standardmäßig für julia-actions/julia-runtest) die pkgimage-Caches für alle anderen abhängigen Pakete, von denen der Test abhängt, nutzen. Dies beschleunigt die Testdurchführung.
- Die Angabe des Pfades in JULIA_DEPOT_PATH wird jetzt anders behandelt. Bei nur einem Pfad wird dieser allein in die interne Variable DEPOT_PATH übernommen. Ist das letzte Zeichen ein «:», erhält die Variable DEPOT_PATH den Wert, der alles enthält, was vor dem «:» angegeben wurde, sowie eine Liste der Systempfade, in denen Julia zu finden ist.
- Vorkompilierungs-Cache-Dateien können jetzt verschoben werden, und ihre Gültigkeit wird anhand des Hashs des Inhalts der Quelldateien überprüft, statt durch «mtime».
- Verbesserungen des Compilers/Laufzeitumgebung
- Die Heuristik des Garbage Collectors wurde aktualisiert, um mit Speicherseiten insgesamt anstatt mit einzelnen Objekten zu arbeiten.
- Unterstützung für die Annotierung von Base.@assume_effects im Code hinzugefügt.
- Änderungen der Befehlszeilenparameter
- Der Einstiegspunkt ist jetzt streng als Main.main(args) definiert. Der Einstiegspunkt muss mit dem @main-Makro definiert werden (siehe Dokumentation). Wenn der Einstiegspunkt in einem Skript festgelegt ist, das über die Kommandozeile ausgeführt wird (z. B. „julia script.jl“ oder „julia -e expr“), wird die Main.main-Funktion automatisch von Julia aufgerufen. Dies dient der Vereinheitlichung der Skriptausführung und -kompilierung, wobei der Code möglicherweise zur Kompilierung geladen wird, während die Main.main-Methode nur beim Start der ausführbaren Datei ausgeführt wird. Bei Verwendung von Julia im interaktiven Modus gibt es keine Änderungen. Der gesamte Code wird sequenziell ausgeführt. Die Argumente „—compiled-modules“ und „—pkgimages“ können auf den Modus existing gesetzt werden, der Julia anweist, vorhandene Caches zu verwenden, aber keine neuen zu erstellen.
- Das Argument „—project“ kann jetzt den Wert @script annehmen, um den Standort der Datei Project.toml relativ zum ausgeführten Skript anzugeben. Zum Beispiel „—project=@script/foo“ für das Unterverzeichnis foo. Wenn nichts angegeben wird, also „—project=@script“, ist dies gleichbedeutend mit „—project=@.“, wenn die Datei Project.toml im aktuellen Verzeichnis gesucht wird.
- Multithreading-Änderungen
- Im Makro Threads.@threads können Sie den Planungsmodus :greedy angeben, der für ungleichmäßige rechnerische Lasten praktisch ist. Die neue Struktur (mit dem Spezifizierer public, aber nicht export) „struct Base.Lockable{T, L<:AbstractLock}“ ist eine Wrapper-Klasse zur Anordnung des parallelen Zugriffs auf Elemente zusammengesetzter Typen, was den Code insgesamt vereinfacht.
- Änderungen im Build-System
- Die Makefile-Datei zum Bauen von Julia und LLVM nutzt die Optimierungsstrategien PGO und LTO. Siehe contrib/pgo-lto/Makefile.
- Neue Bibliotheksfunktionen
- Drei neue Typen im Rahmen der Idee von annotiertem Text wurden hinzugefügt — Pair{Symbol, Any}, zum Beispiel ‚:lang => „en“‘ oder ‚:face => :magenta‘. Wenn möglich, werden die Anmerkungen während der Bearbeitung von Strings, beispielsweise bei der Verkettung, beibehalten.
- Der spezifische Typ AnnotatedString implementiert AbstractString. Dieser Typ ist ein Wrapper um einen String, der es ermöglicht, Annotationen über einen Zeichenbereich hinzuzufügen. Der Typ AnnotatedString wird in der neuen Standardbibliothek StyledStrings häufig verwendet, um Informationen stilvoll auf dem Bildschirm anzuzeigen.
- Der spezifische Typ AnnotatedChar implementiert AbstractChar. Er ist ein Wrapper um ein Zeichen und ermöglicht das Anhängen einer Liste von Anmerkungen daran.
- Der spezifische Typ AnnotatedIOBuffer implementiert IO, spiegelt die Schnittstelle des Typs IOBuffer wider, hat jedoch spezialisierte Lese-/Schreibmethoden zum Annotieren des Streams. Er kann als String-Builder oder als Mittel zur Verknüpfung annotierter und nicht annotierter Strings verwendet werden.
- Die Methode „in!(x, s::AbstractSet)“ gibt immer true zurück. Wenn jedoch das Element x nicht in s enthalten ist, wird es hinzugefügt.
- Die neue Funktion Libc.mkfifo ist eine Wrapper-Funktion für die C-Funktion mkfifo auf Unix-Plattformen.
- Die Methode „logrange(start, stop; length)“ erstellt eine logarithmische Sequenz mit der angegebenen Anzahl an Werten, anstelle eines festen Schrittes.
- Die Methoden „copyuntil(out, io, delim)“ und „copyline(out, io)“ kopieren Daten aus dem Stream io in den Stream out::IO.
- Die Methode „eachrsplit(string, pattern)“ gibt einen Iterator für die von rechts nach links zerlegten Elemente des Strings zurück.
- Die Methode Sys.username() gibt den aktuellen Benutzernamen zurück.
- Die Methoden Sys.isreadable(), Sys.iswritable() können verwendet werden, um die Lese- und Schreibberechtigungen des Benutzers zu überprüfen.
- Die Methode GC.logging_enabled() gibt true zurück, wenn das Logging der Garbage-Collector-Operationen über GC.enable_logging aktiviert ist.
- Der Typ IdSet wird jetzt von Base exportiert und ist öffentlich zugänglich.
- Das Makro «@time» meldet jetzt den Wert des Konfliktzählers bei Sperren, wenn ein ReentrantLock verwendet werden muss. Außerdem wurde das Makro «@lock_conflicts» hinzugefügt, das diesen Zähler zurückgibt.
- Das Makro Base.Cartesian.@ncallkw wurde analog zu Base.Cartesian.@ncall entwickelt, ermöglicht jedoch die Hinzufügung von Argumenten in Form von Schlüsselwörtern für den Funktionsaufruf.
- Die neue Funktion Docs.hasdoc(module, symbol) gibt an, ob der angeforderte Name symbol eine Docstring-Beschreibung hat.
- Die neue Funktion Docs.undocumented_names(module) gibt die Namen der nicht dokumentierten Funktionen des angeforderten Moduls module zurück.
- Neue Funktionen bekannter Methoden
- Die Methode invmod(n, T) für den vordefinierten ganzzahligen Typ T berechnet jetzt das modulare Inverse von n mit einem neuen Algorithmus.
- Die Methode invmod(n) bietet eine verkürzte Form für den Aufruf invmod(n, typeof(n)) für Ganzzahltypen.
- Die Methode replace(string, pattern…) unterstützt jetzt ein optionales IO-Argument, um den Wert in einen Stream zurückzugeben, anstatt einen String zurückzugeben.
- Neue Methoden allequal(f, itr) und allunique(f, itr) mit einem Prädikatfunktionsargument.
- Die Methode sizehint!(s, n) unterstützt jetzt die Option «shrink», um das Abschneiden von Elementen zu deaktivieren.
- Die Übertragung von IOBuffer als Argument von stdout bei der Erzeugung von Prozessen funktioniert jetzt mit vollständiger Synchronisation durch „wait“ oder „success“, sodass im Base.BufferStream keine Verfügbarkeitsprüfung mehr erforderlich ist.
- Die Methode „closewrite“ wird nach dem Schließen des Prozesses nun nicht mehr automatisch für den übergebenen Stream aufgerufen. Verwenden Sie die Methode „wait“ für den Prozess und rufen Sie anschließend „closewrite“ manuell auf. Alternativ können Sie die open-Methode mit Funktionen verwenden, um das Schließen automatisch zu behandeln.
- Die Methode „@timed“ gibt jetzt zusätzlich eine Schätzung der Kompilierungs- und Rekompilierungszeit zurück, die durch die Instabilität von Typen verursacht wird.
- Die Methode „filter“ kann nun mit NamedTuple arbeiten.
- Die Methode Iterators.cycle(iter, n) wird n Mal auf dem Iterator „iter“ ausgeführt.
- Die Methode zero(::AbstractArray) wird rekursiv angewendet, zum Beispiel generiert zero([[1,2],[3,4,5]]) [[0,0],[0,0,0]] anstelle eines Fehlers.
- Die Methode include_dependency(path; track_content=true) fügt Abhängigkeiten basierend auf dem Hash-Wert des vorkompilierten Codes hinzu, nicht basierend auf mtime.
- Änderungen in der Basisbibliothek
- Die Methode write(::IO, ::AbstractArray) wird verwendet, um die Methoden „write“ rekursiv für jedes Element des Arrays aufzurufen, speichert aber jetzt die Darstellung im Speicher für jeden Wert. Zum Beispiel wird der Aufruf write(io, ‘a’:’b’) 4 Bytes für jedes Zeichen schreiben, anstatt der kompakten UTF-8-Darstellung für jeden von ihnen. Das neue Format ist mit Array kompatibel und macht es möglich, die Methode „read!“ für das Rücklesen von Werten zu verwenden.
- Es kann keine Methode „length“ für Iteratoren mit Zustand im Allgemeinen definiert werden. Aufgrund der potenziellen Fehlfunktion von Stateful-Iteratoren wurde die Methode length(::Stateful) entfernt.
- StyledStrings
- Eine neue Standardbibliothek für die stilisierte Darstellung von Strings.
- Die Struktur Faces ist ein Container für Stilinformationen (Farbe, Dekoratoren usw.) und bietet außerdem ein bequemes, erweiterbares (über addface!) und anpassbares (unter Verwendung benutzerdefinierter Faces.toml und loadfaces!) Gerüst zur stilvollen Darstellung von Inhalten.
- Das Makro @styled_str bietet eine bequeme Möglichkeit, annotierte Strings AnnotatedString mit verschiedenen Stil-Attributen zu erstellen. Zum Beispiel: StyledStrings.addface!(:orange => StyledStrings.Face(foreground = 0xFF7700)) styled«{orange:this is orange text}»
- Libdl
- Ein neuer Typ der LazyLibrary wird aus der Libdl-Bibliothek exportiert, um lazy loading von Bibliotheken zu erstellen, das ursprünglich im JLL-Format verwendet wird.
- LinearAlgebra
- Die Methode cbrt(::AbstractMatrix{<:Real}) gibt jetzt eine Matrix der reellen Werte der Quadratwurzeln der Eingabematrix von reellen Werten zurück.
- Die Methode zur Berechnung der Eigenwerte «eigvals/eigen(A, bunchkaufman(B)) und eigvals/eigen(A, lu(B))» verwendet die Bunchkaufman (LDL) und LU Dekomposition von B, um die allgemeinen Eigenwerte (Eigenwerte: und Eigenvektoren) von A und B effizient zu berechnen. Der zweite Parameter der Methode übergibt das Ergebnis der Methoden bunchkaufman oder lu.
- Die spezialisierte Methode «eigvals/eigen(::Hermitian{<:Tridiagonal})» ist für symmetrische tridiagonale Matrizen vorgesehen und nutzt LAPACK-Tools.
- Strukturierte Matrizen behalten jetzt die Achsen der Eltern (für Symmetrisch/Hermitian/AbstractTriangular/UpperHessenberg) oder die Achsen der Hauptdiagonalen (für bandmatrizen).
- Die Methoden bunchkaufman und bunchkaufman! sind jetzt für die Typen AbstractFloat, Rational und deren komplexe Variationen definiert. Die Methode bunchkaufman unterstützt nun auch die Typen Integer, indem sie diese intern zu Rational{BigInt} konvertiert. Eine Funktion inertia wurde hinzugefügt, die die Trägheit des Diagonalfaktors des BunchKaufman-Verfahrens für Objekte reeller symmetrischer oder hermitescher Matrizen berechnet. Für komplexe symmetrische Matrizen berechnet die Methode inertia nur die Anzahl der Eigenwerte des Diagonalfaktors.
- Pakete, die die Methode der Matrixmultiplikation mul! mit der Signatur mul!(::AbstractMatrix, ::MyMatrix, ::AbstractMatrix, ::Number, ::Number) definieren, werden keine Mehrdeutigkeiten mehr haben, wenn sie mit dem Paket LinearAlgebra interagieren. Früher gab es Mehrdeutigkeiten beim Multiplizieren zwischen dem benutzerdefinierten Matrizen-Typ MyMatrix und den strukturierten Matrizen, die vom Paket LinearAlgebra bereitgestellt wurden, wie z.B. AbstractTriangular. Solche Probleme wurden für die Multiplikationsoperationen mit Typen Matrix-Vektor behoben.
- Die Methoden lu und issuccess(::LU) unterstützen jetzt das Argument allowsingular. Wenn es den Wert true hat, wird eine zulässige Faktorisierung mit einer U-Faktorisierung mit unzureichendem Rang als erfolgreich betrachtet, anstatt einen Fehler auszugeben. Solche Faktorisierungen werden jetzt durch das Drucken der Faktoren zusammen mit der Kennzeichnung „rank-deficient“ anstelle der Meldung „Failed Factorization“ angezeigt.
- Zufällig
- Die Methode rand ist jetzt auf Typen anwendbar, die in Form eines Tuple übergeben werden.
- Die Methode rand ist jetzt auf Typen anwendbar, die als Pair übergeben werden.
- Für den ersten Start des Zufallszahlengenerators RNG des Random-Moduls können jetzt negative Zahlen verwendet werden.
- Die Initialisierung des Zufallszahlengenerators kann jetzt über einen String erfolgen, beispielsweise seed!(rng, "a random seed").
- REPL
- Das Drücken der Tab-Taste zum Abschluss der Eingabeaufforderung wird jetzt in hellerer Schrift hervorgehoben. Um diesen Modus auszuschalten, wenden Sie interaktiv oder in einem Skript startup.jl Folgendes an: if VERSION >= v"1.11.0-0" atreplinit() do repl repl.options.hint_tab_completes = false end end
- Meta-M mit einer leeren Eingabeaufforderung wechselt jetzt das Kontextmodul zwischen dem vorherigen nicht-hauptmäßigen Kontextmodul und dem Hauptmodul, was das Hin- und Herwechseln erleichtert.
- Daten
- Die undocumented Funktion adjust wird nicht mehr exportiert, ist aber dokumentiert.
- Statistiken
- Das Paket Statistics ist nun ohne das gesamte Julia-Paket aktualisierbar.
- Verteilt
- Die Methode pmap verwendet jetzt standardmäßig CachingPool.
- Veraltete und entfernte Methoden
- Die Methoden Base.map, Iterators.map und foreach mit nur einem Argument werden nicht mehr unterstützt.
- Externe Abhängigkeiten
- Die Bibliothek libuv wurde von Version 1.44.2 auf 1.48.0 aktualisiert.
- Die Methode tput wird nicht mehr verwendet, um die Terminalfähigkeiten zu überprüfen. Sie wurde durch Parsing-Methoden für terminfo ersetzt, die vollständig in Julia implementiert sind.
- Terminfo wird standardmäßig verwendet. Wenn es im System nicht vorhanden ist, kann Julia mit der Makefile-Option WITH_TERMINFO=0 kompiliert werden.
- Verbesserungen der Werkzeuge
- CI führt nun eine eingeschränkte automatische Typprüfung in allen Merge-Anfragen durch.
Quelle: opennet.ru
