Доступна мова програмування Julia 1.9

Опубліковано реліз мови програмування Julia 1.9, що поєднує такі якості як висока продуктивність, підтримка динамічної типізації та вбудовані засоби для паралельного програмування. Синтаксис Julia близький до MATLAB із запозиченням деяких елементів з Ruby та Lisp. Метод маніпуляції рядками нагадує Perl. Код проекту розповсюджується під ліцензією MIT.

Ключові особливості мови:

  • Висока продуктивність: однією з ключових цілей проекту є досягнення продуктивності близької до програм мовою Сі. Компілятор Julia заснований на напрацюваннях проекту LLVM та генерує ефективний нативний машинний код для багатьох цільових платформ;
  • Підтримує різні парадигми програмування, включаючи елементи об'єктно-орієнтованого та функціонального програмування. Стандартна бібліотека надає у тому числі функції для асинхронного введення/виводу, управління процесами, ведення логів, профілювання та управління пакетами;
  • Динамічна типізація: мова не вимагає явного визначення типів змінних за аналогією зі скриптовими мовами програмування. Підтримується інтерактивний режим роботи;
  • Опціональна можливість явної вказівки типів;
  • Синтаксис, що чудово підходить для чисельних обчислень, наукових розрахунків, систем машинного навчання та візуалізації даних. Підтримка багатьох числових типів даних та засобів для розпаралелювання обчислень.
  • Можливість прямого виклику функцій з бібліотек мовою Сі без додаткових прошарків.

