Опубліковано реліз мови програмування Julia 1.11, що поєднує такі якості як висока продуктивність, підтримка динамічної типізації та вбудовані засоби для паралельного програмування. Синтаксис Julia близький до MATLAB із запозиченням деяких елементів з Ruby та Lisp. Метод маніпуляції рядками нагадує Perl. Код проекту розповсюджується під ліцензією MIT.
Ключові особливості мови:
- Висока продуктивність: однією з ключових цілей проекту є досягнення продуктивності близької до програм мовою Сі. Компілятор Julia заснований на напрацюваннях проекту LLVM та генерує ефективний нативний машинний код для багатьох цільових платформ;
- Підтримує різні парадигми програмування, включаючи елементи об'єктно-орієнтованого та функціонального програмування. Стандартна бібліотека надає у тому числі функції для асинхронного введення/виводу, управління процесами, ведення логів, профілювання та управління пакетами;
- Динамічна типізація: мова не вимагає явного визначення типів змінних за аналогією зі скриптовими мовами програмування. Підтримується інтерактивний режим роботи;
- Опціональна можливість явної вказівки типів;
- Синтаксис, що чудово підходить для чисельних обчислень, наукових розрахунків, систем машинного навчання та візуалізації даних. Підтримка багатьох числових типів даних та засобів для розпаралелювання обчислень.
- Можливість прямого виклику функцій з бібліотек мовою Сі без додаткових прошарків.
Основні зміни в Julia 1.11:
- Нові можливості мови
- Додано тип Memory, який є низькорівневою альтернативою типу Array. Тип Memory вимагає менших витрат і має швидкий конструктор, будучи альтернативою Array там, де не потрібно повний набір його можливостей. Наприклад, багатовимірні масиви. У внутрішній реалізації, більшість методів типу Array реалізована поверх типу Memory, що значно прискорило деякі функції, наприклад push.
- Додано ключове слово "public". Ідентифікатори, промарковані як «public», розглядаються як зовнішній програмний інтерфейс. Ідентифікатори з ключовим словом "export" розглядаються схожим чином. Але основне різницю між «public» і «export» у цьому, що імена, помічені «public», не входять у контекст модуля під час використання «using» у залежних модулях.
- Пакет ScopedValue реалізує динамічну область видимості під час використання у паралельному програмуванні Threads/tasks.
- Файл Manifest.toml може бути перейменований у форматі Manifest-v{major}.{minor}.toml для використання конкретною версією Julia. Наприклад, файл Manifest-v1.11.toml буде використаний версією 1.11, а файл Manifest.toml в тій же директорії буде використовуватися іншими версіями Julia.
- Додано підтримку Unicode 15.1.
- Зміни у мові
- У процесі прекомпіляції обробник "atexit" запускається до формування результуючого файлу. Це дозволяє користувачам безпечно завершувати фонове виконання (наприклад, тригери за таймером або періодичні оповіщення), а також явно вивільняти ресурси перед завершенням програми.
- Файли покриття коду та виділення пам'яті більше не формуються у процесі прекомпіляції. Крім того, у цих режимах кеші pkgimage використовуються для пакетів, які також не відстежуються. Це означає, що тести покриття (за замовчуванням для julia-actions/julia-runtest) використовують кеші pkgimage для всіх інших пакетів, від яких тестується. Це дає змогу прискорити тестування.
- Вказівка шляху JULIA_DEPOT_PATH тепер обробляється інакше. За наявності одного шляху, тільки цей шлях буде вставлено значення внутрішньої змінної DEPOT_PATH. Якщо останнім символом є «:», то змінна DEPOT_PATH отримає значення, що містить все те, що було вказано до «:», а також перелік системних шляхів, де знаходиться Julia.
- Файли кешу попередньої компіляції тепер можна переміщати, які актуальність тепер перевіряється з допомогою хешу вмісту вихідних файлів, а чи не з допомогою «mtime».
- Поліпшення компілятора/середовища виконання
- Оновлено евристику збирача сміття, що дозволяє працювати зі сторінками пам'яті загалом замість індивідуальних об'єктів.
- Додано підтримку анотування Base.@assume_effects у коді.
- Зміна параметрів командного рядка
- Точка входу тепер чітко визначена як Main.main(args). Точка входу має бути визначена макросом @main (див. документацію). Якщо точка входу задана в скрипті, що запускається в командному рядку (наприклад, "julia script.jl або julia -e expr"), julia запустить функцію Main.main автоматично. Це зроблено для уніфікації виконання скриптів та його компіляції, коли завантаження коду може відбуватися для компіляції, а виконання методу Main.main лише з етапі запуску виконуваного файла. У разі використання Julia в інтерактивному режимі змін немає. Весь код виконується послідовно. Аргументи "-compiled-modules" і "-pkgimages" можуть бути виставлені в режим existing, який змушує Julia використовувати існуючі кеші, але не створювати нові.
- Аргумент «—project» тепер може отримувати значення @script для вказівки розміщення файлу Project.toml щодо скрипту, що запускається. Наприклад «project=@script/foo» для піддиректорії foo. Якщо нічого не вказано, тобто «project=@script», це буде аналогічно «project=@.», коли файл Project.toml шукається в поточній директорії.
- Багатопотокові зміни
- У макросі Threads.@threads можна вказати режим планувальника: greedy, який зручний для нерівномірного обчислювального навантаження. Нова структура (зі специфікатором public, але не export) «struct Base.Lockable{T, L<:AbstractLock}» є обгорткою для впорядкування паралельного доступу до елементів складових типів, в цілому спрощуючи код.
- Зміни системи збирання
- Файл Makefile для складання Julia та LLVM використовує стратегії оптимізації PGO та LTO. Див. contrib/pgo-lto/Makefile.
- Нові бібліотечні функції
- Додано три нові типи в рамках ідеї тексту з анотацією - Pair{Symbol, Any}, наприклад ':lang => en' або ':face => :magenta'. Якщо це можливо, анотації зберігаються в процесі операцій над рядками, наприклад конкатенції.
- Конкретний тип AnnotatedString реалізує AbstractString. Цей тип є обгорткою над рядком, дозволяючи додати інструкцію за діапазоном символів. Тип AnnotatedString широко використовується у новій стандартній бібліотеці StyledStrings для відображення інформації на екрані зі стилем.
- Конкретний тип AnnotatedChar реалізує AbstractChar. Є обгорткою над символом та дозволяє приєднати список анотацій до нього.
- Конкретний тип AnnotatedIOBuffer реалізує IO, повторює інтерфейс типу IOBuffer, але має спеціалізовані методи read/write для анотування потоку. Може використовуватися як будівельник рядків або як засіб склеювання анотованих та не анотованих рядків.
- Метод "in!(x, s::AbstractSet)" завжди повертає true. Але якщо елемент x не входить у s, він буде вставлений.
- Нова функція Libc.mkfifo є обгорткою C-функції mkfifo для платформ Unix.
- Метод «logrange(start, stop; length)» створює логарифмічну послідовність із зазначеною кількістю замість фіксованого кроку.
- Методи copyuntil(out, io, delim) і copyline(out, io) копіюють дані з потоку io в потік out::IO.
- Метод «eachrsplit(string, pattern)» повертає ітератор за розбитими елементами рядка праворуч наліво.
- Метод Sys.username() повертає ім'я користувача.
- Методи Sys.isreadable(), Sys.iswritable() можуть бути використані для визначення дозволів користувача на читання та запис даних.
- Метод GC.logging_enabled() повертає true якщо журналування операцій збирача сміття увімкнено через GC.enable_logging.
- Тип IdSet тепер експортується з Base та є загальнодоступним.
- Макрос @time зараз повідомляє значення лічильника конфліктів блокування, якщо використовується ReentrantLock, який необхідно очікувати. А також доданий макрос @lock_conflicts, які повертає цей лічильник.
- Макрос Base.Cartesian.@ncallkw розроблений за аналогією з Base.Cartesian.@ncall, але дозволяє додати аргументи у формі ключових слів для виклику функції.
- Нова функція Docs.hasdoc(module, symbol) повідомляє, чи має запитане ім'я symbol опису docstring.
- Нова функція Docs.undocumented_names(module) повертає імена недокументованих функцій запитаного модуля module.
- Нові можливості відомих методів
- Метод invmod(n, T) для певного цілого типу T тепер обчислює зворотне за модулем ціле n за новим алгоритмом.
- Метод invmod(n) надає скорочену форму виклику invmod(n, typeof(n)) цілих типів.
- Метод replace(string, pattern…) тепер підтримує опціональний аргумент IO для повернення значення потоку замість повернення рядка типу String.
- Нові методи allequal(f, itr) та allunique(f, itr) з аргументом функції-предикату.
- Метод sizehint!(s, n) тепер підтримує опцію "shrink", що дозволяє відключити відсічення елементів.
- Передача IOBuffer як аргументу stdout при породженні процесів тепер працює з повною синхронізацією «wait» або «success», тому в Base.BufferStream немає більше необхідності перевірки доступності.
- Метод "closewrite" більше не викликається автоматично для переданого потоку після закриття процесу. Використовуйте метод "wait" для процесу, а потім примусово викликайте "closewrite". Або використовуйте форму open з функцій для автоматичної обробки закриття.
- Метод @timed тепер додатково повертає оцінку часу компіляції та перекомпіляції, обумовленої нестабільністю типів.
- Метод "filter" тепер може працювати з NamedTuple.
- Метод Iterators.cycle(iter, n) запускається на ітераторі iter фіксоване n число разів.
- Метод zero(::AbstractArray) застосовується рекурсивно, наприклад zero([[1,2],[3,4,5]]) породжує [[0,0],[0,0,0]] замість генерації помилки.
- Метод include_dependency(path; track_content=true) включає залежність на основі хеш-значення прекомпільованого коду, а не mtime.
- Зміни базової бібліотеки
- Метод write(::IO, ::AbstractArray) використовується для рекурсивного виклику методів write для кожного елемента масиву, але тепер записується подання в пам'яті кожного значення. Наприклад, виклик write(io, 'a':'b') запише 4 байти кожного символу замість скороченого представлення UTF-8 для кожного з них. Новий формат сумісний з Array, уможливлюючи використовувати метод «read!» для зворотного читання значень.
- Неможливо визначити метод "length" для ітераторів зі станом у загальному вигляді. У зв'язку з потенційно некоректною роботою ітераторів Stateful метод length(::Stateful) видалений.
- StyledStrings
- Нова стандартна бібліотека для стильового представлення рядків.
- Структура Faces є контейнером стильової інформації (колір, декоратори та ін.), а також надає каркас зручного, розширюваного (via addface!), і адаптованого (із застосуванням Faces.toml і loadfaces!) підходу до відображення вмісту зі стилями.
- Макрос @styled_str надає зручний спосіб створення анотованих рядків AnnotatedString з різними атрибутами-стилями. Наприклад, StyledStrings.addface!(:orange => StyledStrings.Face(foreground = 0xFF7700)) styled»{orange:this is orange text}»
- Libdl
- Новий тип LazyLibrary експортується з бібліотеки Libdl для створення лінивих ланцюжків завантаження бібліотек, які спочатку використовуються у форматі JLL.
- Лінійна алгебра
- Метод cbrt(::AbstractMatrix{<:Real}) тепер повертає матрицю дійсних значень квадратного коріння для вхідної матриці дійсних значень.
- Метод обчислення власних значень «eigvals/eigen(A, bunchkaufman(B)) та eigvals/eigen(A, lu(B))» використовує алгоритми Bunchkaufman (LDL) та LU декомпозиції B, відповідно, для ефективного обчислення узагальнених власних значень (eigen : і eigenvectors) від A і B. Другим аргументом методу передається результат методів bunchkaufman чи lu.
- Спеціалізований метод "eigvals/eigen(::Hermitian{<:Tridiagonal})", який призначений для симетричних тридіагональних матриць і використовує засоби LAPACK.
- Структуровані матриці зберігають тепер осі батьківських (для Symmetric/Hermitian/AbstractTriangular/UpperHessenberg), або осі головних діагоналей (для стрічкових матриць).
- Методи bunchkaufman та bunchkaufman! Тепер визначено для типів AbstractFloat, Rational та їх комплексних варіацій. Метод bunchkaufman тепер підтримує типи Integer, внутрішньо перетворюючи їх на Rational{BigInt}. Додано функцію inertia, яка обчислює інерцію діагонального фактора процедури BunchKaufman для об'єкта дійсної симетричної або Ермітової матриці. Для комплексних симетричних матриць метод inertia тільки обчислює кількість власних значень діагонального фактора.
- Пакети, що визначають метод матричного множення mul! з сигнатурою mul!(::AbstractMatrix, ::MyMatrix, ::AbstractMatrix, ::Number, ::Number) більше не будуть мати неоднозначність, взаємодіючи з пакетом LinearAlgebra. Раніше при множенні виникали неоднозначності між типом матриці MyMatrix і структурованими матрицями, що надаються пакетом LinearAlgebra, наприклад AbstractTriangular. Подібні проблеми усунуто для операцій mul! з типами матриці вектор.
- Методи lu і issuccess(::LU) тепер підтримують аргумент, що дозволяєвиконати. Якщо він має значення true, допустима факторизація з фактором U з недостатнім рангом вважатиметься успішною, а не видаватиме помилку. Такі факторизації тепер відображаються шляхом друку множників разом із позначкою "rank-deficient", а не повідомлення "Failed Factorization".
- випадковий
- Метод rand тепер застосовується для типів, переданих у формі Tuple.
- Метод rand тепер застосовується для типів, переданих Pair.
- Для початкового запуску генератора випадкових чисел RNG модуля Random можна використовувати негативні числа.
- Ініціалізація генератора випадкових чисел тепер може бути виконана рядком, наприклад, seed!(rng, «a random seed»).
- ВІДПОВІДЬ
- Натискання клавіші Tab для завершення підказки тепер підсвічується світлим шрифтом. Для вимкнення цього режиму застосуйте Base.active_repl.options.hint_tab_completes = false інтерактивно або у скрипті startup.jl: if VERSION >= v»1.11.0-0″ atreplinit() do repl repl.options.hint_tab_completes = false end end
- Meta-M з порожнім запрошенням тепер перемикає контекстний модуль між попереднім неосновним контекстним і основним, спрощуючи перемикання туди і назад.
- Дати
- Недокументована функція adjust не експортується, але задокументована.
- Статистика
- Пакет Statistics тепер оновлюється без усього комплекту Julia.
- Видали більше
- Метод pmap тепер використовує CachingPool за замовчуванням.
- Застарілі та віддалені методи
- Методи Base.map, Iterators.map і foreach з єдиним аргументом більше не підтримуються.
- Зовнішні залежності
- Бібліотеку libuv оновлено з версії 1.44.2 до 1.48.0.
- Метод tput не використовується для перевірки можливостей терміналу. Він замінений засобами аналізу terminfo, реалізованими повністю на Julia.
- Terminfo використовується за замовчуванням. Якщо в системі він відсутній, Julia може бути зібрана з опцією Makefile WITH_TERMINFO=0.
- Поліпшення інструментів
- CI тепер виконує обмежену автоматичну перевірку типів у всіх запитах злиття.
Джерело: opennet.ru
