[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-5-introduction-yul-assemblage-solidity":3},{"article":4,"author":58},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":7,"meta_description":16,"focus_keyword":17,"og_image":18,"canonical_url":18,"robots_meta":19,"created_at":15,"updated_at":15,"tags":20,"category_name":38,"related_articles":39},"d6000000-0000-0000-0000-000000000105","a0000000-0000-0000-0000-000000000062","Deep EVM #5 : Introduction à Yul — Le langage d'assemblage secret de Solidity","deep-evm-5-introduction-yul-assemblage-solidity","Apprenez Yul, le langage d'assemblage intermédiaire qui vous donne un accès direct aux opcodes EVM depuis Solidity. Syntaxe, variables, fonctions et blocs assembly en ligne.","## Qu'est-ce que Yul ?\n\nYul est un langage d'assemblage intermédiaire conçu pour l'EVM. Il sert deux rôles : c'est la représentation intermédiaire du compilateur Solidity (ce en quoi Solidity compile avant de devenir bytecode), et c'est un langage que vous pouvez écrire directement dans des blocs `assembly {}` à l'intérieur de Solidity.\n\nContrairement au bytecode EVM brut, Yul offre :\n- Des variables nommées (pas de gestion manuelle de la pile)\n- Des fonctions avec paramètres et valeurs de retour\n- Des structures de contrôle (if, switch, for)\n- Un accès direct à tous les opcodes EVM\n\n## Yul inline dans Solidity\n\nVous pouvez intégrer du Yul dans n'importe quelle fonction Solidity :\n\n```solidity\nfunction efficientAdd(uint256 a, uint256 b) external pure returns (uint256 result) {\n    assembly {\n        result := add(a, b)\n    }\n}\n```\n\nDans ce bloc assembly, `add` est l'opcode EVM ADD, pas une fonction Solidity. Les variables Solidity (`a`, `b`, `result`) sont automatiquement accessibles.\n\n## Syntaxe de Yul\n\n### Variables\n\n```yul\nlet x := 42\nlet y := add(x, 1)  \u002F\u002F y = 43\nlet z := 0           \u002F\u002F déclaration avec initialisation à zéro\n```\n\nLes variables Yul sont toujours de 32 octets (256 bits). Il n'y a pas de types — tout est un uint256.\n\n### Structures de contrôle\n\n```yul\n\u002F\u002F If (pas de else en Yul)\nif gt(x, 100) {\n    \u002F\u002F exécuté si x > 100\n}\n\n\u002F\u002F Switch\nswitch selector\ncase 0x70a08231 { \u002F* balanceOf *\u002F }\ncase 0xa9059cbb { \u002F* transfer *\u002F }\ndefault { revert(0, 0) }\n\n\u002F\u002F Boucle for\nfor { let i := 0 } lt(i, 10) { i := add(i, 1) } {\n    \u002F\u002F corps de la boucle\n}\n```\n\n### Fonctions\n\n```yul\nfunction safeAdd(a, b) -> result {\n    result := add(a, b)\n    if lt(result, a) {\n        revert(0, 0) \u002F\u002F débordement\n    }\n}\n```\n\n## Accès à la mémoire\n\n```yul\n\u002F\u002F Écrire en mémoire\nmstore(0x00, 0x42)     \u002F\u002F memory[0x00..0x20] = 0x42\nmstore8(0x20, 0xff)    \u002F\u002F memory[0x20] = 0xff (1 octet)\n\n\u002F\u002F Lire depuis la mémoire\nlet value := mload(0x00)  \u002F\u002F value = memory[0x00..0x20]\n```\n\n## Accès au stockage\n\n```yul\n\u002F\u002F Lire un slot de stockage\nlet bal := sload(slot)\n\n\u002F\u002F Écrire dans un slot de stockage\nsstore(slot, newValue)\n```\n\n## Quand utiliser Yul\n\n1. **Optimisation du gas** — Quand Solidity génère un bytecode sous-optimal\n2. **Opérations non supportées** — Certaines opérations EVM n'ont pas d'équivalent Solidity\n3. **Manipulation de mémoire** — Encodage\u002Fdécodage ABI personnalisé\n4. **Gestion fine du gas** — Contrôle précis de chaque opcode\n\n## Risques du Yul inline\n\n- Pas de vérification de types\n- Possibilité d'écraser le pointeur de mémoire libre de Solidity\n- Les bugs sont plus difficiles à détecter et auditer\n- Le compilateur ne peut pas optimiser autour des blocs assembly\n\n## Conclusion\n\nYul est le pont entre le confort de Solidity et la puissance brute de l'EVM. Il vous permet d'optimiser les chemins critiques sans abandonner complètement les abstractions de haut niveau.\n\nDans le prochain article, nous approfondirons la gestion mémoire en Yul : mstore, mload et le pointeur de mémoire libre.","\u003Ch2 id=\"qu-est-ce-que-yul\">Qu’est-ce que Yul ?\u003C\u002Fh2>\n\u003Cp>Yul est un langage d’assemblage intermédiaire conçu pour l’EVM. Il sert deux rôles : c’est la représentation intermédiaire du compilateur Solidity (ce en quoi Solidity compile avant de devenir bytecode), et c’est un langage que vous pouvez écrire directement dans des blocs \u003Ccode>assembly {}\u003C\u002Fcode> à l’intérieur de Solidity.\u003C\u002Fp>\n\u003Cp>Contrairement au bytecode EVM brut, Yul offre :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Des variables nommées (pas de gestion manuelle de la pile)\u003C\u002Fli>\n\u003Cli>Des fonctions avec paramètres et valeurs de retour\u003C\u002Fli>\n\u003Cli>Des structures de contrôle (if, switch, for)\u003C\u002Fli>\n\u003Cli>Un accès direct à tous les opcodes EVM\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"yul-inline-dans-solidity\">Yul inline dans Solidity\u003C\u002Fh2>\n\u003Cp>Vous pouvez intégrer du Yul dans n’importe quelle fonction Solidity :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">function efficientAdd(uint256 a, uint256 b) external pure returns (uint256 result) {\n    assembly {\n        result := add(a, b)\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Dans ce bloc assembly, \u003Ccode>add\u003C\u002Fcode> est l’opcode EVM ADD, pas une fonction Solidity. Les variables Solidity (\u003Ccode>a\u003C\u002Fcode>, \u003Ccode>b\u003C\u002Fcode>, \u003Ccode>result\u003C\u002Fcode>) sont automatiquement accessibles.\u003C\u002Fp>\n\u003Ch2 id=\"syntaxe-de-yul\">Syntaxe de Yul\u003C\u002Fh2>\n\u003Ch3>Variables\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-yul\">let x := 42\nlet y := add(x, 1)  \u002F\u002F y = 43\nlet z := 0           \u002F\u002F déclaration avec initialisation à zéro\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Les variables Yul sont toujours de 32 octets (256 bits). Il n’y a pas de types — tout est un uint256.\u003C\u002Fp>\n\u003Ch3>Structures de contrôle\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-yul\">\u002F\u002F If (pas de else en Yul)\nif gt(x, 100) {\n    \u002F\u002F exécuté si x &gt; 100\n}\n\n\u002F\u002F Switch\nswitch selector\ncase 0x70a08231 { \u002F* balanceOf *\u002F }\ncase 0xa9059cbb { \u002F* transfer *\u002F }\ndefault { revert(0, 0) }\n\n\u002F\u002F Boucle for\nfor { let i := 0 } lt(i, 10) { i := add(i, 1) } {\n    \u002F\u002F corps de la boucle\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Fonctions\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-yul\">function safeAdd(a, b) -&gt; result {\n    result := add(a, b)\n    if lt(result, a) {\n        revert(0, 0) \u002F\u002F débordement\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"acc-s-la-m-moire\">Accès à la mémoire\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-yul\">\u002F\u002F Écrire en mémoire\nmstore(0x00, 0x42)     \u002F\u002F memory[0x00..0x20] = 0x42\nmstore8(0x20, 0xff)    \u002F\u002F memory[0x20] = 0xff (1 octet)\n\n\u002F\u002F Lire depuis la mémoire\nlet value := mload(0x00)  \u002F\u002F value = memory[0x00..0x20]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"acc-s-au-stockage\">Accès au stockage\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-yul\">\u002F\u002F Lire un slot de stockage\nlet bal := sload(slot)\n\n\u002F\u002F Écrire dans un slot de stockage\nsstore(slot, newValue)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"quand-utiliser-yul\">Quand utiliser Yul\u003C\u002Fh2>\n\u003Col>\n\u003Cli>\u003Cstrong>Optimisation du gas\u003C\u002Fstrong> — Quand Solidity génère un bytecode sous-optimal\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Opérations non supportées\u003C\u002Fstrong> — Certaines opérations EVM n’ont pas d’équivalent Solidity\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Manipulation de mémoire\u003C\u002Fstrong> — Encodage\u002Fdécodage ABI personnalisé\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Gestion fine du gas\u003C\u002Fstrong> — Contrôle précis de chaque opcode\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"risques-du-yul-inline\">Risques du Yul inline\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Pas de vérification de types\u003C\u002Fli>\n\u003Cli>Possibilité d’écraser le pointeur de mémoire libre de Solidity\u003C\u002Fli>\n\u003Cli>Les bugs sont plus difficiles à détecter et auditer\u003C\u002Fli>\n\u003Cli>Le compilateur ne peut pas optimiser autour des blocs assembly\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"conclusion\">Conclusion\u003C\u002Fh2>\n\u003Cp>Yul est le pont entre le confort de Solidity et la puissance brute de l’EVM. Il vous permet d’optimiser les chemins critiques sans abandonner complètement les abstractions de haut niveau.\u003C\u002Fp>\n\u003Cp>Dans le prochain article, nous approfondirons la gestion mémoire en Yul : mstore, mload et le pointeur de mémoire libre.\u003C\u002Fp>\n","fr","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:28.875925Z","Apprenez Yul, le langage d'assemblage EVM. Syntaxe, variables, fonctions, structures de contrôle et blocs assembly inline dans Solidity.","Yul assemblage EVM",null,"index, follow",[21,26,30,34],{"id":22,"name":23,"slug":24,"created_at":25},"c0000000-0000-0000-0000-000000000016","EVM","evm","2026-03-28T10:44:21.513630Z",{"id":27,"name":28,"slug":29,"created_at":25},"c0000000-0000-0000-0000-000000000020","Gas Optimization","gas-optimization",{"id":31,"name":32,"slug":33,"created_at":25},"c0000000-0000-0000-0000-000000000014","Solidity","solidity",{"id":35,"name":36,"slug":37,"created_at":25},"c0000000-0000-0000-0000-000000000018","Yul","yul","Blockchain",[40,46,52],{"id":41,"title":42,"slug":43,"excerpt":44,"locale":12,"category_name":38,"published_at":45},"d0000000-0000-0000-0000-000000000608","La couche d'interoperabilite Ethereum : comment 55+ L2 deviennent une seule chaine","couche-interoperabilite-ethereum-55-l2-deviennent-une-seule-chaine","Ethereum compte 55+ rollups Layer 2, fragmentant la liquidite et l'experience utilisateur. La couche d'interoperabilite Ethereum — combinant messagerie cross-rollup, sequenceurs partages et based rollups — vise a les unifier en un reseau composable unique.","2026-03-28T10:44:45.078068Z",{"id":47,"title":48,"slug":49,"excerpt":50,"locale":12,"category_name":38,"published_at":51},"d0000000-0000-0000-0000-000000000607","Les preuves ZK au-dela des rollups : l'inference IA verifiable sur Ethereum","preuves-zk-au-dela-des-rollups-inference-ia-verifiable-ethereum","Les preuves a connaissance nulle ne sont plus un simple outil de scalabilite. En 2026, zkML permet l'inference IA verifiable on-chain, les ZK coprocesseurs deplacent le calcul lourd hors chaine avec verification on-chain, et de nouveaux systemes de preuve comme SP1 et Jolt rendent tout cela pratique.","2026-03-28T10:44:45.071974Z",{"id":53,"title":54,"slug":55,"excerpt":56,"locale":12,"category_name":38,"published_at":57},"d0000000-0000-0000-0000-000000000584","EIP-7702 en pratique : construire des flux de comptes intelligents apres Pectra","eip-7702-en-pratique-construire-flux-comptes-intelligents-apres-pectra","EIP-7702 permet a tout EOA Ethereum d'agir temporairement comme un contrat intelligent dans une seule transaction. Voici comment implementer les transactions par lots, le parrainage de gas et la recuperation sociale avec la nouvelle primitive d'account abstraction.","2026-03-28T10:44:43.586053Z",{"id":13,"name":59,"slug":60,"bio":61,"photo_url":18,"linkedin":18,"role":62,"created_at":63,"updated_at":63},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]