Источник.

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

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


  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. AuToMaton
        13.10.2024 12:13

        Если именно занимался расчётами - точно не выглядит. А если работал над приложениями для научных расчётов - то скорее выглядит.

        Я склонен раскладывать всю околопрограммистскую работу на три кучки - работа над себя, на продажу и на дядю. Раз предоставился дополнительный случай её похвалить, скажу - Julia мне нравится ещё и тем что попадает строго в первую.


        1. unreal_undead2
          13.10.2024 12:13

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


          1. AuToMaton
            13.10.2024 12:13

            Сейчас сказывают малость иначе. Они называют это «решить проблему двух языков» - одного чтобы писать прототип где необходим быстрый цикл изменений, и второго для того чтобы писать эффективный код для собственно расчётов. Текущее состояние дел - проблема двух языков решена, но появилась «проблема полутора языков» - код, полученный в результате быстрого прототипирования, нужно оптимизировать для повышения производительности.

            Да, физики и химики конечно, но не только - вообще все кто использует комп для себя. Сейчас специалисты по данным и машинному обучению подтягиваются.


            1. unreal_undead2
              13.10.2024 12:13

              но не только - вообще все кто использует комп для себя. Сейчас специалисты по данным и машинному обучению подтягиваются.

              В любом случае в первую очередь специалисты в целевой области, а не чистые девелоперы.


              1. AuToMaton
                13.10.2024 12:13

                Именно так, что я и пытался объяснить. «Специалисты в целевой области» хорошо сформулировано.


    1. SquareRootOfZero
      13.10.2024 12:13

      В смысле, условному свитчеру может не хватить своих мозгов чтобы проверить, есть ли для Julia транспайлер в JavaScript, компиляция в WebAssembly, или что там ещё щас хотят для "создания приложений" на JavaScript?


      1. AuToMaton
        13.10.2024 12:13

        Условному свитчеру может хватить мозгов подобными вещами не заморачиваться. Есть энтузиасты которые работают над приложениями на Julia, но это очень не мейнстрим. Я думаю что транспайлер в JS невозможен в принципе. WebAssembly казалась реализуемой на столько, что её даже обсуждали.

        Не предназначена не значит что невозможно. Но на практике значит что на столько криво и ограниченно, что можно и так считать.


  1. ajijiadduh
    13.10.2024 12:13

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


    1. Deosis
      13.10.2024 12:13

      А что вы хотели от ии? Он только только пальцы считать научился.


  1. mbait
    13.10.2024 12:13

    Так и не понял, чем Julia лучше Python или Matlab. Первый проще и (пока ещё) не имеет вырвиглазного синтаксиса, который приходится каждый раз вспоминать. У второго есть невероятное количество встроенных моделей и пакетов-расширений. Julia в своём стремлении охватить как можно больше парадигм и ниш похож на С++.


    1. unreal_undead2
      13.10.2024 12:13

      Если не получается в основном вычислительном ядре запользовать готовые библиотеки или высокоуровневые примитивы, производительность кода на Python/Matlab будет так себе.


      1. vadimfry
        13.10.2024 12:13

        Никто и не утверждает что голый питон производителен. Но я не могу найти ситуации, когда для решения научной задачи ты не можешь установить numpy, numba, taichi и подобные, которые закрывают все возможные потребности, с которыми можно столкнуться на практике, и не писать при этом в 5 раз больше кода. Тем более, что реализации популярных алгоритмов на подобных библиотеках часто находятся в общем доступе, и всегда можно залезть под капот.


        1. unreal_undead2
          13.10.2024 12:13

          Одно время работал с товарищами, моделирующими термояд - там были голые фортрановские коды. Естественно, об оптимизированных вариантах BLAS и прочих библиотеках люди были в курсе - не подходило.


          1. vadimfry
            13.10.2024 12:13

            Знаю про такое. У нас квантмех моделируют. Говорят, что видеокарты не подходят, чтобы ускорять расчеты, ввиду ограничений точности возможных использований типов переменных, а также нужно по 200+ гигов оперативы. Пишут на голом фортране. И используют древние супер компы на зеончиках. Но надо понимать, что там костыльная база 30-тилетней давности, которую никто на что-то современное переписывать не будет. Тем более, что там и работают над этим уже по сути деды. А я начал на питоне и уходить с него не увидел причин, т.к. чаще всего и float32 хватает, чтобы приближенно плазму в тлеющем разряде посчитать.


            1. unreal_undead2
              13.10.2024 12:13

              Если хватает numpy и т.п. - почему бы и нет. Кстати, что в питоне сейчас принято использовать для распараллеливания на кластере?


              1. vadimfry
                13.10.2024 12:13

                Я использую taichi. Позволяет параллелить на процессоре или видеокарте используя cuda или vulkan. Пишешь на питоноподомном синтаксисе, а код преобразуется в плюсовый, а потом в машинный. Сильно экономит время и объем кода. Также можно встроенными способами объединять несколько систем в один кластер. Правда я это не использую, ибо никто мне много компов не выделил. Дали 4070 и на том спасибо. Еще популярен pytorch, но он скорее для нейросеток.


                1. unreal_undead2
                  13.10.2024 12:13

                  Я именно про запуск счётного кода (не нейронки) на сотне-другой компов в кластере.


                  1. vadimfry
                    13.10.2024 12:13

                    Я знаю лишь о том, что сам использую. А так вариантов довольно много и кому не лень пишут такие библиотеки и фреймворки, поэтому разработчики используют на свое усмотрение. А так то, что для нейронок можно использовать и для обычных вычислений, просто такие инструменты сильнее заточены под работу с числами точностью меньше float32. Все равно чаще всего они опираются на cuda под капотом и доступен весь его функционал.


                    1. unreal_undead2
                      13.10.2024 12:13

                      то, что для нейронок можно использовать и для обычных вычислений

                      Там же вполне конкретные алгоритмы, фреймворк на входе по идее просто структуру сетки берёт, а не произвольный код. Но я к тому, что реально тяжёлые вычисления на одну ноду просто не влезут (скажем, large size в SpecHPC требует до 14.5Tb оперативки), надо как то разбивать данные, обмениваться между нодами и т.д.


                      1. vadimfry
                        13.10.2024 12:13

                        Я понимаю о чем вы, но мне с такими масштабами работать не приходилось. Максимум под 100 гиг памяти. Да и требований запускать ракеты с дурной точностью тоже. Поэтому про такое сказать ничего не могу. В научной среде нормальное железо толком не выделяют, да и большинство ученых, которых я знаю программирование вообще стороной обходят, либо используют готовый софт, что печально, ибо неоткуда брать опыт.