Mojo es un lenguaje de programación de la familia Python que actualmente se encuentra en desarrollo. [3] [4] [5] Está disponible tanto en navegadores a través de Jupyter notebooks , [5] [6] como localmente en Linux y macOS . [7] [8] Mojo tiene como objetivo combinar la usabilidad de un lenguaje de programación de alto nivel , específicamente Python , con el rendimiento de un lenguaje de programación de sistema como C++ , Rust y Zig . [9] A partir de 2024 , el compilador[actualizar] Mojo es un software propietario (código cerrado) con una biblioteca estándar de código abierto . Modular, la empresa detrás de Mojo, ha declarado su intención de eventualmente abrir el código fuente del lenguaje Mojo, a medida que madure. [10]
Mojo se basa en el marco de software de compilación de Representación Intermedia Multinivel ( MLIR ) en lugar de directamente en el marco de compilación de nivel inferior LLVM , como lo hacen muchos lenguajes como Julia , Swift , Clang y Rust. [11] [12] MLIR es un marco de compilación más nuevo que permite a Mojo explotar pases de compilación de nivel superior no disponibles solo en LLVM, y permite a Mojo compilar y apuntar a más que solo unidades centrales de procesamiento (CPU), incluida la producción de código que puede ejecutarse en unidades de procesamiento gráfico (GPU), unidades de procesamiento tensor (TPU), circuitos integrados específicos de la aplicación (ASIC) y otros aceleradores. También puede usar a menudo de manera más efectiva ciertos tipos de optimizaciones de CPU directamente, como instrucción única, datos múltiples (SIMD) sin intervención directa de un desarrollador, como ocurre en muchos otros lenguajes. [13] [14] Según Jeremy Howard de fast.ai, Mojo puede considerarse como un " azúcar sintáctico para MLIR" y por esa razón Mojo está bien optimizado para aplicaciones como la inteligencia artificial (IA). [15]
El lenguaje de programación Mojo fue creado por Modular Inc, que fue fundada por Chris Lattner , el arquitecto original del lenguaje de programación Swift y LLVM , y Tim Davis, un ex empleado de Google . [16] La intención detrás de Mojo es cerrar la brecha entre la facilidad de uso de Python y el rápido rendimiento requerido para aplicaciones de IA de vanguardia. [17]
Según los registros de cambios públicos, el desarrollo de Mojo se remonta a 2022. [18] En mayo de 2023, la primera versión que se podía probar públicamente se puso a disposición en línea a través de un patio de juegos alojado. [19] En septiembre de 2023, Mojo estaba disponible para descarga local para Linux [20] y en octubre de 2023 también estaba disponible para descarga en macOS de Apple . [21]
En marzo de 2024, Modular abrió el código fuente de la biblioteca estándar Mojo y comenzó a aceptar contribuciones de la comunidad bajo la licencia Apache 2.0. [22] [23]
Mojo fue creado para facilitar la transición desde Python. El lenguaje tiene una sintaxis similar a la de Python, con tipado estático inferido, [24] y permite a los usuarios importar módulos de Python . [25] Utiliza LLVM y MLIR como su backend de compilación. [5] [26] [27] El lenguaje también pretende añadir una interfaz de función externa para llamar a código C/C++ y Python. El lenguaje no es compatible con Python 3, solo proporciona un subconjunto de su sintaxis , por ejemplo, falta la palabra clave global , las comprensiones de listas y diccionarios, y el soporte para clases. Además, Mojo también añade características que permiten una programación de bajo nivel de alto rendimiento: fn para crear funciones compiladas tipadas y "struct" para alternativas optimizadas para la memoria a las clases . Las estructuras de Mojo admiten métodos , campos , sobrecarga de operadores y decoradores . [6]
El lenguaje también proporciona un verificador de préstamos , una influencia de Rust . [28] Las funciones def de Mojo usan semántica de valor por defecto (las funciones reciben una copia de todos los argumentos y cualquier modificación no es visible fuera de la función), mientras que las funciones Python usan semántica de referencia (las funciones reciben una referencia en sus argumentos y cualquier modificación de un argumento mutable dentro de la función es visible afuera). [29]
El lenguaje no es de código abierto, pero está previsto que lo sea en el futuro. [30]
En Mojo, las funciones se pueden declarar utilizando tanto fn (para funciones de alto rendimiento) como def (para compatibilidad con Python). [25]
Operaciones aritméticas básicas en Mojo con una función def :
def sub ( x , y ): """Una resta pitónica.""" res = x - y return res
y con una función fn :
fn add ( x : Int , y : Int ) -> Int : """Una adición rustácea.""" let res : Int = x + y return res
La forma en que Mojo emplea var y let para las declaraciones de variables mutables e inmutables respectivamente refleja la sintaxis que se encuentra en Swift. En Swift, var se utiliza para variables mutables, mientras que let se designa para constantes o variables inmutables. [25]
Declaración y uso de variables en Mojo:
fn main () : sea x = 1 sea y : Int y = 1 var z = 0 z + = 1
El SDK de Mojo permite a los programadores de Mojo compilar y ejecutar archivos fuente de Mojo localmente desde una interfaz de línea de comandos y actualmente es compatible con Ubuntu y macOS. [31] Además, existe una extensión de Mojo para Visual Studio Code que proporciona finalización de código e información sobre herramientas.
En enero de 2024, se publicó un modelo de inferencia de LLaMA2 escrito en Mojo. [32]
Mojo es un lenguaje de programación tan fácil de usar como Python, pero con el rendimiento de C++ y Rust. Además, Mojo ofrece la posibilidad de aprovechar todo el ecosistema de bibliotecas de Python.
Si bien muchos otros proyectos ahora usan MLIR, Mojo es el primer lenguaje importante diseñado expresamente para MLIR, lo que hace que Mojo sea excepcionalmente poderoso al escribir código a nivel de sistemas para cargas de trabajo de IA.
Todos los valores que se pasan a una función def de Python usan semántica de referencia. Esto significa que la función puede modificar objetos mutables que se le pasan y esos cambios son visibles fuera de la función. Sin embargo, el comportamiento a veces es sorprendente para los no iniciados, porque puede cambiar el objeto al que apunta un argumento y ese cambio no es visible fuera de la función. Todos los valores que se pasan a una función de Mojo usan semántica de valor de forma predeterminada. En comparación con Python, esta es una diferencia importante: una función
def
de Mojo recibe una copia de todos los argumentos: puede modificar argumentos dentro de la función, pero los cambios no son visibles fuera de la función.