Выпуск языка программирования 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‹tab›.
- Добавлены функции «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».
Источник: http://www.opennet.ru/opennews/art.shtml? num=60368
© OpenNet