Niuxe a écrit :
J'ai lu dernièrement que tu t'intéresses à Rust. Pourquoi ? Qu'est-ce qui te motive cette décision ?
Je n'ai pas choisi Rust, j'ai choisi des architectures... qui
in fine m'ont conduit à Rust. Rust c'est accidentel.
Tout ça a commencé il y a un an, à peu près à la même époque que maintenant : j'étais sous Fastify, donc Node.js, j'étais en train de concevoir un service worker pour paralléliser du taitemment d'images en multithread... Tout d'un coup je me suis dit : "Pourquoi je m'échine à écrire des scripts et à me battre contre l'écosystème Node alors que des stacks gérent la concurrence nativement ?" Quelques mois passent. Pendant les vacances d'été, loin de tout ordinateur, mais équipé d'un smartphone, j'ai fait le tour des caractéristiques des moteurs d'exécution JIT. Je me suis dit que pour la rentrée j'opterais pour un langage compilé. Les langages fonctionnels me faisaient de l'oeil, j'ai opté pour F# en raison d'un pragamatisme puisque lié à l'écosystème .NET que j'ai trouvé très intéressant, depuis les 10 ans du passage en open source. Au final j'ai fait du C# et F# avec interop',
pour un moteur de jeu vidéo.
Mais, et c'est à ce moment-là que ça devient intéressant, lors de la création de ce moteur (pour un RPG 2D) j'ai "reconnu" de manière formelle (plutôt que totalement découvert), des patterns dont je ne connaissais pas le nom mais dont j'avais des intuitions plus ou moins claires auparavant :
- AOT (Ahead-of-time) : tout ce qui peut être résolu avant le runtime doit l'être (c'est de l'anti-JIT)
- DOD (Data-Oriented Design) : organiser les données par usage (et non par objet) pour le CPU
- ECS (Entity Component System) : on range les composants par type (contiguëment), et un système itère sur tous les composants d'un même type
En clair, j'ai découvert que j'ai une mentalité orienté bas niveau et compilateur, résolument data-driven.
J'applique désormais ces principes partout, selon ce que l'écosystème traversé peu permettre. C'est ainsi qu'
un simple script front devient un moteur ECS, ou même
une base de donnée. Un
calendrier liturgique recherchera une adresse en 2 ou 3 cycles CPU, accès O(1), en ne dépassant jamais le cache L3.
Disons que ce que je faisais de manière artisanale et naïve auparavant (mes task runner sous Grunt, puis Gulp, puis pnpm, il y a déjà 10 ans) je l'ai industrialisé en transposant mes patterns architecturaux partout. Bref, il ne s'agit pas de Rust, qui pour moi est un détail d'implémentation, même en mode no_std, en fait je suis devenu accro aux architectures systèmes, je suis définitivement tombé sur côté obscur du bas niveau et des compilateurs.
Edit : En réalité, au delà de l'architecture : j'aime prendre les données chaotiques d'un domaine pour les rendre totalement déterministes après être passées dans un pipeline AOT, après cette étape de compilation on fera en sorte que l'Engine soit le plus stupide possible, idéalement sans rien calculer (et donc terriblement rapide), son rôle se borne alors à la projection d'une vue sur mémoire (comme dans le cas du calendrier plus haut).
Modifié par Olivier C (05 May 2026 - 10:59)