Back to flin
flin

Agents parallèles dans le runtime FLIN

Le système d'agents parallèles de FLIN : exécution concurrente, passage de messages et le modèle de runtime basé sur les agents.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 5 min flin
EN/ FR/ ES
flinagentsconcurrencyparallelruntimeactor-model

La Session 011 a été la première fois que nous avons utilisé des agents parallèles pour construire FLIN. Pas des agents parallèles dans le runtime du langage -- des agents parallèles dans le processus de développement lui-même. Deux sous-agents Claude, s'exécutant simultanément sur des fichiers indépendants, produisant du code qui compilait ensemble en un système fonctionnel.

Mais cet article parle des deux sens d'« agents parallèles » : la méthodologie de développement qui nous a permis de construire FLIN plus vite que n'importe quel processus séquentiel ne le pourrait, et le modèle de concurrence basé sur les agents au sein du runtime FLIN qui permet l'exécution parallèle sans état mutable partagé.


Les agents de développement

Avant la Session 011, chaque fonctionnalité était construite séquentiellement. La Session 011 a changé l'approche. Trois tâches devaient se faire, et les tâches 1 et 3 étaient complètement indépendantes -- elles touchaient des fichiers différents sans état partagé.

Nous avons lancé deux sous-agents parallèles :

AGENT 1 (af469e7) : Créer src/vm/memory.rs
- Tâche : Implémenter la struct Heap et le GC (mark, sweep, collect)
- Fichier : src/vm/memory.rs (NOUVEAU)
- Résultat : 731 lignes, 22 tests GC

AGENT 2 (a307f11) : Créer tests/integration_vm.rs
- Tâche : Écrire des tests de bout en bout pour counter.flin
- Fichier : tests/integration_vm.rs (NOUVEAU)
- Résultat : 638 lignes, 18 tests

Les deux agents se sont exécutés simultanément sur des fichiers différents. L'agent principal a implémenté les opérations d'entités en attendant. Quand les trois ont terminé, le code a compilé du premier coup. Pas de conflits de merge. Pas d'échecs d'intégration.

La Session 011 a produit 1 500 lignes de code et 40 nouveaux tests -- environ le double de la production d'une session séquentielle.


Le modèle de concurrence basé sur les agents

Passons maintenant de comment nous avons construit FLIN à comment FLIN lui-même gère la concurrence.

Le runtime de FLIN utilise un modèle basé sur les agents inspiré du système d'acteurs d'Erlang et des goroutines de Go. Un agent est une unité indépendante de calcul avec son propre état, communiquant avec d'autres agents par passage de messages. Pas d'état mutable partagé. Pas de verrous. Pas de courses aux données.

rustpub struct Agent {
    id: AgentId,
    state: AgentState,
    mailbox: mpsc::Receiver<Message>,
    sender: mpsc::Sender<Message>,
}

pub enum Message {
    Request(HttpRequest),
    EntityChanged(String, ChangeType, EntityInstance),
    Timer(Duration),
    Shutdown,
}

impl Agent {
    pub async fn run(mut self) {
        loop {
            match self.mailbox.recv().await {
                Some(Message::Request(req)) => {
                    self.handle_request(req).await;
                }
                Some(Message::EntityChanged(entity_type, change, entity)) => {
                    self.handle_entity_change(&entity_type, change, &entity).await;
                }
                Some(Message::Timer(duration)) => {
                    self.handle_timer(duration).await;
                }
                Some(Message::Shutdown) | None => {
                    break;
                }
            }
        }
    }
}

