Mojo — язык программирования в семействе Python , который в настоящее время находится в стадии разработки. [3] [4] [5] Он доступен как в браузерах через блокноты Jupyter , [5] [6] , так и локально на Linux и macOS . [7] [8] Mojo стремится объединить удобство использования языка программирования высокого уровня , в частности Python , с производительностью системных языков программирования, таких как C++ , Rust и Zig . [9] По состоянию на 2024 год компилятор[обновлять] Mojo является проприетарным программным обеспечением (с закрытым исходным кодом) со стандартной библиотекой с открытым исходным кодом . Modular, компания, стоящая за Mojo, заявила о намерении в конечном итоге открыть исходный код языка Mojo по мере его развития. [10]
Mojo строится на основе фреймворка программного обеспечения компилятора Multi-Level Intermediate Representation ( MLIR ) вместо непосредственно фреймворка компилятора LLVM более низкого уровня , как это делают многие языки, такие как Julia , Swift , Clang и Rust. [11] [12] MLIR — это более новый фреймворк компилятора, который позволяет Mojo использовать проходы компилятора более высокого уровня, недоступные только в LLVM, и позволяет Mojo компилировать и нацеливаться не только на центральные процессоры (ЦП), включая создание кода, который может работать на графических процессорах (GPU), тензорных процессорах (TPU), специализированных интегральных схемах (ASIC) и других ускорителях. Он также часто может более эффективно использовать определенные типы оптимизаций ЦП напрямую, такие как одна инструкция, несколько данных (SIMD) без прямого вмешательства разработчика, как это происходит во многих других языках. [13] [14] По словам Джереми Ховарда из fast.ai, Mojo можно рассматривать как « синтаксический сахар для MLIR», и по этой причине Mojo хорошо оптимизирован для таких приложений, как искусственный интеллект (ИИ). [15]
Язык программирования Mojo был создан компанией Modular Inc, которую основали Крис Латтнер , первоначальный архитектор языка программирования Swift и LLVM , и Тим Дэвис, бывший сотрудник Google . [16] Цель Mojo — сократить разрыв между простотой использования Python и высокой производительностью, необходимой для современных приложений ИИ. [17]
Согласно общедоступным журналам изменений, разработка Mojo началась в 2022 году. [18] В мае 2023 года первая публично тестируемая версия была размещена в сети через размещенную игровую площадку. [19] К сентябрю 2023 года Mojo стал доступен для локальной загрузки для Linux [20] , а к октябрю 2023 года он также стал доступен для загрузки на macOS от Apple . [21]
В марте 2024 года Modular открыла исходный код стандартной библиотеки Mojo и начала принимать вклады сообщества по лицензии Apache 2.0. [22] [23]
Mojo был создан для легкого перехода с Python. Язык имеет синтаксис, похожий на синтаксис Python, с выведенной статической типизацией [24] и позволяет пользователям импортировать модули Python . [25] Он использует LLVM и MLIR в качестве бэкэнда компиляции. [5] [26] [27] Язык также намерен добавить интерфейс внешней функции для вызова кода C/C++ и Python. Язык несовместим с исходным кодом Python 3, предоставляя только подмножество своего синтаксиса , например, отсутствуют глобальное ключевое слово, списочные и словарное понимание и поддержка классов. Кроме того, Mojo также добавляет функции, которые обеспечивают производительное низкоуровневое программирование: fn для создания типизированных , скомпилированных функций и «struct» для оптимизированных для памяти альтернатив классам . Структуры Mojo поддерживают методы , поля , перегрузку операторов и декораторы . [6]
Язык также предоставляет средство проверки заимствований , вдохновленное Rust . [28] Функции Mojo def по умолчанию используют семантику значений (функции получают копию всех аргументов, и любые изменения не видны за пределами функции), в то время как функции Python используют семантику ссылок (функции получают ссылку на свои аргументы, и любые изменения изменяемого аргумента внутри функции видны за ее пределами). [29]
Язык не имеет открытого исходного кода, но в будущем планируется сделать его открытым. [30] [31] [32] [33]
В Mojo функции можно объявлять как с помощью fn (для производительных функций), так и с помощью def (для совместимости с Python). [25]
Базовые арифметические операции в Mojo с функцией def :
def sub ( x , y ): """Питонское вычитание.""" res = x - y return res
и с функцией fn :
fn add ( x : Int , y : Int ) -> Int : """Ржавое дополнение.""" let res : Int = x + y return res
Способ, которым Mojo использует var и let для объявлений изменяемых и неизменяемых переменных, соответственно, отражает синтаксис, найденный в Swift. В Swift var используется для изменяемых переменных, в то время как let обозначает константы или неизменяемые переменные. [25]
Объявление и использование переменных в Mojo:
fn main () : пусть x = 1 пусть y : Int y = 1 вар z = 0 z += 1
Mojo SDK позволяет программистам Mojo компилировать и выполнять исходные файлы Mojo локально из интерфейса командной строки и в настоящее время поддерживает Ubuntu и macOS. [34] Кроме того, существует расширение Mojo для Visual Studio Code, которое обеспечивает автодополнение кода и всплывающие подсказки.
В январе 2024 года была опубликована модель вывода LLaMA2, написанная на языке Mojo. [35]
Mojo — это язык программирования, который так же прост в использовании, как Python, но обладает производительностью C++ и Rust. Более того, Mojo предоставляет возможность использовать всю экосистему библиотек Python.
В то время как многие другие проекты теперь используют MLIR, Mojo является первым крупным языком, разработанным специально для MLIR, что делает Mojo уникально мощным при написании кода системного уровня для рабочих нагрузок ИИ.
Все значения, переданные в функцию def Python, используют семантику ссылок. Это означает, что функция может изменять передаваемые в нее изменяемые объекты, и эти изменения видны за пределами функции. Однако поведение иногда удивляет непосвященных, поскольку вы можете изменить объект, на который указывает аргумент, и это изменение не будет видно за пределами функции. Все значения, переданные в функцию Mojo, по умолчанию используют семантику значений. По сравнению с Python это важное отличие: функция
def
Mojo получает копию всех аргументов: она может изменять аргументы внутри функции, но эти изменения не будут видны за пределами функции.