На днях была опубликована новая версия языка программирования Mojo, теперь это 24.3. Новинка получила несколько важных компонентов, которые требуются для создания приложений на этом языке. Например, компилятор, интерактивная REPL-оболочка для сборки и запуска программ, отладчик, дополнение к редактору кода Visual Studio Code (VS Code) и т. п.

Стоит отметить, что исходники открыты под лицензией Apache 2.0. После того как будет завершено проектирование внутренней архитектуры, разработчики откроют и код компилятора. Ну а подробности изменений и дополнений — под катом.

Что это за язык такой?

Mojo — специализированный ЯП, созданный компанией Modular и ориентированный на разработку в сфере машинного обучения. Выпущен в мае 2023 года. Mojo позиционируется как более продвинутая альтернатива Python, практически полностью совместим с ним и его библиотеками, но при этом показывает лучшую производительность, аналогичную таким довольно низкоуровневым языкам программирования, как C и C++.

Ключевые приоритеты языка — разработка в области искусственного интеллекта и системное программирование. Mojo умеет взаимодействовать с SIMD-командами, из-за чего позволяет выполнять множество алгебраических операций за раз, что положительно сказывается на производительности.

Кроме того, у Mojo нет сборщика мусора, вместо этого он применяет семантику перемещения, сильно похожую на ту, что есть в Rust. Данный подход позволяет языку безопасно и быстро удалять неиспользуемые ресурсы и отказаться от рантайма.

По словам разработчиков, Mojo — отлично продуманная система, в фундаменте языка — MLIR, который не является новинкой. Он совершенствуется в течение многих лет. Команда проекта понимала, что требуется для ядра «языка программирования для ИИ», поэтому сделала максимум, чтобы оптимально всё реализовать.

Ещё одно достоинство Mojo — использование синтаксиса Python, благодаря чему некоторые разработчики называют этот ЯП Python++. Создатели языка решили использовать синтаксис, чтобы избежать одной из самых сложных частей в проектировании и реализации ЯП. Есть, конечно, и некоторое количество новых элементов, но оно небольшое.

Команда этого ЯП — вовсе не новички, у всех них огромный опыт в этой отрасли. Благодаря этому им удалось применить лучшие практики, избежав слабых мест и проблем других ЯП. Стоит отметить, что с развёртыванием Mojo дела обстоят примерно так же, как и у С. Так, приложение с matmul, т. е. матричным умножением, занимает всего 100 КБ. При помощи Mojo можно относительно быстро писать легко развёртываемые приложения, которые в полной мере используют многоядерность и многопоточность систем.

Что нового?

В общем-то, достаточно много всего:

  • так, в модули для работы с коллекциями (List, Dict, Set и Tuple) добавлены возможности, делающие их более привычными пользователям, знакомым с языком программирования Python. В типе List теперь появились методы, которые повторяют Python API. Это в первую очередь pop(index), resize(new_size) и insert(index, value)

  • кроме того, обновлены типы. Так, в типе Dict теперь есть метод update() для обновления ключа/значения из другого Dict. В Tuple добавили возможность работы с типами, которые хранятся лишь в памяти. Это, например, String. В результате можно указать "x = tup[1]" вместо "x = tup.get[1, Int]()" и присваивать значения через "tup[1] = x". И в типе Set добавлена поддержка именованных методов. Их можно применять вместо операторов: difference() вместо "-", difference_update() вместо "-=", intersection_update() вместо "&=" и update() вместо "|="

  • нельзя забывать и о добавлении новых функций. Например, reversed(), которая предоставляет возможность изменить порядок следования элементов на обратный

  • функция reversed() может применяться с List, Dict и любыми типами, поддерживающими диапазоны значений

var numbers = List(1, 2, 3, 4, 5)
for number in reversed(numbers):
               print(number)
  • оптимизирована поддержка вариативных аргументов. Так, разработчики теперь дают возможность определить функции, которые содержат как необязательные, так и вариативные аргументы

fn variadic_arg_after_default(
               a: Int, b: Int = 3, *args: Int, c: Int, d: Int = 1, **kwargs: Int
   ): ...
  • появились в новой версии функции __source_location() и __call_location() для определения местоположения (номер строки в исходных текстах) вызовов функций и кода

  • добавлена поддержка аргумента whence, как это организовано в методе FileHandle.seek()

  • тип AnyPointer переименован в UnsafePointer. Добавлена возможность инициализации UnsafePointer напрямую из ссылки с типом Reference ("UnsafePointer(someRef)"). Для работы с указателями UnsafePointer добавлены функции initialize_pointee_copy, initialize_pointee_move, move_from_pointee() и move_pointee

Вместе с новым релизом представлен и движок MAX Engine 24.3, предлагающий платформу для проектов в области машинного обучения. Он дополняет инструментарий Mojo средствами для разработки и отладки приложений, использующих ML-модели в различных форматах (TensorFlow, PyTorch, ONNX и т. п.). Сборки Mojo SDK и MAX Engine подготовлены для платформ Linux и macOS.

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


  1. ivankudryavtsev
    07.05.2024 07:52
    +4

    Исходники чего открыты под Apache License 2.0?


    1. alexanderniki
      07.05.2024 07:52

      Стандартной библиотеки, примеров и документации. Сам Mojo, к сожалению, закрыт. Его обещают открыть, когда более-менее стабилизируют. Насколько этому можно верить, я не знаю.


      1. ivankudryavtsev
        07.05.2024 07:52
        +1

        Вы это расскажите автору статьи :) я об этом вполне себе знаю.


  1. mobi
    07.05.2024 07:52
    +2

    Как они ловко с версии 0.7 сразу перескочили на 24.x. Я тоже хочу так уметь.


    1. Zam_dev
      07.05.2024 07:52

      Возможно они решили считать по годам (24.мм)


  1. Adgh
    07.05.2024 07:52

    Пора добавить тег Mojo на Хабре)