Mojo 1.0 bêta
(mojolang.org)- Mojo se présente comme un langage qui permet de « l’écrire comme en Python, l’exécuter comme en C++ » et propose actuellement la version stable 1.0.0b1 (7 mai)
- Il vise à permettre l’écriture de code rapide sur une grande variété de matériels, du CPU au GPU, sans dépendre d’un fournisseur spécifique, et a été conçu comme un langage statiquement typé haute performance pour les systèmes d’IA modernes
- Il prend en charge l’interopérabilité avec Python nativement, ce qui permet de déplacer uniquement les goulets d’étranglement de performance vers Mojo sans réécrire tout le code existant ; il prend en charge à la fois l’import de code Mojo depuis Python et l’import de bibliothèques Python dans Mojo
- Il permet d’écrire des kernels GPU dans le même langage, et cherche à fournir des optimisations spécifiques au matériel ainsi que des abstractions sans coût grâce à la métaprogrammation à la compilation utilisant le même langage que le code d’exécution
- La bibliothèque standard de Mojo est entièrement open source sur GitHub et accepte les contributions ; le compilateur Mojo prévoit d’être open source en 2026
Versions et ressources de démarrage
- La version stable actuelle est 1.0.0b1 (7 mai), et la dernière nightly est celle du 9 mai
- Mojo s’inspire de la syntaxe intuitive de Python, de la sûreté mémoire de Rust, et de la métaprogrammation à la compilation puissante et intuitive de Zig
- En tant que langage compilé et statiquement typé, il convient aussi à la programmation orientée agents
- Son objectif est d’offrir à la fois productivité et performances, plutôt que de forcer à choisir entre les deux ; on peut commencer avec des patterns de programmation simples et familiers, puis ajouter de la complexité quand c’est nécessaire
- Pour démarrer, sont proposés : Install Now, Quickstart, Releases, Roadmap, GitHub
- Pour afficher une page en Markdown, on peut ajouter
.mdà l’URL, et l’index complet de la documentation Mojo est disponible dans llms.txt
GPU et interopérabilité avec Python
-
Programmation GPU
- Mojo vise à rendre la programmation GPU accessible sans bibliothèques spécifiques à un fournisseur ni code compilé séparément
- Il permet d’écrire des kernels GPU haute performance dans le même langage que pour le CPU
- Le kernel d’exemple
vector_addreçoit desTileTensoret effectueresult[i] = a[i] + b[i]en se basant surglobal_idx.xdef vector_add( a: TileTensor[float_dtype, type_of(layout), element_size=1, ...], b: TileTensor[float_dtype, type_of(layout), element_size=1, ...], result: TileTensor[ mut=True, float_dtype, type_of(layout), element_size=1, ... ], ): var i = global_idx.x if i < layout.size(): result[i] = a[i] + b[i]
-
Interopérabilité avec Python
- Mojo est nativement interopérable avec Python, ce qui permet d’éliminer les goulets d’étranglement de performance sans réécrire entièrement le code existant
- On peut commencer par une seule fonction, puis étendre progressivement en déplaçant vers Mojo le code critique pour les performances selon les besoins
- Le code Mojo peut être importé naturellement dans Python et être empaqueté avec les packages destinés au déploiement
- À l’inverse, le code Mojo peut aussi importer des bibliothèques de l’écosystème Python
- La fonction d’exemple
mojo_square_arrayobtient un pointeur depuisctypes.datad’unPythonObject, calcule la largeur SIMD à la compilation, puis met au carré les éléments du tableau# SIMD-vectorized kernel squaring array elements in place. def mojo_square_array(array_obj: PythonObject) raises: comptime simd_width = simd_width_of[DType.int64]() ptr = array_obj.ctypes.data.unsafe_get_as_pointer[DType.int64]() def pow[width: Int](i: Int) unified {mut ptr}: elem = ptr.load[width=width](i) ptr.store[width=width](i, elem * elem) vectorize[simd_width](len(array_obj), pow)
Métaprogrammation à la compilation
- La métaprogrammation de Mojo fournit un système intuitif qui maximise les performances en utilisant le même langage que le code d’exécution
- Elle permet de créer des optimisations spécifiques au matériel via la compilation conditionnelle, de garantir la sûreté mémoire grâce à l’évaluation à la compilation, et d’éliminer les branchements d’exécution coûteux
- L’objectif est d’offrir des abstractions sans coût tout en exprimant clairement l’intention
- L’implémentation d’exemple de
__eq__utilise la réflexion à la compilation pour obtenir les noms et types des champs d’une struct, vérifier que tous les champs satisfontEquatable, puis effectuer l’égalité champ par champ# Generic struct equality using compile-time reflection. @always_inline def __eq__(self, other: Self) -> Bool: comptime r = reflect[Self]() comptime names = r.field_names() comptime types = r.field_types() comptime for i in range(names.size): comptime T = types[i] comptime assert conforms_to(T, Equatable), "All fields must be Equatable" if trait_downcast[Equatable]( r.field_ref[i](self) ) != trait_downcast[Equatable](r.field_ref[i](other)): return False return True
Feuille de route et open source
- Mojo a démarré fin 2022 et il reste encore beaucoup à faire
-
Phase 0
- Étape de mise en place des bases initiales
- Cette étape consiste à implémenter le parseur central, les types mémoire, les fonctions, les structs, les initialiseurs, les conventions d’appel et d’autres fondations du langage
-
Phase 1
- Étape actuellement en cours
- L’objectif est d’en faire un langage puissant et expressif pour écrire des kernels haute performance sur CPU, GPU et ASIC, tout en permettant aux développeurs d’étendre Python de manière fluide
-
Phase 2
- Étape de programmation d’applications système
- Cette étape vise à l’étendre pour prendre en charge un modèle de sûreté mémoire garanti ainsi que davantage de capacités d’abstraction attendues par les développeurs en programmation système
-
Phase 3
- Étape de programmation orientée objet dynamique
- Cette étape consiste à prendre davantage en charge les fonctionnalités dynamiques de Python, comme les classes, l’héritage et les variables non typées, afin de maximiser la compatibilité avec le code Python
- Plus de détails sont disponibles dans la Mojo roadmap
- La bibliothèque standard de Mojo est entièrement open source sur GitHub et accepte les contributions
- Le compilateur Mojo prévoit d’être open source en 2026
- Même si l’orientation est d’open sourcer l’ensemble de Mojo, l’équipe estime que, le langage étant encore très jeune, un groupe d’ingénieurs étroitement aligné sur une vision commune peut avancer plus vite qu’un modèle piloté par la communauté
- Une voie de participation est proposée via la developer community
Ressources d’apprentissage et communauté
- Install et Quickstart guide : ressources pour démarrer avec Mojo
- Beginner tutorial : apprendre Mojo en créant un Game of Life
- GPU puzzles : apprendre la programmation GPU avec Mojo en résolvant des puzzles
- Intro to Mojo : présentation générale des fonctionnalités du langage Mojo
- Developer forum : questions et mises à jour autour de Mojo
- Events : événements, meetups, présentations et hackathons
- Contributions : informations sur les issues ouvertes, les contributions à la documentation et le partage de projets
1 commentaires
Avis sur Hacker News
J’ai beaucoup utilisé Mojo pour le plaisir ces deux dernières années, et c’est vraiment un langage génial
Il a un modèle de possession proche de Rust, une exécution à la compilation plus puissante que Zig, un système de types riche et une prise en charge SIMD de premier ordre
Côté performances aussi, cela ressemble enfin à un vrai langage plutôt qu’à un simple wrapper LLVM. LLVM est toujours utilisé, mais d’une manière différente de Rust ou Zig
J’attends vraiment beaucoup de Mojo quand il passera en open source plus tard cette année
Rien que d’après la documentation de Mojo, il est difficile d’arriver à cette conclusion
En tant que personne qui fait du machine learning tout en s’intéressant aux performances, j’espère que Mojo réussira. En particulier, le fait de pouvoir mélanger du code GPU et du code CPU dans le même langage est prometteur
Cela dit, je crains que les changements actuels n’éloignent les développeurs Python. La dernière fois que j’ai essayé, je voulais juste tester une manipulation de chaîne basique avec
var x = 'hello'; print(x[3]), mais ça ne marchait pas, etlen(x)non plus, ce qui m’a fait perdre une heureIl s’est avéré qu’ils avaient décidé de distinguer plus précisément les représentations en octets et en points de code, mais la documentation contredisait l’implémentation réelle
J’aimerais qu’il devienne exploitable aussi pour le machine learning généraliste, mais pour l’instant cela reste assez limité. Certaines fonctionnalités de base correctes autour des tenseurs ont aussi été supprimées
Pour le moment, je vais rester sur JAX et jeter un œil de temps en temps
Ça ressemble pourtant au genre de rêve que devraient avoir les gens passionnés par les compilateurs et la conception de langages
Il n’a pas besoin de garantir l’efficacité dans tous les cas ni d’offrir des performances de pointe, le simple fait qu’il existe serait déjà bien
Je comprends qu’un tel langage soit faisable, mais il semble ne pas avoir réussi à susciter l’intérêt des personnes capables de le construire
Presque tous les défauts qui me viennent à l’esprit avec Kotlin viennent de sa compatibilité avec Java. Ici, ils auraient peut-être pu mieux le résoudre de façon plus explicite, mais dans sa forme actuelle, cela semble voué à l’échec
Il est écrit qu’« ils ont promis de publier Mojo en open source à l’automne 2026 »
https://docs.modular.com/mojo/faq/#will-mojo-be-open-sourced
Malheureusement, pendant ce temps Nvidia n’est pas resté immobile non plus, et a créé une CUDA de nouvelle génération appelée CuTile pour Python, et bientôt pour C++, via une pile de compilation similaire basée sur MLIR
Même sans portabilité, il y a de fortes chances que ce soit bien plus utilisé que Mojo, simplement parce que Nvidia va pousser fort, l’intégrer à ses outils de développement et le faire coexister avec le code CUDA existant
Tile IR relevait probablement davantage d’une réponse à la menace de Triton que de Mojo. C’est particulièrement vrai si on se place du point de vue de la facilité avec laquelle on peut écrire des noyaux LLM aux performances correctes
Il y a aussi des essais comme GraalPy et PyPy
Tous ces efforts fonctionnent aujourd’hui sous Windows. C’est assez important dans les environnements où la plupart des employés reçoivent des machines Windows au travail et où seuls les serveurs utilisent une distribution Linux
Ça me fait encore penser à une possible fin à la Swift for Tensorflow
En dehors des retours clients, personne n’a parlé d’une réponse à quoi que ce soit
Mais est-ce que CuTile fonctionnera aussi sur des GPU AMD ou sur Apple Silicon ? Quoi que fasse Nvidia, la dépendance fournisseur reste entière
Quand j’ai entendu parler de Mojo au début, j’ai cru qu’ils essayaient de le rendre compatible avec le code Python existant
Mais à court terme, cet objectif paraît désormais très lointain. On pourra appeler du code dans les deux sens entre Python et Mojo, mais Mojo lui-même ne peut pas exécuter le code Python existant
Mais au fur et à mesure de la construction, ils semblent avoir changé de direction
Cela donnait moins l’impression d’un effort honnête pour améliorer l’écosystème Python que d’un montage crypto façon pump and dump
Il reprenait les enseignements de Swift et Rust, visait le CPU, le GPU et les cibles hétérogènes, et plaçait MLIR au centre
En même temps, l’architecture semblait pensée pour permettre un jour d’embarquer ou d’étendre Python relativement facilement, et le cadrage autour de Python a presque certainement aidé à lever des fonds
Chris Lattner a davantage parlé de la relation entre MLIR et Mojo que de celle entre Python et Mojo
Entre ce point et leur modèle de développement pas totalement open source, ça m’a toujours donné une impression de vaporware
Interopérabilité Python : « Mojo est interopérable nativement avec Python, ce qui vous permet d’éliminer les goulets d’étranglement de performance dans le code existant sans tout réécrire. Vous pouvez commencer par une seule fonction et étendre progressivement en migrant vers Mojo le code critique pour les performances selon les besoins. Le code Mojo s’importe naturellement dans Python et peut être empaqueté avec lui pour le déploiement. De même, les bibliothèques de l’écosystème Python peuvent être importées dans le code Mojo »
Mojo a l’air correct, mais pour le calcul numérique haute performance couvrant CPU et GPU, je suis actuellement assez satisfait de Julia
Mis à part la syntaxe à la Python, j’ai l’impression que cette niche est déjà largement couverte. Même Python dispose déjà d’outils efficaces comme Numba et Triton pour des problèmes moins complexes et plus ciblés
Pour le même objectif, Julia est plus mature, et depuis l’an dernier Nvidia aligne les fonctionnalités de ses outils Python et C++ pour CUDA
Avec le compilateur JIT Python cuTile, on peut écrire des noyaux CUDA comme en pur Python
AMD et Intel suivent aussi une approche similaire
Il reste à voir si Mojo arrivera à temps pour obtenir une adoption plus large
Tous ces dialectes Python « favorables à la performance », comme Triton, Pythran, CuTile, Numba, Pycell, cuPy, etc., ressemblent à Python en surface, mais dès qu’on gratte un peu, ce n’est plus du Python du tout
Ce sont des DSL à la saveur Python conçus pour faciliter l’optimisation et l’inférence de types. Dès qu’on les utilise réellement, on le sent
Dans chacun d’eux, beaucoup, voire la plupart, des fonctionnalités de Python ne sont pas disponibles, tout en conservant malgré cela les problèmes propres à Python
Franchement, Python n’est pas intrinsèquement bon pour l’efficacité et la performance
Le problème va bien au-delà du GIL. Le typage dynamique, la sémantique par référence, le monkey patching, le modèle objet extrêmement dynamique, l’ABI de CPython, les BigInt par défaut, le système de modules à l’exécution, etc., ont du sens pour un petit langage de scripting, mais sont très mauvais pour le calcul haute performance et l’efficacité
L’écosystème NumPy/SciPy lui-même ressemble déjà à un ensemble de contournements pour échapper aux limites de Python dans le cadre d’une simple arithmétique tensorielle CPU-bound
Les performances de base de Python sont si faibles que de simples boucles
forfont presque passer Excel pour un pur-sangMojo, c’est différent
Au lieu de bricoler sur une base existante et problématique, Mojo essaie de repartir d’une base propre
Et plutôt que de s’appuyer sur un Python vieux de plus de 30 ans, il veut offrir une « expérience proche de Python » avec un langage bien conçu, bâti sur les enseignements accumulés en conception de langages
Rien que pour ça, j’espère qu’il réussira
De nos jours, on dirait qu’au moins une partie du public a besoin d’une communication mettant AI native au premier plan
Mais personnellement, cela me rebute un peu. On dirait une formule qui ne veut en réalité rien dire
Est-ce que les passionnés d’IA peuvent m’expliquer pourquoi « étant compilé et statiquement typé, c’est aussi idéal pour la programmation par agents », et même ce que cela signifie exactement ?
Personnellement, le plus drôle a été d’ouvrir la page produit d’IBM DB2 et de voir l’étiquette AI database
J’imagine que cela veut dire qu’en attrapant davantage d’erreurs à la compilation, un agent peut vérifier rapidement son propre travail de manière statique, sans tests unitaires ni autres tests
C’est particulièrement vrai pour des langages comme Python, où il existe énormément de code open source disponible. Pour un nouvel entrant, ne pas avoir de base de code existante sur laquelle apprendre est un vrai problème
Donc, pour paraître pertinent dans un monde « agentique », ce type de marketing AI native est peut-être nécessaire. Reste à voir si cela suffira
Les agents ont tendance à mieux s’en sortir lorsqu’ils reçoivent beaucoup de retours. La vérification de types est très utile pour détecter automatiquement beaucoup d’erreurs stupides
En gros, plus on donne d’indices à un agent, mieux c’est en général
En ce qui concerne la compilation et le typage statique, dans la programmation par agents, c’est effectivement très utile de pouvoir détecter les problèmes à la compilation
Cela réduit les problèmes qui n’apparaissent qu’à l’exécution, ainsi que les situations plus difficiles à résoudre pour un agent. Les tests unitaires peuvent combler une partie du manque, mais pas entièrement
Ce qui n’est pas indiqué sur leur site, c’est que Mojo est probablement plutôt un mauvais choix pour la programmation par agents. Il n’existe pas encore beaucoup de données d’entraînement pour Mojo
Python+ruff+pycheck et TypeScript se compilent en bytecode, pas en code machine. Et ils ne sont pas non plus statiquement typés au sens de Rust
Pourtant, j’ai vu des modèles produire du code valide plutôt bon dans les deux cas. Il n’était pas nécessaire que ce soit strictement « compilé » ou « statiquement typé »
Au final, l’IA se moque assez de ces propriétés dès lors qu’elle dispose de bons outils pour vérifier rapidement le code et itérer
Modular prévoit de publier en open source plus tard cette année l’intégralité du SDK Mojo, y compris le compilateur
On peut lire que « Mojo 1.0 sera finalisé plus tard cette année, avec la publication du compilateur et la stabilité du langage »
https://www.modular.com/blog/modular-26-3-mojo-1-0-beta-max-...
Je continue de suivre Mojo. Honnêtement, ce que j’aime le moins dans Python, c’est sa syntaxe
Quelqu’un ici a mentionné Julia, et je pense que c’est un bon langage. Mais les messages d’erreur du compilateur et la documentation des bibliothèques ne sont pas au niveau qu’on attendrait d’un langage aussi mature
Les problèmes de fiabilité dans certains billets de blog que j’ai lus il y a quelque temps m’inquiètent aussi. Et à cause de la taille des binaires et du temps de démarrage initial, je ne pense pas pouvoir créer avec Julia le genre de module Python que je voudrais
Cela dit, j’espère quand même que Mojo deviendra une vraie option. J’aime le REPL et j’aime aussi le caractère dynamique de Python, donc il est possible qu’au final je ne sorte jamais de NumPy pour des raisons de performance
C’est pour ça que j’aime beaucoup Nim. On y gagne une vitesse de niveau C, l’exécution à la compilation, la métaprogrammation, un système de types puissant et la sécurité mémoire, tout en gardant un code souvent court et élégant
Mojo est intéressant aussi, mais jusqu’ici il semble surtout orienté machine learning plutôt que programmation généraliste. Et si je ne me trompe pas, le compilateur n’est toujours pas open source
J’ai aussi l’impression que Mojo vise davantage à devenir un langage robuste pour l’industrie. J’ai été choqué de voir que la première implémentation de la précompilation de Julia ne fournissait même pas d’entrées-sorties fichier