В мае 2023 года стартап Modular выпустил в релиз первую версию нового языка программирования Mojo. Он предназначен для разработки в сфере машинного обучения, похож на Python, но при этом быстрее: на некоторые задачи Mojo тратит в 90 тысяч раз меньше времени. Давайте с ним познакомимся.
Зачем нужен новый язык и почему нельзя всё делать на Python
Mojo задуман как основной язык в сфере искусственного интеллекта и машинного обучения. Поэтому он так похож на Python, который сейчас самый распространённый в этой области.
Сами разработчики говорят, что Mojo умеет то, что не умеют другие языки программирования. Python хорош, но для некоторых задач его возможностей не хватает.
Вспоминаем интерпретаторы и компиляторы
Компьютер не понимает код, который пишут разработчики на высокоуровневых языках. Неважно, какой это язык: Python, Mojo, C++ или Rust. Для запуска кода нужна дополнительная программа — переводчик на понятный компьютеру машинный язык. Такая программа называется интерпретатор или компилятор.
Интерпретатор читает код построчно и выполняет каждую строку, одну за другой. Если код запускается через интерпретатор, язык программирования называется интерпретируемым.
Компилятор берёт весь код, переводит его в машинный язык и запускает. Языки программирования, которые работают по этой схеме, называются компилируемыми.
Так вот, Python — интерпретируемый язык, а Mojo — компилируемый.
Для разных языков и процессоров нужны разные интерпретаторы и компиляторы. Чтобы разработчикам было легче их писать, есть специальные наборы инструментов. Самые известные такие инструменты для компиляторов называются LLVM (Low Level Virtual Machine, буквально «Низкоуровневая виртуальная машина») и MLIR (Multi-Level Intermediate Representation, то есть «Многоуровневое промежуточное представление»).
Кто разрабатывает Mojo
У стартапа Modular два основателя:
- Крис Лэтнер — раньше работал над языком Swift, компилятором Clang и технологиями для разработки компиляторов LLVM и MLIR;
- Тим Дэвис — работал над проектом Google по изучению искусственного интеллекта Google Brain и библиотекой для машинного обучения Tensor Flow.
Если посмотреть на то, чем раньше занимались основатели и остальная команда, видно, что они много работали с искусственным интеллектом и машинным обучением. Значит, на язык Mojo стоит обратить внимание как минимум ML-инженерам.
Проблемы работы с Python в машинном обучении
В Python много готовых библиотек для работы почти в любой области, в том числе машинном обучении. Проблема большинства библиотек для ML в том, что они используют два языка: Python для взаимодействия с ними и более быстрые C и C++ для обработки сложных операций. Это усложняет работу и снижает производительность.
Написанный на Python код может выполняться в двух режимах:
- режим немедленного выполнения, или
eager execution
, когда код выполняется сразу; - графовый режим, или
graph mode
, когда сначала строится граф вычислений.
Modular говорят, что Python подталкивает к работе через graph mode, а для машинного обучения лучше подходит более простой и быстрый eager execution.
Python автоматически освобождает место в оперативной памяти, если какие-то объекты в коде больше не используются. Это называется «сборщик мусора» — он удобный, но тормозит работу больших программ. И иногда срабатывает, если код написан неграмотно.
Ещё в Python есть такая штука, как GIL (Global Interpreter Lock) — глобальная блокировка интерпретатора. Это ограничитель, который запрещает выполнять больше одной задачи в один момент времени — и он тоже влияет на производительность.
В чём плюсы Mojo
Синтаксис Mojo похож на Python, и разработчики языка постепенно добавляют привычные библиотеки для машинного обучения. Если вы уже знакомы с чем-то из этого, будет проще начать работать. При этом для получения обещанной производительности нужно использовать дополнительные возможности, например явно указывать типы переменных. В Python такого нет.
В Mojo нет автоматического управления памятью, вместо этого объект выбрасывается сразу после использования. Даже внутри такого выражения, как a+b+c+d
, Mojo уничтожает ненужные промежуточные значения. Это эффективнее классического сборщика мусора. А ещё Mojo умеет выполнять несколько операций параллельно.
В перспективе разработчики Modular хотят сделать так, чтобы можно было пользоваться всеми возможностями Python и при этом решить все его проблемы с ML.
В чём минусы
Mojo — новый язык. Он пока не прошёл проверку временем, выдаёт неизвестные ошибки, в нём могут быть ещё не выявленные уязвимости. Например, сейчас можно написать код, который сломает Mojo, — это ошибка языка, а не пользователя. Сами разработчики говорят, что до финального результата ещё многое поменяется.
Для установки Mojo сначала нужно установить пакет инструментов Mojo SDK, который пока доступен только для операционных систем Ubuntu Linux и компьютеров с процессорами Apple Silicon.
В Python у ошибок есть хорошее, подробное описание, а в Mojo пока нет. Опытное сообщество тоже пока не сформировалось. Поэтому, если при работе у вас что-то не получается, на решение может уйти много времени.
Несмотря на все минусы, Mojo очень быстро развивается. Посмотреть на историю версий с датами всех релизов и нововведений можно на сайте этого языка. На момент, когда пишется эта статья, последняя версия вышла 2 мая 2024 года.
Поделитесь в комментариях, чего на ваш взгляд у этого языка — плюсов или минусов (и почему).
Как выглядит синтаксис
Mojo похож на Python, но это другой язык. У него свой компилятор, своя стандартная библиотека и вообще своя система работы. Посмотрим на два примера: переменные и функции.
Переменные в Mojo можно создавать так же, как в Python:
x = 1
Но есть и свой собственный синтаксис. Работать с ним сложнее, но при этом безопаснее, а код при правильном обращении будет выполняться быстрее.
Для переменных в Mojo есть операторы var
для изменяемых типов и let
— для неизменяемых. Можно задать значение переменной, тип данных или всё сразу:
# создаём изменяемую переменную и присваиваем ей строку
var name = "Sam"
# создаём неизменяемую переменную и присваиваем ей тип данных: целое число
let user_id: Int
# создаём неизменяемую переменную, присваиваем ей тип данных: целое число, и сразу кладём в неё значение
let user_id: Int = 12345
А ещё посмотрите: если в Python целому числу соответствует тип int
, то в Mojo нужно писать Int
c большой буквы. Эти типы различаются тем, что у Int
есть предел: если попробовать положить в такую переменную слишком большое число, переменная переполнится и выдаст значение 0
.
То же самое с функциями. Их можно объявлять через def
:
# создаём функцию, в которую при вызове нужно передать имя
def greet(name):
# объявляем переменную, в которой лежит поздравление человека по заданном имени
greeting = "Hello, " + name + "!"
# возвращаем из функции поздравление
return greeting
А можно указать через оператор fn
. Эти два варианта равны по своим возможностям, но работать с fn
сложнее:
- нужно указывать тип данных для аргументов функции и значения, которое она вернёт в результате;
- по умолчанию аргументы функции доступны только для чтения — это предотвращает случайные изменения;
- переменные внутри функции должны быть объявлены с использованием ключевого слова
var
; - если функция может вызывать исключение, оно должно быть явно объявлено с ключевым словом
raises
.
Общий вывод: можно работать почти так же, как на Python — но для использования скоростных возможностей Mojo нужно разобраться в тонкостях нового синтаксиса: начиная от особенностей компилируемого языка и до работы с памятью без сборщика мусора.
Как установить и начать работать
Самый простой вариант — запустить онлайн-редактор Mojo Playground. Главное ограничение — в онлайн-редакторе нельзя импортировать библиотеки Python.
Если хотите программировать на Mojo на своей машине, но у вас нет компьютера с Ubuntu Linux или процессором Apple Silicon, понадобится Docker-контейнер. C Docker можно создать виртуальную Linux-среду, установить Mojo SDK и сам Mojo.
Ещё плагин Mojo доступен в среде разработки Visual Studio Code: можно писать код, но запустить — только с установленным SDK.
Когда можно удалять Python
Пока удалять ничего не нужно, ближайшие лет десять точно.
Во-первых, разработчики Mojo ещё какое-то время собираются исправлять и обновлять свой язык. Сколько это продлится — не уточняется, но вряд ли меньше одного-двух лет.
Во-вторых, Python — язык не только для машинного обучения, он универсальный. Если даже в ML его заменит Mojo, то для многих других задач Python надолго останется лучшим выбором.
Mojo похож на Python, потому что разработчики делают язык специально для работы с искусственным интеллектом, а в этой сфере Python пока на первом месте. А значит, ML-инженерам будет проще перейти на Mojo. Например, так происходил переход с языка Objective-C на Swift в iOS-разработке.
Что в итоге
Mojo придумали и разрабатывают сразу как язык для машинного обучения, и делают это опытные ML-инженеры. Команда Modular знает о проблемах Python и о том, как всё должно работать в идеале — теоретически. Если у них всё получится, у Mojo есть хорошие шансы стать новым главным языком в ИИ.