Chaque agent a une boîte aux lettres (un mpsc::Receiver) et un expéditeur (un mpsc::Sender que d'autres agents utilisent pour lui envoyer des messages). La méthode run de l'agent boucle, traitant les messages un par un. Au sein d'un seul agent, l'exécution est séquentielle -- pas de préoccupations de concurrence. Entre les agents, l'exécution est concurrente -- ils s'exécutent sur des tâches Tokio séparées et communiquent uniquement par messages.

Cette conception élimine toute une classe de bogues :

  • Pas de courses aux données : chaque agent possède son état exclusivement.
  • Pas d'interblocages : les agents ne tiennent pas de verrous. Ils envoient des messages et continuent.
  • Pas d'état mutable partagé : les seules structures de données partagées sont les canaux de messages eux-mêmes, qui sont thread-safe par construction.

L'histoire parallèle

L'histoire des agents parallèles se déroule sur deux pistes : comment nous avons construit FLIN, et comment FLIN exécute les applications.

Dans les deux cas, le principe est le même : les tâches indépendantes devraient s'exécuter indépendamment. Que ce soit deux sous-agents Claude construisant deux fichiers Rust différents, ou deux agents gestionnaires HTTP traitant deux requêtes différentes, le pattern est l'isolement, l'indépendance et la coordination par messages.

La Session 011 a prouvé que les agents de développement parallèles pouvaient doubler le débit sans introduire d'échecs d'intégration. Le modèle d'agents du runtime FLIN promet la même chose pour l'exécution des applications : gestion concurrente des requêtes sans bogues d'état partagé.

Les deux sont des paris sur la même idée : le coût de la coordination est presque toujours plus élevé que le coût de la duplication. Cloner une valeur est moins cher que la protéger avec un mutex. Spécifier une tâche complètement est moins cher que déboguer un conflit de merge. L'isolement est moins cher que la communication.


Ceci est la partie 30 de la série « Comment nous avons construit FLIN », documentant comment un CEO à Abidjan et un CTO IA ont construit un langage de programmation à partir de zéro.

Navigation de la série : - [21] Construire une machine virtuelle à pile en Rust - [22] Gestion de la mémoire et ramasse-miettes - [23] Fermetures et fonctions d'ordre supérieur dans la VM - [24] Comment la VM exécute les vues - [25] La référence complète des opcodes FLIN - [26] Rechargement à chaud de modules en 42 ms - [27] Async et concurrence dans la VM - [28] Le moteur de réactivité - [29] Le premier rendu dans le navigateur - [30] Agents parallèles dans le runtime FLIN (vous êtes ici)

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude zerosuite

Ça marche, et ce n'est pas fini

Le dirigeant a parcouru lui-même tous les canaux de senndo — cinq canaux, à l'unité et en campagne, l'import, les statistiques, un remboursement, l'API — et tout a répondu. Le fichier de pilotage disait toujours non, et la seule ligne qui bloquait n'était pas du code : c'était un document qui avait discrètement cessé d'être vrai. Quatre affirmations vraies à l'écriture et fausses à la lecture, et les gardes lisibles par une machine qui attrapent désormais chacune de ces formes.

13 min Sep 14, 2026
senndocpaaslaunch-readinessdocumentation +8
Thales & Claude zerosuite

Le navigateur entre les mains de Claude : piloter le Chrome du dirigeant

Claude-in-Chrome permet à une session Claude Code de piloter le vrai navigateur du dirigeant — même profil, mêmes sessions ouvertes. Ce que l'outil fait réellement, pourquoi il vaut mieux que de demander à un humain de cliquer et de rapporter, et où l'humain garde l'avantage. Ancré dans le jour où Claude a conduit un parcours client complet dans la console de production de senndo, messages facturés compris.

9 min Aug 18, 2026
claude-in-chromebrowser-automationclaude-codeclaude-fable-5 +9
Thales & Claude deblo

Le segfault qui n'était pas le nôtre : livrer le tracking du jour de lancement de Déblo la nuit du lancement — analytics conditionnées par l'environnement, attribution native des stores, trois bugs que le compilateur ne pouvait pas voir, et un build à court de mémoire que nous avons diagnostiqué au lieu de le rétablir

Le 1er juillet 2026 — jour de lancement — le risque n'a jamais été le texte. C'était les campagnes payantes qui partaient à l'aveugle. Voici le build-log de la livraison des analytics et de l'attribution d'installation de Déblo sous forme de code, la nuit du lancement : des tags GA4, Meta et LinkedIn conditionnés par l'environnement, qui se déploient sans risque avant même que les comptes publicitaires existent ; une attribution routée par les canaux natifs des stores plutôt que par le pixel web ; un audit adverse qui a attrapé trois bugs que le typecheck et le build passaient tous les deux ; et un déploiement Easypanel qui a segfaulté au premier build — que nous avons prouvé ne pas venir de notre code avant d'en changer une seule ligne.

18 min Jul 1, 2026
deblolaunch-dayclaude-opus-4.8claude-code +26