Il creatore di LLVM sviluppa un nuovo linguaggio di programmazione Mojo

Chris Lattner, fondatore e architetto principale di LLVM, nonché creatore del linguaggio di programmazione Swift, insieme a Tim Davis, ex responsabile dei progetti AI di Google come TensorFlow e JAX, hanno presentato un nuovo linguaggio di programmazione chiamato Mojo. Questo linguaggio combina la facilità d'uso per lo sviluppo di ricerca e la rapida prototipazione con la capacità di creare prodotti finali ad alte prestazioni. Questo è possibile grazie all'uso della sintassi familiare del linguaggio Python, e alla possibilità di compilare in codice macchina, meccanismi per una gestione sicura della memoria e l'uso di strumenti per l'accelerazione hardware dei calcoli.

Il progetto è focalizzato sull'utilizzo per lo sviluppo nel campo dell'apprendimento automatico, pur presentandosi come un linguaggio di programmazione generale, espandendo le capacità del linguaggio Python con strumenti di programmazione a livello di sistema, adatto a un'ampia gamma di compiti. Ad esempio, il linguaggio può essere utilizzato in aree come i calcoli ad alte prestazioni, l'elaborazione e la trasformazione dei dati. Un aspetto interessante di Mojo è la possibilità di utilizzare 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 viene offerto solo un'interfaccia online per i test. Le versioni autonome per l'esecuzione su sistemi locali sono promesse per essere pubblicate in seguito, dopo aver ricevuto feedback sul funzionamento dell'ambiente web interattivo. I codici sorgenti del compilatore, JIT e altre componenti correlate al progetto saranno resi disponibili dopo la progettazione dell'architettura interna (il modello di sviluppo del prototipo operativo a porte chiuse ricorda le fasi iniziali di sviluppo di LLVM, Clang e Swift). Poiché la sintassi di Mojo è basata su 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, nonché per lo sviluppo di progetti ibridi che combinano codice in Python e Mojo.

Il progetto è progettato per sfruttare le risorse hardware disponibili dei sistemi eterogenei per le computazioni. Ad esempio, per eseguire applicazioni scritte in Mojo e per parallelizzare i calcoli, possono essere utilizzati GPU, acceleratori specializzati per l'apprendimento automatico e istruzioni SIMD (Single Instruction, Multiple Data). Come motivo per lo sviluppo di un sottoinsieme separato del linguaggio Python invece di lavorare sull'ottimizzazione dell'attuale CPython, viene citata la focalizzazione sulla compilazione, l'integrazione delle capacità di programmazione di sistema e l'adozione di un'architettura interna fondamentalmente diversa che consente di eseguire codice su GPU e vari acceleratori hardware. Allo stesso tempo, gli sviluppatori di Mojo intendono mantenere, per quanto possibile, la compatibilità con CPython.

Mojo può essere utilizzato sia in modalità interpretativa con l'uso di JIT, sia per la compilazione in file eseguibili (AOT, ahead-of-time). Il compilatore include tecnologie moderne per l'ottimizzazione automatica, caching e compilazione distribuita. I codici sorgenti in Mojo vengono trasformati in un codice intermedio a basso livello MLIR (Multi-Level Intermediate Representation), sviluppato dal progetto LLVM e che offre ulteriori possibilità di ottimizzazione per l'elaborazione dei grafi di flusso di dati. Il compilatore consente l'uso di vari backend per la generazione di codice macchina che supportano MLIR.

L'uso di meccanismi hardware aggiuntivi per accelerare i calcoli consente di ottenere prestazioni che, durante i calcoli intensivi, superano quelle delle applicazioni in C/C++. Ad esempio, durante il test di un'applicazione per generare una serie di Mandelbrot, l'applicazione compilata in Mojo eseguita nel cloud AWS (r7iz.metal-16xl) si è rivelata 6 volte più veloce dell'implementazione in C++ (0,03 secondi contro 0,20 secondi), e 35.000 volte più veloce dell'applicazione in Python utilizzando il CPython 3.10.9 (0,03 secondi contro 1027 secondi) e 1500 volte più veloce utilizzando PYPY (0,03 secondi contro 46,1 secondi).

Nella valutazione delle prestazioni nella risoluzione dei compiti di machine learning, il stack AI Modular Inference Engine, scritto nel linguaggio Mojo, si è dimostrato fino a 3 volte più veloce rispetto a una soluzione basata sulla libreria TensorFlow su un sistema con processore Intel nella lavorazione di modelli linguistici, 6.4 volte più veloce nell'esecuzione di modelli di raccomandazione e 2.1 volte più veloce nell'elaborazione di modelli per informazioni visive. Utilizzando processori AMD, il vantaggio con 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 ha mostrato prestazioni inferiori rispetto a Mojo di 1.4, 1.1 e 1.5 volte sui CPU Intel, 2.1, 1.2 e 1.5 volte sui CPU AMD e 4, 4.3 e 1.3 volte sui CPU ARM.

Il creatore di LLVM sviluppa un nuovo linguaggio di programmazione Mojo

Il linguaggio supporta la tipizzazione statica e strumenti per la gestione sicura della memoria a basso livello, simile alle capacità del linguaggio Rust, come il tracciamento della durata delle referenze e il controllo del prestito delle variabili (borrow checker). Oltre agli strumenti per una gestione sicura dei puntatori, il linguaggio offre la possibilità di operazioni a basso livello, come l'accesso diretto alla memoria in modalità unsafe usando il tipo Pointer, l'invocazione di singole istruzioni SIMD o l'accesso a estensioni hardware come TensorCores e AMX.

Il creatore di LLVM sviluppa un nuovo linguaggio di programmazione Mojo

Per semplificare la separazione del codice Python classico e ottimizzato per funzioni con dichiarazione esplicita dei tipi per tutte le variabili, è stato proposto di utilizzare una parola chiave separata 'fn' invece di 'def'. Allo stesso modo, per le classi, in caso di necessità di impacchettamento statico dei dati in memoria durante la compilazione (come in C), è possibile utilizzare il tipo 'struct' invece di 'class'. È inoltre possibile importare moduli in linguaggi C/C++, ad esempio, per importare la funzione cos dalla libreria math, si può specificare 'from "math.h" import cos'.

Fonte: opennet.ru

Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster