Chris Lattner, fondatore e principale architetto di LLVM, nonché creatore del linguaggio di programmazione Swift, e Tim Davis, ex responsabile dei progetti AI di Google come TensorFlow e JAX, hanno presentato un nuovo linguaggio di programmazione Mojo, che unisce la semplicità d'uso per le ricerche e la rapida prototipazione con la capacità di formare prodotti finali ad alte prestazioni. Questo primo aspetto è raggiunto grazie all'uso di una sintassi simile a quella del linguaggio Python, mentre il secondo grazie alla possibilità di compilare in codice macchina, meccanismi di gestione della memoria sicura e all'uso di strumenti per l'accelerazione hardware dei calcoli.
Il progetto è focalizzato sull'uso nello sviluppo di applicazioni di apprendimento automatico, ma viene presentato come un linguaggio di programmazione generico, che espande le capacità del linguaggio Python con strumenti di programmazione di sistema, adatto per una vasta gamma di attività. Ad esempio, il linguaggio è utilizzabile in ambiti come l'elaborazione ad alte prestazioni e la trasformazione dei dati. Un aspetto interessante di Mojo è la possibilità di indicare l'emoji '🔥' come estensione per i file di codice (ad esempio, 'helloworld.🔥'), oltre all'estensione testuale '.mojo'.
Attualmente, il linguaggio è in fase di intenso sviluppo e per il testing è disponibile solo un'interfaccia online. Sono promesse assemblee autonome per l'esecuzione su sistemi locali in seguito, dopo aver ricevuto feedback sull'ambiente web interattivo. Il codice sorgente del compilatore, JIT e altri lavori collegati al progetto saranno resi disponibili dopo il completamento della progettazione dell'architettura interna (il modello di sviluppo di un prototipo operativo a porte chiuse ricorda le prime fasi di sviluppo di LLVM, Clang e Swift). Poiché la sintassi di Mojo si basa sul linguaggio Python e il sistema di tipi è simile a C/C++, in futuro si prevede di sviluppare strumenti per semplificare la traduzione di progetti esistenti scritti in C/C++ e Python in Mojo, così come per lo sviluppo di progetti ibridi che combinano codice in Python e Mojo.
Il progetto è progettato per sfruttare le risorse hardware disponibili nel sistema di sistemi eterogenei per l'esecuzione di calcoli. Ad esempio, per l'esecuzione di applicazioni nel linguaggio Mojo e la parallelizzazione dei calcoli possono essere impiegati GPU, acceleratori specializzati per il machine learning e istruzioni per processori vettoriali (SIMD). Come motivo per lo sviluppo di un sottoinsieme separato del linguaggio Python, invece di ottimizzare l'esistente CPython, viene citata l'orientamento verso la compilazione, l'integrazione delle funzionalità di programmazione di sistema e l'adozione di un'architettura interna fondamentalmente diversa, che consente l'esecuzione del codice su GPU e vari acceleratori hardware. Nel frattempo, gli sviluppatori di Mojo intendono seguire, per quanto possibile, la compatibilità con CPython.
Mojo può essere utilizzato sia in modalità interpretativa con JIT sia per la compilazione in file eseguibili (AOT, ahead-of-time). Il compilatore incorpora tecnologie moderne di ottimizzazione automatica, caching e compilazione distribuita. I codici sorgente nel linguaggio Mojo vengono trasformati in codice intermedio a basso livello MLIR (Multi-Level Intermediate Representation), sviluppato dal progetto LLVM, che offre ulteriori opportunità di ottimizzazione nella gestione del grafo del flusso di dati. Il compilatore consente di utilizzare diversi backend che supportano MLIR per la generazione di codice macchina.
L'uso di meccanismi hardware aggiuntivi per accelerare i calcoli consente di raggiungere prestazioni che, durante calcoli intensivi, superano le applicazioni in C/C++. Ad esempio, nei test di un'applicazione per la generazione di insiemi di Mandelbrot, l'applicazione compilata nel linguaggio Mojo, eseguita nel cloud AWS (r7iz.metal-16xl), è risultata sei volte più veloce dell'implementazione in C++ (0,03 sec. contro 0,20 sec.), oltre a essere 35.000 volte più veloce dell'applicazione in Python utilizzando il normale CPython 3.10.9 (0,03 sec. contro 1027 sec.) e 1500 volte più veloce con PYPY (0,03 sec. contro 46,1 sec.).
Nella valutazione delle prestazioni nella risoluzione di problemi di apprendimento automatico, il stack AI Modular Inference Engine, scritto nel linguaggio Mojo, si è dimostrato tre volte più veloce su un sistema con processore Intel nell'elaborazione di modelli linguistici, 6,4 volte più veloce nell'esecuzione di modelli di raccomandazione e 2,1 volte più veloce nel lavoro con modelli per l'elaborazione di informazioni visive. Utilizzando processori AMD, il vantaggio nell'uso di Mojo è stato di 3,2, 5 e 2,2 volte, mentre con processori ARM è stato di 5,3, 7,5 e 1,7 volte, rispettivamente. La soluzione basata su PyTorch è risultata inferiore a Mojo di 1,4, 1,1 e 1,5 volte su CPU Intel, di 2,1, 1,2 e 1,5 volte su CPU AMD e di 4, 4,3 e 1,3 volte su CPU ARM.

Il linguaggio supporta la tipizzazione statica e strumenti per il lavoro sicuro a basso livello con la memoria, simili alle capacità del linguaggio Rust, come il tracciamento del ciclo di vita dei riferimenti e la verifica del prestito delle variabili (borrow checker). Oltre agli strumenti per un lavoro sicuro con i puntatori, il linguaggio offre anche possibilità per operazioni a basso livello, come l'accesso diretto alla memoria in modalità unsafe utilizzando il tipo Pointer, la chiamata a istruzioni SIMD specifiche o l'accesso a estensioni hardware come TensorCores e AMX.

Per semplificare la separazione del codice Python classico da quello ottimizzato per funzioni con dichiarazione esplicita dei tipi per tutte le variabili, è stato proposto di utilizzare una parola chiave separata "fn" invece di "def". Analogamente, per le classi, nel caso sia necessaria una confezione statica dei dati in memoria durante la compilazione (come in C), si può utilizzare il tipo "struct" al posto di "class". È possibile anche un semplice import dei moduli in linguaggi C/C++, ad esempio, per importare la funzione cos dalla libreria math si può scrivere "from "math.h" import cos."
Fonte: opennet.ru
