Mojo: Python-совместимый язык с производительностью Си — от Криса Лэттнера
2 мая 2023 года Modular (одна из компаний-лидеров в сфере AI-инфраструктуры) анонсировала язык программирования Mojo, обещающий полную совместимость с Python в сочетании со сверх-высокой производительностью.
В компании утверждают, что автоматическое низкоуровневое распараллеливание, возможности строгой типизации и статической компиляции уже на самых ранних этапах развития языка позволяют достичь скорости, превосходящей Python в 35 000 раз!
Так что это за чудо-язык такой, правда ли он заменит Python — да и где его пощупать можно?
Давайте разбираться!
Перед прочтением, после прочтения или вместо прочтения
Поскольку язык доступен только в JupyterHub-песочнице авторов строго по запросу (его я, конечно, отправил, но сколько ждать — неизвестно), эта статья — лишь краткий разбор обещанных возможностей, документации и примеров кода с официального сайта.
Я студент, и это моя первая статья на хабре, так что если кто хочет пропустить растекания мыслью по древу и сразу окунуться в документацию, пожалуйста:
https://www.modular.com/get-started — запрос на доступ, сюда бежим в первую очередь
https://www.modular.com/mojo — страничка-лэндинг проекта, здесь все самые громкие обещания и красивые анимации
https://docs.modular.com/mojo/ — документация, на удивление хорошая для столь молодого языка
https://youtu.be/-3Kf2ZZU-dg? t=1545 — презентация языка (там после этого демку Mojo показывает сам Джереми Говард)
А авторы кто?
Прежде всего возникает подозрение:, а не проходной ли это проект на волне хайпа вокруг ИИ?
Здесь, конечно, время всё расставит на свои места, однако создатели у языка ещё какие:
Крис Лэттнер(со основатель и директор Modular)
В прошлом — один из ключевых разработчиков языка Swift, компилятора Clang, а также технологий LLVM и MLIR. До основания Modular AI работал в Google, Tesla, Apple.
Тим Дэвис (со основатель и руководитель продукта)
Привнёс значительный вклад в разработку и масштабирование Google Brain проектов, а также TensorFlow.
… и множество других опытных разработчиков.
Так что же нам обещают?
Синтаксис Питона с минимальными изменениями
Даже нововведения в Mojo разработчики постарались сделать максимально схожими с Python:
Пример кода на Mojo. Загрузил бы через блок кода, да подсветка синтаксиса хабра ещё не узнаёт язык трёхдневной давности. К тому же, весь код есть в документации
Доступ к библиотекам Python
Честно, доступ есть ещё далеко не ко всем, но к нескольким самым известным (Numpy, Matplotlob) разработчики его всё-таки наладили.
Пример доступа к pyplot через импорт модулей
В целом, это работает следующим образом: сначала импортируется любой модуль Python, затем его можно использовать как угодно.
Пример с NumPy
К сожалению, сейчас имеется возможность импорта только модуля целиком (выхватить только парочку функций не выйдет).
Можно даже импортировать собственные модули:
да, питоновский print тоже придётся импортировать
И прочие громкие слова
Благодаря такой гибкости по отношению к Питону, Mojo будет возможно точечно встраивать в уже готовые модели, переопределять операции с его помощью, пользоваться супер-быстрыми реализациями многих алгоритмов, и т.п.
Обо всех подробностях низкоуровневых усовершенствований, распараллеливания, статической компиляции и прочих фишках, влияющих на производительность, подробно рассказано в документации.
Утверждается, например, что на алгоритме вычисления и построения множества Мандельброта Mojo справляется быстрее Питона в 35 000 (!) раз:
Немного о синтаксисе
Довольно об особенностях, давайте перейдём к конкретике и рассмотрим несколько основных особенностей кода языка Mojo.
Здесь будет приведено лишь краткое описание нескольких основных программных нововведений в синтаксис Питона — всё это, и ещё больше, в подробнейшем виде расписано в документации.
let и var
Mojo позволяет объявлять переменные среды с ограниченной областью.
let — неизменяемая переменная,
var — изменяемая.
Такой синтаксис также поддерживает спецификаторы типа и отложенную инициализацию:
стоит заметить, что «неявные» переменные из Питона также поддерживаются
struct как замена class
struct в Mojo, как и class в Питоне, может содержать методы, поля, декораторы, перегрузку операторов —, но есть существенное различие.
Классы в Питоне динамические — они допускают добавление и подмену методов и значений в рантайме, жертвуя при этом производительностью.
Структуры в Mojo статические — они формируются во время компиляции, не позволяя вносить изменения в рантайме. Помимо лучшей безопасности, такой подход позволяет выигрывать в производительности.
простейший пример структуры
Важно также заметить, что структура обязывает объявлять поля в ней через let или var.
Строгая типизация
Mojo позволяет пользоваться гибкой системой типов Питона, но также предоставляет систему типов и механизм для контроля операций с ними.
Простейший способ использовать эту систему контроля — просто писать код в структурах (как уже говорилось, это связывает переменные с их типами во время компиляции), что не позволит случиться подобным ситуациям:
пример попытки применения несовместимого оператора
Кстати, почему Int, а не int?
Хороший вопрос! Дело в том, что питоновский int «отягощён» множеством дополнительных возможностей, как работа с большими числами или сравнение значений. Тип Int в Mojo наоборот очень простой и лёгкий, что позволяет значительно повысить скорость работы с ним.
fn как строгая версия def
В Mojo есть свой вариант синтаксиса функции — fn. Он полностью взаимозаменяем с def, однако накладывает ряд ограничений:
Значения аргументов по умолчанию неизменяемы в теле функции, что исключает случайные изменения и позволяет использовать неизменяемые типы в качестве аргументов.
Для всех аргументов (кроме self) и для возвращаемого значения требуется указать тип.
Все локальные переменные должны быть объявлены явно (ой, тавтология).
В заключение
Хоть этот, безусловно, интересный язык сейчас находится в версии 0.1, не поддерживает многие концепции Питона и был анонсирован несколько дней назад, он уже показывает себя достаточно серьёзным. В этой статье я описал лишь самую верхушку айсберга, подробнее же про алиасы, передачу по ссылке, новые декораторы и многое-многое другое можно прочитать в на удивление подробной для такого молодого языка документации (да, я кинул эту ссылку уже раз пять).
Чтобы закончить на забавном моменте, хочу рассказать вам, что исходный код на Mojo можно хранить не только в файлах с расширением .mojo, но и … с расширением .