Dostępny język programowania Julia 1.9

Ukazało się wydanie języka programowania Julia 1.9, łączącego w sobie takie cechy, jak wysoka wydajność, obsługa dynamicznego typowania oraz wbudowane narzędzia do programowania równoległego. Składnia Julii jest zbliżona do MATLAB-a, zapożyczając niektóre elementy z Ruby i Lisp. Metoda manipulacji ciągami przypomina Perla. Kod projektu jest rozpowszechniany na licencji MIT.

Kluczowe cechy języka:

  • Wysoka wydajność: jednym z kluczowych celów projektu jest osiągnięcie wydajności zbliżonej do programów C. Kompilator Julia bazuje na pracach projektu LLVM i generuje wydajny natywny kod maszynowy dla wielu platform docelowych;
  • Obsługuje różne paradygmaty programowania, w tym elementy programowania obiektowego i funkcjonalnego. Biblioteka standardowa zapewnia między innymi funkcje asynchronicznego wejścia/wyjścia, kontroli procesów, rejestrowania, profilowania i zarządzania pakietami;
  • Typowanie dynamiczne: język nie wymaga jawnej definicji typów zmiennych, podobnie jak w przypadku skryptowych języków programowania. Obsługiwany tryb interaktywny;
  • Opcjonalna możliwość jawnego określenia typów;
  • Składnia idealna do obliczeń numerycznych, obliczeń naukowych, uczenia maszynowego i wizualizacji danych. Obsługa wielu numerycznych typów danych i narzędzi do zrównoleglenia obliczeń.
  • Możliwość bezpośredniego wywoływania funkcji z bibliotek C bez dodatkowych warstw.

