{"id":4323,"date":"2026-03-06T19:07:43","date_gmt":"2026-03-06T16:07:43","guid":{"rendered":"https:\/\/demensdeum.com\/blog\/2026\/03\/06\/interpreter-in-practice\/"},"modified":"2026-03-06T19:41:37","modified_gmt":"2026-03-06T16:41:37","slug":"interpreter-in-practice","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/fr\/2026\/03\/06\/interpreter-in-practice\/","title":{"rendered":"Interpr\u00e8te de mod\u00e8les en pratique"},"content":{"rendered":"<p>Dans le <a href=\"https:\/\/demensdeum.com\/blog\/2022\/06\/24\/pattern-interpreter\/\">dernier article<\/a>, nous avons examin\u00e9 la th\u00e9orie du mod\u00e8le Interpreter, appris ce qu&#8217;est un arbre AST et comment faire abstraction des expressions terminales et non terminales. Cette fois, \u00e9loignons-nous de la th\u00e9orie et voyons comment ce mod\u00e8le est appliqu\u00e9 dans des projets commerciaux s\u00e9rieux que nous utilisons tous au quotidien\u00a0!<\/p>\n<p>Spoiler\u00a0: <b>Vous utilisez peut-\u00eatre le mod\u00e8le Interpreter en ce moment, simplement en lisant ce texte dans votre navigateur\u00a0!<\/b><\/p>\n<p>L&#8217;un des exemples les plus frappants et, peut-\u00eatre, les plus importants de l&#8217;utilisation de ce mod\u00e8le dans l&#8217;industrie est <b>JavaScript<\/b>. Le langage, qui a \u00e9t\u00e9 cr\u00e9\u00e9 \u00e0 l&#8217;origine \u00ab sur le genou \u00bb, fonctionne aujourd&#8217;hui sur des milliards d&#8217;appareils pr\u00e9cis\u00e9ment gr\u00e2ce au concept d&#8217;interpr\u00e9tation.<\/p>\n<h2>10 jours qui ont chang\u00e9 Internet<\/h2>\n<p>L&#8217;histoire de JavaScript est pleine de l\u00e9gendes. En 1995, Brendan Eich, alors qu&#8217;il travaillait chez Netscape Communications, s&#8217;est vu confier la t\u00e2che de cr\u00e9er un langage de script simple pouvant s&#8217;ex\u00e9cuter directement dans un navigateur (Netscape Navigator) pour rendre les pages Web interactives. La direction voulait quelque chose avec une syntaxe similaire \u00e0 Java alors tr\u00e8s populaire, mais destin\u00e9 non pas aux ing\u00e9nieurs professionnels, mais aux concepteurs Web.<\/p>\n<p>Eich n&#8217;a eu que <b>10 jours<\/b> pour \u00e9crire le premier prototype du langage, qui s&#8217;appelait alors Mocha (puis LiveScript, et seulement ensuite JavaScript pour des raisons marketing). Cette ru\u00e9e n&#8217;\u00e9tait pas fortuite : Microsoft \u00e9tait sur ses talons, qui pr\u00e9parait en m\u00eame temps activement son propre langage de script <b>VBScript<\/b> \u00e0 int\u00e9grer dans le navigateur Internet Explorer. Netscape devait de toute urgence publier sa r\u00e9ponse afin de ne pas perdre dans la guerre imminente des navigateurs.<\/p>\n<p>Nous n&#8217;avions tout simplement pas le temps d&#8217;\u00e9crire un compilateur complexe en code machine. La solution \u00e9vidente et la plus rapide pour Eich \u00e9tait l&#8217;architecture du classique <b>Interpreter<\/b>.<\/p>\n<p>Le premier interpr\u00e8te (SpiderMonkey) fonctionnait comme ceci\u00a0:<\/p>\n<ol>\n<li>Il lit le code source du texte du script \u00e0 partir de la page.<\/li>\n<li>L&#8217;analyseur lexical a divis\u00e9 le texte en jetons.<\/li>\n<li>L&#8217;analyseur a construit un <b>arbre de syntaxe abstraite (AST)<\/b>. En termes de mod\u00e8le Interpreter, cet arbre se composait d&#8217;<i>expressions terminales<\/i> (cha\u00eenes, nombres comme 42) et de <i>non-terminaux<\/i> (appels de fonction, instructions comme If, \u200b\u200b\u200b\u200bWhile).<\/li>\n<li>Ensuite, la machine virtuelle a \u00ab parcouru \u00bb cet arbre \u00e9tape par \u00e9tape, ex\u00e9cutant les instructions qui y sont int\u00e9gr\u00e9es \u00e0 chaque n\u0153ud (en appelant une m\u00e9thode similaire \u00e0 Interpret()).<\/li>\n<\/ol>\n<h2>Contexte et objets<\/h2>\n<p>Vous vous souvenez de l&#8217;objet Context que nous avons d\u00fb passer \u00e0 la m\u00e9thode Interpret(Context context) dans l&#8217;impl\u00e9mentation classique\u00a0? L&#8217;interpr\u00e9teur en a besoin pour stocker l&#8217;\u00e9tat actuel de la m\u00e9moire.<\/p>\n<p>Dans le cas de JavaScript, le r\u00f4le de ce contexte au niveau sup\u00e9rieur est jou\u00e9 par un <b>Objet global<\/b> (par exemple, une fen\u00eatre dans un navigateur). Lorsque votre n\u0153ud AST essaie, par exemple, d&#8217;\u00e9crire du texte \u00e0 l&#8217;\u00e9cran via document.write(&#8220;Hello&#8221;), l&#8217;interpr\u00e9teur acc\u00e8de \u00e0 son contexte (l&#8217;objet document) et appelle l&#8217;API interne du navigateur souhait\u00e9e.<\/p>\n<p>C&#8217;est gr\u00e2ce \u00e0 l&#8217;interpr\u00e9teur que JavaScript est capable d&#8217;interagir si facilement avec le DOM (Document Object Model) &#8211; ce ne sont que des objets dans un contexte accessibles par les n\u0153uds de l&#8217;arborescence.<\/p>\n<h2>\u00c9volution de l&#8217;interpr\u00e9teur\u00a0: Compilation JIT<\/h2>\n<p>Historiquement, JS dans les navigateurs est longtemps rest\u00e9 un \u00ab pur \u00bb interpr\u00e8te. Et cela avait un gros inconv\u00e9nient : une vitesse lente. L&#8217;analyse de l&#8217;arborescence et la travers\u00e9e lente de chaque n\u0153ud \u00e0 chaque fois que le script \u00e9tait ex\u00e9cut\u00e9 ralentissaient les applications Web complexes.<\/p>\n<p>Avec l&#8217;av\u00e8nement du moteur <b>V8<\/b> de Google (int\u00e9gr\u00e9 \u00e0 Chrome) en\u00a02008, une r\u00e9volution s&#8217;est produite. Les ing\u00e9nieurs ont r\u00e9alis\u00e9 qu\u2019un seul interpr\u00e8te ne suffisait pas pour le Web moderne. Le moteur est devenu plus complexe\u00a0: il construit toujours l&#8217;arborescence AST, mais utilise d\u00e9sormais la <b>compilation JIT (Just-In-Time)<\/b>.<\/p>\n<p>Les moteurs JS modernes (V8, SpiderMonkey) fonctionnent comme un pipeline complexe\u00a0:<\/p>\n<ol>\n<li>L&#8217;interpr\u00e9teur de base rapide et stupide commence \u00e0 ex\u00e9cuter votre code JS instantan\u00e9ment, sans m\u00eame attendre sa compilation (le mod\u00e8le classique fonctionne toujours ici).<\/li>\n<li>En parall\u00e8le, le moteur surveille les sections de code \u00ab chaudes \u00bb (boucles ou fonctions appel\u00e9es des milliers de fois).<\/li>\n<li>Ces sections sont compil\u00e9es par le compilateur JIT directement dans un code machine optimis\u00e9, en contournant l&#8217;interpr\u00e9teur lent.<\/li>\n<\/ol>\n<p>C&#8217;est cette combinaison du d\u00e9marrage instantan\u00e9 de l&#8217;interpr\u00e9teur et de la puissance de calcul de la compilation qui a permis \u00e0 JavaScript de conqu\u00e9rir le monde, devenant le langage des serveurs (Node.js) et des applications mobiles (React Native).<\/p>\n<h2>Interpr\u00e8te dans l&#8217;industrie du jeu vid\u00e9o<\/h2>\n<p>Malgr\u00e9 la domination du C++ dans l&#8217;informatique lourde, le mod\u00e8le Interpreter est une norme industrielle en mati\u00e8re de d\u00e9veloppement de jeux pour la cr\u00e9ation de logique de jeu. Pour quoi? Pour que les concepteurs de jeux puissent cr\u00e9er des jeux sans risquer de \u00ab laisser tomber \u00bb le moteur ou sans avoir besoin de le recompiler constamment.<\/p>\n<p>Un excellent exemple historique est <b>UnrealScript<\/b> &#8211; le langage dans lequel la logique des jeux Unreal Tournament et Gears of War a \u00e9t\u00e9 \u00e9crite dans Unreal Engine 1, 2 et 3. Le texte a \u00e9t\u00e9 compil\u00e9 en bytecode compact et abstrait, qui a ensuite \u00e9t\u00e9 (interpr\u00e9t\u00e9) \u00e9tape par \u00e9tape par la machine virtuelle du moteur.<\/p>\n<h3>Scripts de graphiques visuels (Blueprints)<\/h3>\n<p>Aujourd&#8217;hui, le texte a \u00e9t\u00e9 remplac\u00e9 par une programmation visuelle &#8211; le syst\u00e8me <b>Blueprints<\/b> dans Unreal Engine 4 et 5.<\/p>\n<p>Si vous avez d\u00e9j\u00e0 ouvert un Blueprint dans Unreal Engine, vous avez vu de nombreux n\u0153uds connect\u00e9s par des fils. Sur le plan architectural, <b>l&#8217;ensemble du graphique Blueprints est un immense arbre de syntaxe abstraite (AST)<\/b> dessin\u00e9 \u00e0 l&#8217;\u00e9cran\u00a0:<\/p>\n<ol>\n<li><b>Expressions terminales\u00a0:<\/b> N\u0153uds constants. Par exemple, un n\u0153ud qui stocke simplement le nombre 42 ou une cha\u00eene. Ils renvoient une valeur sp\u00e9cifique lorsqu&#8217;ils sont interpr\u00e9t\u00e9s.<\/li>\n<li><b>Expressions non-terminales\u00a0:<\/b> n\u0153uds de calcul (Ajouter) ou n\u0153uds de contr\u00f4le de flux (Branche). Ils ont des entr\u00e9es d&#8217;arguments, que l&#8217;interpr\u00e9teur \u00e9value d&#8217;abord de mani\u00e8re r\u00e9cursive avant de produire le r\u00e9sultat sous forme de broche de sortie.<\/li>\n<\/ol>\n<p>Et le r\u00f4le de contexte ici est jou\u00e9 par la m\u00e9moire d&#8217;une instance d&#8217;un objet de jeu sp\u00e9cifique (acteur). La machine d&#8217;interpr\u00e9tation \u00ab parcourt \u00bb ce graphique en toute s\u00e9curit\u00e9, demandant des donn\u00e9es et effectuant des transitions.<\/p>\n<h2>O\u00f9 d&#8217;autre l&#8217;interpr\u00e8te est-il utilis\u00e9\u00a0?<\/h2>\n<p>Le mod\u00e8le d&#8217;interpr\u00e9teur peut \u00eatre trouv\u00e9 dans presque tous les syst\u00e8mes complexes o\u00f9 des instructions dynamiques doivent \u00eatre ex\u00e9cut\u00e9es. Voici quelques exemples de logiciels commerciaux\u00a0:<\/p>\n<ul>\n<li><b>Langages de programmation interpr\u00e9t\u00e9s (Python, Ruby, PHP).<\/b> L&#8217;ensemble de leur ex\u00e9cution est bas\u00e9 sur le mod\u00e8le classique. Par exemple, l&#8217;impl\u00e9mentation de r\u00e9f\u00e9rence CPython analyse d&#8217;abord votre script .py dans un AST, le compile en bytecode, puis une \u00e9norme machine virtuelle (boucle de calcul) interpr\u00e8te ce bytecode \u00e9tape par \u00e9tape.<\/li>\n<li><b>Machine virtuelle Java (JVM).<\/b> Initialement, le code Java n&#8217;est pas compil\u00e9 en instructions machine, mais en bytecode. Lorsque vous ex\u00e9cutez l&#8217;application, la JVM agit comme un interpr\u00e8te (mais avec une compilation JIT agressive, tout comme dans la V8).<\/li>\n<li><b>Bases de donn\u00e9es et SQL<\/b> Lorsque vous \u00e9mettez une requ\u00eate SQL (utilisateurs SELECT * FROM) dans PostgreSQL ou MySQL, le moteur de base de donn\u00e9es agit comme un interpr\u00e9teur. Il effectue une analyse lexicale, construit un arbre de requ\u00eates AST, g\u00e9n\u00e8re un plan d&#8217;ex\u00e9cution, puis \u00ab interpr\u00e8te \u00bb litt\u00e9ralement ce plan en it\u00e9rant sur les lignes des tables.<\/li>\n<li><b>Expressions r\u00e9guli\u00e8res (RegEx).<\/b> Tout moteur d&#8217;expression r\u00e9guli\u00e8re analyse en interne un mod\u00e8le de cha\u00eene (par exemple, ^\\d{3}-\\d{2}$) dans un graphe d&#8217;\u00e9tat (NFA\/DFA Automata), que l&#8217;interpr\u00e9teur interne traverse ensuite, en faisant correspondre chaque caract\u00e8re d&#8217;entr\u00e9e avec les sommets de ce graphe.<\/li>\n<li><b>Unity Shader Graph<\/b> \/ <b>Unreal Material Editor<\/b> &#8211; interpr\u00e8te les n\u0153uds visuels dans un code de shader modulaire (GLSL\/HLSL).<\/li>\n<li><b>N\u0153uds g\u00e9om\u00e9triques Blender<\/b>\u00a0: interpr\u00e8tez les op\u00e9rations math\u00e9matiques et g\u00e9om\u00e9triques pour g\u00e9n\u00e9rer de mani\u00e8re proc\u00e9durale des mod\u00e8les\u00a03D en temps r\u00e9el.<\/li>\n<\/ul>\n<h2>Total<\/h2>\n<p>Le mod\u00e8le Interpreter a depuis longtemps d\u00e9pass\u00e9 le cadre de \u00ab\u00a0l&#8217;\u00e9criture de votre propre calculatrice\u00a0\u00bb. Il s\u2019agit de la norme industrielle la plus puissante. Des moteurs JavaScript qui ex\u00e9cutent chaque jour des gigaoctets de code dans les coulisses des navigateurs, aux concepteurs de jeux qui vous permettent de cr\u00e9er une logique complexe sans connaissance du C++, les interpr\u00e9teurs restent l&#8217;un des concepts architecturaux les plus importants du d\u00e9veloppement informatique moderne.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans le dernier article, nous avons examin\u00e9 la th\u00e9orie du mod\u00e8le Interpreter, appris ce qu&#8217;est un arbre AST et comment faire abstraction des expressions terminales et non terminales. Cette fois, \u00e9loignons-nous de la th\u00e9orie et voyons comment ce mod\u00e8le est appliqu\u00e9 dans des projets commerciaux s\u00e9rieux que nous utilisons tous au quotidien\u00a0! Spoiler\u00a0: Vous utilisez<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/fr\/2026\/03\/06\/interpreter-in-practice\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Interpr\u00e8te de mod\u00e8les en pratique&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[61,52],"tags":[],"class_list":["post-4323","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"fr","enabled_languages":["en","ru","zh","de","fr","ja","pt"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/4323","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/comments?post=4323"}],"version-history":[{"count":2,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/4323\/revisions"}],"predecessor-version":[{"id":4325,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/4323\/revisions\/4325"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=4323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=4323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=4323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}