На днях была опубликована новая версия языка программирования 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.