Julia v1.11 Release Notes

New language features

  • Новый тип Memory, который предоставляет контейнер более низкого уровня в качестве альтернативы Array. Memory имеет меньшие накладные расходы и более быстрый конструктор, что делает его хорошим выбором для ситуаций, которые не требуют всех функций Array (например, многомерные массивы). Большая часть типа Array теперь реализована в Julia на основе Memory, что приводит к значительным ускорениям для нескольких функций (например, push!), а также к более поддерживаемому коду (#51319).
  • public — это новое ключевое слово. Символы, помеченные как public, считаются публичным API. Символы, помеченные как export, теперь также рассматриваются как публичный API. Разница между public и export заключается в том, что имена public не становятся доступными при using пакета/модуля (#50105).
  • ScopedValue реализует динамическую область видимости с наследованием между задачами (#50958).
  • Manifest.toml файлы теперь могут быть переименованы в формате Manifest-v{major}.{minor}.toml, чтобы предпочтительно использоваться данной версией julia. То есть в одной и той же папке файл Manifest-v1.11.toml будет использоваться версией v1.11, а Manifest.toml — каждой другой версией julia. Это упрощает управление окружениями для нескольких версий julia одновременно (#43845).
  • Поддержка Unicode 15.1 (#51799).

Language changes

  • Во время предварительной компиляции хуки atexit теперь выполняются перед сохранением выходного файла. Это позволяет пользователям безопасно завершать фоновое состояние (например, закрывать Timer и отправлять уведомления о разъединении задачам heartbeat) и очищать другие ресурсы, когда программа хочет начать выход.
  • Code coverage and malloc tracking is no longer generated during the package precompilation stage. Further, during these modes pkgimage caches are now used for packages that are not being tracked. This means that coverage testing (the default for julia-actions/julia-runtest) will by default use pkgimage caches for all other packages than the package being tested, likely meaning faster test execution (#52123).
  • Указание пути в JULIA_DEPOT_PATH теперь приводит к расширению пустых строк, чтобы опустить стандартный пользовательский депо (#51448).
  • Файлы кэша предварительной компиляции теперь могут быть перемещены, и их действительность теперь проверяется через хеш-содержимое их исходных файлов вместо их mtime (#49866).
  • Расширения теперь могут зависеть от других расширений, если их триггеры включают все триггеры любого расширения, от которого они хотят зависеть (+ как минимум один другой триггер). Зависимости от расширения к расширению, которые не соответствуют этому требованию, теперь заблокированы от использования Base.get_extension во время предварительной компиляции, чтобы предотвратить циклы расширений #55557.

Compiler/Runtime improvements

  • Updated GC heuristics to count allocated pages instead of individual objects (#50144).
  • Добавлена поддержка аннотирования Base.@assume_effects в блоках кода (#52400).

Command-line option changes

  • Точка входа для Julia была стандартизирована на Main.main(args). Это должно быть явно выбрано с помощью макроса @main (см. документацию для получения дополнительных деталей). Когда выбрано, и julia вызывается для выполнения скрипта или выражения (т.е. с использованием julia script.jl или julia -e expr), julia затем автоматически выполнит функцию Main.main. Это предназначено для унификации рабочих процессов скриптов и компиляции, где загрузка кода может происходить в компиляторе, а выполнение Main.main может происходить в результирующем исполняемом файле. Для интерактивного использования нет семантической разницы между определением функции main и выполнением кода непосредственно в конце скрипта (#50974).
  • Флаги --compiled-modules и --pkgimages теперь могут быть установлены в existing, что заставит Julia рассмотреть возможность загрузки существующих файлов кэша, но не создавать новые (#50586, #52573).
  • Аргумент --project теперь принимает @script, чтобы указать путь к директории с Project.toml относительно переданного файла скрипта. --project=@script/foo для подпапки foo. Если путь не указан после (т.е. --project=@script), то (как и --project=@.) директория и её родительские директории будут проверяться на наличие Project.toml (#50864 и #53352)

Multi-threading changes

  • Threads.@threads теперь поддерживает планировщик :greedy, предназначенный для неравномерных нагрузок (#52096).
  • Новая публичная (но неэкспортируемая) структура Base.Lockable{T, L<:AbstractLock} упрощает объединение ресурса и его блокировки (#52898).

Build system changes

  • Существует новый Makefile для сборки Julia и LLVM с использованием стратегий оптимизации на основе профиля и оптимизации времени линковки (PGO и LTO), см. contrib/pgo-lto/Makefile (#45641).

New library functions

  • Три новых типа вокруг идеи текста с "аннотациями" (Pair{Symbol, Any} записи, например, :lang => "en" или :face => :magenta). Эти аннотации сохраняются при операциях (например, конкатенация строк с *), когда это возможно.

    • AnnotatedString — это новый тип AbstractString. Он оборачивает основную строку и позволяет прикреплять аннотации к регионам строки. Этот тип широко используется в новой стандартной библиотеке StyledStrings для хранения информации о стилях.
    • AnnotatedChar — это новый тип AbstractChar. Он оборачивает другой символ и содержит список аннотаций, которые к нему применимы.
    • AnnotatedIOBuffer — это новый тип IO, который имитирует IOBuffer, но имеет специализированные методы read/write для аннотированного контента. Это можно рассматривать как своего рода "конструктор строк", а также как связующее звено между аннотированным и неаннотированным контентом.
  • in!(x, s::AbstractSet) вернет, находится ли x в s, и вставит x в s, если его там нет (#45156, #51636).

  • Новая функция Libc.mkfifo оборачивает функцию mkfifo на C для платформ Unix (#34587).

  • logrange(start, stop; length) создает диапазон с постоянным отношением, вместо постоянного шага (#39071)

  • copyuntil(out, io, delim) и copyline(out, io) копируют данные в поток out::IO (#48273).

  • eachrsplit(string, pattern) итерирует разделенные подстроки справа налево (#51646).

  • Sys.username() может быть использован для возврата имени пользователя текущего пользователя (#51897).

  • Sys.isreadable(), Sys.iswritable() можно использовать для проверки, имеет ли текущий пользователь права доступа, позволяющие чтение и запись соответственно. (#53320).

  • GC.logging_enabled() можно использовать для проверки, включено ли ведение журнала GC через GC.enable_logging (#51647).

  • IdSet теперь экспортируется из Base и считается публичным (#53262).

  • @time теперь сообщает количество любых конфликтов блокировок, когда ReentrantLock должен был ждать, плюс новый макрос @lock_conflicts, который возвращает это количество (#52883).

  • Новый макрос Base.Cartesian.@ncallkw аналогичен Base.Cartesian.@ncall, но позволяет добавлять именованные аргументы к вызову функции (#51501).

  • Новая функция Docs.hasdoc(module, symbol) сообщает, имеет ли имя строку документации (#52139).

  • Новая функция Docs.undocumented_names(module) возвращает недокументированные публичные имена модуля (#52413).

New library features

  • invmod(n, T), где T является нативным целочисленным типом, теперь вычисляет обратный элемент по модулю n в кольце целых чисел, определяемом T (#52180).
  • invmod(n) является сокращением для invmod(n, typeof(n)) для нативных целочисленных типов (#52180).
  • replace(string, pattern...) теперь поддерживает необязательный аргумент IO, чтобы записывать вывод в поток, а не возвращать строку (#48625).
  • Новые методы allequal(f, itr) и allunique(f, itr), принимающие предикатную функцию (#47679).
  • sizehint!(s, n) теперь поддерживает необязательный аргумент shrink, чтобы отключить уменьшение (#51929).
  • Передача IOBuffer в качестве аргумента stdout для Process теперь работает как ожидалось, синхронизированная с wait или success, поэтому Base.BufferStream больше не требуется для корректности, чтобы избежать гонок данных (#52461).
  • После выхода процесса closewrite больше не будет автоматически вызываться для потока, переданного ему. Вместо этого вызовите wait на процессе, чтобы убедиться, что содержимое полностью записано, затем вручную вызовите closewrite, чтобы избежать гонок данных, или используйте форму обратного вызова open, чтобы все это обрабатывалось автоматически (#52461).
  • @timed теперь дополнительно возвращает время компиляции и рекомпиляции (#52889).
  • filter теперь может действовать на NamedTuple (#50795).
  • Iterators.cycle(iter, n) выполняет итерацию по iter фиксированное количество раз, вместо бесконечно (#47354).
  • zero(::AbstractArray) теперь применяется рекурсивно, поэтому zero([[1,2],[3,4,5]]) теперь производит аддитивный ноль [[0,0],[0,0,0]], а не вызывает ошибку (#38064).
  • include_dependency(path; track_content=true) позволяет переключиться с использования mtime на хеширование зависимости предварительной компиляции для восстановления возможности перемещения кэшей предварительной компиляции (#51798).

Standard library changes

  • Метод резервного копирования write(::IO, ::AbstractArray) раньше рекурсивно вызывал write для каждого элемента, но теперь записывает представление каждого значения в памяти. Например, write(io, 'a':'b') теперь записывает 4 байта для каждого символа, вместо того чтобы записывать представление UTF-8 для каждого символа. Новый формат совместим с тем, который используется в Array, что делает возможным использование read! для получения данных обратно (#42593).
  • Невозможно определить length для состоящих итераторов в общем последовательном порядке. Потенциал для тихо неверных результатов для Stateful итераторов решается удалением метода length(::Stateful). Последний параметр типа Stateful также исчез. Проблема: (#47790), PR: (#51747).

Package Manager

  • Теперь можно указать "источники" для пакетов в секции [sources] в Project.toml. Это можно использовать для добавления незарегистрированных обычных или тестовых зависимостей.
  • Pkg теперь соблюдает границы [compat] для julia и выдает ошибку, если версия запущенного бинарного файла Julia несовместима с границами в Project.toml. Pkg всегда соблюдал эту совместимость при работе с пакетами из реестра. Это изменение в основном затрагивает локальные пакеты.
  • pkg> add и Pkg.add теперь будут добавлять записи совместимости для новых прямых зависимостей, если активная среда является пакетом (имеет записи name и uuid).
  • Зависимости теперь можно напрямую добавлять как слабые зависимости или дополнительные через формы pkg> add --weak/extra Foo или Pkg.add("Foo", target=:weakdeps/:extras).

StyledStrings

  • Новая стандартная библиотека для обработки стилей более комплексным и структурированным образом (#49586).
  • Новая структура Faces служит контейнером для информации о стилизации текста (подумайте о шрифте, а также о цвете и декорации) и предоставляет структуру для удобного, расширяемого (через addface!) и настраиваемого (с помощью Faces.toml пользователя и loadfaces!) подхода к стилизованному контенту (#49586).
  • Новый @styled_str макрос строки предоставляет удобный способ создания AnnotatedString с различными шрифтами или другими атрибутами (#49586).

Libdl

  • Новый тип LazyLibrary экспортируется из Libdl для использования в построении цепочечных ленивых загрузок библиотек, в первую очередь для использования внутри JLL (#50074).

LinearAlgebra

  • cbrt(::AbstractMatrix{<:Real}) теперь определен и возвращает матрицы кубических корней действительных матриц (#50661).
  • eigvals/eigen(A, bunchkaufman(B)) и eigvals/eigen(A, lu(B)), которые используют разложение Банчкауфмана (LDL) и LU разложение B, соответственно, теперь эффективно вычисляют обобщенные собственные значения (eigen: и собственные векторы) A и B. Примечание: Второй аргумент является выходом bunchkaufman или lu (#50471).
  • Теперь существует специализированная диспетчеризация для eigvals/eigen(::Hermitian{<:Tridiagonal}), которая выполняет преобразование подобия для создания вещественной симметричной тридиагональной матрицы и решает эту задачу с использованием процедур LAPACK (#49546).
  • Структурированные матрицы теперь сохраняют либо оси родительского (для Symmetric/Hermitian/AbstractTriangular/UpperHessenberg), либо ось главной диагонали (для полосных матриц) (#52480).
  • bunchkaufman и bunchkaufman! теперь работают для любых AbstractFloat, Rational и их комплексных вариантов. bunchkaufman теперь поддерживает типы Integer, выполняя внутреннее преобразование в Rational{BigInt}. Добавлена новая функция inertia, которая вычисляет инерцию диагонального фактора, заданного объектом факторизации BunchKaufman для вещественной симметричной или эрмитовой матрицы. Для комплексных симметричных матриц inertia вычисляет только количество нулевых собственных значений диагонального фактора (#51487).
  • Пакеты, которые специализируются на mul! для матриц, с сигнатурой метода вида mul!(::AbstractMatrix, ::MyMatrix, ::AbstractMatrix, ::Number, ::Number), больше не сталкиваются с неоднозначностями методов при взаимодействии с LinearAlgebra. Ранее неоднозначности возникали при умножении MyMatrix на структурированный тип матрицы, предоставляемый LinearAlgebra, такой как AbstractTriangular, что требовало дополнительных методов для разрешения таких неоднозначностей. Подобные источники неоднозначностей также были удалены для операций mul! с матрицами и векторами (#52837).
  • lu и issuccess(::LU) теперь принимают аргумент ключевого слова allowsingular. Если он установлен в true, допустимая факторизация с ранг-дефицитным U-фактором будет считаться успешной, а не вызывать ошибку. Такие факторизации теперь отображаются при печати факторов вместе с примечанием "ранг-дефицитный", а не выводится сообщение "Неудачная факторизация" (#52957).

Random

  • rand теперь поддерживает выборку по типам Tuple (#35856, #50251).
  • rand теперь поддерживает выборку по типам Pair (#28705).
  • Когда инициализируются генераторы случайных чисел, предоставляемые Random, теперь можно использовать отрицательные целые числа в качестве семян (#51416).
  • Генераторы случайных чисел с возможностью задания начального значения из Random теперь могут быть инициализированы строкой, например, seed!(rng, "a random seed") (#51527).

REPL

  • Подсказки автозаполнения теперь отображаются более светлым текстом во время ввода в REPL. Чтобы отключить, установите 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

    (#51229).

  • Meta-M с пустым запросом теперь переключает контекстный модуль между предыдущим неконечным контекстным модулем и Основным, так что переключение туда и обратно становится простым (#51616, #52670).

Dates

Не документированная функция adjust больше не экспортируется, но теперь задокументирована (#53092).

Statistics

  • Статистика теперь является обновляемой стандартной библиотекой (#46501).

Distributed

  • pmap теперь по умолчанию использует CachingPool (#33892).

Deprecated or removed

  • Base.map, Iterators.map и foreach потеряли свои методы с одним аргументом (#52631).

External dependencies

  • Библиотека libuv была обновлена с версии v1.44.2 до v1.48.0 (#49937).
  • tput больше не используется для проверки возможностей терминала; он был заменен на парсер terminfo на чистом Julia (#50797).
  • База данных информации терминала, terminfo, теперь по умолчанию включена в пакет, что обеспечивает лучший пользовательский опыт REPL, когда terminfo недоступен в системе. Julia может быть собрана без включения базы данных, используя опцию Makefile WITH_TERMINFO=0. (#55411)

Tooling Improvements

  • CI теперь выполняет ограниченное автоматическое обнаружение опечаток во всех PR. Если вы объедините PR с неудачной проверкой опечаток CI, то сообщенные опечатки будут автоматически игнорироваться в будущих запусках CI на PR, которые редактируют те же файлы (#51704).