Chris Lattner, fondateur et architecte en chef de LLVM, ainsi que créateur du langage de programmation Swift, et Tim Davis, ancien responsable des projets IA chez Google tels que TensorFlow et JAX, ont présenté un nouveau langage de programmation, Mojo, alliant simplicité pour la recherche et prototypage rapide à l'aptitude à créer des produits finaux hautes performances. Cela est rendu possible grâce à la syntaxe familière du langage Python et à sa capacité de compilation en code machine, à des mécanismes de gestion de la mémoire sûrs et à des outils pour l'accélération matérielle des calculs.
Le projet se concentre sur l'utilisation pour le développement dans le domaine de l'apprentissage automatique, tout en étant présenté comme un langage polyvalent qui étend les capacités de Python avec des outils de programmation système et qui convient à une large gamme de tâches. Par exemple, le langage est applicable à des domaines tels que le calcul haute performance, le traitement et la transformation des données. Une caractéristique intéressante de Mojo est la possibilité d'utiliser le symbole emoji «🔥» comme extension pour les fichiers de code (par exemple, «helloworld.🔥»), en plus de l'extension textuelle «.mojo».
Actuellement, le langage est en phase de développement intensif et propose uniquement une interface en ligne pour les tests. Des versions distinctes pour une exécution sur les systèmes locaux seront promises ultérieurement, après avoir recueilli des retours sur le fonctionnement de l'environnement web interactif. Le code source du compilateur, JIT et d'autres éléments liés au projet est prévu d'être rendu public après la finalisation de l'architecture interne (le modèle de développement d'un prototype fonctionnel derrière des portes closes rappelle les premières étapes de développement de LLVM, Clang et Swift). Étant donné que la syntaxe de Mojo est basée sur Python et que le système de types est proche de C/C++, des outils pour faciliter la transition vers Mojo de projets existants en C/C++ et Python, ainsi que pour le développement de projets hybrides combinant le code en Python et Mojo, sont prévus pour l'avenir.
Le projet est conçu pour tirer parti des ressources matérielles existantes dans des systèmes hétérogènes pour exécuter des calculs. Par exemple, pour le développement d'applications en Mojo et le parallélisme des calculs, des GPU, des accélérateurs spécialisés pour l'apprentissage automatique et des instructions de processeur vectoriel (SIMD) peuvent être utilisés. La raison du développement d'un sous-ensemble distinct du langage Python, au lieu de travailler sur l'optimisation de l'existant CPython, est l'orientation vers la compilation, l'intégration des possibilités de programmation système et l'application d'architectures internes fondamentalement différentes permettant d'exécuter du code sur des GPU et divers accélérateurs matériels. Les développeurs de Mojo souhaitent, autant que possible, maintenir la compatibilité avec CPython.
Mojo peut être utilisé à la fois en mode interprétation avec JIT et pour la compilation en fichiers exécutables (AOT, ahead-of-time). Le compilateur intègre des technologies modernes d'optimisation automatique, de mise en cache et de compilation distribuée. Les sources écrites en Mojo sont transformées en un code intermédiaire de bas niveau MLIR (Multi-Level Intermediate Representation), développé dans le cadre du projet LLVM, offrant des possibilités supplémentaires pour l'optimisation du traitement des graphes de flux de données. Le compilateur permet d'utiliser différents backends supportant MLIR pour la génération de code machine.
L'utilisation de mécanismes matériels supplémentaires pour accélérer les calculs permet d'atteindre une performance qui, lors de calculs intensifs, surpasse les applications en C/C++. Par exemple, lors des tests d'une application pour générer des ensembles de Mandelbrot, l'application compilée en Mojo, exécutée sur le cloud AWS (r7iz.metal-16xl), s'est révélée six fois plus rapide qu'une implémentation en C++ (0,03 s contre 0,20 s), et également 35 000 fois plus rapide qu'une application en Python avec CPython 3.10.9 (0,03 s contre 1027 s), et 1500 fois plus rapide avec PYPY (0,03 s contre 46,1 s).
Lors de l'évaluation des performances en matière de résolution des tâches d'apprentissage automatique, la pile AI Modular Inference Engine, écrite en Mojo, s'est révélée trois fois plus rapide que la solution basée sur la bibliothèque TensorFlow sur un système avec un processeur Intel lors du traitement d'un modèle linguistique, 6,4 fois plus rapide lors de l'exécution d'un modèle de recommandation et 2,1 fois plus rapide pour les modèles de traitement de l'information visuelle. En utilisant des processeurs AMD, l'avantage avec Mojo a été de 3,2, 5 et 2,2 fois, et avec des processeurs ARM — de 5,3, 7,5 et 1,7 fois, respectivement. La solution basée sur PyTorch a été inférieure à Mojo de 1,4, 1,1 et 1,5 fois sur CPU Intel, de 2,1, 1,2 et 1,5 fois sur CPU AMD et de 4, 4,3 et 1,3 fois sur CPU ARM.

Le langage prend en charge la typage statique et des outils pour un travail sécurisé à bas niveau avec la mémoire, rappelant les capacités du langage Rust, comme le suivi de la durée de vie des références et la vérification de l'emprunt des variables (borrow checker). En plus des outils pour un travail sécurisé avec des pointeurs, le langage offre également des possibilités de travail à bas niveau, par exemple, l'accès direct à la mémoire en mode unsafe en utilisant le type Pointer, l'appel d'instructions SIMD spécifiques ou l'accès aux extensions matérielles telles que les TensorCores et l'AMX.

Pour simplifier la séparation entre le code Python classique et optimisé pour les fonctions avec une définition explicite des types pour toutes les variables, il est proposé d'utiliser un mot-clé séparé «fn» au lieu de «def». De même, pour les classes, en cas de besoin de regroupement statique des données en mémoire à la compilation (comme en C), on peut utiliser le type «struct» au lieu de «class». Un import simple de modules en C/C++ est également possible, par exemple, pour importer la fonction cos de la bibliothèque math, vous pouvez spécifier «from «math.h» import cos».
Source : opennet.ru
