Veröffentlichung der Programmiersprache Julia 1.8

Die Veröffentlichung der Programmiersprache Julia 1.8 ist verfügbar und vereint Eigenschaften wie hohe Leistung, Unterstützung für dynamisches Schreiben und integrierte Tools für die parallele Programmierung. Julias Syntax ähnelt MATLAB und übernimmt einige Elemente von Ruby und Lisp. 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.8:

  • Neue Sprachfunktionen
    • Felder einer veränderlichen Struktur können jetzt als Konstanten annotiert werden, um zu verhindern, dass sie geändert werden, und um eine Optimierung zu ermöglichen.
    • Typanmerkungen können zu globalen Variablen hinzugefügt werden.
    • Leere n-dimensionale Arrays können mit mehreren Semikolons in eckigen Klammern erstellt werden, zum Beispiel erstellt „[;;;]“ ein 0x0x0-Array.
    • Try-Blöcke können jetzt optional einen else-Block haben, der unmittelbar nach dem Hauptteil ausgeführt wird, wenn keine Fehler ausgegeben wurden.
    • @inline und @noinline können innerhalb eines Funktionskörpers platziert werden, sodass Sie eine anonyme Funktion mit Anmerkungen versehen können.
    • @inline und @noinline können jetzt auf eine Funktion in einer Aufrufstelle oder einem Block angewendet werden, um zu erzwingen, dass die entsprechenden Funktionsaufrufe einbezogen (oder nicht eingeschlossen) werden.
    • Als Identifikationszeichen sind ∀, ∃ und ∄ zulässig.
    • Unterstützung für die Unicode 14.0.0-Spezifikation hinzugefügt.
    • Mit der Methode Module(:name, false, false) können Sie ein Modul erstellen, das keine Namen enthält, weder Base noch Core importiert und keinen Verweis auf sich selbst enthält.
  • Sprachänderungen
    • Neu erstellte Task-Objekte (@spawn, @async usw.) verfügen jetzt bei der Erstellung über „world_age“ für Methoden der übergeordneten Task, was eine optimierte Ausführung ermöglicht. Die vorherige Aktivierungsoption ist mit der Base.invoketest-Methode verfügbar.
    • Unicode-unausgeglichene bidirektionale Formatierungsanweisungen sind jetzt in Zeichenfolgen und Kommentaren verboten, um Injektionen zu vermeiden.
    • Base.ifelse ist jetzt als generische Funktion und nicht als integrierte Funktion definiert, sodass Pakete ihre Definition erweitern können.
    • Jede Zuweisung an eine globale Variable durchläuft nun zunächst einen Aufruf von „convert(Any, x)“ oder „convert(T, x)“, wenn die globale Variable als Typ T deklariert wurde. Stellen Sie vor der Verwendung globaler Variablen sicher, dass die Invariante „convert(Any , x) === x ist immer wahr, andernfalls kann es zu unerwartetem Verhalten kommen.
    • Integrierte Funktionen ähneln jetzt generischen Funktionen und können mithilfe von Methoden programmgesteuert aufgezählt werden.
  • Compiler-/Laufzeitverbesserungen
    • Die Bootzeit wurde um ca. 25 % verkürzt.
    • Der LLVM-basierte Compiler wurde von der Laufzeitbibliothek in eine neue Bibliothek, libjulia-codegen, getrennt. Es wird standardmäßig geladen, daher sollten sich bei normaler Verwendung keine Änderungen ergeben. In Bereitstellungen, die keinen Compiler benötigen (z. B. Systemabbilder, in denen der gesamte erforderliche Code vorkompiliert ist), kann diese Bibliothek (und ihre LLVM-Abhängigkeit) einfach weggelassen werden.
    • Die bedingte Typinferenz ist jetzt möglich, indem ein Argument an eine Methode übergeben wird. Beispielsweise gibt Base.ifelse(isa(x, Int), x, 0) ::Int zurück, auch wenn der Typ von x unbekannt ist.
    • SROA (Scalar Replacement of Aggregates) wurde verbessert: Eliminiert Getfield-Aufrufe mit persistenten globalen Feldern, eliminiert veränderliche Strukturen mit nicht initialisierten Feldern, verbessert die Leistung und Handhabung verschachtelter Getfield-Aufrufe.
    • Die Typinferenz verfolgt verschiedene Effekte – Nebenwirkungen und Non-Drop. Es wird eine konstante Ausbreitung berücksichtigt, was die Leistung bei der Kompilierung erheblich verbessert. In einigen Fällen werden beispielsweise Aufrufe von Funktionen, die nicht inline sein können, aber keinen Einfluss auf das Ergebnis haben, zur Laufzeit verworfen. Regeln für Effekte können manuell mit dem Makro Base.@assume_effects überschrieben werden.
    • Durch die Vorkompilierung (mit expliziten Vorkompilierungsanweisungen oder angegebenen Arbeitslasten) wird jetzt mehr typdefinierter Code gespeichert, was zu einer schnelleren Erstausführung führt. Alle neuen Methoden-/Typkombinationen, die Ihr Paket benötigt, unabhängig davon, wo diese Methoden definiert wurden, können jetzt in der Vorkompilierungsdatei zwischengespeichert werden, wenn sie von einer zu Ihrem Paket gehörenden Methode aufgerufen werden.
  • Änderungen der Befehlszeilenparameter
    • Das Standardverhalten für die Überwachung von @inbounds-Deklarationen ist jetzt die Option auto in „--check-bounds=yes|no|auto“.
    • Neue Option „--strip-metadata“ zum Entfernen von Dokumentzeichenfolgen, Quellspeicherortinformationen und lokalen Variablennamen beim Erstellen eines Systemabbilds.
    • Neue Option „--strip-ir“, die es dem Compiler ermöglicht, die Zwischenquellcodedarstellung beim Erstellen des Systemabbilds zu entfernen. Das resultierende Bild funktioniert nur, wenn „--compile=all“ verwendet wird oder wenn der gesamte erforderliche Code vorkompiliert ist.
    • Wenn anstelle des Dateinamens das Zeichen „-“ angegeben wird, wird der ausführbare Code aus dem Standardeingabestream gelesen.
  • Änderungen bei der Multithreading-Unterstützung
    • Threads.@threads verwendet standardmäßig die neue Planungsoption :dynamic, die sich vom vorherigen Modus darin unterscheidet, dass Iterationen dynamisch über alle verfügbaren Arbeitsthreads hinweg geplant werden, anstatt jedem Thread zugewiesen zu werden. Dieser Modus ermöglicht eine bessere Verteilung verschachtelter Schleifen mit @spawn und @threads.
  • Neue Bibliotheksfunktionen
    • Eachsplit(str), um split(str) mehrmals auszuführen.
    • allequal(itr), um zu testen, ob alle Elemente in einem Iterator gleich sind.
    • hardlink(src, dst) kann zum Erstellen von Hardlinks verwendet werden.
    • setcpuaffinity(cmd, cpus), um die Affinität des Prozessorkerns zu den gestarteten Prozessen festzulegen.
    • diskstat(path=pwd()), um Festplattenstatistiken abzurufen.
    • Neues @showtime-Makro zur Anzeige sowohl der ausgewerteten Zeile als auch des @time-Berichts.
    • LazyString und das Lazy"str"-Makro wurden hinzugefügt, um die verzögerte Erstellung von Fehlermeldungen in Fehlerpfaden zu unterstützen.
    • Ein Problem mit der Parallelität in Dict und anderen abgeleiteten Objekten wie „keys(::Dict), „values(::Dict)“ und „Set“ wurde behoben. Iterationsmethoden können jetzt für ein Wörterbuch oder eine Menge aufgerufen werden, solange keine Aufrufe vorhanden sind, die das Wörterbuch oder die Menge ändern.
    • @time und @timev verfügen jetzt über eine optionale Beschreibung, sodass Sie beispielsweise die Quelle von Zeitberichten mit Anmerkungen versehen können. @time „Foo wird ausgewertet“ foo().
    • range verwendet entweder stop oder length als einziges Schlüsselwortargument.
    • precision und setprecision akzeptieren jetzt base als Schlüsselwort
    • TCP-Socket-Objekte bieten jetzt eine Closewrite-Methode und unterstützen die Verwendung des halboffenen Modus.
    • Extrema akzeptiert jetzt ein Init-Argument.
    • Iterators.countfrom akzeptiert jetzt jeden Typ, der eine +-Methode definiert.
    • @time weist jetzt den Prozentsatz der Zeit zu, die für die Neukompilierung von Methoden mit geänderten Typen aufgewendet wurde.
  • Änderungen der Standardbibliothek
    • Schlüssel mit dem Wert Nothing werden jetzt aus der Umgebung in addenv entfernt.
    • Iterators.reverse (und daher last) unterstützt jede Zeile.
    • Die Längenfunktion für Bereiche bestimmter Typen prüft nicht mehr auf Ganzzahlüberlauf. Es ist eine neue Funktion namens „checked_length“ verfügbar; sie enthält eine Steuerlogik für die Bitübertragung. Verwenden Sie bei Bedarf SaferIntegers.jl, um den Bereichstyp zu erstellen.
    • Der Iterators.Reverse-Iterator implementiert nach Möglichkeit die Umkehrung jedes Indexes.
  • Paket-Manager
    • Neue ⌃- und ⌅-Anzeigen neben Paketen im „pkg>“-Status, für die neue Versionen verfügbar sind. ⌅ zeigt an, dass neue Versionen nicht installiert werden können.
    • Neues outdated::Bool-Argument für Pkg.status (--outdated oder -o im REPL-Modus), um Informationen zu Paketen aus früheren Versionen anzuzeigen.
    • Neues compat::Bool-Argument für Pkg.status (--compat oder -c im REPL-Modus), um alle [compat]-Einträge in Project.toml anzuzeigen.
    • Neuer Modus „pkg>compat“ (und Pkg.compat) zum Festlegen von Projektkompatibilitätseinträgen. Bietet einen interaktiven Editor über „pkg>compat“ oder direkte Datensatzsteuerung über „pkg>Foo 0.4,0.5“, der aktuelle Datensätze per Tab-Vervollständigung laden kann. Das heißt, „pkg> compat Fo " wird automatisch auf "pkg>Foo 0.4,0.5" aktualisiert, um die Bearbeitung eines vorhandenen Eintrags zu ermöglichen.
    • Pkg versucht jetzt nur noch, Pakete von einem Paketserver herunterzuladen, wenn der Server die Registrierung überwacht, die das Paket enthält.
    • Pkg.instantiate gibt jetzt eine Warnung aus, wenn Project.toml nicht mit Manifest.toml synchronisiert ist. Dies geschieht auf der Grundlage eines Hashs der Deps- und Kompatibilitätsdatensätze des Projekts (andere Felder werden ignoriert) im Manifest bei der Auflösung, sodass jede Änderung an den Project.toml-Deps- oder Kompatibilitätsdatensätzen ohne erneute Auflösung erkannt werden kann.
    • Wenn „pkg>add“ kein Paket mit dem angegebenen Namen finden kann, werden nun Pakete mit ähnlichen Namen vorgeschlagen, die hinzugefügt werden können.
    • Die im Manifest gespeicherte Julia-Version enthält nicht mehr die Build-Nummer, was bedeutet, dass Master jetzt als 1.9.0-DEV geschrieben wird.
    • Der Testabbruch „pkg>“ wird jetzt konsistenter erkannt und korrekt an die REPL zurückgegeben.
  • InteractiveUtils
    • Neues @time_imports-Makro zur Meldung der für den Import von Paketen und deren Abhängigkeiten aufgewendeten Zeit, wobei die Kompilierungs- und Neukompilierungszeit als Prozentsatz der Importe hervorgehoben wird.
  • Lineare Algebra
    • Das BLAS-Submodul unterstützt jetzt Level-2-BLAS-Spr!-Funktionen.
    • Die Standardbibliothek LinearAlgebra.jl ist jetzt völlig unabhängig von SparseArrays.jl, sowohl aus Quellcode- als auch aus Unit-Test-Perspektive. Infolgedessen werden spärliche Arrays nicht mehr (implizit) von Methoden von LinearAlgebra zurückgegeben, die auf Base- oder LinearAlgebra-Objekte angewendet werden. Dies führt insbesondere zu folgenden Breaking Changes:
      • Verkettungen mit speziellen „sparse“ Matrizen (z. B. Diagonale) geben jetzt dichte Matrizen zurück; Infolgedessen sind die D1- und D2-Felder von SVD-Objekten, die durch getproperty-Aufrufe erstellt wurden, jetzt dichte Matrizen.
      • Die Methode Similar(::SpecialSparseMatrix, ::Type, ::Dims) gibt eine dichte Nullmatrix zurück. Infolgedessen führen Produkte von zwei-, drei- und symmetrischen tridiagonalen Matrizen miteinander zur Erzeugung einer dichten Matrix. Darüber hinaus schlägt die Konstruktion ähnlicher Matrizen mit drei Argumenten aus speziellen „sparse“ Matrizen aus (nicht statischen) Matrizen jetzt aufgrund von „zero(::Type{Matrix{T}})“ fehl.
  • printf
    • %s und %c verwenden jetzt das Argument textwidth, um die Breite zu formatieren.
  • Profil
    • Die CPU-Lastprofilerstellung zeichnet jetzt Metadaten einschließlich Threads und Aufgaben auf. Profile.print() verfügt über ein neues Groupby-Argument, mit dem Sie Threads, Aufgaben oder Unterthreads/Aufgaben, Aufgaben/Threads sowie Threads und Aufgabenargumente gruppieren können, um eine Filterung bereitzustellen. Darüber hinaus wird der Auslastungsprozentsatz jetzt entweder insgesamt oder pro Thread gemeldet, je nachdem, ob der Thread in jeder Stichprobe inaktiv ist oder nicht. Profile.fetch() enthält standardmäßig die neuen Metadaten. Aus Gründen der Abwärtskompatibilität mit externen Verbrauchern von Profilierungsdaten kann dies durch Übergabe von include_meta=false ausgeschlossen werden.
    • Mit dem neuen Modul Profile.Allocs können Sie Speicherzuordnungen profilieren. Ein Stack-Trace des Typs und der Größe jeder Speicherzuordnung wird aufgezeichnet, und das Argument „sample_rate“ ermöglicht das Überspringen einer konfigurierbaren Anzahl von Zuweisungen, wodurch der Leistungsaufwand reduziert wird.
    • Die CPU-Profilerstellung mit fester Dauer kann jetzt vom Benutzer ausgeführt werden, während Aufgaben ausgeführt werden, ohne dass zuvor das Profil geladen werden muss. Der Bericht wird während der Ausführung angezeigt. Drücken Sie unter MacOS und FreeBSD Strg-T oder rufen Sie SIGINFO auf. Für andere Plattformen aktivieren Sie SIGUSR1, d.h. % kill -USR1 $julia_pid. Dies ist unter Windows nicht verfügbar.
  • ERSATZ
    • RadioMenu unterstützt jetzt zusätzliche Tastaturkürzel für die direkte Auswahl von Optionen.
    • Die Sequenz „?(x, y“ gefolgt von der TAB-Taste zeigt alle Methoden an, die mit den Argumenten x, y, ... aufgerufen werden können. (Ein führendes Leerzeichen verhindert, dass Sie in den Hilfemodus gelangen.) „MyModule.?(x, y " schränkt die Suche auf „MyModule“ ein. Das Drücken von TAB erfordert, dass mindestens ein Argument einen spezifischeren Typ als „Any“ hat. Oder verwenden Sie SHIFT-TAB anstelle von TAB, um alle kompatiblen Methoden zuzulassen.
    • Mit der neuen globalen Variablen err können Sie die neueste Ausnahme abrufen, ähnlich dem Verhalten von ans bei der letzten Antwort. Durch Eingabe von err werden die Ausnahmeinformationen erneut gedruckt.
  • SparseArrays
    • Der SparseArrays-Code wurde vom Julia-Repository in das externe SparseArrays.jl-Repository verschoben.
    • Die neuen Verkettungsfunktionen sparse_hcat, sparse_vcat und sparse_hvcat geben einen SparseMatrixCSC-Typ zurück, unabhängig von den Typen der Eingabeargumente. Dies wurde notwendig, um den Mechanismus zum Kleben von Matrizen nach der Trennung des LinearAlgebra.jl- und SparseArrays.jl-Codes zu vereinheitlichen.
  • Protokollierung
    • Die Standardprotokollierungsstufen BelowMinLevel, Debug, Info, Warn, Error und AboveMaxLevel werden jetzt aus der Standardprotokollierungsbibliothek exportiert.
  • Unicode
    • Funktion isequal_normalized hinzugefügt, um auf Unicode-Äquivalenz zu prüfen, ohne explizit normalisierte Zeichenfolgen zu erstellen.
    • Die Funktion Unicode.normalize akzeptiert jetzt das Schlüsselwort charttransform, mit dem benutzerdefinierte Zeichenzuordnungen bereitgestellt werden können. Außerdem wird die Funktion Unicode.julia_chartransform bereitgestellt, um die Zuordnung zu reproduzieren, die beim Normalisieren von Bezeichnern durch den Julia-Parser verwendet wird.
  • Test
    • Mit „@test_throws „some message“ triggers_error()“ kann nun unabhängig vom konkreten Ausnahmetyp getestet werden, ob der angezeigte Fehlertext einen „some message“-Fehler enthält. Reguläre Ausdrücke, Stringlisten und Matching-Funktionen werden ebenfalls unterstützt.
    • @testset foo() kann jetzt verwendet werden, um einen Testsatz aus einer bestimmten Funktion zu erstellen. Der Testfallname ist der Name der aufgerufenen Funktion. Die aufgerufene Funktion kann @test und andere @testset-Definitionen enthalten, auch für Aufrufe anderer Funktionen, während alle Zwischentestergebnisse aufgezeichnet werden.
    • TestLogger und LogRecord werden jetzt aus der Standard-Testbibliothek exportiert.
  • Verteilt
    • SSHManager unterstützt jetzt Arbeitsthreads mit einem csh/tcsh-Wrapper über die Methode addprocs() und den Parameter shell=:csh.
  • Andere Änderungen
    • GC.enable_logging(true) kann verwendet werden, um jeden Garbage-Collection-Vorgang mit der Zeit und der Menge des gesammelten Speichers zu protokollieren.

Source: opennet.ru

Kommentar hinzufügen