Główne zmiany w Julii 1.9:

  • Nowe funkcje językowe
    • Zezwalaj na wykonywanie przypisań w innym module za pomocą „setproperty!(::Module, ::Symbol, x)”.
    • Dopuszczalne jest wielokrotne przypisanie nie na pozycji końcowej. Na przykład ciąg „a, b…, c = 1, 2, 3, 4” zostanie przetworzony jako „a = 1; b…, = 2, 3; c = 4". Jest to obsługiwane przez Base.split_rest.
    • Literały jednoznakowe obsługują teraz tę samą składnię, co literały łańcuchowe; te. Składnia może reprezentować nieprawidłowe sekwencje UTF-8, na co pozwala typ Char.
    • Dodano obsługę specyfikacji Unicode 15.
    • Zagnieżdżone kombinacje krotek i krotek nazwanych znaków mogą być teraz używane jako parametry typu.
    • Nowe wbudowane funkcje „getglobal(::Module, ::Symbol[, zamówienie])” i „setglobal!(::Module, ::Symbol, x[, zamówienie])” do odczytu i zapisu wyłącznie do zmiennych globalnych. Aby uzyskać dostęp do zmiennych globalnych, należy teraz preferować metodę getglobal zamiast metody getfield.
  • Zmiany w języku
    • Makro „@invoke” wprowadzone w wersji 1.7 jest teraz wyeksportowane i dostępne do użycia. Ponadto używa teraz metody „Core.Typeof(x)” zamiast „Any” w przypadku, gdy adnotacja typu została pominięta w argumencie „x”. Jest to konieczne, aby zapewnić prawidłowe przetwarzanie typów przekazywanych jako argumenty.
    • Włączono eksport funkcji „invokelatest” i makra „@invokelatest”, wprowadzonego w wersji 1.7.
  • Ulepszenia kompilatora/środowiska wykonawczego
    • Znacząco skrócony czas do pierwszego wykonania (TTFX – Czas do pierwszego wykonania). Prekompilacja pakietu przechowuje teraz natywny kod w „pkgimage”, co oznacza, że ​​kod wygenerowany w procesie prekompilacji nie będzie musiał być ponownie kompilowany po załadowaniu pakietu. Korzystanie z trybu pkgimages można wyłączyć za pomocą opcji „--pkgimages=no”.
    • Naprawiono znany problem wnioskowania o typie ze złożonością kwadratową, a wnioskowanie zużywa ogólnie mniej pamięci. Niektóre przypadki brzegowe z automatycznie generowanymi długimi funkcjami (takie jak ModelingToolkit.jl z cząstkowymi równaniami różniczkowymi i dużymi modelami przyczynowymi) kompilują się znacznie szybciej.
    • Wywołania z argumentami bez konkretnych typów mogą być teraz zoptymalizowane pod kątem podziału Unii pod kątem wstrzykiwania lub rozwiązywania statycznego, nawet jeśli istnieje wielu kandydatów różnych typów do wysłania. Może to poprawić wydajność w niektórych sytuacjach, gdy typy obiektów nie są w pełni rozpoznawane statycznie, poprzez statyczne rozpoznawanie witryn wywołań „@nospecialize-d” i unikanie ponownej kompilacji.
    • Wszystkie zastosowania makra @pure w module Base zostały zastąpione makrem Base.@assume_effects.
    • Wywołania invoke(f, invokesig, args...) z mniej szczegółowymi typami niż zwykle używane dla f(args...) nie powodują już ponownej kompilacji pakietu.
  • Zmiany w opcjach wiersza poleceń
    • W systemach Linux i Windows opcja „--threads=auto” próbuje teraz określić dostępną liczbę procesorów na podstawie powinowactwa procesora – maski zwykle ustawianej w środowiskach HPC i chmurach.
    • Parametr „--math-mode=fast” jest wyłączony, zamiast niego zaleca się użycie makra „@fastmath”, które ma jasno zdefiniowaną semantykę.
    • Opcja „--threads” ma teraz format „auto | N[,auto|M]”, gdzie M wskazuje liczbę interaktywnych wątków do utworzenia (obecnie auto oznacza 1).
    • Dodano opcję „—heap-size-hint=” ", który ustawia próg, po przekroczeniu którego rozpoczyna się aktywne zbieranie śmieci. Rozmiar można określić w bajtach, kilobajtach (1000 KB), megabajtach (300 MB) lub gigabajtach (1,5 GB).
  • Zmiany w wielowątkowości
    • „Threads.@spawn” ma teraz opcjonalny pierwszy argument o wartości „:default” lub „:interactive”. Zadanie interaktywne wymaga małego opóźnienia odpowiedzi i jest zaprojektowane tak, aby było krótkie lub często wykonywane. Zadania interaktywne będą uruchamiane w wątkach interaktywnych, jeśli zostaną określone podczas uruchamiania Julii.
    • Wątki działające poza środowiskiem wykonawczym Julii (na przykład z C lub Java) mogą teraz wywoływać kod Julii za pomocą „jl_adopt_thread”. Dzieje się to automatycznie podczas wprowadzania kodu Julii poprzez punkt wejścia „cfunction” lub „@ccallable”. W rezultacie liczba wątków może się teraz zmieniać podczas wykonywania.
  • Nowe funkcje biblioteczne
    • Nowa funkcja „Iterators.flatmap”.
    • Nowa funkcja „pkgversion(m::Module)” pozwalająca uzyskać wersję pakietu, który załadował dany moduł, podobnie jak „pkgdir(m::Module)”.
    • Nowa funkcja „stack(x)”, która uogólnia „reduce(hcat, x::Vector{<:Vector})” na dowolny wymiar i umożliwia dowolny iterator iteratorów. Metoda „stack(f, x)” uogólnia „mapreduce(f, hcat, x)” i jest bardziej wydajna.
    • Nowe makro do analizy przydzielonej pamięci „@allocations”, podobne do „@allocated”, z tą różnicą, że zwraca liczbę alokacji pamięci, a nie całkowity rozmiar przydzielonej pamięci.
  • Nowe funkcje biblioteki
    • „RoundFromZero” działa teraz dla typów innych niż „BigFloat”.
    • „Dict” można teraz ręcznie zmniejszyć za pomocą „sizehint!”
    • „@time” teraz osobno określa procent czasu spędzonego na ponownej kompilacji nieprawidłowych metod.
  • Zmiany w bibliotece standardowej
    • Naprawiono problem współbieżności w metodach iteracji dla Dict i innych obiektów pochodnych, takich jak klucze(::Dict), wartości(::Dict) i Set. Te metody iteracyjne można teraz wywoływać równolegle w Dict lub Set dla nieograniczonej liczby wątków, o ile nie ma żadnych akcji modyfikujących słownik lub zestaw.
    • Negacja funkcji predykatu „!f” zwraca teraz funkcję złożoną „(!) ∘ f” zamiast funkcji anonimowej.
    • Funkcje plasterków wymiaru działają teraz w wielu wymiarach: „eachslice”, „eachrow” i „eachcol” zwracają obiekt „Slices”, który umożliwia wysyłanie w celu zapewnienia bardziej wydajnych metod.
    • Dodano makro „@kwdef” do publicznego API.
    • Naprawiono problem z kolejnością operacji w „fld1”.
    • Sortowanie jest teraz zawsze stabilne w czasie (QuickSort został przeprojektowany).
    • „Base.splat” jest teraz eksportowany. Zwracaną wartością jest typ „Base.Splat”, a nie funkcja anonimowa, dzięki czemu można ją ładnie wyprowadzić.
  • Menedżer pakietów
    • „Rozszerzenia pakietów”: obsługa ładowania fragmentu kodu z innych pakietów załadowanych w sesji Julii. Aplikacja jest podobna do pakietu „Requires.jl”, ale obsługiwana jest wstępna kompilacja i zgodność ustawień.
  • Biblioteka Algebry Liniowej
    • Ze względu na ryzyko pomyłki z dzieleniem elementarnym usunięto metody „a/b” i „b\a” ze skalarem „a” i wektorem „b”, które były równoważne z „a * pinv(b)”.
    • Wywoływanie BLAS i LAPACK używa teraz „libblastrampoline (LBT)”. OpenBLAS jest dostarczany domyślnie, ale budowanie obrazu systemu przy użyciu innych bibliotek BLAS/LAPACK nie jest obsługiwane. Zamiast tego zaleca się użycie mechanizmu LBT w celu zastąpienia BLAS/LAPACK innym istniejącym zestawem bibliotek.
    • „lu” obsługuje nową strategię rotacji macierzy „RowNonZero()”, która wybiera pierwszy niezerowy element rotacji do użycia z nowymi typami arytmetycznymi i do celów szkoleniowych.
    • „normalize(x, p=2)” obsługuje teraz dowolną znormalizowaną przestrzeń wektorową „x”, w tym skalary.
    • Domyślna liczba wątków BLAS jest teraz równa liczbie wątków procesora na architekturach ARM i połowie liczby wątków procesora na innych architekturach.
  • Printf: Przerobiono komunikaty o błędach dla niepoprawnie sformatowanych ciągów znaków, aby zapewnić lepszą czytelność.
  • Profil: Nowa funkcja „Profile.take_heap_snapshot(file)”, która zapisuje plik w formacie „.heapsnapshot” opartym na JSON obsługiwanym w przeglądarce Chrome.
  • Random: Randn i Randexp działają teraz dla dowolnego typu AbstractFloat, który definiuje Rand.
  • ODPOWIEDŹ
    • Naciśnięcie kombinacji klawiszy „Alt-e” otwiera teraz bieżące dane wejściowe w edytorze. Treść (jeśli została zmodyfikowana) zostanie wykonana po wyjściu z edytora.
    • Aktualny kontekst modułu aktywny w REPL można zmienić (domyślnie Main) za pomocą funkcji „REPL.activate(::Module)” lub wpisując moduł w REPL i naciskając kombinację klawiszy „Alt-m”.
    • Tryb „numerowanego podpowiedzi”, który drukuje liczby dla każdego wejścia i wyjścia oraz przechowuje zdobyte wyniki w Out, można aktywować za pomocą polecenia „REPL.numbered_prompt!()”.
    • Uzupełnianie tabulatora wyświetla dostępne argumenty słów kluczowych.
  • SuiteSparse: Przeniesiono kod modułu solwera „SuiteSparse” do „SparseArrays.jl”. Solvery są teraz reeksportowane przez „SuiteSparse.jl”.
  • Rzadkie tablice
    • Solwery „SuiteSparse” są teraz dostępne jako podmoduły „SparseArrays”.
    • Tryby ochrony wątków UMFPACK i CHOLMOD zostały ulepszone poprzez wyeliminowanie zmiennych globalnych i użycie blokad. Wielowątkowy „ldiv!” Obiekty UMFPACK można teraz bezpiecznie wykonywać.
    • Eksperymentalna funkcja „SparseArrays.allowscalar(::Bool)” umożliwia wyłączenie lub włączenie skalarnego indeksowania tablic rzadkich. Ta funkcja ma na celu wykrywanie losowego indeksowania skalarnego obiektów „SparseMatrixCSC”, które jest częstym źródłem problemów z wydajnością.
  • Nowy tryb awaryjny dla zestawów testów, który kończy przebieg testu wcześniej w przypadku awarii lub błędu. Ustaw za pomocą „@testset kwarg fallfast=true” lub „export JULIA_TEST_FAILFAST=true”. Jest to czasami konieczne w przypadku przebiegów CI, aby wcześniej otrzymywać komunikaty o błędach.
  • Daty: Puste ciągi nie są już niepoprawnie analizowane jako prawidłowe wartości „DateTime”, „Dates” lub „Times” i zamiast tego zgłaszają „ArgumentError” w konstruktorach i podczas analizowania, podczas gdy „tryparse” nic nie zwraca.
  • Pakiet dystrybuowany
    • Konfiguracja pakietu (aktywny projekt, „LOAD_PATH”, „DEPOT_PATH”) jest teraz propagowana podczas dodawania lokalnych procesów roboczych (np. przy użyciu „addprocs(N::Int)” lub przy użyciu flagi wiersza poleceń „--procs=N”).
    • „addprocs” dla lokalnych procesów roboczych akceptuje teraz argument o nazwie „env” w celu przekazywania zmiennych środowiskowych do procesów roboczych.
  • Unicode: „graphemes(s, m:n)” zwraca podciąg od m-tego do n-tego grafemu w „s”.
  • Pakiet DelimitedFiles został usunięty z bibliotek systemowych i jest teraz rozpowszechniany jako oddzielny pakiet, który należy jawnie zainstalować, aby móc go używać.
  • Zależności zewnętrzne
    • W systemie Linux automatycznie wykrywana jest wersja biblioteki systemowej libstdc++ i, jeśli jest nowsza, ładowana. Stare, wbudowane zachowanie ładowania biblioteki libstdc++, niezależnie od wersji systemu, można przywrócić, ustawiając zmienną środowiskową „JULIA_PROBE_LIBSTDCXX=0”.
    • Usunięto „RPATH” z pliku binarnego Julii, co może spowodować uszkodzenie bibliotek w systemie Linux, które nie definiują zmiennej „RUNPATH”.
    • Ulepszenia narzędzi: Dane wyjściowe „MethodError” i metod (na przykład z „methods(my_func)”) są teraz formatowane i kolorowane zgodnie z zasadą wyświetlania metod w ścieżce stosu.

    Źródło: opennet.ru

Dodaj komentarz