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 может быть собрана без включения базы данных, используя опцию MakefileWITH_TERMINFO=0
. (#55411)
Tooling Improvements
- CI теперь выполняет ограниченное автоматическое обнаружение опечаток во всех PR. Если вы объедините PR с неудачной проверкой опечаток CI, то сообщенные опечатки будут автоматически игнорироваться в будущих запусках CI на PR, которые редактируют те же файлы (#51704).