Источник.

Выпущена новая версия языка программирования 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 без промежуточных прослоек, что повышает гибкость и производительность.




Основные новшества в версии 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 привнесла множество изменений, которые улучшили производительность, параллельную обработку, работу с памятью и расширили функциональные возможности для научных и высокопроизводительных вычислений. С полным списком можно ознакомиться вот здесь.

Комментарии (3)


  1. AuToMaton
    13.10.2024 12:13

    Выпущена новая версия языка программирования Julia 1.11, который сочетает высокую производительность…

    И тут, раз уж мы опустились на этот уровень, как мне кажется, непременно нужно добавить пояснение - Julia не предназначена для создания приложений в ещё большей степени чем Python. Но в меньшей чем Racket. Если этого не сделать, то можно спровоцировать переход на Julia с, скажем, JavaScript, вот ведь какой прекрасный язык в статье описан и всё правда, чем оказать медвежью услугу.


    1. randomsimplenumber
      13.10.2024 12:13

      Если кто-то занимался научными расчетами на js, то перейти на Julia не выглядит плохой идеей ;)


  1. ajijiadduh
    13.10.2024 12:13

    а чего на кдпв неправильное название?