<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Rust on Benjamin Geer</title>
    <link>https://benjamingeer.eu/fr/topics/rust/</link>
    <description>Recent content in Rust on Benjamin Geer</description>
    <generator>Hugo</generator>
    <language>fr-FR</language>
    <lastBuildDate>Mon, 05 Oct 2026 07:00:00 +0000</lastBuildDate>
    <atom:link href="https://benjamingeer.eu/fr/topics/rust/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Créer des applications hypermédia sécurisées pour un monde aux ressources limitées</title>
      <link>https://benjamingeer.eu/fr/post/hypermedia/</link>
      <pubDate>Mon, 05 Oct 2026 07:00:00 +0000</pubDate>
      <guid>https://benjamingeer.eu/fr/post/hypermedia/</guid>
      <description>&lt;p&gt;Quand je développais des applications web dans les années 1990, il était courant que le server&#xA;génère des pages HTML à partir de templates, et beaucoup de moteurs de template ont été créés&#xA;pour cela (y compris &lt;a href=&#34;https://freemarker.apache.org&#34; target=&#34;_blank&#34;&gt;par moi&lt;/a&gt;). À partir du début des années&#xA;2000, les &lt;a href=&#34;https://fr.wikipedia.org/wiki/Application_web_monopage&#34; target=&#34;_blank&#34;&gt;applications web monopages&lt;/a&gt;&#xA;se sont répandues. Dans celles-ci, le serveur renvoie surtout des données au format JSON, alors&#xA;qu&amp;rsquo;un framework JavaScript (ou TypeScript) génère le code HTML dans le navigateur. J&amp;rsquo;ai&#xA;travaillé sur des applications de ce type et j&amp;rsquo;ai constaté qu&amp;rsquo;elles sont difficiles à maintenir,&#xA;en partie parce que les frameworks JavaScript sont gigantesques et complexes et évoluent&#xA;rapidement.&lt;/p&gt;&#xA;&lt;p&gt;On constate aujourd&amp;rsquo;hui un mécontentement croissant vis-à-vis des applications monopages, non&#xA;seulement à cause des difficultés de maintenance, mais aussi parce que ces applications doivent&#xA;charger plusieurs mégaoctets de JavaScript via le réseau avant de pouvoir fonctionner, ce qui&#xA;les rend lentes, surtout quand la connexion réseau est lente. En même temps, &lt;a href=&#34;https://chrisburnell.com/html-can-do-that/&#34; target=&#34;_blank&#34;&gt;HTML est devenu&#xA;plus puissant&lt;/a&gt;, ce qui rend JavaScript moins&#xA;indispensable. Par conséquent, il y a un regain d&amp;rsquo;intérêt pour la génération de code HTML côté&#xA;serveur.&lt;/p&gt;&#xA;&lt;p&gt;Un des inconvénients de la génération de code HTML côté serveur dans les années 1990 était la&#xA;nécessité de recharger la page entière dès qu&amp;rsquo;un élément changeait. Aujourd&amp;rsquo;hui cette limitation&#xA;n&amp;rsquo;existe plus, grâce à des bibliothèques JavaScript minuscules comme &lt;a href=&#34;https://htmx.org&#34; target=&#34;_blank&#34;&gt;htmx&lt;/a&gt;.&#xA;En ajoutant des attributs déclaratifs aux éléments HTML, on peut permettre à toutes sortes&#xA;d&amp;rsquo;interactions utilisateur de récupérer des fragments de code HTML depuis le serveur et de ne&#xA;remplacer que les parties de la page qui doivent être modifiées. Les applications qui&#xA;fonctionnent de cette façon sont des « applications hypermédia », et il y a un livre là-dessus&#xA;qui s&amp;rsquo;appelle &lt;a href=&#34;https://hypermedia.systems&#34; target=&#34;_blank&#34;&gt;Hypermedia Systems&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Le livre explique la construction d&amp;rsquo;une application de gestion de contacts à l&amp;rsquo;aide de htmx, et&#xA;le &lt;a href=&#34;https://github.com/bigskysoftware/contact-app&#34; target=&#34;_blank&#34;&gt;code source&lt;/a&gt; est fourni en Python. L&amp;rsquo;ouvrage&#xA;étant axé sur htmx, le code serveur est très simple : il ne prend en charge que l&amp;rsquo;anglais, les&#xA;contacts sont stockés dans un fichier plutôt que dans une base de données, la validation des&#xA;entrées est très limitée, la pagination est basée sur des numéros de page et il n&amp;rsquo;y a pas de&#xA;tests.&lt;/p&gt;&#xA;&lt;p&gt;Dans un monde aux ressources limitées, il est logique de développer ce type d&amp;rsquo;applications dans&#xA;des langages qui se compilent en code machine et utilisent relativement peu de mémoire.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&#xA;Nous aimerions avoir la possibilité d&amp;rsquo;utiliser une base de données très légère comme&#xA;&lt;a href=&#34;https://sqlite.org/&#34; target=&#34;_blank&#34;&gt;SQLite&lt;/a&gt; ou d&amp;rsquo;en choisir une plus puissante comme&#xA;&lt;a href=&#34;https://www.postgresql.org&#34; target=&#34;_blank&#34;&gt;PostgreSQL&lt;/a&gt;. Pour éviter les bugs et les failles de sécurité, nous&#xA;pouvons privilégier les langages à typage statique qui mettent l&amp;rsquo;accent sur les fonctionnalités&#xA;de sécurité intégrées. Et nous aimerions que notre application soit facile à maintenir.&lt;/p&gt;&#xA;&lt;p&gt;Compte tenu de ces préférences, rendons l&amp;rsquo;application de &lt;em&gt;Hypermedia Systems&lt;/em&gt; plus réaliste.&#xA;Nous allons y ajouter une interface utilisateur internationalisée, une base de données&#xA;relationnelle avec un index de recherche en texte intégral, une meilleure validation des&#xA;entrées, une pagination par curseur et des tests d&amp;rsquo;interface utilisateur. Dans les prochains&#xA;articles, je présenterai deux implémentations, l&amp;rsquo;une en Go et l&amp;rsquo;autre en Rust, utilisant soit&#xA;SQLite, soit PostgreSQL. J&amp;rsquo;expliquerai les choix de conception que j&amp;rsquo;ai faits dans chaque&#xA;version et j&amp;rsquo;aborderai des techniques intéressantes qui ont des applications plus larges.&#xA;N&amp;rsquo;étant pas concepteur UX, je ne chercherai pas à améliorer l&amp;rsquo;interface utilisateur décrite dans&#xA;le livre, mais j&amp;rsquo;aurai quelques mots à dire sur ce qui peut faciliter le travail des concepteurs&#xA;UX. Je ne couvrirai pas la plupart des détails expliqués dans &lt;em&gt;Hypermedia Applications&lt;/em&gt;, mais&#xA;vous pouvez lire ces articles sans avoir lu le livre. Réfléchissons donc à des techniques que&#xA;nous pouvons utiliser pour développer des applications web sécurisées, économes en ressources et&#xA;faciles à maintenir :&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://benjamingeer.eu/fr/post/hypermedia-go/&#34;&gt;Créer une application hypermédia en Go&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://benjamingeer.eu/fr/post/hypermedia-rust/&#34;&gt;Créer une application hypermédia en Rust&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;(Ces deux articles peuvent être lus indépendamment l&amp;rsquo;un de l&amp;rsquo;autre.)&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;La relation entre l&amp;rsquo;efficacité énergétique et le choix du langage de programmation&#xA;constitue un domaine de recherche très actif. Voir &lt;a href=&#34;https://benchmarksgame-team.pages.debian.net/benchmarksgame/energy-efficiency.html&#34; target=&#34;_blank&#34;&gt;Energy Efficiency of Programming&#xA;Languages&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Comparer les performances de requêtes SQL</title>
      <link>https://benjamingeer.eu/fr/post/sqlstopwatch/</link>
      <pubDate>Thu, 29 Jan 2026 18:25:18 +0100</pubDate>
      <guid>https://benjamingeer.eu/fr/post/sqlstopwatch/</guid>
      <description>&lt;p&gt;J&amp;rsquo;ai réalisé un petit programme en Rust,&#xA;&lt;a href=&#34;https://codeberg.org/benjamingeer/sqlstopwatch&#34; target=&#34;_blank&#34;&gt;sqlstopwatch&lt;/a&gt;, pour comparer&#xA;les performances de différentes requêtes&#xA;&lt;a href=&#34;https://fr.wikipedia.org/wiki/Structured_Query_Language&#34; target=&#34;_blank&#34;&gt;SQL&lt;/a&gt;. J&amp;rsquo;ai été&#xA;inspiré par l&amp;rsquo;article &lt;a href=&#34;https://www.jooq.org/benchmark&#34; target=&#34;_blank&#34;&gt;Benchmarking&#xA;SQL&lt;/a&gt; publié par le projet jOOQ, dans lequel le&#xA;code du test est implémenté en SQL. Je voulais quelque chose de semblable,&#xA;mais j&amp;rsquo;avais quelques exigences supplémentaires :&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Un programme en ligne de commande avec une interface utilisateur simple en&#xA;mode texte (TUI) qui affiche une barre de progression.&lt;/li&gt;&#xA;&lt;li&gt;Le programme devrait prendre en charge&#xA;&lt;a href=&#34;https://www.postgresql.org&#34; target=&#34;_blank&#34;&gt;PostgreSQL&lt;/a&gt;, &lt;a href=&#34;https://www.mysql.com&#34; target=&#34;_blank&#34;&gt;MySQL&lt;/a&gt; et&#xA;&lt;a href=&#34;https://sqlite.org&#34; target=&#34;_blank&#34;&gt;SQLite&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Il devrait lire les requêtes SQL et les paramètres du test dans un fichier de&#xA;configuration indiqué sur la ligne de commande.&lt;/li&gt;&#xA;&lt;li&gt;Il devrait afficher les résultats sous forme de table dans le terminal ou les&#xA;enregistrer dans un fichier au format CSV que je puisse utiliser pour générer un&#xA;diagramme.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;L&amp;rsquo;interface utilisateur a été facile à réaliser avec&#xA;&lt;a href=&#34;https://ratatui.rs&#34; target=&#34;_blank&#34;&gt;Ratatui&lt;/a&gt;. Pour interagir avec la base de données, j&amp;rsquo;ai&#xA;utilisé la bibliothèque asynchrone &lt;a href=&#34;https://crates.io/crates/sqlx&#34; target=&#34;_blank&#34;&gt;sqlx&lt;/a&gt;, qui&#xA;fournit une bibliothèque SQLite embarquée.&lt;/p&gt;&#xA;&lt;p&gt;J&amp;rsquo;ai pensé à utiliser le format &lt;a href=&#34;https://toml.io&#34; target=&#34;_blank&#34;&gt;TOML&lt;/a&gt; pour le fichier de&#xA;configuration, mais le fichier doit fournir les identifiants de connexion. Dans&#xA;les environnements de test, il se peut que les identifiants doivent être chargés&#xA;à partir de variables d&amp;rsquo;environnement ou de fichiers sur un système de fichiers&#xA;monté, mais TOML ne permet pas d&amp;rsquo;effectuer de telles opérations. En plus, on&#xA;pourrait vouloir générer plusieurs requêtes similaires pour les comparer, comme&#xA;je l&amp;rsquo;ai fait dans &lt;a href=&#34;https://benjamingeer.eu/fr/post/bref&#34;&gt;ce projet d&amp;rsquo;optimisation de base de&#xA;données&lt;/a&gt;. Par conséquent, il vaut mieux que le fichier de&#xA;configuration soit un programme dans un langage de script. Mon &lt;a href=&#34;https://benjamingeer.eu/fr/post/organiclox&#34;&gt;exercice&#xA;d&amp;rsquo;implémentation d&amp;rsquo;un interpréteur de langage de script&lt;/a&gt;&#xA;m&amp;rsquo;avait permis d&amp;rsquo;apprécier à sa juste valeur la machine virtuelle&#xA;&lt;a href=&#34;https://www.lua.org&#34; target=&#34;_blank&#34;&gt;Lua&lt;/a&gt;. Le fichier de configuration est donc un script en&#xA;Lua, que je trouve plus commode de rédiger en&#xA;&lt;a href=&#34;https://fennel-lang.org&#34; target=&#34;_blank&#34;&gt;Fennel&lt;/a&gt;, un dialect de Lisp qui se compile en Lua.&#xA;Grâce à la bibliothèque &lt;a href=&#34;https://crates.io/crates/mlua&#34; target=&#34;_blank&#34;&gt;mlua&lt;/a&gt;, il a été très&#xA;facile d&amp;rsquo;embarquer un interpréteur Lua dans le programme et d&amp;rsquo;utiliser&#xA;&lt;a href=&#34;https://serde.rs&#34; target=&#34;_blank&#34;&gt;Serde&lt;/a&gt; pour convertir des tables Lua en &lt;code&gt;struct&lt;/code&gt;s Rust.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Créer un client Bittorrent en Rust</title>
      <link>https://benjamingeer.eu/fr/post/sayaca/</link>
      <pubDate>Thu, 15 Jan 2026 15:16:01 +0100</pubDate>
      <guid>https://benjamingeer.eu/fr/post/sayaca/</guid>
      <description>&lt;h2 class=&#34;heading&#34; id=&#34;aperçu&#34;&gt;&#xA;  Aperçu&lt;span class=&#34;heading__anchor&#34;&gt; &lt;a href=&#34;#aper%c3%a7u&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&#xA;&lt;/h2&gt;&lt;p&gt;Pour continuer mon apprentissage de &lt;a href=&#34;https://benjamingeer.eu/fr/topics/rust/&#34;&gt;Rust&lt;/a&gt;, j&amp;rsquo;ai décidé de&#xA;réaliser un client pour&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/BitTorrent&#34; target=&#34;_blank&#34;&gt;Bittorrent&lt;/a&gt;, le protocole de&#xA;transfert de données pair-à-pair. Les clients Bittorrent que j&amp;rsquo;ai utilisés ont&#xA;des interfaces graphiques complexes qui semblent destinées aux gens qui&#xA;téléchargent des torrents à longueur de journée, plutôt que pour l&amp;rsquo;utilisateur&#xA;occasionnel comme moi, qui veut tout simplement obtenir un seul fichier. Et&#xA;comme beaucoup d&amp;rsquo;applications à interface graphique, les clients Bittorrent ont&#xA;tendance à accumuler des fichiers qui occupent de l&amp;rsquo;espace disque dans des&#xA;répertoires obscurs. Je fais beaucoup de choses dans le terminal et quand j&amp;rsquo;ai&#xA;besoin de télécharger un fichier, mon réflexe est d&amp;rsquo;utiliser&#xA;&lt;a href=&#34;https://curl.se/&#34; target=&#34;_blank&#34;&gt;curl&lt;/a&gt;. Je me suis donc dit, pourquoi ne pas créer quelque&#xA;chose comme curl pour Bittorrent ? En pensant à &lt;a href=&#34;https://curl.se/docs/tutorial.html#:~:text=www.example.com-,Progress%20Meter,-The%20progress%20meter&#34; target=&#34;_blank&#34;&gt;l&amp;rsquo;indicateur de&#xA;progression&lt;/a&gt;&#xA;de curl, l&amp;rsquo;idée m&amp;rsquo;est venue à l&amp;rsquo;esprit de faire quelque chose de semblable avec&#xA;&lt;a href=&#34;https://ratatui.rs&#34; target=&#34;_blank&#34;&gt;Ratatui&lt;/a&gt;, une bibliothèque de création d&amp;rsquo;environnements&#xA;en mode texte (TUI), que je voulais de toute façon essayer.&lt;/p&gt;&#xA;&lt;p&gt;La réalisation d&amp;rsquo;un client Bittorrent semblait être une bonne occasion&#xA;d&amp;rsquo;apprendre la programmation asynchrone en Rust. J&amp;rsquo;avais lu beaucoup de&#xA;critiques d&amp;rsquo;&lt;code&gt;async&lt;/code&gt; en Rust, mais je l&amp;rsquo;ai trouvé agréable à utiliser (en&#xA;utilisant la bibliothèque &lt;a href=&#34;https://tokio.rs&#34; target=&#34;_blank&#34;&gt;Tokio&lt;/a&gt;) et certainement plus&#xA;confortable que les infrastructures logicielles comparables que j&amp;rsquo;avais&#xA;utilisées en Scala (&lt;a href=&#34;https://akka.io&#34; target=&#34;_blank&#34;&gt;Akka&lt;/a&gt; et &lt;a href=&#34;https://typelevel.org/cats-effect/&#34; target=&#34;_blank&#34;&gt;Cats&#xA;Effect&lt;/a&gt;). J&amp;rsquo;aime particulièrement le fait&#xA;qu&amp;rsquo;une fonction &lt;code&gt;async&lt;/code&gt; peut être exécutée dans une tâche existante ou dans sa&#xA;propre tâche, à la différence du &lt;code&gt;Future&lt;/code&gt; de Scala, qui est affecté à un fil&#xA;d&amp;rsquo;exécution et se lance dès sa construction. L&amp;rsquo;approche de Rust semble mieux&#xA;adapté au remaniement et à la maintenabilité. En même temps, je suis content de&#xA;ne pas avoir à gérer la complexité liée à l&amp;rsquo;utilisation des monades comme dans&#xA;Cats Effect.&lt;/p&gt;&#xA;&lt;p&gt;Le résultat est &lt;a href=&#34;https://codeberg.org/benjamingeer/sayaca&#34; target=&#34;_blank&#34;&gt;Sayaca&lt;/a&gt;, qui porte&#xA;le nom d&amp;rsquo;un oiseau sud-américain qui joue un rôle important dans la dispersion&#xA;des graines (le verbe anglais &lt;em&gt;to seed&lt;/em&gt; veut dire ensemencer, et dans la&#xA;terminologie de Bittorrent, envoyer des données aux autres pairs).&lt;/p&gt;&#xA;&lt;h2 class=&#34;heading&#34; id=&#34;la-conception&#34;&gt;&#xA;  La conception&lt;span class=&#34;heading__anchor&#34;&gt; &lt;a href=&#34;#la-conception&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&#xA;&lt;/h2&gt;&lt;p&gt;Ma première tâche a été de réaliser un analyseur syntaxique pour&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Bencode&#34; target=&#34;_blank&#34;&gt;Bencode&lt;/a&gt;, le format de données&#xA;utilisées dans le protocole Bittorrent. Au niveau conceptuel, Bencode ressemble&#xA;à &lt;a href=&#34;https://en.wikipedia.org/wiki/JSON&#34; target=&#34;_blank&#34;&gt;JSON&lt;/a&gt;, mais il est destiné à la&#xA;représentation de données binaires plutôt que textuelles. J&amp;rsquo;avais envie&#xA;d&amp;rsquo;essayer d&amp;rsquo;utiliser une bibliothèque de combinateurs d&amp;rsquo;analyseurs syntaxiques,&#xA;et je n&amp;rsquo;ai pas eu de mal à implémenter l&amp;rsquo;analyseur en utilisant&#xA;&lt;a href=&#34;https://github.com/rust-bakery/nom&#34; target=&#34;_blank&#34;&gt;nom&lt;/a&gt;. Comme je voulais être en mesure de&#xA;sérialiser et de désérialiser des &lt;code&gt;struct&lt;/code&gt;s en Rust au format Bencode, j&amp;rsquo;ai&#xA;ajouté la prise en charge de la bibliothèque &lt;a href=&#34;https://serde.rs&#34; target=&#34;_blank&#34;&gt;Serde&lt;/a&gt;. J&amp;rsquo;ai&#xA;publié la crate issue de ce travail sous le nom de&#xA;&lt;a href=&#34;https://crates.io/crates/bside&#34; target=&#34;_blank&#34;&gt;bside&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;La principale difficulté dans la conception du client résidait dans le caractère&#xA;confus des spécifications Bittorrent. Il y a des ambigüités (le mot &lt;em&gt;piece&lt;/em&gt; a&#xA;deux sens différents) et les implémentations se sont écartées des spécifications&#xA;(par exemple, les identifiants de pair ne sont pas utilisés pour identifier&#xA;les pairs). Une grande partie des informations relatives au protocole ne figure&#xA;pas dans les spécifications officielles, mais dans d&amp;rsquo;autres documents dispersés&#xA;sur le Web. Il y a une &lt;a href=&#34;https://www.bittorrent.org/beps/bep_0000.html&#34; target=&#34;_blank&#34;&gt;longue&#xA;liste&lt;/a&gt; (non mise à jour depuis&#xA;2018) de projets d&amp;rsquo;extension du protocole qui sont pris en charge par de&#xA;nombreux clients. Une extension dite &lt;a href=&#34;https://en.wikipedia.org/wiki/BitTorrent_protocol_encryption&#34; target=&#34;_blank&#34;&gt;de&#xA;chiffrement&lt;/a&gt;&#xA;(qui semble en réalité décrire une forme de brouillage) semble être largement&#xA;mise en œuvre, mais d&amp;rsquo;après ce que je peux en juger, depuis 2023, &lt;a href=&#34;https://web.archive.org/web/20230405235517/http://wiki.vuze.com/w/Message_Stream_Encryption&#34; target=&#34;_blank&#34;&gt;sa&#xA;spécification&lt;/a&gt;&#xA;n&amp;rsquo;est conservée que dans la Wayback Machine de l&amp;rsquo;Internet Archive. Il existe un&#xA;&lt;a href=&#34;https://bittorrent.org/beps/bep_0052.html&#34; target=&#34;_blank&#34;&gt;projet de spécification du protocole BitTorrent&#xA;v2&lt;/a&gt; (non mis à jour depuis 2017) qui&#xA;tente de corriger certains défauts du protocole d&amp;rsquo;origine, comme sa dépendance&#xA;vis-à-vis de la fonction de hachage&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/SHA-1&#34; target=&#34;_blank&#34;&gt;SHA-1&lt;/a&gt; (qui n&amp;rsquo;est plus considérée comme&#xA;sécurisée depuis 2005). J&amp;rsquo;aurais pu errer longtemps dans un dédale de documents&#xA;et dans le code source des clients existants. Pour simplifier les choses, j&amp;rsquo;ai&#xA;décidé de ne mettre en œuvre que le &lt;a href=&#34;https://bittorrent.org/beps/bep_0003.html&#34; target=&#34;_blank&#34;&gt;protocole&#xA;d&amp;rsquo;origine&lt;/a&gt; et l&amp;rsquo;extension &lt;a href=&#34;https://www.bittorrent.org/beps/bep_0007.html&#34; target=&#34;_blank&#34;&gt;IPv6&#xA;tracker&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Quand un client Bittorrent enregistre des données sur le disque, il devrait&#xA;offrir de bonnes performances avec des fichiers volumineux, être capable&#xA;d&amp;rsquo;interrompre un téléchargement et de le reprendre plus tard (ce qui signifie&#xA;qu&amp;rsquo;il doit noter quels fragments ont été téléchargées) et gérer les torrents qui&#xA;comprennent plusieurs fichiers. Pour faire tout cela, et pour que les choses&#xA;soient claires pour l&amp;rsquo;utilisateur, j&amp;rsquo;ai choisi d&amp;rsquo;enregistrer les données&#xA;téléchargées dans un fichier intermédiaire (avec l&amp;rsquo;extension &lt;code&gt;.sayaca&lt;/code&gt;), dans le&#xA;même répertoire où les fichiers finaux seront enregistrés. Le fichier&#xA;intermédiaire contient un champ de bits indiquant les fragments qui ont été&#xA;téléchargés (il s&amp;rsquo;agit du même champ de bits qu&amp;rsquo;il faut de toute façon envoyer&#xA;aux pairs). Pour lire et écrire ce fichier, Sayaca utilise la projection en&#xA;mémoire, ce qui devrait offrir de bonnes performances d&amp;rsquo;entrée-sortie avec des&#xA;fichiers volumineux. Une fois le téléchargement terminé, il copie les données&#xA;depuis le fichier intermédiaire vers les fichiers finaux. Lorsque le programme&#xA;se ferme, le fichier intermédiaire est supprimé s&amp;rsquo;il n&amp;rsquo;est plus nécessaire.&lt;/p&gt;&#xA;&lt;p&gt;Comme un client Bittorrent est tributaire des entrées-sorties (&lt;em&gt;I/O bound&lt;/em&gt;),&#xA;j&amp;rsquo;ai décidé d&amp;rsquo;employer &lt;a href=&#34;https://codeberg.org/benjamingeer/sayaca/src/branch/main/docs/design.md&#34; target=&#34;_blank&#34;&gt;une architecture&#xA;événementielle&lt;/a&gt;&#xA;dans laquelle une seule tâche accomplit la majeure partie du travail, comme dans&#xA;&lt;a href=&#34;https://redis.io&#34; target=&#34;_blank&#34;&gt;Redis&lt;/a&gt;. Cette tâche principale délègue toute les&#xA;entrées-sorties réseau à d&amp;rsquo;autres tâches, avec lesquelles elle communique via&#xA;des &lt;a href=&#34;https://docs.rs/tokio/latest/tokio/sync/&#34; target=&#34;_blank&#34;&gt;canaux&lt;/a&gt;. Cela a été très simple à&#xA;mettre en œuvre et a eu l&amp;rsquo;avantage de rendre facile la création de tests&#xA;unitaires pour la tâche principale.&lt;/p&gt;&#xA;&lt;p&gt;Une grande partie du travail effectué par un client Bittorrent revient à tenir&#xA;une sorte de comptabilité. Dans Sayaca, ce travail est la responsabilité du&#xA;&lt;a href=&#34;https://codeberg.org/benjamingeer/sayaca/src/branch/main/src/client/bookkeeper.rs&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;Bookkeeper&lt;/code&gt;&lt;/a&gt;&#xA;(« comptable »). Par exemple, dans &lt;a href=&#34;https://wiki.theory.org/BitTorrentSpecification#Piece_downloading_strategy&#34; target=&#34;_blank&#34;&gt;l&amp;rsquo;algorithme&#xA;recommandé&lt;/a&gt;&#xA;de sélection des fragments à demander aux pairs, le client essaie de demander&#xA;d&amp;rsquo;abord les fragments les plus rares. Cela nécessite une structure de données&#xA;qui note les fragments dont dispose chaque pair, ainsi que la rareté de chaque&#xA;fragment, entre autres. Il y a plusieurs façons de réaliser cela et j&amp;rsquo;ai décidé&#xA;d&amp;rsquo;utiliser un &lt;a href=&#34;https://doc.rust-lang.org/std/collections/struct.BTreeMap.html&#34; target=&#34;_blank&#34;&gt;tableau associatif&#xA;ordonné&lt;/a&gt;, trié&#xA;par ordre de rareté, pour stocker les identifiants de fragments et les&#xA;ensembles de pairs qui les possèdent. Le &lt;code&gt;Bookkeeper&lt;/code&gt; peut ainsi trouver&#xA;facilement un fragment, choisi au hasard parmi les plus rares, associé à un pair&#xA;choisi au hasard parmi ceux qui possèdent ce fragment et qui nous ont autorisé à&#xA;leur envoyer des demandes. Ainsi une grande partie du travail du client consiste&#xA;à mettre à jour le &lt;code&gt;Bookkeper&lt;/code&gt; lors de la réception de nouvelles informations et&#xA;à l&amp;rsquo;interroger pour savoir ce qu&amp;rsquo;il faut faire ensuite.&lt;/p&gt;&#xA;&lt;p&gt;J&amp;rsquo;aime bien les TUI et il a été facile de créer un TUI simple avec Ratatui. Mais&#xA;comme le client est une bibliothèque qui communique avec son interface&#xA;utilisateur via des canaux, il serait simple d&amp;rsquo;intégrer le client dans une autre&#xA;interface utilisateur, comme une interface en ligne de commande &lt;a href=&#34;https://xogium.me/the-text-mode-lie-why-modern-tuis-are-a-nightmare-for-accessibility&#34; target=&#34;_blank&#34;&gt;plus&#xA;accessible&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 class=&#34;heading&#34; id=&#34;dautres-approches-possibles&#34;&gt;&#xA;  D&amp;rsquo;autres approches possibles&lt;span class=&#34;heading__anchor&#34;&gt; &lt;a href=&#34;#dautres-approches-possibles&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&#xA;&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;ai choisi d&amp;rsquo;utiliser Tokio parce que je voulais en savoir plus à son sujet et&#xA;sur &lt;code&gt;async&lt;/code&gt;, mais je pense que le programme n&amp;rsquo;aurait probablement pas été très&#xA;différent si j&amp;rsquo;avais utilisé des fils d&amp;rsquo;exécution à la place, avec la même&#xA;communication via des canaux.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Créer une machine virtuelle en Rust</title>
      <link>https://benjamingeer.eu/fr/post/organiclox/</link>
      <pubDate>Sun, 12 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://benjamingeer.eu/fr/post/organiclox/</guid>
      <description>&lt;h2 class=&#34;heading&#34; id=&#34;aperçu&#34;&gt;&#xA;  Aperçu&lt;span class=&#34;heading__anchor&#34;&gt; &lt;a href=&#34;#aper%c3%a7u&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&#xA;&lt;/h2&gt;&lt;p&gt;Pour m&amp;rsquo;aider à apprendre le langage Rust, j&amp;rsquo;ai décidé de réaliser un&#xA;interpréteur pour Lox, le langage de script que Robert Nystrom a créé pour son&#xA;livre &lt;a href=&#34;https://craftinginterpreters.com/&#34; target=&#34;_blank&#34;&gt;&lt;em&gt;Crafting Interpreters&lt;/em&gt;&lt;/a&gt;. Je&#xA;m&amp;rsquo;intéresse aux langages de script qui sont destinés à être embarqués dans des&#xA;applications, et cet exercice m&amp;rsquo;a semblé un bon moyen d&amp;rsquo;en savoir plus sur la&#xA;construction de ce type de langage.&lt;/p&gt;&#xA;&lt;p&gt;Le livre de Nystrom présente, étape par étape, le développement de deux versions&#xA;de l&amp;rsquo;interpréteur. Alors que la première, en Java, parcourt un arbre de syntaxe&#xA;abstraite (AST) pour exécuter un script, la deuxième, en C, comporte une machine&#xA;virtuelle qui exécute du bytecode. Cette deuxième version m&amp;rsquo;intéressait&#xA;davantage. Au fil des ans, j&amp;rsquo;avais réalisé deux interpréteurs qui parcourent des&#xA;arbres de syntaxe abstraite, en commençant par &lt;a href=&#34;https://freemarker.apache.org/&#34; target=&#34;_blank&#34;&gt;Apache&#xA;FreeMarker&lt;/a&gt;, ainsi qu&amp;rsquo;&lt;a href=&#34;https://doi.org/10.3233/sw-200386&#34; target=&#34;_blank&#34;&gt;un compilateur source à&#xA;source optimisant&lt;/a&gt; utilisant l&amp;rsquo;inférence de&#xA;types. Mais je n&amp;rsquo;avais pas encore fait de machine virtuelle. L&amp;rsquo;idée me rappelait&#xA;de bons souvenirs de programmation en assembleur sur l&amp;rsquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Apple_II&#34; target=&#34;_blank&#34;&gt;Apple&#xA;II&lt;/a&gt; quand j&amp;rsquo;avais quinze ans. Le jeu&#xA;d&amp;rsquo;instructions de la machine virtuelle de Nystrom est plus simple que celle du&#xA;processeur &lt;a href=&#34;https://fr.wikipedia.org/wiki/MOS_Technology_6502&#34; target=&#34;_blank&#34;&gt;Motorola 6502&lt;/a&gt; de&#xA;l&amp;rsquo;Apple II, mais le principe est le même. J&amp;rsquo;ai donc sauté la première partie du&#xA;livre pour aller directement à celle où il s&amp;rsquo;agit de la machine virtuelle.&lt;/p&gt;&#xA;&lt;p&gt;Le résultat est &lt;a href=&#34;https://codeberg.org/benjamingeer/organiclox&#34; target=&#34;_blank&#34;&gt;OrganicLox&lt;/a&gt;. La&#xA;conception est globalement celle présentée dans le livre, mais j&amp;rsquo;ai essayé de&#xA;coder dans un Rust courant, en visant des performances raisonnables, sans écrire&#xA;de code non sécurisé. Les fonctionnalités d&amp;rsquo;OrganicLox devraient être identiques&#xA;à celles du programme &lt;code&gt;clox&lt;/code&gt; de Nystrom : au moins, ses &lt;a href=&#34;https://github.com/munificent/craftinginterpreters/?tab=readme-ov-file#testing-your-implementation&#34; target=&#34;_blank&#34;&gt;246 tests&#xA;automatisés&lt;/a&gt;&#xA;passent.&lt;/p&gt;&#xA;&lt;p&gt;J&amp;rsquo;ai décidé de ne pas créer mon propre ramasse-miettes, car tout le monde semble&#xA;s&amp;rsquo;accorder à dire que les ramasse-miettes sont &lt;a href=&#34;https://manishearth.github.io/blog/2021/04/05/a-tour-of-safe-tracing-gc-designs-in-rust/&#34; target=&#34;_blank&#34;&gt;particulièrement difficiles à&#xA;réaliser en&#xA;Rust&lt;/a&gt;.&#xA;Par souci de simplicité, j&amp;rsquo;ai opté plutôt pour le comptage des références (au&#xA;moyen de &lt;a href=&#34;https://doc.rust-lang.org/std/rc/struct.Rc.html&#34; target=&#34;_blank&#34;&gt;Rc&lt;/a&gt;). Sur la branche&#xA;&lt;a href=&#34;https://codeberg.org/benjamingeer/organiclox/src/branch/main&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;main&lt;/code&gt;&lt;/a&gt;, cela&#xA;veut dire que les cycles de propriétés d&amp;rsquo;objets ne seront pas nettoyés. Sur la&#xA;branche&#xA;&lt;a href=&#34;https://codeberg.org/benjamingeer/organiclox/src/branch/with_dumpster_gc&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;with_dumpster_gc&lt;/code&gt;&lt;/a&gt;,&#xA;j&amp;rsquo;ai remplacé &lt;code&gt;Rc&lt;/code&gt; par la crate&#xA;&lt;a href=&#34;https://codeberg.org/benjamingeer/organiclox/src/branch/main&#34; target=&#34;_blank&#34;&gt;dumpster&lt;/a&gt;, qui&#xA;assure le comptage des références et nettoie aussi les cycles.&lt;/p&gt;&#xA;&lt;h2 class=&#34;heading&#34; id=&#34;ce-que-jai-préféré&#34;&gt;&#xA;  Ce que j&amp;rsquo;ai préféré&lt;span class=&#34;heading__anchor&#34;&gt; &lt;a href=&#34;#ce-que-jai-pr%c3%a9f%c3%a9r%c3%a9&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&#xA;&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;ai beaucoup aimé ce livre : les explications claires de Nystrom, ses&#xA;illustrations utiles, son style léger et son humour ont rendu le livre&#xA;agréable à lire.&lt;/p&gt;&#xA;&lt;p&gt;Pour moi, la mise en œuvre des variables locales et des fermetures dans une&#xA;machine virtuelle à pile ont été parmi les aspects les plus intéressants de la&#xA;conception que présente Nystrom, conception qui s&amp;rsquo;inspire largement de &lt;a href=&#34;https://www.lua.org/doc/jucs05.pdf&#34; target=&#34;_blank&#34;&gt;celle de&#xA;l&amp;rsquo;interpréteur Lua&lt;/a&gt;. J&amp;rsquo;ai aimé apprendre que&#xA;le compilateur &lt;a href=&#34;https://craftinginterpreters.com/local-variables.html&#34; target=&#34;_blank&#34;&gt;associe les variables locales à des positions spécifiques sur la&#xA;pile&lt;/a&gt;, de sorte que la&#xA;machine virtuelle n&amp;rsquo;a besoin de connaître que ces positions et non pas les noms&#xA;des variables concernés.&lt;/p&gt;&#xA;&lt;p&gt;La mise en œuvre des &lt;em&gt;upvalues&lt;/em&gt;, à savoir les variables qui sont capturées par&#xA;les fermetures et qui doivent donc éventuellement être allouées sur le tas, n&amp;rsquo;a&#xA;pas été simple à faire correctement. En corrigeant un bogue, j&amp;rsquo;ai été heureux de&#xA;me rendre compte que &lt;a href=&#34;https://github.com/munificent/craftinginterpreters/blob/master/test/function/local_recursion.lox&#34; target=&#34;_blank&#34;&gt;l&amp;rsquo;appel récursif d&amp;rsquo;une function définie dans une portée&#xA;locale&lt;/a&gt;&#xA;nécessite que la fermeture de la fonction soit une des ses propres &lt;em&gt;upvalues&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;h2 class=&#34;heading&#34; id=&#34;ce-que-jaurais-souhaité&#34;&gt;&#xA;  Ce que j&amp;rsquo;aurais souhaité&lt;span class=&#34;heading__anchor&#34;&gt; &lt;a href=&#34;#ce-que-jaurais-souhait%c3%a9&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&#xA;&lt;/h2&gt;&lt;p&gt;Les explications de Nystrom sont tantôt ascendantes, tantôt descendantes.&#xA;L&amp;rsquo;approche ascendante a présenté plus de difficultés quant à la traduction de&#xA;sa conception en Rust, car je devais deviner où il voulait en venir. Plusieurs&#xA;fois j&amp;rsquo;ai dû remanier beaucoup de code parce que je n&amp;rsquo;avais pas deviné juste.&#xA;Comme l&amp;rsquo;implémentation de Lox dans toutes sortes de langages de programmation&#xA;semble être &lt;a href=&#34;https://github.com/munificent/craftinginterpreters/wiki/Lox-implementations&#34; target=&#34;_blank&#34;&gt;un exercice courant&lt;/a&gt;,&#xA;il aurait été utile d&amp;rsquo;avoir plus souvent une vue d&amp;rsquo;ensemble de la conception.&lt;/p&gt;&#xA;&lt;p&gt;Cela m&amp;rsquo;a fait plaisir de découvrir &lt;a href=&#34;https://craftinginterpreters.com/compiling-expressions.html&#34; target=&#34;_blank&#34;&gt;la technique de Pratt pour construire un analyseur&#xA;syntaxique descendant reposant sur la précédence des&#xA;opérateurs&lt;/a&gt;&#xA;et de constater qu&amp;rsquo;il est vraiment possible de générer du bytecode sans d&amp;rsquo;abord&#xA;construire un AST. Mais il aurait peut-être été plus&#xA;utile de construire un AST et d&amp;rsquo;apprendre quelque chose sur la conception d&amp;rsquo;une&#xA;deuxième phase pour optimiser le bytecode.&lt;/p&gt;&#xA;&lt;h2 class=&#34;heading&#34; id=&#34;la-performance&#34;&gt;&#xA;  La performance&lt;span class=&#34;heading__anchor&#34;&gt; &lt;a href=&#34;#la-performance&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&#xA;&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;optimisation principale que j&amp;rsquo;ai faite au départ a été de faire en sorte que&#xA;l&amp;rsquo;analyseur lexical mette tous les identifiants dans un pool de chaînes de&#xA;caractères (en utilisant&#xA;&lt;a href=&#34;https://docs.rs/string-interner/latest/string_interner/&#34; target=&#34;_blank&#34;&gt;string_interner&lt;/a&gt;),&#xA;pour que ni le compilateur ni la machine virtuelle aient à comparer des chaînes&#xA;représentant des identifiants.&lt;/p&gt;&#xA;&lt;p&gt;Après avoir fini &lt;a href=&#34;https://craftinginterpreters.com/calls-and-functions.html&#34; target=&#34;_blank&#34;&gt;le chapitre&#xA;24&lt;/a&gt;, j&amp;rsquo;ai passé un&#xA;peu de temps à me pencher sur la performance, en suivant les conseils du &lt;a href=&#34;https://nnethercote.github.io/perf-book&#34; target=&#34;_blank&#34;&gt;Rust&#xA;Performance Book&lt;/a&gt;. J&amp;rsquo;ai fait des tests&#xA;de performance avec &lt;a href=&#34;https://docs.rs/criterion/latest/criterion/&#34; target=&#34;_blank&#34;&gt;criterion&lt;/a&gt; et&#xA;du profilage avec &lt;a href=&#34;https://perfwiki.github.io/main/&#34; target=&#34;_blank&#34;&gt;perf&lt;/a&gt; et&#xA;&lt;a href=&#34;https://github.com/KDAB/hotspot&#34; target=&#34;_blank&#34;&gt;hotspot&lt;/a&gt;, j&amp;rsquo;ai ajusté &lt;a href=&#34;https://nnethercote.github.io/perf-book/build-configuration.html#maximizing-runtime-speed&#34; target=&#34;_blank&#34;&gt;la configuration du&#xA;compilateur&#xA;Rust&lt;/a&gt;&#xA;and j&amp;rsquo;ai marqué quelques fonctions&#xA;&lt;a href=&#34;https://nnethercote.github.io/perf-book/inlining.html&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;inline&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ensuite j&amp;rsquo;ai regardé &lt;a href=&#34;https://github.com/munificent/craftinginterpreters/wiki/Lox-implementations#rust&#34; target=&#34;_blank&#34;&gt;quelques autres versions de Lox en&#xA;Rust&lt;/a&gt;&#xA;et j&amp;rsquo;ai remarqué que tout le monde semble avoir eu du mal à obtenir des&#xA;performances proches de celles du &lt;code&gt;clox&lt;/code&gt; de&#xA;Nystrom et que les versions qui y arrivent comportent beaucoup de code&#xA;non sécurisé, ce que je voulais éviter.&lt;/p&gt;&#xA;&lt;p&gt;Je recommande vivement &lt;a href=&#34;https://ceronman.com/blog/my-experience-crafting-an-interpreter-with-rust/&#34; target=&#34;_blank&#34;&gt;billet de&#xA;blog&lt;/a&gt;&#xA;de Manuel Cerón sur sa tentative impressionnante, déterminée et partiellement&#xA;réussie d&amp;rsquo;égaler la vitesse de &lt;code&gt;clox&lt;/code&gt; en Rust en écrivant de plus en plus de&#xA;code non sécurisé.&lt;/p&gt;&#xA;&lt;p&gt;À titre de comparaison, voici les résultats de l&amp;rsquo;exécution de quelques-uns des&#xA;&lt;a href=&#34;https://github.com/munificent/craftinginterpreters/tree/master/test/benchmark&#34; target=&#34;_blank&#34;&gt;tests de performance de Nystrom&lt;/a&gt;&#xA;sur les versions suivantes :&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Le &lt;code&gt;clox&lt;/code&gt; de Nystrom&lt;/li&gt;&#xA;&lt;li&gt;La version sécurisée du &lt;code&gt;loxido&lt;/code&gt; de Cerón&lt;/li&gt;&#xA;&lt;li&gt;La version non sécurisée de &lt;code&gt;loxido&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;OrganicLox avec &lt;code&gt;Rc&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;OrganicLox avec le ramasse-miettes &lt;code&gt;dumpster&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://benjamingeer.eu/fr/post/organiclox/lox-benchmarks-fr.svg&#34;&#xA;&#x9;&#x9;&#x9;alt=&#34;un diagramme à barres de résultats de tests de performance&#34; width=&#34;100%&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;OrganicLox avec &lt;code&gt;Rc&lt;/code&gt; est donc deux à quatre fois plus lent que &lt;code&gt;clox&lt;/code&gt;, ce qui&#xA;est peut-être typique des interpréteurs réalisés en Rust &lt;a href=&#34;https://github.com/raviqqe/stak/blob/939f7bae9f188027d2f9e2cdc62c3baa76be36ed/README.md?plain=1#L174&#34; target=&#34;_blank&#34;&gt;par rapport à ceux&#xA;réalisés en&#xA;C&lt;/a&gt;.&#xA;La version avec &lt;code&gt;dumpster&lt;/code&gt; est beaucoup plus lente. Il semble clair qu&amp;rsquo;un&#xA;ramasse-miettes rapide est essentiel pour une machine virtuelle très&#xA;performante.&lt;/p&gt;&#xA;&lt;p&gt;Quelle est l&amp;rsquo;importance de ces différences ? Les tests de performance sont&#xA;conçus pour simuler des scénarios extrêmes, par exemple en utilisant de longues&#xA;boucles ou la récursivité profonde, ou en créant une charge de travail&#xA;importante pour le ramasse-miettes. Ils ne sont donc pas forcément&#xA;représentatifs des cas d&amp;rsquo;utilisation réels. Il arrive souvent que les scripts&#xA;exécutés par une application dans un interpréteur embarqué sont courts et font&#xA;très peu de travail. On pourrait se faire une idée plus réaliste de la&#xA;performance d&amp;rsquo;une machine virtuelle dans un tel scénario en exécutant la suite&#xA;de tests d&amp;rsquo;intégration de Nystrom, qui exécute 246 scripts courts en Lox et&#xA;vérifie leurs sorties. Voici une comparaison :&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://benjamingeer.eu/fr/post/organiclox/lox-tests-fr.svg&#34;&#xA;&#x9;&#x9;&#x9;alt=&#34;a bar chart of test suite running times&#34; width=&#34;100%&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Dans une application où chaque cycle CPU compte, les écarts entre les&#xA;performances de ces différentes implémentations pourraient avoir beaucoup&#xA;d&amp;rsquo;importance. Mais dans d&amp;rsquo;autres cas d&amp;rsquo;utilisation, ils pourraient être&#xA;insignifiants.&lt;/p&gt;&#xA;&lt;h2 class=&#34;heading&#34; id=&#34;dautres-approches-possibles&#34;&gt;&#xA;  D&amp;rsquo;autres approches possibles&lt;span class=&#34;heading__anchor&#34;&gt; &lt;a href=&#34;#dautres-approches-possibles&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&#xA;&lt;/h2&gt;&lt;p&gt;Il est tentant d&amp;rsquo;essayer d&amp;rsquo;ajouter un compilateur à la volée (JIT) pour&#xA;améliorer la performance de l&amp;rsquo;interpréteur, soit en en écrivant un à partir de&#xA;zéro, soit en en utilisant un &lt;em&gt;backend&lt;/em&gt; existant comme &lt;a href=&#34;https://llvm.org/&#34; target=&#34;_blank&#34;&gt;LLVM&lt;/a&gt;&#xA;ou &lt;a href=&#34;https://cranelift.dev/&#34; target=&#34;_blank&#34;&gt;Cranelift&lt;/a&gt;.&#xA;&lt;a href=&#34;https://blog.nlnetlabs.nl/introducing-roto-a-compiled-scripting-language-for-rust&#34; target=&#34;_blank&#34;&gt;Roto&lt;/a&gt;&#xA;et&#xA;&lt;a href=&#34;https://blog.nlnetlabs.nl/introducing-roto-a-compiled-scripting-language-for-rust/&#34; target=&#34;_blank&#34;&gt;Dora&lt;/a&gt;&#xA;sont des exemples en Rust de cette approche. Mais même si on adopte cette&#xA;démarche, il n&amp;rsquo;est pas facile d&amp;rsquo;atteindre un haut niveau de performance. Dans&#xA;&lt;a href=&#34;https://blog.miguelgrinberg.com/post/python-3-14-is-here-how-fast-is-it&#34; target=&#34;_blank&#34;&gt;ces tests de&#xA;performance&lt;/a&gt;,&#xA;le nouveau JIT de Python n&amp;rsquo;a aucun effet mesurable sur les performances (voir&#xA;aussi &lt;a href=&#34;https://dinfuehr.com/blog/dora-implementing-a-jit-compiler-with-rust/#benchmarks&#34; target=&#34;_blank&#34;&gt;ces résultats de tests de la performance de&#xA;Dora&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Voilà une raison d&amp;rsquo;envisager d&amp;rsquo;utiliser un interpréteur existant qui a déjà&#xA;bénéficié d&amp;rsquo;années de développement, plutôt que d&amp;rsquo;en créer un nouveau. Le&#xA;langage &lt;a href=&#34;https://www.lua.org/&#34; target=&#34;_blank&#34;&gt;Lua&lt;/a&gt; est une option largement utilisée, mais il&#xA;n&amp;rsquo;est pas assez rapide pour certaines applications. La machine virtuelle&#xA;&lt;a href=&#34;https://luajit.org/&#34; target=&#34;_blank&#34;&gt;LuaJIT&lt;/a&gt; est un ordre de grandeur plus rapide que la&#xA;machine virtuelle Lua standard pour certains cas d&amp;rsquo;utilisation, mais c&amp;rsquo;est un&#xA;&lt;a href=&#34;https://www.polarsignals.com/blog/posts/2024/11/13/lua-unwinding&#34; target=&#34;_blank&#34;&gt;compilateur à la volée basé sur les arbres de&#xA;traces&lt;/a&gt;, ce&#xA;qui a des avantages et des inconvénients. Les développeurs de Lua ont publié un&#xA;&lt;a href=&#34;https://www.inf.puc-rio.br/~roberto/docs/pallene-sblp.pdf&#34; target=&#34;_blank&#34;&gt;article intéressant&lt;/a&gt;&#xA;qui traite des limites de cette approche et propose une autre solution (un&#xA;langage supplémentaire à typage statique, un peu comme&#xA;&lt;a href=&#34;https://cython.org/&#34; target=&#34;_blank&#34;&gt;Cython&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Pour certains cas d&amp;rsquo;utilisation, si des scripts embarqués ne font pas beaucoup&#xA;de travail, leurs performances pourraient ne pas être critiques. S&amp;rsquo;ils font&#xA;tellement de travail que leurs performances sont insuffisantes, une autre option&#xA;consiste à ne pas intégrer d&amp;rsquo;interpréteur du tout. Cloudflare, qui avait investi&#xA;massivement pendant plus de 20 ans dans des scripts en utilisant LuaJIT embarqué&#xA;dans &lt;a href=&#34;https://openresty.org/en/&#34; target=&#34;_blank&#34;&gt;OpenResty&lt;/a&gt;, &lt;a href=&#34;https://blog.cloudflare.com/20-percent-internet-upgrade/&#34; target=&#34;_blank&#34;&gt;les a récemment remplacés par du&#xA;code Rust&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
