Создатель LLVM развивает новый язык программирования Mojo

Крис Латнер (Chris Lattner), основатель и главный архитектор LLVM, а также создатель языка программирования Swift, и Тим Дэвис (Tim Davis), бывший руководитель AI-проектов Google, таких как Tensorflow и JAX, представили новый язык программирования Mojo, сочетающий простоту применения для исследовательских разработок и быстрого создания прототипов с пригодностью для формирования высокопроизводительных конечных продуктов. Первое достигается благодаря использованию привычного синтаксиса языка Python, а второе за счёт возможности компиляции в машинный код, механизмов безопасной работы с памятью и задействованию средств для аппаратного ускорения вычислений.

Проект сфокусирован на использовании для разработок в области машинного обучения, но при этом преподносится как язык общего назначения, расширяющий возможности языка Python средствами системного программирования и подходящий для широкого круга задач. Например, язык применим для таких областей, как высокопроизводительные вычисления, обработка и преобразование данных.
Интересной особенностью Mojo является возможность указания emoji-символа “🔥” в качестве расширения для файлов с кодом (например, “helloworld.🔥”), помимо текстового расширения “.mojo”.

В настоящее время язык находится на стадии интенсивного развития и для тестирования предложен только online-интерфейс. Обособленные сборки для запуска на локальных системах обещают опубликовать позднее, после получения отзывов о работе интерактивного web-окружения. Исходные тексты компилятора, JIT и других связанных с проектом наработок планируют открыть после завершения проектирования внутренней архитектуры (модель развития рабочего прототипа за закрытыми дверями напоминает начальную стадию разработки LLVM, Clang и Swift). Так как синтаксис Mojo основан на языке Python, а система типов близка к C/C++, в будущем также планируют разработать инструментарий для упрощения перевода на
Mojo существующих проектов, написанных на C/C++ и Python, а также разработки гибридных проектов, совмещающих код на Python и Mojo.

Проект рассчитан на привлечение к выполнению вычислений имеющихся в системе аппаратных ресурсов гетерогенных систем. Например, для выполнения приложений на языке Mojo и распараллеливания вычислений могут привлекаться GPU, специализированные ускорители для машинного обучения и векторные процессорные инструкции (SIMD). В качестве причины развития отдельного подмножества языка Python вместо подключения к работе по оптимизации существующего CPython упоминается ориентация на компиляцию, интеграция возможностей системного программирования и применение фундаментально иной внутренней архитектуры, позволяющей выполнять код на GPU и различных аппаратных ускорителях. При этом разработчики Mojo намерены насколько это возможно придерживаться совместимости с CPython.

Mojo может использоваться как в режиме интерпретации с использованием JIT, так и для компиляции в исполняемые файлы (AOT, ahead-of-time). В компилятор встроены современные технологии автоматической оптимизации, кэширования и распределённой компиляции. Исходные тексты на языке Mojo преобразуются в низкоуровневый промежуточный код MLIR (Multi-Level Intermediate Representation), развиваемый проектом LLVM и предоставляющий дополнительные возможности для оптимизации обработки графа потока данных. Компилятор позволяет применять для генерации машинного кода различные бэкенды, поддерживающие MLIR.

Задействование дополнительных аппаратных механизмов для ускорения вычислений позволяет добиться производительности, при интенсивных вычислениях превосходящей приложения на C/C++. Например, при тестировании приложения для генерации множества Мандельброта, скомпилированное приложение на языке Mojo при выполнении в облаке AWS оказалось в 6 раз быстрее реализации на C++ (0.03 сек. против 0.20 сек.), а также в 35 тысяч раз быстрее приложения на Python при использовании штатного CPython 3.10.9 (0.03 сек. против 1027 сек.) и в 1500 раз быстрее при использовании PYPY (0.03 сек. против 46.1 сек.).

При оценке производительности в области решения задач машинного обучения, AI-стек Modular Inference Engine, написанный на языке Mojo, по сравнению с решением на базе библиотеки TensorFlow оказалось на системе с процессором Intel в 3 раза быстрее при обработке языковой модели, в 6.4 раза быстрее при выработке рекомендаций и в 2.1 раза быстрее при работе с моделями для обработки визуальной информации. При использовании процессоров AMD выигрыш при использовании Mojo составил 3.2, 5 и 2.2 раза, а при использовании процессоров ARM – 5.3, 7.5 и 1.7 раз, соответственно. Решение на базе PyTorch отстало от Mojo в 1.4, 1.1 и 1.5 раз на CPU Intel, в 2.1, 1.2 и 1.5 раз на CPU AMD и в 4, 4.3 и 1.3 раза на CPU ARM.


Язык поддерживает статическую типизацию и средства для безопасной низкоуровневой работы с памятью, напоминающие возможности языка Rust, такие как отслеживание времени жизни ссылок и проверка заимствования переменных (borrow checker). Помимо средств для безопасной работы с указателями в языке доступны и возможности для низкоуровневой работы, например, возможно прямое обращение к памяти в режиме unsafe с использованием типа Pointer, вызов отдельных SIMD-инструкций или доступ к аппаратным расширениям, таким как TensorCores и AMX.


Для упрощения разделения классического и оптимизированного Python-кода для функций с явным определением типов для всех переменных предложено использовать отдельное ключевое слово “fn” вместо “def”. Аналогично для классов, при необходимости последовательной упаковки данных в памяти (как в Си) вместо “class” можно использовать ключевое слово “struct”. Также возможен простой импорт модулей на языках C/C++, например, для импорта функции cos из библиотеки math можно указать “from “math.h” import cos”.

Release. Ссылка here.