Para el aprendizaje automático y la inteligencia artificial, Python siempre ha parecido ser el lenguaje de programación dominante, con potentes bibliotecas como NumPy, TensorFlow y PyTorch. Pero un rápido vistazo a las páginas de GitHub de estas bibliotecas te mostrará que gran parte de su código fuente está escrito en C y C++.
Esto se debe a que Python es demasiado lento para la IA. Mojo es un nuevo lenguaje de programación que intenta combinar la velocidad de C/C++ con la elegancia de Python.
Mojo: Una visión general
Mojo es un nuevo lenguaje de programación sintácticamente similar a Python, pero con la velocidad de C. Está pensado principalmente para los usuarios de Inteligencia artificial y Desarrollo de Sistemas, campos ambos que requieren software de alto rendimiento.
Utiliza el paradigma SIMD (Single Instruction, Multiple Data) para aprovechar el paralelismo. Además, se compila justo a tiempo y consume poca memoria.
Sin embargo, Mojo no es un lenguaje completamente nuevo, sino un superconjunto de Python. Esto significa que es Python más características adicionales. Similar a cómo TypeScript extiende JavaScript. Esto es bueno porque si usted ya sabe Python, no debería ser demasiado difícil de aprender Mojo.
Mojo ha sido desarrollado por Modular, una empresa fundada por Chris Lattner, creador de LLVM y del lenguaje de programación Swift.
En conclusión, Mojo es un nuevo lenguaje de programación diseñado para ser sintácticamente similar a Python pero tan rápido como C/C++. Está pensado para ser utilizado en el desarrollo de IA y la programación de sistemas. Aunque el proyecto no está completo, es increíblemente prometedor, y en la siguiente sección analizaremos por qué.
Características de Mojo frente a otros lenguajes de programación
Mojo se ha hecho increíblemente popular a pesar de que aún no está disponible públicamente. Esto se debe a que presenta varias ventajas significativas sobre otros lenguajes de programación a la hora de realizar Aprendizaje automático y construir software a nivel de sistema. En esta sección analizaremos estas ventajas.
#1. Soporte nativo para tareas de IA y aprendizaje automático
Mojo está pensado para desarrollar aplicaciones de Inteligencia Artificial. Como resultado, viene con funciones y módulos en la biblioteca estándar para construir redes neuronalesvisión por ordenador y preparación de datos.
La mayoría de los lenguajes de propósito general como Python requerirían bibliotecas adicionales para llevar a cabo esto, pero Mojo lo soporta desde el primer momento.
#2. Sintaxis simplificada y abstracciones de alto nivel
Para escribir software rápido y eficiente, normalmente tendríamos que utilizar lenguajes como C, C++ y Rust. Aunque estos lenguajes son rápidos, son más difíciles de aprender y trabajar con ellos. Esto se debe a que te obligan a trabajar a bajo nivel para que tengas más control.
Sin embargo, Mojo sigue ofreciendo abstracciones de alto nivel como Python y una sintaxis sencilla. Esto hace que sea más fácil trabajar con él que con otros lenguajes comparables en rendimiento.
#3. Integración con marcos y bibliotecas de IA populares
Como ya se ha mencionado, Mojo no es un lenguaje completamente nuevo, sino un superconjunto de Python. Como resultado, se integra bien con bibliotecas existentes como NumPy y PyTorch. Esto significa que, por defecto, Mojo tiene un ecosistema tan grande como el de Python.
#4. Manipulación eficaz de datos
Mojo está diseñado para manipular múltiples valores de forma eficiente en paralelo. Esto es muy útil cuando se realiza álgebra lineal, de la que tanto depende el aprendizaje automático. Mojo también se compila justo a tiempo, por lo que el código de bytes está optimizado para la velocidad. Esto hace que trabajar con datos y aprendizaje automático sea eficiente en Mojo.
#5. Escalabilidad y computación paralela
Como se mencionó anteriormente, Mojo está construido para soportar el paradigma de Instrucción Única - Datos Múltiples de computación paralela. Esto viene integrado en Mojo y lo hace más rápido desde el primer momento. También supera a librerías de Python como NumPy.
Elementos clave de Mojo
En esta sección, discutiremos cómo escribir programas en Mojo. Debido a que Mojo pretende ser un superconjunto de Python, al igual que TypeScript es un superconjunto de JavaScript, todo el código Python válido es código Mojo válido, pero no todo el código Mojo es código Python válido.
Mojo es todavía un trabajo en progreso, y algunas características del lenguaje Python no están soportadas todavía - por ejemplo, las clases. Además, un compilador no está disponible todavía, pero puede utilizar Mojo en un cuaderno de juegos. Sin embargo, primero necesitará una cuenta, que puede crear en su sitio web.
Por el momento, es difícil dar un tutorial completo sobre el lenguaje, ya que algunas características aún no se han añadido, y no todas las cosas están soportadas actualmente. En su lugar, vamos a discutir algunas adiciones clave que Mojo añade a lo que Python ya tiene.
Sintaxis y gramática
Dado que Mojo es un superconjunto de Python, sus sintaxis son idénticas. Al igual que Python, un programa se compone de sentencias. Estas sentencias pueden agruparse en bloques bajo funciones, bucles o condicionales. Las sentencias dentro de un bloque están sangradas. He aquí un programa de ejemplo escrito en Mojo:
def odd_or_even():
for i in range(1, 101):
if i % 2 == 0:
print("Even")
else:
print("Odd")
odd_or_even()
Esto es perfectamente idéntico a un programa Python. Sin embargo, Mojo ofrece características adicionales que verás en las secciones siguientes.
Declaraciones de variables
Con Mojo, tienes dos formas adicionales de declarar variables. Puedes utilizar el método let
o var
palabra clave. La dirección let
declara una variable inmutable. Una vez inicializada, no se puede reasignar su valor a otra cosa. En cambio, las variables declaradas con var
pueden reasignarse, ya que son mutables.
La principal ventaja de las variables declaradas mediante let
o var
es que soportan especificadores de tipo. El siguiente ejemplo ilustra cómo se declaran las variables en Mojo.
let pi: Float64 = 3.141
var greeting = "Hello, World"
# This would be impossible
# pi = 6.283
# But this is possible
greeting = "Ola"
print(pi, greeting)
Estructuras
Además de una forma diferente de declarar variables, Mojo soporta structs. Una forma sencilla de ver los structs es que son como las clases, pero más rígidos. A diferencia de las clases, no puedes añadir/eliminar o modificar métodos mientras se ejecutan, y todos los miembros tienen que ser declarados usando el método var
o let
palabras clave. Esta estructura más rígida permite a Mojo gestionar la memoria y el rendimiento de forma más eficaz. Aquí tienes un ejemplo de estructura:
struct Person:
var name: StringLiteral
var age: Int32
fn __init__(inout self, name: StringLiteral, age: Int32):
self.name = name
self.age = age
john = Person("John Doe", 32)
print(john.name, john.age)
Funciones
En la estructura anterior, te habrás dado cuenta de que hemos declarado la variable __init__
utilizando la palabra clave fn en lugar de def. Esto se debe a que, en Mojo, puedes declarar funciones utilizando fn
y def
. Una función declarada mediante fn
es más estricta en comparación con su def
contraparte.
En concreto, una función declarada mediante fn
tiene sus argumentos inmutables por defecto. Además, es necesario especificar el tipo de datos de los argumentos y el valor de retorno de la función. Todas las variables locales deben declararse antes de su uso.
fn say_hello(name: StringLiteral):
print("Hello,", name)
# This would be invalid
# fn say_hello(name):
# print("Hello,", name)
say_hello("John")
Si la función lanza una excepción, debe indicarse explícitamente cuando se declara la función utilizando la propiedad raises
palabra clave. Además, Mojo no utiliza la clase Exception como hace Python, en su lugar, utiliza la clase Error.
fn will_raise_error() raises:
raise Error('Some error')
will_raise_error()
Sobrecarga
Mojo también soporta operadores de sobrecarga basados en diferentes tipos de datos. Esto apoya el principio de polimorfismo orientado a objetos.
fn add_numbers(a: Int32, b: Int32) -> Int32:
return a + b
fn add_numbers(a: Int32, b: Int32, c: Int32) -> Int32:
return a + b + c
let first_total = add_numbers(2, 3)
let second_total = add_numbers(1, 2, 3)
print(first_total, second_total)
Cómo se utiliza Mojo en el desarrollo de IA
Mojo viene con librerías para construir modelos de Aprendizaje Automático. Esto incluye bibliotecas para construir redes neuronales. Además, también puedes realizar tareas como Procesamiento del lenguaje natural y visión por ordenador.
Aunque el lenguaje en sí aún no está terminado y su ecosistema es prácticamente inexistente, podemos esperar que Mojo aporte muchas funciones para realizar tareas como el tratamiento de datos, la creación de modelos, la optimización, la gestión de modelos y la supervisión.
¿Es Mojo el futuro del desarrollo de la IA?
Es difícil predecir cómo evolucionará y se adoptará la tecnología. La mayoría de las predicciones son erróneas, pero eso no significa que no podamos intentarlo. Para predecir si es probable que Mojo sustituya a Python, consideremos las ventajas y los inconvenientes/limitaciones de Mojo:
Beneficios
- Es muy rápido y está construido para aprovechar el paralelismo sin hacer mucho, lo que es esencial para el aprendizaje automático, ya que el entrenamiento de modelos puede llevar mucho tiempo.
- Es un superconjunto de Python, por lo tanto, más fácil de aprender y tiene una curva de aprendizaje más suave. Esto reduce la fricción para su adopción.
- Reduce las posibilidades de que se produzcan errores en producción, ya que errores como nombres de variables mal escritos o desajustes de tipo se detectan en tiempo de compilación. Esto hace que sea preferible.
Inconvenientes
- En la actualidad incompleto. Pero, por supuesto, el equipo de Modular está trabajando para liberar el lenguaje y su traductor.
- Por mucho que simplifique el trabajo de los productores de marcos, puede que no suponga una gran ventaja para los consumidores de marcos, puesto que ya utilizan marcos de aprendizaje automático en Python.
- Aún no cuenta con un gran ecosistema de herramientas y recursos de aprendizaje. Mientras que puedes usar las bibliotecas de Python en Mojo, todavía puedes usar las bibliotecas de Python en Python. Para que Mojo tenga alguna ventaja sobre Python, necesita bibliotecas que lleven la velocidad de Mojo.
Palabras finales
Si nos guiamos por la publicidad actual, es probable que Mojo se convierta en un lenguaje de IA popular. Creo que su velocidad es suficiente para animar a la gente a pasarse a Mojo. Su sencillez es una ventaja. Pero al igual que TypeScript no sustituyó a JavaScript por completo, es probable que Mojo no sustituya a Python por completo.
Mojo es, sin duda, un lenguaje que hay que tener en cuenta para cuando madure.
A continuación, consulte Tipo vs. Interfaz en TypeScript.