LLVM Creator sviluppa un nuovo linguaggio di programmazione Mojo

Chris Lattner, fondatore e capo architetto di LLVM e creatore del linguaggio di programmazione Swift, e Tim Davis, ex capo dei progetti di intelligenza artificiale di Google come Tensorflow e JAX, hanno introdotto un nuovo linguaggio di programmazione Mojo che unisce facilità d'uso per ricerca e sviluppo e prototipazione rapida con idoneità per prodotti finali ad alte prestazioni. Il primo è ottenuto attraverso l'uso della sintassi familiare del linguaggio Python, e il secondo è dovuto alla capacità di compilare in codice macchina, meccanismi per la gestione sicura della memoria e l'uso di strumenti per l'accelerazione hardware dei calcoli.

Il progetto è incentrato sull'uso per lo sviluppo dell'apprendimento automatico, ma si presenta come un linguaggio generico che estende le capacità del linguaggio Python con la programmazione di sistemi ed è adatto a un'ampia gamma di attività. Ad esempio, il linguaggio è applicabile ad aree come il calcolo ad alte prestazioni, l'elaborazione e la trasformazione dei dati. Una caratteristica interessante di Mojo è la possibilità di specificare il simbolo emoji "🔥" come estensione per i file di codice (ad esempio, "helloworld.🔥"), oltre all'estensione di testo ".mojo".

Attualmente, la lingua è in fase di sviluppo intensivo e solo l'interfaccia online è disponibile per i test. Si prevede che in un secondo momento verranno pubblicati assembly separati da eseguire su sistemi locali, dopo aver ricevuto feedback sul lavoro dell'ambiente web interattivo. Il codice sorgente per il compilatore, JIT e altri sviluppi relativi al progetto dovrebbe essere aperto dopo il completamento della progettazione dell'architettura interna (il modello di sviluppo di un prototipo funzionante a porte chiuse ricorda la fase iniziale di sviluppo di LLVM, Clang e Swift). Poiché la sintassi di Mojo è basata su Python e il sistema di tipi è vicino a C/C++, in futuro ci sono piani per sviluppare un toolkit per facilitare la traduzione di progetti esistenti scritti in C/C++ e Python in Mojo, nonché per sviluppare progetti ibridi che combinano codice Python e Mojo.

Il progetto è pensato per coinvolgere nei calcoli le risorse hardware di sistemi eterogenei disponibili nel sistema. Ad esempio, GPU, acceleratori di machine learning specializzati e istruzioni di elaborazione vettoriale (SIMD) possono essere utilizzati per eseguire applicazioni Mojo e parallelizzare i calcoli. La ragione per lo sviluppo di un sottoinsieme separato del linguaggio Python, piuttosto che unirsi al lavoro di ottimizzazione del CPython esistente, è citata come obiettivo di compilazione, integrazione delle capacità di programmazione del sistema e utilizzo di un'architettura interna fondamentalmente diversa che consente al codice di essere eseguito su GPU e vari acceleratori hardware. Allo stesso tempo, gli sviluppatori di Mojo intendono aderire il più possibile alla compatibilità con CPython.

Mojo può essere utilizzato sia in modalità di interpretazione JIT che per la compilazione in file eseguibili (AOT, in anticipo). Il compilatore dispone di moderne tecnologie integrate per l'ottimizzazione automatica, la memorizzazione nella cache e la compilazione distribuita. I testi di origine in lingua Mojo vengono convertiti in codice intermedio di basso livello MLIR (Multi-Level Intermediate Representation), sviluppato dal progetto LLVM e che fornisce funzionalità aggiuntive per l'ottimizzazione dell'elaborazione di un grafico del flusso di dati. Il compilatore consente di utilizzare vari backend che supportano MLIR per generare codice macchina.

L'utilizzo di meccanismi hardware aggiuntivi per velocizzare i calcoli consente di ottenere prestazioni che, con calcoli intensivi, superano le applicazioni C/C++. Ad esempio, durante il test di un'applicazione per generare un set di Mandelbrot, l'applicazione Mojo compilata, se eseguita nel cloud AWS (r7iz.metal-16xl), era 6 volte più veloce dell'implementazione C ++ (0.03 sec. vs. 0.20 sec .), nonché 35 mila volte più veloce di un'applicazione Python che utilizza CPython 3.10.9 standard (0.03 sec contro 1027 sec) e 1500 volte più veloce utilizzando PYPY (0.03 sec contro 46.1 sec).

Nel valutare le prestazioni nell'area della risoluzione dei problemi di machine learning, lo stack AI del Modular Inference Engine scritto nel linguaggio Mojo, rispetto a una soluzione basata sulla libreria TensorFlow, si è rivelato 3 volte più veloce su un sistema con un processore Intel processore durante l'elaborazione di un modello linguistico, 6.4 volte più veloce durante l'esecuzione del modello di generazione di raccomandazioni e 2.1 volte più veloce quando si lavora con modelli per l'elaborazione di informazioni visive. Quando si utilizzano processori AMD, il guadagno durante l'utilizzo di Mojo è stato di 3.2, 5 e 2.2 volte e quando si utilizzano processori ARM, rispettivamente di 5.3, 7.5 e 1.7 volte. La soluzione basata su PyTorch è rimasta indietro rispetto a Mojo di 1.4, 1.1 e 1.5 volte sulla CPU Intel, 2.1, 1.2 e 1.5 volte sulla CPU AMD e 4, 4.3 e 1.3 volte sulla CPU ARM.

LLVM Creator sviluppa un nuovo linguaggio di programmazione Mojo

Il linguaggio supporta la tipizzazione statica e le funzionalità di protezione della memoria di basso livello che ricordano le funzionalità di Rust come il monitoraggio della durata dei riferimenti e il controllo del prestito variabile (controllo del prestito). Oltre ai mezzi per il funzionamento sicuro con i puntatori, il linguaggio fornisce anche funzionalità per il lavoro di basso livello, ad esempio è possibile accedere direttamente alla memoria in modalità non sicura utilizzando il tipo di puntatore, chiamare singole istruzioni SIMD o accedere a estensioni hardware come come TensorCore e AMX.

LLVM Creator sviluppa un nuovo linguaggio di programmazione Mojo

Per semplificare la separazione del codice Python classico e ottimizzato per le funzioni con definizioni di tipo esplicite per tutte le variabili, si propone di utilizzare una parola chiave separata "fn" invece di "def". Allo stesso modo per le classi, se hai bisogno di impacchettare staticamente i dati in memoria in fase di compilazione (come in C), invece di "classe" puoi usare il tipo "struct". È anche possibile importare semplicemente moduli in linguaggi C / C ++, ad esempio, per importare la funzione cos dalla libreria matematica, è possibile specificare "da "math.h" import cos".

Fonte: opennet.ru

Aggiungi un commento