# Mojo #### Python-совместимый язык с производительностью Си — от Криса Лэттнера 2 мая 2023 года Modular (одна из компаний-лидеров в сфере AI-инфраструктуры) анонсировала язык программирования Mojo, обещающий полную совместимость с Python в сочетании со сверх-высокой производительностью. В компании утверждают, что автоматическое низкоуровневое распараллеливание, возможности строгой типизации и статической компиляции уже на самых ранних этапах развития языка позволяют достичь скорости, превосходящей Python в 35 000 раз! ### А авторы кто? Прежде всего возникает подозрение: а не проходной ли это проект на волне популярности вокруг ИИ? Здесь, конечно, время всё расставит на свои места, однако создатели у языка ещё какие: ![ ](Letner.jpg) Крис Лэттнер (со основатель и директор Modular) В прошлом — один из ключевых разработчиков языка Swift, компилятора Clang, а также технологий LLVM и MLIR. До основания Modular AI работал в Google, Tesla, Apple. ![ ](davis.jpg) Тим Дэвис (со основатель и руководитель продукта) Привнёс значительный вклад в разработку и масштабирование Google Brain проектов, а также TensorFlow. ... и множество других опытных разработчиков. ### Так что же нам обещают? Синтаксис Питона с минимальными изменениями Даже нововведения в Mojo разработчики постарались сделать максимально схожими с Python: ![ ](pr1.jpg) ##### Пример кода на Mojo. ### Доступ к библиотекам Python Честно, доступ есть ещё далеко не ко всем, но к нескольким самым известным (Numpy, Matplotlob) разработчики его всё-таки наладили. ![ ](pr2.jpg) ##### Пример доступа к pyplot через импорт модулей В целом, это работает следующим образом: сначала импортируется любой модуль Python, затем его можно использовать как угодно. ![ ](pr3.jpg) ##### Пример с NumPy К сожалению, сейчас имеется возможность импорта только модуля целиком (выхватить только парочку функций не выйдет). Можно даже импортировать собственные модули: ![ ](pr4.jpg) ##### питоновский print тоже придётся импортировать ### И прочие громкие слова Благодаря такой гибкости по отношению к Питону, Mojo будет возможно точечно встраивать в уже готовые модели, переопределять операции с его помощью, пользоваться супер-быстрыми реализациями многих алгоритмов, и т.п. Обо всех подробностях низкоуровневых усовершенствований, распараллеливания, статической компиляции и прочих фишках, влияющих на производительность, подробно рассказано в документации. Утверждается, например, что на алгоритме вычисления и построения множества Мандельброта Mojo справляется быстрее Питона в 35 000 (!) раз: ![ ](pr5.jpg) ##### этот алгоритм, кстати, лежит у них здесь ### Немного о синтаксисе Довольно об особенностях, давайте перейдём к конкретике и рассмотрим несколько основных особенностей кода языка Mojo. Здесь будет приведено лишь краткое описание нескольких основных программных нововведений в синтаксис Питона — всё это, и ещё больше, в подробнейшем виде расписано в документации. #### let и var Mojo позволяет объявлять переменные среды с ограниченной областью. * let — неизменяемая переменная, * var — изменяемая. Такой синтаксис также поддерживает спецификаторы типа и отложенную инициализацию: ![ ](pr6.jpg) ###### стоит заметить, что "неявные" переменные из Питона также поддерживаются ### struct как замена class struct в Mojo, как и class в Питоне, может содержать методы, поля, декораторы, перегрузку операторов — но есть существенное различие. * Классы в Питоне динамические — они допускают добавление и подмену методов и значений в рантайме, жертвуя при этом производительностью. * Структуры в Mojo статические — они формируются во время компиляции, не позволяя вносить изменения в рантайме. Помимо лучшей безопасности, такой подход позволяет выигрывать в производительности. ![ ](pr7.jpg) ##### простейший пример структуры Важно также заметить, что структура обязывает объявлять поля в ней через let или var. ### Строгая типизация Mojo позволяет пользоваться гибкой системой типов Питона, но также предоставляет систему типов и механизм для контроля операций с ними. Простейший способ использовать эту систему контроля — просто писать код в структурах (как уже говорилось, это связывает переменные с их типами во время компиляции), что не позволит случиться подобным ситуациям: ![ ](pr8.jpg) ##### пример попытки применения несовместимого оператора Кстати, почему Int, а не int? Дело в том, что питоновский int "отягощён" множеством дополнительных возможностей, как работа с большими числами или сравнение значений. Тип Int в Mojo наоборот очень простой и лёгкий, что позволяет значительно повысить скорость работы с ним. #### fn как строгая версия def В Mojo есть свой вариант синтаксиса функции — fn. Он полностью взаимозаменяем с def, однако накладывает ряд ограничений: Значения аргументов по умолчанию неизменяемы в теле функции, что исключает случайные изменения и позволяет использовать неизменяемые типы в качестве аргументов. Для всех аргументов (кроме self) и для возвращаемого значения требуется указать тип. Все локальные переменные должны быть объявлены явно (ой, тавтология). ### В заключение Хоть этот, безусловно, интересный язык сейчас находится в версии 0.1, не поддерживает многие концепции Питона и был анонсирован несколько дней назад, он уже показывает себя достаточно серьёзным. ## Литература https://habr.com/ru/articles/734318/