Die Veröffentlichung der Programmiersprache Julia 1.7 verbindet hohe Leistung, Unterstützung für dynamische Typisierung und integrierte Werkzeuge für parallelisierte Programmierung. Die Syntax von Julia ähnelt MATLAB, wobei einige Elemente aus Ruby und Lisp übernommen wurden. Die Methode zur Manipulation von Zeichenfolgen erinnert 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.
Neue Funktionen der Programmiersprache Julia 1.7:
- Eine neue Syntax zur Erstellung multidimensionaler Arrays. Semikolons werden verwendet, um die Dimensionen des Arrays zu trennen, wobei die Anzahl der Semikolons die Größe angibt. Zum Beispiel bedeutet ein Semikolon in „[A; B]“ eine Verkettung in der ersten Dimension (vertikal in einem eindimensionalen Array), zwei Semikolons „[A;; B]“ tätigen dies in der zweiten Dimension (horizontal als neue Zeile der Matrix), drei Semikolons „;;;“ in der dritten und so weiter.
- Ein umgekehrter Schrägstrich (\) am Ende einer Zeile innerhalb eines Zeichenliterals entfernt nun das Zeilenumbruchzeichen und die Einrückungen. Dies kann verwendet werden, um lange Zeilen in mehrere Codezeilen zu teilen, ohne zusätzliche Zeichen hinzuzufügen.
- Der umgekehrte Schrägstrich vor einer neuen Zeile in den Literalen zum Starten von Konsolenkommandos `cmd \…` entfernt jetzt immer den Zeilenumbruch und interpretiert die Sequenz als kontinuierliches Zeichenliteral, während das Ergebnis zuvor nicht eindeutig definiert war.
- Der Ausdruck «(; a, b) = x» erzeugt separate Variablen a und b aus x. Diese Syntax ist equivalent zu «a = getproperty(x, :a); b = getproperty(x, :b)».
- Implizite Multiplikation ist jetzt für Wurzelsymbole erlaubt (z.B. x√y und x∛y).
- Logische Operatoren «&&» und «||» können jetzt auch auf Arrays angewendet werden in der Form «.&&» und «.||».
- Die Operatoren ⫪(U + 2AEA, \Top, \downvDash) und ⫫(U + 2AEB, \Bot, \upvDash, \indep) können jetzt als binäre Operatoren verwendet werden.
- Eine Option «—check-bounds=yes|no|auto» wurde hinzugefügt, um die @inbounds-Makros mit dem Standardwert auto zu steuern.
Änderungen der Sprache
- Der standardmäßig verwendete Pseudo-Zufallszahlengenerator wurde von Mersenne Twister auf Xoshiro256++ geändert. Daher sind alle Zufallszahlen verschieden (selbst bei derselben Startzahl), es sei denn, es wird ein explizites RNG-Objekt verwendet. Der neue Generator bietet eine bessere Leistung, hervorragende statistische Eigenschaften und wird für reproduzierbare Zufälligkeiten in Multithreading-Programmen eingesetzt (er speichert den Zustand für jede laufende Aufgabe und verzweigt einen separaten Zustand bei der Erstellung einer neuen Aufgabe).
- Die Destrukturierung ändert die Werte während der Zuweisung auf der linken Seite nicht mehr, wenn Werte von der rechten Seite des Ausdrucks abgerufen werden. Zum Beispiel wird für das Array x der Ausdruck „x[2], x[1] = x“ nun das erste und zweite Element von x vertauschen, während zuvor für die Zuweisung beider Einträge x[1] verwendet wurde, weil x[2] während der Zuweisung von x verändert wurde.
- macroexpand, @macroexpand und @macroexpand1 erzeugen keinen LoadError mehr. @test_throws wurde ebenfalls geändert, um die betroffenen Tests weiterhin funktionsfähig zu halten.
- Der Mittelwert „·“ (\cdotpU + 00b7) und das griechische Satzzeichen · (U + 0387) werden jetzt als Äquivalent zum Operator „⋅“ (\cdotU + 22c5) behandelt.
- Das Minuszeichen „−“ (\minusU + 2212) wird jetzt als Äquivalent zum Gedankenstrich „-“ (U + 002d) betrachtet.
- Iterators.peel(itr) gibt jetzt „nothing“ zurück, wenn itr leer ist, anstatt eine BoundsError-Ausnahme auszulösen.
- Mehrere aufeinanderfolgende Semikolons in einem Array-Ausdruck wurden zuvor ignoriert (zum Beispiel „[1 ;; 2] == [1 ; 2]“). Jetzt wird diese Syntax verwendet, um Dimensionen zu trennen.
- Unbalancierte Formatierungsanweisungen „#= … =#“ in Unicode sind jetzt in Strings und Kommentaren verboten, um die Wahrscheinlichkeit von parse/eval Code-Injektionen zu verringern.
Änderungen der Befehlszeilenparameter
- Der julia-Parameter —project und die Umgebungsvariable JULIA_PROJECT unterstützen jetzt die Auswahl gemeinsamer Umgebungen. Beispielsweise sind jetzt julia —project=@myenv und export JULIA_PROJECT=„@myenv“ äquivalent.
Änderungen der Multithreading-Funktionen
- Interne Funktionen für Operationen mit atomaren Zeigern sind jetzt für bestimmte Bytegrößen definiert.
- Die Unterstützung für das deklarieren und verwenden separater Felder für mutable struct als atomare wurde hinzugefügt; siehe den neuen Makro @atomic.
- Wenn die Umgebungsvariable JULIA_NUM_THREADS den Wert „auto“ hat, entspricht die Anzahl der Threads der Anzahl der CPU-Threads.
- Jedes Task-Objekt besitzt einen lokalen Zustand des Zufallszahlengenerators, der standardmäßig reproduzierbare (nicht von der Planung abhängige) Ausführung des parallelen Simulationscodes ermöglicht. Der Standardgenerator arbeitet auch parallel deutlich schneller als in früheren Versionen.
- Aufgaben können nun zwischen Threads verschoben werden. Zuvor wurde eine Aufgabe immer in dem Thread ausgeführt, der sie zuerst gestartet hat.
Neue Funktionen der Bibliothek
- Die Methoden findmax(f, domain), argmax(f, domain) und die entsprechenden „min“-Versionen mit zwei Argumenten wurden hinzugefügt.
- isunordered(x) gibt true zurück, wenn x ein Wert ist, der nicht geordnet sein sollte, z. B. NaN oder missing.
- Die neue Funktion keepat!(vector, inds), die äquivalent zu vector[inds] ist, wobei inds eine Liste von Ganzzahlen ist.
- Die Methode lock(f, lck) für zwei Argumente akzeptiert nun Channel als zweiten Argument.
- Der neue Funktor Returns(value) gibt value für beliebige Argumente zurück.
- Neue Makros @something und @coalesce, die Versionen von something und coalesce sind, wurden hinzugefügt.
- Neue Funktion redirect_stdio zur Umleitung von stdin, stdout und stderr.
- Das neue Makro „Base.@invoke f(arg1::T1, arg2::T2; kwargs…)“ bietet eine einfache Syntax für den Aufruf von „invoke(f, Tuple{T1,T2}, arg1, arg2; kwargs…)“.
- Das neue Makro „Base.@invokelatest f(args…; kwargs…)“ ermöglicht eine bequeme Möglichkeit, „Base.invokelatest(f, args…; kwargs…)“ aufzurufen.
Neue Funktionen der Bibliothek
- Ein Tupel kann mit dem Schlüsselwort context im Format „:key => value“ erstellt werden, um Attribute für die Übertragung an IOContext anzugeben.
- bytes2hex und hex2bytes sind nicht mehr auf Argumente vom Typ „Union{String,AbstractVector{UInt8}}“ beschränkt und verlangen jetzt nur, dass die Typen Sequenzen sind und eine berechenbare Länge haben.
- stat(file) hat eine detailliertere und benutzerfreundlichere show-Methode erhalten.
Änderungen an der Standardbibliothek.
- count und findall akzeptieren jetzt AbstractChar-Argumente zur Suche nach Zeichen in Strings.
- Neue Methoden range(start, stop) und range(start, stop, length).
- range unterstützt jetzt start als optionales Schlüsselargument.
- Einige Operationen mit Bereichen geben jetzt StepRangeLen anstelle von StepRange zurück, wodurch ein Nullschritt möglich ist. Früher gab λ .* (1:9) einen Fehler aus, wenn λ = 0 war.
- islowercase und isuppercase behandeln jetzt Unicode-Kategorien von Klein- und Großbuchstaben.
- Die Funktionen iseven und isodd unterstützen jetzt Typen, die von Integer abweichen.
- escape_string akzeptiert jetzt eine Zeichenauswahl über das Schlüsselwort keep für Zeichen, die unverändert bleiben sollen.
- getindex für NamedTuple akzeptiert jetzt ein Tuple von Zeichen zur Indizierung mehrerer Werte.
- Die Subtypen von AbstractRange folgen dem allgemeinen Verhalten der Array-Indizierung bei Bool-Indexierung, weisen Fehler für Bool-Skalarwerte auf und behandeln Bool-Arrays (einschließlich Bereiche) als logische Indizes.
- keys(::RegexMatch) gibt die Namens- oder Indexschlüssel von Capture-Gruppen des regulären Ausdrucks zurück, wenn keine Namen vorhanden sind.
- keys(::Generator) gibt die Schlüssel des Iterators zurück.
- RegexMatch ist jetzt durch Iteration verfügbar und gibt gefangene Teilstrings zurück.
- lpad/rpad sind für textwidth definiert.
- Test.@test akzeptiert jetzt benannte Argumente broken und skip, die das Verhalten von Test.@test_broken und Test.@test_skip wiederholen, aber das Überspringen von Tests ermöglichen, die nur unter bestimmten Bedingungen fehlschlagen. Zum Beispiel kann if T == Float64 @test_broken isequal(complex(one(T)) / complex(T(Inf), T(-Inf)), complex(zero(T), zero(T))) else @test isequal(complex(one(T)) / complex(T(Inf), T(-Inf)), complex(zero(T), zero(T))) end durch @test isequal(complex(one(T)) / complex(T(Inf), T(-Inf)), complex(zero(T), zero(T))) broken=(T == Float64) ersetzt werden.
- @lock wird jetzt aus Base exportiert.
- Die experimentelle Funktion Base.catch_stack() wurde in current_exceptions() umbenannt und hat einen spezifischen Rückgabewerttyp erhalten.
- Einige trigonometrische Funktionen (sind, cosd, tand, asind, acosd, asecd, acscd, acotd, atand) akzeptieren nun eine quadratische Matrix.
- replace(::String) akzeptiert nun mehrere Muster, die gleichzeitig von links nach rechts angewendet werden, sodass nur ein Muster auf jedes Zeichen angewendet wird, und die Muster werden nur auf den Eingangstext angewendet, jedoch nicht auf deren aufeinanderfolgende Ersetzungen.
- Die Funktion length prüft bei bestimmten Typen in festgelegten Bereichen nicht mehr auf ganzzahlige Überläufe in den meisten Fällen. checked_length ist eine neue Funktion, die überprüfte Arithmetik bis zum Überlaufpunkt verwendet, wenn das Ergebnis einen Übertrag haben kann. Alternativ verwenden Sie das Paket SaferIntegers.jl, wenn ein Überlaufrisiko besteht.
- Neue replace-Methoden zum Ersetzen von Elementen in Tuples.
Paket-Manager
- Im Konsolenmodus „julia>“ wird bei using- oder import-Paketen, die nicht installiert, aber im Register „pkg> add“ verfügbar sind, vorgeschlagen, das Paket automatisch zu installieren.
- Die Manifest.toml verwendet ein neues Format mit neuen Metadaten, einschließlich der Julia-Version, die das Manifest generiert hat. Manifeste im alten Format werden weiterhin im ursprünglichen Format unterstützt, solange der Benutzer Pkg.upgrade_manifest() nicht ausführt.
- «pkg> precompile» wird jetzt neue Versionen bereits geladener Pakete vorab kompilieren, anstatt sie auf die nächste Sitzung zu verschieben.
- Die Befehle «pkg> rm, pin und free» unterstützen jetzt das Argument «—all», um die Aktion für alle Pakete gleichzeitig auszuführen.
- Register, die von Pkg Server (nicht git) geladen wurden, werden nicht mehr in Dateien entpackt, sondern direkt aus dem Archiv im Speicher gelesen. Um diese Funktion zu deaktivieren, setzen Sie die Umgebungsvariable JULIA_PKG_UNPACK_REGISTRY=true.
- Jetzt kann eine externe ausführbare Datei git anstelle der Standardbibliothek libgit2 für Downloads verwendet werden, die über das Git-Protokoll erfolgen, indem Sie die Umgebungsvariable JULIA_PKG_USE_CLI_GIT=true setzen.
- Register, die von Server Pkg (nicht git) geladen wurden, gelten nun als unveränderlich. Manuelle Änderungen an ihren Dateien werden möglicherweise nicht von der laufenden Pkg-Sitzung akzeptiert.
- Das Hinzufügen von Paketen nach Katalognamen im REPL-Modus erfordert jetzt die Angabe von „./“ im Namen, wenn das Paket im aktuellen Verzeichnis liegt; zum Beispiel „add ./Package“ anstelle von „add Package“. Dies wurde eingeführt, um Verwirrung zwischen dem Paketnamen Package und dem lokalen Verzeichnis Package zu vermeiden.
- Das Schlüsselwort mode für PackageSpec wurde entfernt.
Lineare Algebra
- Verwenden Sie Libblastrampoline, um BLAS und LAPACK zur Laufzeit zu verbinden. Standardmäßig wird OpenBLAS mit der Julia-Distribution geliefert. Der neue Verbindungsmechanismus kann verwendet werden, um BLAS und LAPACK durch benutzerdefinierte Einstellungen zu ersetzen.
- Auf aarch64 verwendet OpenBLAS jetzt ILP64 BLAS, ebenso wie alle anderen 64-Bit-Plattformen.
- OpenBLAS wurde auf Version 0.3.13 aktualisiert.
- SuiteSparse wurde auf Version 5.8.1 aktualisiert.
- Die Struktur der UpperHessenberg-Matrix bleibt bei bestimmten arithmetischen Operationen, wie zum Beispiel der Multiplikation oder Division mit einer UpperTriangular-Matrix, erhalten.
- Reelle quasi-trianguläre Schur-Faktorisierungen können jetzt mit dem Ausdruck „Schur{Complex}(S)“ in die komplexe obere Dreiecksform umgewandelt werden.
- cis(A) unterstützt jetzt Matrizen als Argumente.
- dot unterstützt UniformScaling für den Typ AbstractMatrix.
- qr[!] und lu[!] unterstützen jetzt Werte des Typs LinearAlgebra.PivotingStrategy als optionales pivot-Argument: Standardwerte qr(A, NoPivot()) im Vergleich zu qr(A, ColumnNorm()) mit Pivotierung und lu(A, RowMaximum()) im Vergleich zu lu(A, NoPivot()) ohne Pivotierung. Frühere Val{true/false} Aufrufe sind veraltet.
- det(M::AbstractMatrix{BigInt}) ruft det_bareiss(M) auf, das den Bareiss-Algorithmus zur Berechnung genauer Werte verwendet.
REPL
- Lange Zeichenfolgen werden jetzt mit der Syntax „head“ ⋯ 12345 Bytes ⋯ „tail“ bei der Anzeige in REPL entfernt.
- Das Einfügen von Repl-Beispielen aus der Zwischenablage in REPL unterstützt jetzt alle Repl-Modi (julia, pkg, shell, help?) und wechselt automatisch den Modus.
- „help?>“ für Module ohne Dokumentationszeilen gibt jetzt eine Liste exportierter Namen zurück und zeigt den Inhalt der zugehörigen README.md an, wenn diese gefunden wird.
SparseArrays
- Neue Methode sizehint!(::SparseMatrixCSC, ::Integer)\.
- cholesky() bewahrt jetzt vollständig die vom Benutzer angegebene Permutation.
- issparse wird jetzt einheitlich auf alle Wrapper-Arrays angewendet, einschließlich verschachtelter, indem überprüft wird, ob das übergeordnete Wrapper-Array issparse ist.
Datum-Manipulationen
- Die Funktion Dates.periods kann verwendet werden, um Vector-Werte aus Period aus CompoundPeriod zu erhalten.
Downloads
- Wenn der Cookie-Header in der umgeleiteten Anfrage gesetzt ist, wird der Cookie jetzt in nachfolgenden Anfragen gesendet.
- Wenn die Datei ~/ .netrc existiert, wird sie als Quelle für Passwörter für Websites mit Authentifizierung verwendet.
- Die Indikation des Servernamens erfolgt jetzt bei allen TLS-Verbindungen, selbst wenn die Identität des Servers nicht überprüft wurde (siehe NetworkOptions).
- Bei der Überprüfung von TLS-Verbindungen in Windows, falls der Server das Zertifikat-Revocation-System nicht verfügbar ist, wird die Verbindung zugelassen; dies entspricht dem Verhalten anderer Anwendungen und der Art, wie die Widerrufprüfungen in macOS durchgeführt werden.
- Es gibt jetzt eine Wartezeit von 30 Sekunden für die Verbindungsfeststellung und 20 Sekunden für den Datentransfer. Dies stellt sicher, dass Verbindungen aktiv sind, andernfalls werden sie innerhalb von weniger als einer Minute getrennt.
Tar
- Tar.extract ignoriert jetzt den genauen Berechtigungsmodus im Tarball und normalisiert die Modi auf die gleiche Weise, wie es Tar.create tut. Dies ist ähnlich wie bei git.
- Funktionen, die tar-Archive verwenden, verarbeiten jetzt harte Links: Das Ziel des Links muss eine zuvor angesehene Datei sein; Tar.list listet einen Eintrag mit dem Typ :hardlink und dem Feld .link auf, das auf das Ziel verweist; andere Funktionen — Tar.extract, Tar.rewrite, Tar.tree_hash — verwandeln den harten Link in eine Kopie der Ziel-Datei.
- Das von Tar.create und Tar.rewrite erstellte Standardformat umfasst nun Einträge für nicht leere Verzeichnisse. Einige Werkzeuge, die tarballs verwenden (einschließlich Docker), sind aufgrund des Fehlens dieser Einträge im Verzeichnis verwirrt.
- Tar akzeptiert jetzt tarballs mit führenden Leerzeichen in den achtzehner Ganzzahlfeldern des Headers: technisch gesehen ist dies ein ungültiges Format gemäß der POSIX-Spezifikation, aber alte tar-Befehle auf Solaris erzeugten solche Archive, daher kommt dieses Format tatsächlich in der Natur vor und es scheint unbedenklich zu sein, es anzunehmen.
- Tar.extract akzeptiert jetzt das Schlüsselwort-Argument set_permissions, das standardmäßig auf true gesetzt ist; wenn false stattdessen übergeben wird, werden die Berechtigungen der extrahierten Dateien beim Extrahieren nicht geändert.
Mmap
- mmap wird jetzt exportiert und ist zur Verwendung verfügbar.
DelimiterDateien
- Readdlm verwendet jetzt standardmäßig use_mmap=false in allen Betriebssystemen, um eine stabile Zuverlässigkeit in abnormalen Situationen mit dem Dateisystem zu gewährleisten.
Quelle: opennet.ru