Основні зміни в Julia 1.9:

  • Нові можливості мови
    • Дозволено виконання присвоєння в іншому модулі за допомогою «setproperty!(::Module, ::Symbol, x)».
    • Дозволено множинне присвоєння над фінальної позиції. Наприклад, рядок «a, b…, c = 1, 2, 3, 4» буде оброблений як «a = 1; b ... = 2, 3; c = 4». Це обробляється через Base.split_rest.
    • Літерали окремих символів тепер підтримують той самий синтаксис, як і рядкові літерали; тобто. синтаксис може представляти неприпустимі UTF-8 послідовності, як це дозволено типом Char.
    • Додано підтримку специфікації Unicode 15.
    • Вкладені комбінації кортежів та іменовані кортежі символів тепер можна використовувати як параметри типу.
    • Нові вбудовані функції «getglobal(::Module, ::Symbol[, order])» та «setglobal!(::Module, ::Symbol, x[, order])» для читання та запису виключно у глобальні змінні. Метод getglobal тепер повинен бути кращим для доступу до глобальних змінних, ніж метод getfield.
  • Зміни у мові
    • Макрос @invoke, представлений у версії 1.7, тепер експортується і доступний для використання. Крім того, тепер він використовує метод Core.Typeof(x), а не Any у випадку, коли анотація типу опущена для аргументу x. Це необхідно для того, щоб типи, що передаються як аргументи, оброблялися правильно.
    • Включено експортування функції «invokelatest» та макросу «@invokelatest», що з'явилися у версії 1.7.
  • Поліпшення компілятора/середовища виконання
    • Значно скорочено час до першого виконання (TTFX - Time to first execution). Попередня компіляція пакета тепер зберігає машинний код в pkgimage, що означає, що код, згенерований в процесі попередньої компіляції, не вимагатиме повторної компіляції після завантаження пакета. Використання режиму pkgimages можна вимкнути за допомогою опції pkgimages=no.
    • Виправлено відому проблему квадратичної складності виведення типів, і загалом висновок використовує менше пам'яті. Деякі граничні випадки з автоматично згенерованими довгими функціями комп'ютеруються набагато швидше.
    • Виклики з аргументами без конкретних типів тепер можуть бути оптимізовані методом Union-splitting для впровадження чи статичного дозволу, навіть якщо є кілька різнотипних кандидатів для диспетчеризації. Це може покращити продуктивність у певних ситуаціях, коли типи об'єктів не повністю статично дозволені, за рахунок статичного дозволу сайтів виклику @nospecialize-d та уникнення повторної компіляції.
    • Усі варіанти використання макросу @pure у модулі Base замінені Base.@assume_effects.
    • Виклики invoke(f, invokesig, args…) з менш конкретними типами ніж зазвичай використовуються для f(args…) більше не призводять до перекомпіляції пакету.
  • Зміна параметрів командного рядка
    • У Linux і Windows параметр «threads=auto» тепер намагається визначити доступну кількість процесорів на основі CPU affinity, маска якого зазвичай встановлюється в середовищах високопродуктивних обчислень і хмарних середовищах.
    • Вимкнено параметр «—math-mode=fast», замість якого рекомендується використовувати макрос «@fastmath», який має чітко визначену семантику.
    • Параметр «—threads» має формат «auto | N[,auto|M]», де M вказує кількість створюваних інтерактивних потоків (нині auto означає 1).
    • Додано опцію «—heap-size-hint= », Встановлює поріг, після якого починається активне складання сміття. Розмір може бути вказаний у байтах, кілобайтах (1000 КБ), мегабайтах (300 МБ) або гігабайтах (1,5 ГБ).
  • Зміни у багатопоточності
    • "Threads.@spawn" тепер має опціональний перший аргумент зі значенням ": default" або ": interactive". Інтерактивне завдання вимагає малої затримки відгуку та розраховане бути короткою або часто виконуваною. Інтерактивні завдання виконуватимуться в інтерактивних потоках, якщо вони вказані під час запуску Julia.
    • Потоки, запущені поза середовищем виконання Julia (наприклад, з C або Java), тепер можуть викликати код Julia, використовуючи «jl_adopt_thread». Це відбувається автоматично при введенні коду Julia через cfunction або точку входу @ccallable. Як наслідок, кількість потоків тепер може змінюватись під час виконання.
  • Нові бібліотечні функції
    • Нова функція "Iterators.flatmap".
    • Нова функція pkgversion(m::Module) для отримання версії пакета, який завантажив даний модуль, аналогічно pkgdir(m::Module).
    • Нова функція "stack(x)", яка узагальнює "reduce(hcat, x::Vector{<:Vector})" до будь-якої розмірності і допускає будь-який ітератор ітераторів. Метод stack(f, x) узагальнює mapreduce(f, hcat, x) і є більш ефективним.
    • Новий макрос для аналізу виділеної пам'яті @allocations, аналогічний @allocated, за винятком того, що повертає кількість операцій виділення пам'яті, а не загальний розмір виділеної пам'яті.
  • Нові можливості бібліотеки
    • "RoundFromZero" тепер працює для типів, відмінних від "BigFloat".
    • "Dict" тепер можна зменшити вручну за допомогою "sizehint!".
    • "@time" тепер вказує окремо відсоток часу, витраченого на перекомпіляцію недійсних методів.
  • Зміни у стандартній бібліотеці
    • Усунено проблему паралельного доступу в методах ітерації для Dict та інших похідних об'єктів, таких як keys(::Dict), values(::Dict) та Set. Ці методи ітерації тепер можна викликати для Dict або Set паралельно для необмеженої кількості потоків за умови, що немає дій, які змінюють словник чи набір.
    • Заперечення функції-предикату "!f" тепер повертає складову функцію "(!) ∘ f" замість анонімної функції.
    • Функції зрізу розмірності тепер працюють у кількох вимірах: eachslice, eachrow і eachcol повертають об'єкт Slices, який дозволяє виконувати диспетчеризацію для надання більш ефективних методів.
    • До загальнодоступного API додано макрос @kwdef.
    • Виправлено проблему з порядком операцій у «fld1».
    • Сортування тепер завжди стабільне за часом (перероблений QuickSort).
    • "Base.splat" тепер експортується. Значення, що повертається, являє собою тип «Base.Splat», а не анонімну функцію, що дозволяє його красиво виводити.
  • Менеджер пакетів
    • "Package Extensions": підтримка завантаження фрагмента коду з інших пакетів, що завантажуються в сеансі Julia. Застосування подібне до пакета «Requires.jl», але підтримується попередня компіляція та сумісність налаштувань.
  • Бібліотека LinearAlgebra
    • Через ризик плутанини з поелементним розподілом видалені методи «a/b» та «b\a» зі скаляром «a» та вектором «b», які були еквівалентні «a*pinv(b)».
    • Для виклику BLAS і LAPACK тепер застосовується "libblastrampoline (LBT)". OpenBLAS постачається за замовчуванням, але збирання образу системи з іншими бібліотеками BLAS/LAPACK не підтримується. Натомість рекомендується використовувати механізм LBT для заміни BLAS/LAPACK на інший наявний комплект бібліотек.
    • "lu" підтримує нову стратегію повороту матриці "RowNonZero()", яка вибирає перший ненульовий елемент повороту для використання з новими арифметичними типами та для навчальних цілей.
    • "normalize(x, p=2)" тепер підтримує будь-який нормований векторний простір "x", включаючи скаляри.
    • Кількість потоків BLAS за умовчанням дорівнює кількості потоків CPU на архітектурі ARM і половині числа потоків CPU на інших архітектурах.
  • Printf: Для кращого читання перероблено повідомлення про помилки для рядків неправильного формату.
  • Profile: Нова функція "Profile.take_heap_snapshot(file)", яка записує файл у форматі ".heapsnapshot" на основі JSON, що підтримується в Chrome.
  • Random: randn та randexp тепер працюють для будь-якого типу AbstractFloat, що визначає rand.
  • ВІДПОВІДЬ
    • Натискання комбінації клавіш Alt-e тепер відкриває поточне введення в редакторі. Вміст (якщо він змінений) буде виконано при виході з редактора.
    • Поточний контекст модуля, активний у REPL, можна змінити (за замовчуванням це Main) за допомогою функції REPL.activate(::Module) або шляхом введення модуля в REPL і натискання комбінації клавіш Alt-m.
    • Режим «нумерованої підказки», який виводить числа для кожного входу та виходу та зберігає оцінені результати в Out, може бути активований за допомогою REPL.numbered_prompt!().
    • Автодоповнення за допомогою табуляції відображає доступні аргументи ключового слова.
  • SuiteSparse: Код для вирішувача "SuiteSparse" переміщений у "SparseArrays.jl". Вирішувачі тепер повторно експортуються "SuiteSparse.jl".
  • SparseArrays
    • Вирішувачі «SuiteSparse» тепер доступні як підмодулі «SparseArrays».
    • Режими захисту потоків UMFPACK та CHOLMOD покращені за рахунок виключення глобальних змінних та використання блокувань. Багатопотоковий «ldiv!» об'єктів UMFPACK тепер можна виконувати безпечно.
    • Експериментальна функція "SparseArrays.allowscalar(::Bool)" дозволяє відключати або включати скалярне індексування розріджених масивів. Ця функція призначена для виявлення випадкового скалярного індексування об'єктів SparseMatrixCSC, що є поширеним джерелом проблем з продуктивністю.
  • Новий відмовостійкий режим для наборів тестів, який достроково завершує тестовий запуск у разі збою чи помилки. Встановлюється або через @testset kwarg failfast=true, або export JULIA_TEST_FAILFAST=true. Подібне буває необхідним у запусках CI для дострокового отримання повідомлень про помилку.
  • Dates: Порожні рядки більше не аналізуються неправильно як допустимі значення "DateTime", "Dates" або "Times" і замість цього видають помилку "ArgumentError" у конструкторах та синтаксичному аналізі, у той час як "tryparse" нічого не повертає.
  • Пакет Distributed
    • Конфігурація пакета (активний проект, LOAD_PATH, DEPOT_PATH) тепер поширюється при додаванні локальних робочих процесів (наприклад, за допомогою addprocs(N::Int) або за допомогою прапора командного рядка —procs=N).
    • addprocs для локальних робочих процесів тепер приймає аргумент з ім'ям env для передачі змінних оточення робочим процесам.
  • Unicode: «graphemes(s, m:n)» повертає підрядок від m-ї до n-ї графеми в «s».
  • Пакет DelimitedFiles винесений із системних бібліотек і тепер поширюється як окремий пакет, який має бути явно встановлений для використання.
  • Зовнішні залежності
    • У Linux автоматично визначається версія системної бібліотеки libstdc++ і якщо вона є новішою, то завантажується. Стару поведінку завантаження вбудованої libstdc++ незалежно від версії системи можна відновити, встановивши змінну оточення «JULIA_PROBE_LIBSTDCXX=0».
    • З бінарного файлу julia видалено "RPATH", що може призвести в Linux до поломки бібліотек, яким не вдалося визначити змінну "RUNPATH".
    • Поліпшення інструментів: Виведення «MethodError» та методів (наприклад з «methods(my_func)») тепер оформлено та розфарбовано відповідно до принципу виведення методів при трасуванні стека.

    Джерело: opennet.ru

Додати коментар або відгук