Julia 1.11: новый релиз и много возможностей. Что добавили разработчики и что изменилось?

a12f2922b5dee6b36bba909a2586caa6.png


Источник.

Выпущена новая версия языка программирования Julia 1.11, который сочетает высокую производительность с гибкостью динамической типизации, а также предлагает встроенные средства для параллельного программирования. Синтаксис языка схож с MATLAB, включает элементы Ruby и Lisp, а работа со строками напоминает Perl. Проект распространяется под лицензией MIT.В общем, хороший и нужный ЯП, о котором сегодня и поговорим. Подробности — под катом.

Немного истории


Язык программирования Julia был разработан в 2009 году, и его релиз вышел в 2012 году. Создатели Julia — Джефф Безансон, Стефан Карпински, Вирал Шах и Алан Эдельман. Основной целью разработки было создание языка, который бы сочетал высокую производительность с простотой использования, характерной для таких языков, как Python или R. Они стремились решить проблему, которая часто возникает при научных и численных вычислениях: необходимость писать прототипы на удобных, но медленных языках и затем переписывать их на более производительных, таких как C или Fortran.

Julia получила поддержку многих парадигм программирования, интеграцию с библиотеками C, возможность эффективных численных вычислений, а также встроенные средства для работы с параллельными задачами.

Основные особенности языка


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

Основные новшества в версии 1.11


Новые возможности языка:

  • Тип Memory: Введен новый тип данных Memory, который является низкоуровневой альтернативой Array. Он требует меньше ресурсов и имеет более быстрый конструктор, что делает его предпочтительным для задач, где не требуется полный функционал Array, например, для работы с многомерными массивами. Внутренняя реализация методов Array теперь основана на Memory, что привело к значительному ускорению некоторых операций, таких как push.
  • Ключевое слово public: Введено новое ключевое слово public, которое используется для маркировки идентификаторов, являющихся частью внешнего интерфейса. В отличие от export, такие идентификаторы не импортируются автоматически в контексте модуля при использовании using в других модулях.
help?> GC.in_finalizer
  │ Warning
  │
  │  The following bindings may be internal; they may change or be removed in future versions:
  │
  │    •  Base.GC.in_finalizer

  GC.in_finalizer()::Bool
  • Пакет ScopedValue: Появился новый пакет для поддержки динамической области видимости при параллельном программировании с использованием Threads/tasks.
  • Файлы Manifest.toml: Теперь поддерживается переименование файлов Manifest.toml в формат Manifest-v{major}.{minor}.toml, что позволяет использовать конкретные версии Julia. Например, файл Manifest-v1.11.toml будет ассоциирован с версией 1.11, а Manifest.toml — с другими версиями.
  • Unicode 15.1: В новой версии добавлена поддержка стандарта Unicode 15.1, что расширяет возможности работы с текстом на разных языках.


Изменения в языке:

  • Прекомпиляция и обработка atexit: Во время прекомпиляции теперь запускается обработчик atexit, что позволяет безопасно завершать фоновое выполнение задач и освобождать ресурсы перед завершением программы.
  • Файлы покрытия кода: Во время прекомпиляции файлы покрытия кода и выделения памяти больше не создаются. Кэши pkgimage теперь используются для пакетов, которые не отслеживаются, что ускоряет тестирование и повышает производительность.
  • Обработка переменной JULIA_DEPOT_PATH: Теперь при указании одного пути в переменной JULIA_DEPOT_PATH, только он будет вставлен в значение переменной. Если путь заканчивается символом »:», добавляются также системные пути.
  • Кэши прекомпиляции: Файлы кэша прекомпиляции теперь можно перемещать, а их актуальность проверяется с помощью хешей содержимого исходных файлов, а не через дату изменения файлов.


Улучшения многопоточности:

  • Новый режим планировщика : greedy: В макросе Threads.@threads добавлен новый режим планировщика : greedy, который оптимизирован для задач с неравномерной вычислительной нагрузкой.
  • Новая структура Base.Lockable: Добавлена новая структура Base.Lockable, которая упрощает код при параллельном доступе к элементам составных типов, снижая вероятность ошибок.


Изменения в компиляции и среде выполнения:

  • Сборщик мусора: Обновлена работа сборщика мусора, что позволяет обрабатывать страницы памяти целиком, а не отдельные объекты, что улучшает производительность.
  • Поддержка аннотаций: Добавлена возможность аннотирования кода с помощью макроса Base.@assume_effects, что расширяет возможности управления побочными эффектами в коде.


Новые параметры командной строки:

  • Точка входа Main.main (args): Теперь строго определена точка входа Main.main (args) для выполнения скриптов через командную строку. Это унифицирует поведение кода при его компиляции и запуске.
  • Аргумент --project=@script: Теперь поддерживается аргумент --project=@script для указания пути к файлу Project.toml относительно запущенного скрипта.


Новые функции библиотеки:

  • Типы для аннотированных строк: Добавлены новые типы для работы с аннотированным текстом, такие как AnnotatedString, AnnotatedChar и AnnotatedIOBuffer. Эти типы позволяют добавлять аннотации к строкам и символам, что полезно для визуализации данных с учётом стиля.
  • Метод Sys.username (): Теперь можно получить имя текущего пользователя с помощью метода Sys.username (). Добавлены также методы для проверки прав доступа — Sys.isreadable () и Sys.iswritable ().
  • Новые методы для строк и коллекций: Метод eachrsplit () теперь позволяет разбивать строку с конца, а функция logrange () создаёт логарифмические последовательности. Метод allequal () проверяет равенство всех элементов коллекции, а allunique () проверяет уникальность.


Изменения в базовых библиотеках:

  • Метод write (:: IO, :: AbstractArray): Теперь запись массива в поток происходит рекурсивно для каждого элемента, что улучшает совместимость с методом read!.
  • Новая стандартная библиотека StyledStrings: Введена библиотека для стилизованного отображения текста. Использование макроса @styled_str позволяет создавать аннотированные строки с различными стилями, такими как цвет и декорации.


Устаревшие и удаленные методы:

  • Удаление методов Base.map, Iterators.map и foreach с одним аргументом: Эти методы больше не поддерживаются и были удалены.


Внешние зависимости:

  • Обновление libuv: В новой версии Julia библиотека libuv обновлена с 1.44.2 до 1.48.0, что улучшает работу с системными ресурсами.
  • Замена tput на terminfo: Метод tput для проверки возможностей терминала больше не используется, его заменили на средства анализа terminfo, реализованные полностью на языке Julia.


Улучшения инструментов:

  • Автоматическая проверка типов в CI: Теперь CI автоматически проверяет типы в запросах на слияние, что повышает стабильность кода.


Julia 1.11 привнесла множество изменений, которые улучшили производительность, параллельную обработку, работу с памятью и расширили функциональные возможности для научных и высокопроизводительных вычислений. С полным списком можно ознакомиться вот здесь.

© Habrahabr.ru