Выпуск языка программирования Julia 1.10

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

Ключевые особенности языка:

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

Основные изменения в Julia 1.10:

  • Новые возможности языка
    • По умолчанию задействован новый улучшенный синтаксический анализатор JuliaSyntax.jl. Если необходимо вернуться к старому, следует установить переменную окружения JULIA_USE_FLISP_PARSER в значение 1.
    • Символы ⥺ (U+297A, leftarrowsubset) и ⥷ (U+2977, leftarrowless) теперь можно использовать как бинарные операторы с приоритетом стрелок.
  • Изменения в языке
    • При порождении дочерних задач, больше не затрагивается локальный RNG (генератор случайных чисел) родительской задачи. Новая схема инициализации генератора случайных чисел похожа на реализации SplitMix и DotMix.
    • Предложено новое правило выбора метода, которое устраняет неоднозначность с типом “Union{}” в пользу метода, определённого явно для обработки аргумента типа “Union{}”.
    • Символ “h bar” ℏ (hslash U+210F) теперь рассматривается как эквивалент ħ (hbar U+0127).
    • Макрос “@simd” теперь имеет конкретизированную семантику: он позволяет только переупорядочивать и сокращать операции с плавающей запятой вместо включения всех оптимизаций “быстрой математики @fastmath”. Если при выполнении программ наблюдается снижение производительности из-за этого изменения, то предыдущее поведение можно восстановить с помощью “@fastmath @simd”.
    • При отображении в трассировке стека метода с ключевыми словами, текстовое представление ключевых слов теперь упрощается с использованием нового синтаксиса макроса “@Kwargs{key1::Type1, …}”.
  • Улучшения компилятора/среды выполнения
    • Сборщик мусора теперь выполняет многопоточный отбор объектов для удаления.
    • JITLink по умолчанию включается в Linux-системах на базе архитектуры aarch64 при сборке Julia с LLVM 15 или более поздними версиями.
    • В процессе предварительной компиляции задействованы блокировки pid-файлов. Только один процесс julia в один момент времени осуществляет предварительную компиляцию. Раньше все процессы работали параллельно, и была опасность повредить файлы кэша компиляции из-за состояния гонки.
  • Изменения параметров командной строки
    • Добавлена опция “–gcthreads”, которая позволяет указать, сколько параллельных потоков будет использовать сборщик мусора. По умолчанию установлено значение “N/2”, где N — количество рабочих потоков (“–threads”), используемых Julia.
  • Изменения системы сборки
    • Из образа системы по умолчанию исключены нодули “SparseArrays” и “SuiteSparse”. В базовом комплекте Julia больше не содержится библиотек с лицензией GPL. Однако эти библиотеки по-прежнему включены вместе с языком в стандартный двоичный дистрибутив.
  • Новые библиотечные функции
    • “tanpi” вычисляет “tan(π*x)” более точно, чем “tan(pi*x)”.
    • “fourroot(x)” определен в Base.Math и может использоваться для вычисления корня четвёртой степени из “x”. Короткое имя этого метода – символ Юникода ∜, который можно ввести с помощью команды fourthroot.
    • Добавлены функции “Libc.memmove”, “Libc.memset” и “Libc.memcpy”, функциональность которых соответствует функциональности соответствующих вызовов C.
    • Добавлен метод “Base.isprecompiled(pkg::PkgId)”, который возвращает “true”, если пакет уже был предварительно скомпилирован.
  • Опции библиотечных функций
    • “binomial(x, k)” теперь поддерживает не целое число “x”.
    • “CartesianIndex” теперь рассматривается как «скаляр» для широковещательной рассылки.
    • Метод “printstyled” теперь поддерживает вывод курсивом.
    • Методы “parent” и “parentindices” теперь поддерживают тип “SubStrings”.
    • Метод “replace(string,pattern…)” теперь поддерживает опциональный аргумент “IO” для вывода в поток, а не для возврата строки.
    • Метод “startswith” теперь поддерживает потоки ввода-вывода.
  • Изменения базовых библиотек
    • Из методов “sortperm!” и “partialsortperm!” удалено ключевое слово “initialized=true”, которое могло приводить к небезопасному поведению.
    • При печати целых чисел типа “Rational” их знаменатель теперь пропускается в контексте типизированных потоков “Rational” (например, в массивах).
  • Менеджер пакетов
    • Метод “Pkg.precompile” теперь принимает “timing” в качестве ключевого аргумента, отображая информацию о времени прекомпиляции для каждого пакета – “Pkg.precompile(timing=true)”.
  • LinearAlgebra
    • Тип “AbstractQ” больше не является подтипом “AbstractMatrix”. Более того, метод “adjoint(Q::AbstractQ)” теперь не оборачивает “Q” в тип “Adjoint”, заменяя его “AdjointQ”, который сам является подтипом “AbstractQ”. Это изменение обусловлено тем, что обычно экземпляры “AbstractQ” ведут себя как линейные операторы на основе функций и матриц и не доступны по индексу. Кроме того, многие типы “AbstractQ” могут работать с векторами/матрицами разного размера, действуя как матрица с размером, зависящим от контекста. Благодаря этому изменению у типа “AbstractQ” появился чётко определённый интерфейс, который подробно описан в документации Julia.
    • Результаты факторизации больше не заключаются в типы-оболочки “Adjoint” и “Transpose”. Вместо них добавлены типы “AdjointFactorization” и “TranposeFactorization”, которые сами являются подтипам “Factorization”.
    • Новые функции “hermitianpart” и “hermitianpart!” для нахождения эрмитовой (действительно симметричной) части матрицы.
    • Метод “norm” транспонированной матрицы потомка типа “AbstractMatrix” теперь по умолчанию возвращает норму родительской матрицы, что соответствует текущему поведению для “AbstractVectors”.
    • Добавлены методы вычисления собственных векторов “eigen(A, B)” и “eigvals(A, B)” для случая, где один из A или B является симметричным или эрмитовым.
    • Методы “eigvals/eigen(A, cholesky(B))” теперь вычисляют обобщённые собственные значения (собственные: и собственные векторы) A и B посредством разложения Холецкого для положительно определенного B.
  • Printf
    • Спецификаторы формата теперь поддерживают динамическую ширину и точность, например “%*s” и “%*.*g”.
  • REPL
    • При печати стека трассировки глубина печатаемых типов в сигнатурах функций ограничена, чтобы избежать слишком подробного вывода.
  • Test
    • Макрос “@test_broken” (или “@test” с “broken=true”) теперь выбрасывают ошибку, если тестовое выражение возвращает не значение false/true.
    • При ошибке при вызове “@test” или ошибке внутри функции, теперь даётся подробная трассировка стека, позволяющая понять позицию теста в “@testset”.
  • InteractiveUtils
    • “code_native” и “@code_native” теперь используют Intel-синтаксис вместо AT&T.
    • “@time_imports” теперь показывает время выполнения “__init__()” для импортируемых модулей.
  • Устаревшие и подлежащие удалению конструкции
    • Макрос “@pure” объявлен устаревшим. Вместо него следует использовать “Base.@assume_effects :foldable”.
  • Release. Ссылка here.