Veröffentlichung der Programmiersprache Julia 1.8

Die neue Version der Programmiersprache Julia 1.8 ist jetzt verfügbar und verbindet hohe Leistung mit dynamischer Typisierung sowie integrierten Mitteln für paralleles Programmieren. Die Syntax von Julia ähnelt MATLAB und enthält Elemente aus Ruby und Lisp. Die Handhabung von Zeichenfolgen erinnert an Perl. Der Code 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.

Wesentliche Änderungen in Julia 1.8:

  • Neue Sprachfeatures
    • Felder von veränderbaren Strukturen (mutable struct) können jetzt als Konstanten annotiert werden, um Änderungen zu verhindern und Optimierungen zu ermöglichen.
    • Typannotationen können jetzt auch für globale Variablen hinzugefügt werden.
    • Leere n-dimensionale Arrays können erstellt werden, indem mehrere Semikolons innerhalb von eckigen Klammern verwendet werden, zum Beispiel erzeugt „[;;;]“ ein Array der Größe 0×0×0.
    • Try-Blöcke können jetzt zusätzlich einen else-Block enthalten, der unmittelbar nach dem Hauptkörper ausgeführt wird, falls keine Fehler auftraten.
    • @inline und @noinline können innerhalb des Funktionskörpers platziert werden, was die Annotierung von anonymen Funktionen ermöglicht.
    • @inline und @noinline können jetzt auf Funktionen in Aufrufseiten oder in Blöcken angewendet werden, um entsprechende Funktionsaufrufe zwingend zu aktivieren (oder zu deaktivieren).
    • ∀, ∃ und ∄ sind als Identifikatorsymbole erlaubt.
    • Unterstützung für die Unicode-Spezifikation 14.0.0 wurde hinzugefügt.
    • Die Methode Module(:name, false, false) kann verwendet werden, um ein Modul zu erstellen, das keine Namen enthält, nicht Base oder Core importiert und keinen Verweis auf sich selbst enthält.
  • Änderungen in der Sprache
    • Neu erstellte Task-Objekte (@spawn, @async usw.) haben nun world_age für Methoden aus dem übergeordneten Task bei ihrer Erstellung, was die Ausführung optimiert. Die vorherige Aktivierungsvariante ist über die Methode Base.invokelatest verfügbar.
    • Richtlinien für unausgewogene bidirektionale Unicode-Formatierung sind nun in Zeichenfolgen und Kommentaren verboten, um Injektionen zu vermeiden.
    • Base.ifelse wird jetzt als allgemeine Funktion definiert und nicht mehr als eingebaut, was es Paketen ermöglicht, ihre Definition zu erweitern.
    • Jede Zuweisung einer globalen Variablen erfolgt nun zuerst durch den Aufruf von convert(Any, x) oder convert(T, x), wenn für die globale Variable der Typ T deklariert wurde. Stellen Sie vor der Verwendung globaler Variablen sicher, dass die Invarianz convert(Any, x) === x immer wahr ist, andernfalls kann es zu unerwartetem Verhalten kommen.
    • Eingebaute Funktionen ähneln jetzt universellen Funktionen und können programmgesteuert mittels Methoden aufgelistet werden.
  • Verbesserungen des Compilers/Laufzeitumgebung
    • Die Initialisierungszeit wurde um etwa 25 % verkürzt.
    • Der auf LLVM basierende Compiler wurde von der Runtime-Bibliothek in eine neue Bibliothek libjulia-codegen ausgelagert. Diese wird standardmäßig geladen, daher sollten bei normalem Gebrauch keine Änderungen erforderlich sein. In Deployments, die keinen Compiler benötigen (z. B. System-Images, in denen der gesamte benötigte Code vorab kompiliert ist), kann diese Bibliothek (und ihre LLVM-Abhängigkeit) einfach ausgeschlossen werden.
    • Die Ausgabe eines bedingten Typs ist jetzt durch die Übertragung eines Arguments an die Methode möglich. Zum Beispiel gibt Base.ifelse(isa(x, Int), x, 0) ::Int zurück, selbst wenn der Typ von x unbekannt ist.
    • SROA (Skalare Ersetzung von Aggregaten) wurde verbessert: schließt getfield-Aufrufe mit konstanten globalen Feldern aus, schließt veränderliche Strukturen mit nicht initialisierten Feldern aus, steigert die Leistung und die Verarbeitung von verschachtelten getfield-Aufrufen.
    • Der Typausgabe verfolgt verschiedene Effekte – Nebenwirkungen und das Fehlen von Abfall. Es werden Konstantenverbreitungen berücksichtigt, was die Leistung während der Kompilierung erheblich steigert. In einigen Fällen, wie beispielsweise Aufrufe von Funktionen, die nicht inline an ihrem Aufrufort eingebaut werden können, aber das Ergebnis nicht beeinflussen, werden zur Laufzeit verworfen. Die Regeln für Effekte können manuell mit dem Makro Base.@assume_effects überschrieben werden.
    • Die Vorabkompilierung (mit expliziten Vorabkompilierungsanweisungen oder festgelegten Arbeitslasten) speichert nun mehr typdefinierten Code, was zu verkürzter Startzeit führt. Alle neuen Kombinationen aus Methoden und Typen, die für Ihr Paket erforderlich sind, unabhängig davon, wo diese Methoden definiert wurden, können jetzt in der Vorabkompilierungsdatei zwischengespeichert werden, wenn sie durch eine Methode aufgerufen werden, die Ihrem Paket gehört.
  • Änderungen der Befehlszeilenparameter
    • Das Standardverhalten zur Überwachung von @inbounds-Deklarationen ist nun die Option auto in „—check-bounds=yes|no|auto“.
    • Eine neue Option „—strip-metadata“ zum Entfernen von Dokumentationszeilen, Informationen über den ursprünglichen Standort und Namen lokaler Variablen beim Erstellen eines Systemabbilds.
    • Eine neue Option „—strip-ir“ zur Entfernung der Zwischenrepräsentation des Quellcodes durch den Compiler beim Erstellen des Systemabbilds. Das resultierende Abbild funktioniert nur, wenn „—compile=all“ verwendet wird oder wenn der gesamte erforderliche Code im Voraus kompiliert wurde.
    • Wenn anstelle eines Dateinamens das Zeichen „-“ angegeben wird, wird der ausführbare Code aus dem Standard-Eingabestrom gelesen.
  • Änderungen der Unterstützung für Mehrfachverarbeitung
    • Threads.@threads verwendet standardmäßig den neuen Planungsparameter :dynamic, der sich vom vorherigen Modus unterscheidet, indem die Iterationen dynamisch für verfügbare Arbeitsstränge geplant werden, anstatt an jeden Strang gebunden zu sein. Dieser Modus ermöglicht eine bessere Verteilung geschachtelter Schleifen mit @spawn und @threads.
  • Neue Bibliotheksfunktionen
    • eachsplit(str) zum mehrmaligen Ausführen von split(str).
    • allequal(itr) zur Überprüfung der Gleichheit aller Elemente im Iterator.
    • hardlink(src, dst) kann verwendet werden, um Verknüpfungen zu erstellen.
    • setcpuaffinity(cmd, cpus) zur Festlegung der Zuordnung von Prozessoren zu laufenden Prozessen.
    • diskstat(path=pwd()) zur Anzeige von Festplattendaten.
    • Neues Makro @showtime zur Anzeige sowohl der geschätzten Zeichenfolge als auch des @time-Berichts.
    • LazyString und das Makro lazy"str" wurden hinzugefügt, um die verzögerte Erstellung von Fehlermeldungen in Fehlerpfaden zu unterstützen.
    • Ein Problem mit dem parallelen Zugriff auf Dict und andere abgeleitete Objekte, wie z. B. keys(::Dict), values(::Dict) und Set, wurde behoben. Iterationsmethoden können jetzt für ein Wörterbuch oder eine Menge aufgerufen werden, solange keine aufrufenden Änderungen am Wörterbuch oder an der Menge vorgenommen werden.
    • @time und @timev haben jetzt eine optionale Beschreibung, die es ermöglicht, die Quelle von Zeitberichten zu annotieren, z. B. @time „Evaluierung von foo“ foo().
    • range akzeptiert entweder stop oder length als einziges Schlüsselwortargument.
    • precision und setprecision akzeptieren jetzt base als Schlüsselwort.
    • TCP-Socket-Objekte bieten jetzt die Methode closewrite und unterstützen die Verwendung des halboffenen Modus.
    • extrema akzeptiert jetzt das Argument init.
    • Iterators.countfrom akzeptiert jetzt jeden Typ, der eine + Methode definiert.
    • @time zeigt jetzt % der Zeit an, die für die Neukompilierung von Methoden mit geänderten Typen aufgewendet wurde.
  • Änderungen an der Standardbibliothek.
    • Schlüssel mit dem Wert Nothing werden jetzt aus der Umgebung in addenv entfernt.
    • Iterators.reverse (und somit last) unterstützt eachline.
    • Die Funktion length für Bereiche bestimmter Typen überprüft nicht mehr auf ganzzahlige Überläufe. Eine neue Funktion checked_length ist verfügbar, die die Logik zur Überwachung des Übertrags enthält. Bei Bedarf verwenden Sie SaferIntegers.jl, um den Bereichstyp zu erstellen.
    • Der Iterator Iterators.Reverse führt die Inversion von eachindex aus, wenn dies möglich ist.
  • Paket-Manager
    • Neue Indikatoren ⌃ und ⌅ neben den Paketen im Status „pkg>“, für die neue Versionen verfügbar sind. ⌅ zeigt an, dass neue Versionen nicht installiert werden können.
    • Neues Argument outdated::Bool für Pkg.status (—outdated oder -o im REPL-Modus), um Informationen über Pakete vorheriger Versionen anzuzeigen.
    • Neues Argument compat::Bool 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) zur Konfiguration der Kompatibilitätseinträge des Projekts. Bietet einen interaktiven Editor über „pkg> compat“ oder direkte Verwaltung von Einträgen über „pkg> Foo 0.4,0.5“, der aktuelle Einträge durch Tab-Vervollständigung laden kann. Das heißt, „pkg> compat Fo“ wird automatisch zu „pkg> Foo 0.4,0.5“ vervollständigt, um einen bestehenden Eintrag zu bearbeiten.
    • Jetzt versucht Pkg, Pakete von Server Paketen nur dann zu laden, wenn der Server das Repository verfolgt, das das Paket enthält.
    • Pkg.instantiate wird jetzt eine Warnung ausgeben, wenn Project.toml nicht mit Manifest.toml synchronisiert ist. Dies geschieht auf Grundlage der Hash-Werte der deps und compat des Projekts (andere Felder werden ignoriert) im Manifest, um jede Änderung in den deps von Project.toml oder den compat-Einträgen ohne erneute Auflösung zu erkennen.
    • Wenn «pkg> add» ein Paket mit dem angegebenen Namen nicht finden kann, werden jetzt Pakete mit ähnlichen Namen vorgeschlagen, die hinzugefügt werden können.
    • Die im Manifest gespeicherte Version von Julia enthält jetzt keine Build-Nummer mehr, d.h. master wird jetzt als 1.9.0-DEV aufgezeichnet.
    • Das Unterbrechen des Tests «pkg>» wird jetzt stabiler erkannt und korrekt in den REPL zurückgegeben.
  • InteractiveUtils
    • Ein neuer Makro @time_imports zur Berichterstattung der Zeit, die für den Import von Paketen und deren Abhängigkeiten aufgewendet wurde, mit einer Hervorhebung der Kompilierungs- und Re-Kompilierungszeiten in Prozent auf den Import.
  • Lineare Algebra
    • Das BLAS-Submodul unterstützt jetzt level-2 BLAS-Funktionen spr!.
    • Die Standardbibliothek LinearAlgebra.jl ist nun vollständig unabhängig von SparseArrays.jl, sowohl in Bezug auf den Quellcode als auch auf die Modultests. Infolgedessen werden bei Methoden aus LinearAlgebra, die auf Objekte von Base oder LinearAlgebra angewendet werden, keine spärlichen Arrays mehr (implizit) zurückgegeben. Dies führt insbesondere zu den folgenden kritischen Änderungen:
      • Konkatenationen, die spezielle 'spärliche' Matrizen verwenden (z. B. diagonale Matrizen), geben nun dichte Matrizen zurück. Infolgedessen sind die Felder D1 und D2 von SVD-Objekten, die durch Aufrufe von getproperty 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 dreidimensionalen Matrizen untereinander zur Erzeugung einer dichten Matrix. Darüber hinaus schlägt der Aufbau ähnlicher Matrizen mit drei Argumenten aus speziellen 'spärlichen' Matrizen aus (nicht-statischen) Matrizen aufgrund von 'zero(::Type{Matrix{T}})' fehl.
  • Printf
    • Jetzt wird für die Formatierung der Breite %s und %c das Argument textwidth verwendet.
  • Profil
    • Die CPU-Auslastung wird nun unter Berücksichtigung von Metadaten, einschließlich Threads und Aufgaben, aufgezeichnet. Profile.print() verfügt über ein neues Argument 'groupby', das die Gruppierung nach Threads, Aufgaben oder verschachtelten Threads/Aufgaben sowie nach Tasks/Threads und zusätzlich den Argumenten 'threads' und 'tasks' zur Filterung ermöglicht. Außerdem wird der Prozentanteil der Nutzung nun entweder als Gesamtnutzung oder pro Thread gemeldet, abhängig davon, ob der Thread in jeder Probe inaktiv ist oder nicht. Profile.fetch() enthält standardmäßig neue Metadaten. Zur Wahrung der Abwärtskompatibilität für externe Verbraucher von Profildaten kann dies durch die Übergabe von 'include_meta=false' ausgeschlossen werden.
    • Das neue Modul Profile.Allocs ermöglicht die Profilerstellung von Speicherzuweisungen. Es wird ein Stack-Trace, der Typ und die Größe jeder Speicherzuweisung aufgezeichnet, und das Argument 'sample_rate' gestattet das Überspringen einer konfigurierbaren Anzahl von Zuweisungen, wodurch die Leistungslast reduziert wird.
    • Die Profilerstellung mit fester Dauer kann jetzt vom Benutzer in der Ausführung von Aufgaben ohne vorheriges Laden des Profils gestartet werden, und der Bericht wird während der Ausführung angezeigt. Unter MacOS und FreeBSD drücken Sie ctrl-t oder rufen SIGINFO auf. Für andere Plattformen aktivieren Sie SIGUSR1, d.h. % kill -USR1 $julia_pid. Unter Windows ist dies nicht verfügbar.
  • REPL
    • RadioMenu unterstützt jetzt zusätzliche Tastenkombinationen 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 Leerzeichen am Anfang erlaubt es nicht, in den Hilfemodus zu gelangen). «MyModule.?(x, y» schränkt die Suche auf «MyModule» ein. Ein Druck auf die TAB-Taste erfordert, dass mindestens ein Argument einen spezifischeren Typ hat als Any. Alternativ verwenden Sie SHIFT-TAB anstelle von TAB, um beliebige kompatible Methoden zuzulassen.
    • Die neue globale Variable err ermöglicht den Zugriff auf die letzte Ausnahme, ähnlich dem Verhalten von ans mit der letzten Antwort. Die Eingabe von err gibt Informationen zur Ausnahme erneut aus.
  • SparseArrays
    • Der Code von SparseArrays wurde aus dem Julia-Repository in das externe Repository SparseArrays.jl verschoben.
    • Die neuen Funktionen sparse_hcat, sparse_vcat und sparse_hvcat geben den Typ SparseMatrixCSC zurück, unabhängig von den Typen der Eingabeargumente. Dies war notwendig, um den Mechanismus zum Zusammenfügen von Matrizen nach der Trennung des Codes von LinearAlgebra.jl und SparseArrays.jl zu vereinheitlichen.
  • Logging
    • Die Standard-Loglevel BelowMinLevel, Debug, Info, Warn, Error und AboveMaxLevel werden jetzt aus der Standardbibliothek Logging exportiert.
  • Unicode
    • Es wurde die Funktion isequal_normalized hinzugefügt, um die Äquivalenz von Unicode zu überprüfen, ohne explizit normalisierte Zeichenfolgen zu erstellen.
    • Die Funktion Unicode.normalize akzeptiert jetzt das Schlüsselwort chartransform, das verwendet werden kann, um benutzerdefinierte Zeichenzuordnungen bereitzustellen. Zudem steht die Funktion Unicode.julia_chartransform zur Verfügung, um die Zuordnung zu reproduzieren, die bei der Normalisierung von Bezeichnern durch den Julia-Parser verwendet wird.
  • Test
    • ‘@test_throws «some message» triggers_error()’ kann jetzt verwendet werden, um zu überprüfen, ob der angezeigte Fehlertext die Meldung «some message» enthält, unabhängig vom spezifischen Ausnahmetyp. Auch reguläre Ausdrücke, Listen von Zeichenfolgen und Zuordnungsfunktionen werden unterstützt.
    • @testset foo() kann jetzt verwendet werden, um eine Testgruppe aus einer gegebenen Funktion zu erstellen. Der Name der Testgruppe entspricht dem Namen der aufgerufenen Funktion. Die aufgerufene Funktion kann @test und andere @testset-Definitionen enthalten, einschließlich Aufrufen anderer Funktionen, während sie alle Zwischenresultate der Tests festhält.
    • TestLogger und LogRecord werden jetzt aus der Standardbibliothek Test exportiert.
  • Verteilt
    • SSHManager unterstützt jetzt Worker-Threads mit der csh/tcsh-Wrap durch die Methode addprocs() und den Parameter shell=:csh.
  • Weitere Änderungen
    • GC.enable_logging(true) kann verwendet werden, um jede Garbage Collection-Operation mit der Zeit und dem Umfang des gesammelten Speichers zu protokollieren.

Quelle: opennet.ru

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster