Die Veröffentlichung von Julia 1.10 wurde bekannt gegeben. Diese Programmiersprache bietet hohe Leistung, Unterstützung für dynamische Typisierung und integrierte Tools für paralleles Programmieren. Die Syntax von Julia ähnelt MATLAB und enthält Elemente von Ruby und Lisp. Die String-Manipulationsmethoden erinnern 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.
Die wichtigsten Änderungen in Julia 1.10:
- Neue Sprachfeatures
- Ein neuer, verbesserter Parser namens JuliaSyntax.jl ist standardmäßig aktiviert. Um zum alten Parser zurückzukehren, setzen Sie die Umgebungsvariable JULIA_USE_FLISP_PARSER auf 1.
- Die Symbole ⥺ (U+297A, \leftarrowsubset) und ⥷ (U+2977, \leftarrowless) können nun als binäre Operatoren mit der Priorität der Pfeile verwendet werden.
- Änderungen in der Sprache
- Beim Erzeugen von Unteraufgaben wird der lokale RNG (Zufallszahlengenerator) der Elternaufgabe nicht mehr beeinflusst. Das neue Schema zur Initialisierung des Zufallszahlengenerators ähnelt den Implementierungen von SplitMix und DotMix.
- Es wurde eine neue Regel zur Auswahl von Methoden vorgeschlagen, die Mehrdeutigkeiten mit dem Typ „Union{}“ zugunsten einer Methode beseitigt, die explizit zur Verarbeitung des Argumenttyps „Union{}“ definiert ist.
- Das Symbol „h-Bar“ ℏ (\hslash U+210F) wird jetzt als Äquivalent zu ħ (\hbar U+0127) betrachtet.
- Das Makro „@simd“ hat nun eine spezifischere Semantik: Es erlaubt lediglich das Neuordnen und Zusammenfassen von Fließkommaoperationen anstelle der Einbeziehung aller Optimierungen der „schnellen Mathematik @fastmath“. Wenn die Ausführung von Programmen aufgrund dieser Änderung an Leistung verliert, kann das vorherige Verhalten durch „@fastmath @simd“ wiederhergestellt werden.
- Bei der Anzeige des Stacktrace für Methoden mit Schlüsselwörtern wird die textuelle Darstellung der Schlüsselwörter jetzt durch die neue Syntax des Makros „@Kwargs{key1::Type1, …}“ vereinfacht.
- Verbesserungen des Compilers/Laufzeitumgebung
- Der Garbage Collector führt jetzt eine mehrteilige Auswahl von Objekten zur Entfernung durch.
- JITLink wird standardmäßig in Linux-Systemen auf Basis der Architektur aarch64 aktiviert, wenn Julia mit LLVM 15 oder späteren Versionen kompiliert wird.
- Im Prozess der Vorabkompilierung sind PID-Dateien gesperrt. Nur ein Julia-Prozess führt zur gleichen Zeit die Vorabkompilierung durch. Früher arbeiteten alle Prozesse parallel, was das Risiko mit sich brachte, die Kompilierungscache-Dateien durch einen Zustand des Wettlaufs zu beschädigen.
- Änderungen der Befehlszeilenparameter
- Die Option „—gcthreads“ wurde hinzugefügt, um anzugeben, wie viele parallele Threads der Garbage Collector verwenden soll. Standardmäßig ist der Wert auf „N/2“ gesetzt, wobei N die Anzahl der Arbeits-Threads („—threads“) ist, die von Julia verwendet werden.
- Änderungen im Build-System
- Die Module „SparseArrays“ und „SuiteSparse“ sind standardmäßig aus dem System-Image ausgeschlossen. Im Basiskit von Julia befinden sich keine Bibliotheken mehr unter der GPL-Lizenz. Diese Bibliotheken sind jedoch weiterhin zusammen mit der Sprache im Standard-Binärdistributiv enthalten.
- Neue Bibliotheksfunktionen
- „tanpi“ berechnet „tan(π*x“ genauer als „tan(pi*x)“.
- „fourroot(x)“ ist in Base.Math definiert und kann verwendet werden, um die vierte Wurzel von „x“ zu berechnen. Der Kurzname dieser Methode ist das Unicode-Symbol ∜, das mit dem Befehl \fourthroot<tab> eingegeben werden kann.
- Die Funktionen „Libc.memmove“, „Libc.memset“ und „Libc.memcpy“ wurden hinzugefügt, deren Funktionalität der entsprechender C-Aufrufe entspricht.
- Die Methode „Base.isprecompiled(pkg::PkgId)“ wurde hinzugefügt, welche „true“ zurückgibt, wenn das Paket bereits vorab kompiliert wurde.
- Optionen für Bibliotheksfunktionen
- „binomial(x, k)“ unterstützt jetzt auch nicht-ganzzahlige Werte für „x“.
- „CartesianIndex“ wird jetzt als „Skalar“ für die Broadcast-Verteilung betrachtet.
- Die Methode „printstyled“ unterstützt jetzt die Ausgabe in Kursivschrift.
- Die Methoden „parent“ und „parentindices“ unterstützen jetzt den Typ „SubStrings“.
- Die Methode „replace(string,pattern…)“ unterstützt jetzt ein optionales Argument „IO“ für die Ausgabe in einen Stream anstelle der Rückgabe eines Strings.
- Die Methode „startswith“ unterstützt jetzt Eingabe-/Ausgabeströme.
- Änderungen an den Basisbibliotheken.
- Das Schlüsselwort „initialized=true“ wurde aus den Methoden „sortperm!“ und „partialsortperm!“ entfernt, da es zu unsicherem Verhalten führen konnte.
- Bei der Ausgabe von Ganzzahlen vom Typ „Rational“ wird der Nenner jetzt im Kontext typisierter Ströme von „Rational“ (z. B. in Arrays) übersprungen.
- Paket-Manager
- Die Methode „Pkg.precompile“ akzeptiert jetzt „timing“ als Schlüsselargument, um Informationen über die Zeit der Vorkompilierung für jedes Paket anzuzeigen – „Pkg.precompile(timing=true)“.
- LinearAlgebra
- Der Typ «AbstractQ» ist nun kein Subtyp von «AbstractMatrix» mehr. Darüber hinaus umschließt die Methode «adjoint(Q::AbstractQ)» «Q» nicht mehr in den Typ «Adjoint», sondern ersetzt ihn durch «AdjointQ», der selbst ein Subtyp von «AbstractQ» ist. Diese Änderung ist darauf zurückzuführen, dass Instanzen von «AbstractQ» in der Regel wie lineare Operatoren auf Funktionen und Matrizen wirken und nicht indizierbar sind. Zudem können viele Typen von «AbstractQ» mit Vektoren/Matrizen unterschiedlicher Größe arbeiten, wobei sie als Matrix mit kontextabhängiger Größe fungieren. Durch diese Änderung verfügt der Typ «AbstractQ» über eine klar definierte Schnittstelle, die in der Julia-Dokumentation detailliert beschrieben ist.
- Die Ergebnisse der Faktorisierung sind nicht mehr in die Wrapper-Typen «Adjoint» und «Transpose» eingeschlossen. Stattdessen wurden die Typen «AdjointFactorization» und «TransposeFactorization» hinzugefügt, die selbst Subtypen von «Factorization» sind.
- Neue Funktionen «hermitianpart» und «hermitianpart!» zur Bestimmung des hermiteschen (reell symmetrischen) Teils einer Matrix.
- Die Methode «norm» einer transponierten Matrix des Typs «AbstractMatrix» gibt jetzt standardmäßig die Norm der Elternmatrix zurück, was dem aktuellen Verhalten für «AbstractVectors» entspricht.
- Es wurden Methoden zur Berechnung von Eigenvektoren «eigen(A, B)» und «eigvals(A, B)» hinzugefügt, für den Fall, dass einer von A oder B symmetrisch oder hermitesch ist.
- Die Methoden «eigvals/eigen(A, cholesky(B))» berechnen nun die verallgemeinerten Eigenwerte (Eigenwerte und Eigenvektoren) von A und B mithilfe der Cholesky-Zerlegung für positiv definite B.
- Printf
- Die Formatangaben unterstützen jetzt dynamische Breite und Genauigkeit, z.B. «%*s» und «%*.*g».
- REPL
- Beim Drucken des Stack-Traces ist die Tiefe der gedruckten Typen in Funktionssignaturen begrenzt, um eine zu ausführliche Ausgabe zu vermeiden.
- Test
- Das Makro «@test_broken» (oder «@test» mit «broken=true») wirft nun einen Fehler, wenn der Testausdruck nicht false/true zurückgibt.
- Bei einem Fehler beim Aufruf von «@test» oder bei einem Fehler innerhalb der Funktion wird nun ein detaillierter Stack-Trace bereitgestellt, der die Position des Tests in «@testset» anzeigt.
- InteractiveUtils
- «code_native» und «@code_native» verwenden jetzt die Intel-Syntax anstelle von AT&T.
- «@time_imports» zeigt nun die Ausführungszeit von «__init__()» für importierte Module an.
- Veraltete und zur Entfernung vorgesehene Konstrukte.
- Das Makro «@pure» ist veraltet. Stattdessen sollten Sie «Base.@assume_effects :foldable» verwenden.
Quelle: opennet.ru
