[{"data":1,"prerenderedAt":21},["ShallowReactive",2],{"$fMIBLR9vYUFsli2ziddgQjHOIZa3p3MlB66daOAHb1ZA":3},{"id":4,"date":5,"summary":6,"thumbImage":7,"author":8,"commentsCount":9,"title":10,"articleURL":11,"content":12,"tags":13,"articleExtras":18},180,"31/05/2026 15:48:41+02:00","\u003Cp>Hey ça faisait longtemps que j'avais plus parlé de Rust.\u003C/p>\n\n\u003Cp>Vous avez peut-être remarqué que les binaires compilés en Rust, en plus d'avoir un temps de compilation un peu élevé,\n  ils pèsent plusieurs MEGABYTES, parfois juste pour un \u003Ci>Hello World\u003C/i>.\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 948px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/edit_exe/rust_hello_world_size.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/edit_exe/rust_hello_world_size.png\" alt=\"Le dossier target du projet de base Hello World compilé affichant 436Kb pour le binaire sous Linux\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">Bon OK c'est moins d'un MEGABYTE mais ça reste beaucoup pour trois lignes de code\u003C/div>\n\u003C/div>\n\n\u003Cp>Excusez-moi monsieur... 436K c'est beaucoup?\u003C/p>\n\n\u003Cp>Pas depuis que le monde a été déformé par l'inefficacité péremptoire et générale du développement logiciel moderne.\n\u003C/p>\n\n\u003Cp>OK non en fait c'est vraiment pas beaucoup. Me semble que c'était pire avant.\u003C/p>\n\n\u003Cp>Mais c'est pas grave, on veut MOINS.\u003C/p>","/wp-content/stuff/edit_exe/rust_logo.png","DkVZ",0,"Comment rendre un exécutable écrit en Rust plus léger","comment_rendre_executable_rust_plus_leger","\u003Ch1 id=\"toc_1_1\">Introduction\u003C/h1>\n\u003Cp>Hey ça faisait longtemps que j'avais plus parlé de Rust.\u003C/p>\n\n\u003Cp>Vous avez peut-être remarqué que les binaires compilés en Rust, en plus d'avoir un temps de compilation un peu élevé,\n  ils pèsent plusieurs MEGABYTES, parfois juste pour un \u003Ci>Hello World\u003C/i>.\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 948px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/edit_exe/rust_hello_world_size.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/edit_exe/rust_hello_world_size.png\" alt=\"Le dossier target du projet de base Hello World compilé affichant 436Kb pour le binaire sous Linux\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">Bon OK c'est moins d'un MEGABYTE mais ça reste beaucoup pour trois lignes de code\u003C/div>\n\u003C/div>\n\n\u003Cp>Excusez-moi monsieur, 436K c'est beaucoup?\u003C/p>\n\n\u003Cp>Pas depuis que le monde a été déformé par l'inefficacité péremptoire et générale du développement logiciel moderne.\n\u003C/p>\n\n\u003Cp>OK non en fait c'est vraiment pas beaucoup. Me semble que c'était pire avant.\u003C/p>\n\n\u003Cp>Mais c'est pas grave, on veut MOINS.\u003C/p>\n\n\u003Cp>Par exemple, un Hello World en \u003Cb>zig\u003C/b> compilé avec l'option \"compacte\":\u003C/p>\n\n\u003Cpre class=\"shiki shiki-themes catppuccin-latte kanagawa-wave\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1F1F28;color:#4c4f69;--shiki-dark:#DCD7BA\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#7AA89F;--shiki-dark-font-style:inherit\">zig\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> build-exe\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> -O\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> ReleaseSmall\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> main.zig\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\n\u003Cp>Et on se retrouve avec à peu près 10 fois moins de données:\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 926px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/edit_exe/zig_helloworld_size.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/edit_exe/zig_helloworld_size.png\" alt=\"Taille d'un Hello World en Zig, seulement 4.2Kb\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">Quand on y pense, l'équivalent de plus de 4000 caractères textuels juste pour dire bonjour ça reste beaucoup\u003C/div>\n\u003C/div>\n\n\u003Cp>Tout ça s'empire avec des ajouts de librairies externes et on arrive vite à plus de 10MB pour un vieux serveur HTTP.\n\u003C/p>\n\n\u003Ch1 id=\"toc_1_2\">Attends, je viens de télécharger VS Code et il fait 300MB\u003C/h1>\n\u003Cp>Ben ouais. C'est bien ce que je disais.\u003C/p>\n\n\u003Cp>Tavu combien ça coûte un bête disque-dur-qui-tourne depuis qu'Open&nbsp;AI a acheté tout le matos informatique du\n  monde entier à l'avance pour plusieures années?\u003C/p>\n\n\u003Ch1 id=\"toc_1_3\">Comment réduire la taille de mon exécutable?\u003C/h1>\n\u003Cp>T'es pas le premier à te poser cette question. Enfin, tu dois être genre le deuxième après moi. Mais c'est pas grave,\n  je te comprends.\u003C/p>\n\n\u003Cp>Un jour j'ai découvert un utilitaire nommé \u003Cb>strip\u003C/b> au sujet duquel aucune blague n'est possible.\u003C/p>\n\n\u003Cp>Je pense qu'il fait partie de \u003Ca target=\"_blank\" rel=\"noreferrer noopener\" href=\"https://fr.wikipedia.org/wiki/GNU_Compiler_Collection\">GCC\u003C/a> ou d'un paquet\n  générique de compilation de bidules.\u003C/p>\n\n\u003Cp>Le rôle de \u003Cb>strip\u003C/b> est pas super clair. Il enlève des symboles et euh... Des autres données??\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 1276px\">\n  \u003Cimg-lightbox>\n    \u003Ca href=\"/wp-content/stuff/edit_exe/strip_manpage.png\" target=\"_blank\">\u003Cimg\n        src=\"/wp-content/stuff/edit_exe/strip_manpage.png\"\n        alt=\"Haut de la page de manuel de strip qui dit qu'il... Enlève des symboles et des autres données\"\n        class=\"responsive-img\">\u003C/a>\n  \u003C/img-lightbox>\n  \u003Cdiv class=\"image-legend\">Voilà qui a l'air prometteur (??)\u003C/div>\n\u003C/div>\n\n\u003Cp>Par exemple, si je prends mon projet obscur \u003Ca href=\"https://github.com/dkvz/filter-snippets\">de génération\n    d'extraits de code pour vim\u003C/a> (oui c'est le pire exemple que pouvais prendre mais je l'avais sous la main):\u003C/p>\n\n\u003Ctable class=\"responsive-table\">\n  \u003Cthead>\n    \u003Ctr>\n      \u003Cth>Taille non-écrémée\u003C/th>\n      \u003Cth>Taille après \u003Cb>strip\u003C/b>\u003C/th>\n    \u003C/tr>\n  \u003C/thead>\n  \u003Ctbody>\n    \u003Ctr>\n      \u003Ctd>1.1 MB\u003C/td>\u003Ctd>855 KB\u003C/td>\n    \u003C/tr>\n  \u003C/tbody>\n\u003C/table>\n\n\u003Cp>Je vous parlerai un jour de ce projet même si ça n'intéresse personne, c'est un peu le thème de ce blog. Mais là, concentrons nous sur l'effet du \u003Cb>strip\u003C/b>.\u003C/p>\n\n\u003Cp>On constate une différence d'environ 250&nbsp;KB soit tout de même autour de 23% de la taille de départ.\u003C/p>\n\n\u003Cp>C'est quoi ces symboles mystérieux?\u003C/p>\n\n\u003Cp>Je sais qu'en invoquant un autre utilitaire de la même famille, \u003Cb>objdump\u003C/b>, on peut lui demander de balancer tous les \"symboles\" (je pense on saura jamais ce que c'est exactement):\u003C/p>\n\n\u003Cpre class=\"shiki shiki-themes catppuccin-latte kanagawa-wave\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1F1F28;color:#4c4f69;--shiki-dark:#DCD7BA\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#7AA89F;--shiki-dark-font-style:inherit\">objdump\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> -t\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> \"NOM_DE_L_EXECUTABLE\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\n\u003Cp>Et il m'indique bien qu'il n'y a [plus] rien:\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 746px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/edit_exe/rust_ya_pas_de_symboles.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/edit_exe/rust_ya_pas_de_symboles.png\" alt=\"la sortie de la commande précédente indique &quot;no symbols&quot;\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">Ah ouais, y en a plus des symboles\u003C/div>\n\u003C/div>\n\n\u003Cp>Un autre utilitaire \"célèbre\" parmi les \u003Cb>binutils\u003C/b> s'appelle \u003Cb>strings\u003C/b> .\u003C/p>\n\n\u003Cp>Sa finalité est de parcourir un fichier binaire et chercher les séquences de chiffres binaires qui peuvent représenter des caractères consécutifs, avec un minimum de caractères texte à détecter (4 par défaut, je crois) avant de tomber sur un caractère \"non texte\".\u003C/p>\n\n\u003Cp>Ce bête programme est connu en sécurité parce qu'il permet d'obtenir un niveau basique d'informations sur un programme avec des traces de qui l'a compilé et comment, ainsi que tout le texte qui est dans le programme.\u003C/p>\n\n\u003Cp>Si c'est un jeu vidéo narratif, par exemple, vous pouvez retrouver tous les dialogues du jeu avec la commande \u003Cb>strings\u003C/b> (pouvu qu'ils aient tout bourré dans l'exécutable et n'utilisent pas des fichiers de ressource séparé, ce qui est somme toute plus propre).\u003C/p>\n\n\u003Cp>Si je \u003Cb>strings\u003C/b> un bidule que je viens de compiler en Rust, je constate qu'il révèle mon répertoire \u003Ci>home\u003C/i> sur tout un tas de lignes, avec mon presque vrai nom et tout:\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 1277px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/edit_exe/rust_stripped_dox.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/edit_exe/rust_stripped_dox.png\" alt=\"Tout un tas de mention à /home/william dans ma sortie de strings\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">C'est qui ce William\u003C/div>\n\u003C/div>\n\n\u003Cp>Bon ben raison de plus de travailler avec du CI/CD. L'OS utilisé pour compiler apparait aussi dans les premières lignes.\u003C/p>\n\n\u003Cp>D'après ce que je comprends, les fameux \u003Cb>SYMBOLES\u003C/b> ressemblent à ceci (aussi visible dans la sortie de \u003Cb>strings\u003C/b>):\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 1236px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/edit_exe/rust_debug_symb_maybe.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/edit_exe/rust_debug_symb_maybe.png\" alt=\"affiche des caractères bizarres avec des messages d'erreur et ce ressemble à de l'info de déboguage\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">Je pense que ça sert au déboguage\u003C/div>\n\u003C/div>\n\n\u003Cp>Si j'en reviens à mon projet mentionné plus haut, je vois que la sortie de \u003Cb>strings\u003C/b> représente une bonne partie de ce qui est éliminé du binaire par \u003Cb>strip\u003C/b> mais pas tout.\u003C/p>\n\n\u003Cp>Ceci dit, gagner 20% de taille moi je prends.\u003C/p>\n\n\u003Ch2 id=\"toc_1_4_2_1\">Le cas Microsoft Edit\u003C/h2>\n\u003Cp>Vous avez déjà entendu parler de MSDOS?\u003C/p>\n\n\u003Cp>Ce système d'exploitation légendaire en LIGNE DE COMMANDE possède bien évidemment un éditeur de texte (aussi en ligne de commande bien entendu): \u003Cb>edit.exe\u003C/b>.\u003C/p>\n\n\u003Cp>J'en ai déjà parlé quelques fois, je l'utilise aussi dans \u003Ca target=\"_blank\" href=\"https://www.youtube.com/watch?v=i8wYSDk0Ro4\" rel=\"noopener noreferrer\">cette vidéo mémorable\u003C/a>.\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 1361px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/edit_exe/edit_exe.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/edit_exe/edit_exe.png\" alt=\"Un fichier HTML ouvert dans edit (présent dans la vidéo citée plus haut)\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">Désolé pour la qualité &mash; C'est pour le côté authentique\u003C/div>\n\u003C/div>\n\n\u003Cp>Et surtout je parle de QBasic dans plusieurs articles également et les deux sont historiquement liés parce que, \u003Cb>edit.com\u003C/b> (\u003Ci>.com\u003C/i> étant un type de fichiers et pas un morceau de nom de domaine) appelait historiquement QBasic pour le transformer en éditeur de texte sans les options de programmation en BASIC.\u003C/p>\n\n\u003Cp>Ce qui est somme toute assez malin et efficace en terme de place. Et ouais, c'était mieux avant.\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 500px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/qbasic.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/qbasic_500_313.png\" alt=\"Capture d'écran de QBasic, editeur pour programmer en language BASIC\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">De mon temps, toute ta vie c'était un écran bleu\u003C/div>\n\u003C/div>\n\n\u003Cp>L'éditeur autorisait l'usage de la souris qui déplaçait un gros curseur rectangulaire. Un peu comme le curseur de \u003Cb>vim\u003C/b> en fait.\u003C/p>\n\n\u003Cp>Attendez une minute... Pourquoi j'ai pas encore parlé de \u003Cb>vim\u003C/b> dans cet article?\u003C/p>\n\n\u003Cp>Ben justement, on pouvait un peu tout faire au clavier avec \u003Cb>edit\u003C/b> en utilisant la touche \u003Ckbd>Alt+&lt;LETTRE&gt;\u003C/kbd> pour invoquer un menu, puis presser la touche de raccourci de l'élément (qui est soulignée).\u003C/p>\n\n\u003Cp>En fait il est toujours vaguement possible d'appeler les menus des programmes Windows comme cela mais ça s'est perdu parce que les gens sont devenus fades en complémentant leur absence d'envie d'investir dans l'apprentissage d'automatismes qui pourraient augmenter leur productivité dans l'avenir plutôt que de juste cliquer sur des machins tout de suite.\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 599px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/guy_with_veins_meme.webp\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/guy_with_veins_meme.webp\" alt=\"Meme du type qui a les veines qui sortent du front et qui en peut plus dans une salle de classe\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">Moi qui me retiens de parler de \u003Cb>vim\u003C/b>\u003C/div>\n\u003C/div>\n\n\u003Cp>Je sais pas si certains d'entre-vous connaissent l'éditeur en ligne de commande \u003Cb>nano\u003C/b>, assez populaire sur Linux dans la famille Debian.\u003C/p>\n\n\u003Cp>Personne? D'accord. Ben je trouve que \u003Cb>edit\u003C/b> est mieux que \u003Cb>nano\u003C/b>. Tant qu'à utiliser un éditeur de prout autant y aller avec la souris et tout.\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 679px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/edit_exe/nano_size_compared.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/edit_exe/nano_size_compared.png\" alt=\"Compare la taille de nano et edit en ligne de commande, de 294Kb contre 295Kb respectivement\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">Ah ben, en plus, nano est plus grand de 1Kb\u003C/div>\n\u003C/div>\n\n\u003Cp>Mais attends, comment on pourrait remplacer nano par edit? C'est un vieil éditeur pour MS&nbsp;DOS.\u003C/p>\n\n\u003Cp>He bien figurez-vous que chez Microsoft, ils ont décidé que ce serait une bonne idée de mettre des développeurs qui coûtent bien cher dans leur minuscule appart de Californie à 3000€/mois pour développer une \u003Cb>NOUVELLE\u003C/b> version \u003Cb>\u003Ci>MODERNE\u003C/i>\u003C/b> de \u003Cb>edit\u003C/b>.\u003C/p>\n\n\u003Ch3 id=\"toc_1_4_2_2_3_1\">VASY je veux cet éditeur! Il me manquait que ça pour passer ma vie en ligne de commande\u003C/h3>\n\n\u003Cp>L'interface originale a été vaguement recréée, en moins bleu et respectant les couleurs annoncées par l'émulateur de terminal (rendons grâce à dieu, lequel que vous voulez).\u003C/p>\n\n\u003Cp>Etant donné tous leurs problèmes de sécurité liés à l'usage de C/C++, Microsoft est devenu fan du langage \u003Cb>Rust\u003C/b> qui sera dès lors utilisé pour écrire ce programme.\u003C/p>\n\n\u003Cp>Ils publient des binaires précompilés pour linux sur \u003Ca href=\"https://github.com/microsoft/edit/releases/\" target=\"_blank\" rel=\"noopener noreferrer\">leur page \u003Ci>Github releases\u003C/i>\u003C/a>.\u003C/p>\n\n\u003Cp>Si vous êtes sous Windows, \u003Cb>edit\u003C/b> est normalement déjà présent à moins que vous ayez zappé une cinquentaine de mises à jour. Je vous en voudrai pas si c'est le cas.\u003C/p>\n\n\u003Cp>Notez que pour Linux il s'agit d'installer un paquet supplémentaire générallement dénommé \u003Cb>libicu-dev\u003C/b>. Sans lui, la recherche ne fonctionne pas du tout.\u003C/p>\n\n\u003Cp>Et alors, de plus, j'avais déjà un programme \"edit\" dans mon \u003Cb>PATH\u003C/b> faisant partie d'utilitaires obscurs \u003Cb>mailcap\u003C/b> que j'ai désinstallés.\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 1281px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/edit_exe/mailcap_edit.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/edit_exe/mailcap_edit.png\" alt=\"Page de manuel de l'utilitaire edit de la suite d'utilitaires mailcap qui semble lié à la lecture ou envoi d'email en ligne de commande\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">Aucune idée de ce que c'est que ce truc mais j'ai pu le désinstaller sans devoir désinstaller Gnome donc c'est bon signe\u003C/div>\n\u003C/div>\n\n\u003Cp>Le plus simple pour ensuite installer edit sous Linux ou Mac consiste à chopper la bonne archive depuis leur page de \u003Ci>releases\u003C/i> qui contient normalement un bon vieux mono-fichier \"edit\" (si seulement tout pouvait être si simple) à bourrer quelque part dans le \u003Cb>PATH\u003C/b>.\u003C/p>\n\n\u003Cp>Vous êtes maintenant prêts à éditer du texte depuis la ligne de commande. Une compétence qui deviendra très utile quand le seul ordinateur que l'on pourra acheter sera un vieux serveur Linux à louer quelque part dans le CLOUD.\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 1200px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/edit_exe/linux_edit_exe_blog.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/edit_exe/linux_edit_exe_blog_1200.png\" alt=\"Deux terminaux côté à côté avec edit à gauche et une coloration syntaxique du HTML du texte de ce même article\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">Quoi? On a de la coloration syntaxique pour autre chose que le BASIC?\u003C/div>\n\u003C/div>\n\n\u003Cp>Comme mentionné plus haut, le programme utilise les couleurs définies par le terminal, comme on peut le voir sous Windows avec un \u003Cb>Windows&nbsp;Terminal\u003C/b> à droite et \u003Ca href=\"https://wezterm.org/index.html\" target=\"_blank\" rel=\"noopener noreferrer\">Wezterm\u003C/a> à gauche, les deux ayant un thème de couleurs différent.\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 1104px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/edit_exe/edit_win_wezterm.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/edit_exe/edit_win_wezterm.png\" alt=\"Deux fenêtres de terminal, celle de gauche a un thème verdâtre et celle de droite est le Windows Terminal tout noir par défaut\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">Je garantis pas que ça donne bien avec tous les thèmes\u003C/div>\n\u003C/div>\n\n\u003Cp>Bon, après, je dois tout de même avouer qu'il se souviens pas de mes préférences (j'ai besoin de \u003Ci>Word Wrap\u003C/i> ou je deviens fou, je suis d'ailleurs le seul à l'utiliser sur \u003Cb>vim\u003C/b>) et c'est pas clair ce qu'on peut faire avec l'hypothétique fichier de préférences JSON.\u003C/p>\n\n\u003Ch3 id=\"toc_1_4_2_2_3_2\">Je peux savoir pourquoi on parle d'un éditeur de texte depuis une heure?\u003C/h3>\n\n\u003Cp>Figurez-vous que les auteurs du nouveau \u003Cb>edit\u003C/b> sont quelque peu obsédés par la taille de leur truc. Encore plus que moi.\u003C/p>\n\n\u003Cp>Sous Windows le binaire pèse un peu de plus de 200Kb, et je pense que la coloration syntaxique prend un bon pourcentage:\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 515px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/edit_exe/edit_exe_win_size.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/edit_exe/edit_exe_win_size.png\" alt=\"Page de propriétés de edit.exe dans C:\\Windows\\system32 affichant 260Kb de taille de fichier\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">Les filous l'ont bourré dans System32 avec le reste du grenier de mamy\u003C/div>\n\u003C/div>\n\n\u003Cp>Je rappelle que, pour \u003Cb>VS&nbsp;Code\u003C/b>, l'installateur (compressé) prend \u003Cb>170MB\u003C/b>.\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 954px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/edit_exe/vs_code_size.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/edit_exe/vs_code_size.png\" alt=\"L'installateur de VS Code annonce qu'il a besoin de 766MB d'espace disque\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">Ben ouais, le CSS ça se compresse bien\u003C/div>\n\u003C/div>\n\n\u003Cp>On va discuter de toutes les optimisations de taille réalisées pour \u003Cb>edit\u003C/b> avant de les voler allègrement comme si on était une \u003Ci>startup\u003C/i> d'IA un lundi matin.\u003C/p>\n\n\u003Ch1 id=\"toc_1_4\">Options de compilation à utiliser\u003C/h1>\n\n\u003Cp>Ne me dis pas qu'on arrive enfin au vif du sujet!\u003C/p>\n\n\u003Cp>La majorité des options se trouvent dans \u003Cb>Cargo.toml\u003C/b>, avec un petit supplément dans le répertoire \u003Cb>.cargo\u003C/b> qui devrait probablement un jour être abandonné.\u003C/p>\n\n\u003Cp>Fût un temps où ils recommendaient chaudement de compiler \u003Cb>edit\u003C/b> avec la version \u003Ci>nightly\u003C/i> (potentiellement pas stabe) de Rust mais ils semblent tenter d'en revenir.\u003C/p>\n\n\u003Cp>Voici les options du profil de compilation \u003Cb>release\u003C/b> qu'ils utilisent:\u003C/p>\n\n\u003Cpre class=\"shiki shiki-themes catppuccin-latte kanagawa-wave\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1F1F28;color:#4c4f69;--shiki-dark:#DCD7BA\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#727169;--shiki-dark-font-style:inherit\"># We use `opt-level = \"s\"` as it significantly reduces binary size.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#727169;--shiki-dark-font-style:inherit\"># We could then use the `#[optimize(speed)]` attribute for spot optimizations.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#727169;--shiki-dark-font-style:inherit\"># Unfortunately, that attribute currently doesn't work on intrinsics such as memset.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7C7F93;--shiki-dark:#9CABCA\">[\u003C/span>\u003Cspan style=\"color:#4C4F69;--shiki-dark:#7AA89F\">profile\u003C/span>\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">.\u003C/span>\u003Cspan style=\"color:#4C4F69;--shiki-dark:#7AA89F\">release\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-dark:#9CABCA\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">codegen-units \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#FE640B;--shiki-dark:#D27E99\"> 1\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#727169;--shiki-dark-font-style:inherit\">           # reduces binary size by ~2%\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">debug \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> \"full\"\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#727169;--shiki-dark-font-style:inherit\">              # No one needs an undebuggable release binary\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">lto \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#FE640B;--shiki-dark:#FFA066\"> true\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#727169;--shiki-dark-font-style:inherit\">                  # reduces binary size by ~14%\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">opt-level \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> \"s\"\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#727169;--shiki-dark-font-style:inherit\">             # reduces binary size by ~25%\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">panic \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> \"abort\"\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#727169;--shiki-dark-font-style:inherit\">             # reduces binary size by ~50% in combination with -Zbuild-std-features=panic_immediate_abort\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">split-debuginfo \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> \"packed\"\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#727169;--shiki-dark-font-style:inherit\">  # generates a separate *.dwp/*.dSYM so the binary can get stripped\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">strip \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> \"symbols\"\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#727169;--shiki-dark-font-style:inherit\">           # See split-debuginfo - allows us to drop the size by ~65%\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">incremental \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#FE640B;--shiki-dark:#FFA066\"> true\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#727169;--shiki-dark-font-style:inherit\">          # Improves re-compile times\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\n\u003Cp>Tout cela s'applique automatiquement si on build avec l'option \u003Ci>--release\u003C/i>, par exemple:\u003C/p>\n\n\u003Cpre class=\"shiki shiki-themes catppuccin-latte kanagawa-wave\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1F1F28;color:#4c4f69;--shiki-dark:#DCD7BA\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#7AA89F;--shiki-dark-font-style:inherit\">cargo\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> build\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> --release\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\n\u003Cp>Il y a d'autres profils de compilation Rust comme comme \u003Ci>dev\u003C/i>, \u003Ci>test\u003C/i> (hérite de \u003Ci>dev\u003C/i> par défaut) et \u003Ci>bench\u003C/i> (hérite de \u003Ci>release\u003C/i> par défaut).\u003C/p>\n\n\u003Cp>Détaillons tout cela avant que je vous livre ce que j'utilise personnellement.\u003C/p>\n\n\u003Ch2 id=\"toc_1_5_2_1\">codegen-units\u003C/h2>\n\u003Cp>Censé contrôler à quel point LLVM (la sous couche de compilation statique ou dynamique) peut découper le code en plusieurs morceaux pour les compiler en parallèle.\u003C/p>\n\n\u003Cp>La valeur par défaut est plus élevée que 1. L'idée étant que si on passe sur 1, la compilation est plus lente mais on est certain d'avoir le binaire le plus optimisé possible.\u003C/p>\n\n\u003Cp>Je pense que ça change pas grand chose, tant en taille qu'en temps de compilation mais si vous payez un \u003Ci>worker\u003C/i> de CI/CD à la seconde et que quelqu'un provoque 15000 recompilations automatiques ça a peut-être de l'importance.\u003C/p>\n\n\u003Ch2 id=\"toc_1_5_2_2\">debug\u003C/h2>\n\u003Cp>La valeur par défaut est en fait \u003Cb>none\u003C/b> pour le profil \u003Ci>release\u003C/i> et devrait réduire la taille davantage que \u003Cb>full\u003C/b>.\u003C/p>\n\n\u003Cp>Je retire totalement cette option pour utiliser la valeur par défaut.\u003C/p>\n\n\u003Cp>Sur au moins un de mes projets, ça ne change quasi rien à la taille du binaire alors que dans un autre ça la multiplie littéralement par 5.\u003C/p>\n\n\u003Cp>Aussi, je sais pas ce que ça veut dire qu'on peut \"pas le debug\" j'imagine qu'on peut quand même l'ouvrir dans \u003Ca href=\"https://github.com/nationalsecurityagency/ghidra\" target=\"_blank\" rel=\"noopener noreferrer\">Ghidra\u003C/a>.\u003C/p>\n\n\u003Ch2 id=\"toc_1_5_2_3\">lto\u003C/h2>\n\u003Cp>Le passer à \u003Cb>true\u003C/b> augmente le temps de compilation mais optimise le code au maximum en analysant l'entièreté du projet.\u003C/p>\n\n\u003Cp>J'imagine que l'impact de cette option augmente avec la taille du code.\u003C/p>\n\n\u003Cp>Ils disent dans la doc de Rust que \u003Cb>LTO\u003C/b> n'est pas du tout utilisé si \u003Cb>codegen-units\u003C/b> vaut 1. Je sais pas trop qui a raison entre la doc Rust et Microsoft mais d'après mes expériences, ça ne fait pas de mal d'avoir les deux options et gratte effectivement quelques KB.\u003C/p>\n\n\u003Ch2 id=\"toc_1_5_2_4\">opt-level\u003C/h2>\n\u003Cp>Censé contrôler le niveau d'optimisation dans l'idée qu'augmenter cette valeur numérique \u003Cb>opt-level\u003C/b> est mieux pour le résultat final mais augmente le temps de compilation. Un peu comme pas mal d'autres options vues précédemment, quoi.\u003C/p>\n\n\u003Cp>Lui filer la valeur \u003Cb>s\u003C/b> (qui n'est pas numérique, ouaip) est censé donner le binaire le plus petit possible en générant moins de code dupliqué en ligne.\u003C/p>\n\n\u003Cp>Pour un peu expliquer l'affaire: les appels de fonction existent vraiment en langage machine bien qu'on les appelle généralement \u003Ci>procédures\u003C/i> et consistent à sauter à un autre endroit du programme (qui est une suite d'instructions se suivant de haut en bas) en empilant l'adresse d'où on a sauté vers la procédure, qui possède alors sa propre pile qui sera nettoyée à la fin de la dite procédure, avant de récupérer l'emplacement précédent et y retourner.\u003C/p>\n\n\u003Cp>Comme la lourdeur de la phrase précédente implique, tout ça prend du temps.\u003C/p>\n\n\u003Cp>S'il s'agit d'une fonction qui ne réalise que quelques actions, les compilateurs ont tendance à ne pas créer de procédure dans l'exécutable et juste copier-coller tout le code de la fonction à son emplacement d'appel dans le programme, potentiellement plusieurs fois. Ce qui augmente la taille du binaire.\u003C/p>\n\n\u003Cp>En gros, l'appel de procédure a totalement disparu, remplacé par le code lui-même. Ce processus s'appelle \u003Ci>inlining\u003C/i> ou un truc du genre.\u003C/p>\n\n\u003Cp>Il est particulièrement important pour les performances parce que beaucoup de langages (dont Rust) utilisent une myriade de petites fonction en interne et dans la librairie de base.\u003C/p>\n\n\u003Cp>Je préfère laisser cette option sur sa valeur par défaut. Notamment parce que son résultat est assez volatile selon le projet et je pense que, quand on choisit de s'autoflageller en bossant avec Rust, c'est pour obtenir un maximum de performances même si ça augmente la taille de quelques Kb.\u003C/p>\n\n\u003Ch2 id=\"toc_1_5_2_5\">panic\u003C/h2>\n\u003Cp>Il s'agit sans doute de l'option la plus intéressante:\u003C/p>\n\n\u003Cpre class=\"shiki shiki-themes catppuccin-latte kanagawa-wave\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1F1F28;color:#4c4f69;--shiki-dark:#DCD7BA\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">panic \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> \"abort\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\n\u003Cp>Elle conditionne le comportement du binaire produit en cas de \"panique\" &mdash; C'est-à-dire de gros problème détecté pendant l'exécution comme un dépassement de pile ou un usage de la macro \u003Cb>panic!\u003C/b>.\u003C/p>\n\n\u003Cp>Le comportement normal consiste à balancer une \u003Cb>VIEILLE TRACE\u003C/b> de toute la pile.\u003C/p>\n\n\u003Cp>Quelque chose de bien connu des développeurs Java (et C#) qui voient souvent de très longues \u003Ci>stack&nbsp;traces\u003C/i>.\u003C/p>\n\n\u003Cp>Ce comportement permet aussi de capturer le signal de panique et l'annuler. Dé-paniquer quoi.\u003C/p>\n\n\u003Cp>En plaçant la valeur sur \u003Cb>abort\u003C/b> on arrête le processus sans déballer des piles et des poils et ça permet de récupérer des chaines de caractères statiques qui étaient visibles avec la commande \u003Cb>strings\u003C/b>.\u003C/p>\n\n\u003Cp>\u003Cb>CEPENDANT\u003C/b>, ça ne fait pas gagner 50% de taille comme annoncé en commentaire par les auteurs d'\u003Cb>edit\u003C/b>. Sur un projet d'exécutable Windows je vois environ 2% et environ 8% sur un projet Linux ce qui indique que, comme d'habitude, la nature du projet va influencer les résultats.\u003C/p>\n\n\u003Cp>En fait, pour \u003Cb>edit\u003C/b>, ils utilisent normalement le build \"nightly\" de Rust avec un fichier de config supplémentaire pour Cargo qui est dans \u003Ca href=\"https://github.com/microsoft/edit/blob/main/.cargo/release.toml\" target=\"_blank\" rel=\"noopener noreferrer\">le répertoire .cargo sur leur repo\u003C/a>.\u003C/p>\n\n\u003Cp>Dans ce fichier on trouve cette valeur mystique pour \u003Ci>abort\u003C/i>:\u003C/p>\n\n\u003Cpre class=\"shiki shiki-themes catppuccin-latte kanagawa-wave\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1F1F28;color:#4c4f69;--shiki-dark:#DCD7BA\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#7C7F93;--shiki-dark:#9CABCA\">[\u003C/span>\u003Cspan style=\"color:#4C4F69;--shiki-dark:#7AA89F\">profile\u003C/span>\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">.\u003C/span>\u003Cspan style=\"color:#4C4F69;--shiki-dark:#7AA89F\">release\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-dark:#9CABCA\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">panic \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> \"immediate-abort\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\n\u003Cp>Spécifiquement pour ce projet et si \u003Ci>nightly\u003C/i> est installé, leur script infernal d'installation Linux d'\u003Cb>edit\u003C/b> crée le binaire \u003Cb>edit\u003C/b> comme ceci:\u003C/p>\n\n\u003Cpre class=\"shiki shiki-themes catppuccin-latte kanagawa-wave\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1F1F28;color:#4c4f69;--shiki-dark:#DCD7BA\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#7AA89F;--shiki-dark-font-style:inherit\">cargo\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> build\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> -p\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> edit\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> --release\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> --config\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> .cargo/release.toml\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\n\u003Cp>Sinon, pour un projet lambda (avec \u003Ci>nighly\u003C/i> installé et actif) ceci devrait fonctionner:\u003C/p>\n\n\u003Cpre class=\"shiki shiki-themes catppuccin-latte kanagawa-wave\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1F1F28;color:#4c4f69;--shiki-dark:#DCD7BA\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#7C7F93;--shiki-dark:#9CABCA\">[\u003C/span>\u003Cspan style=\"color:#4C4F69;--shiki-dark:#7AA89F\">profile\u003C/span>\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">.\u003C/span>\u003Cspan style=\"color:#4C4F69;--shiki-dark:#7AA89F\">release\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-dark:#9CABCA\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">panic \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> \"immediate-abort\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7C7F93;--shiki-dark:#9CABCA\">[\u003C/span>\u003Cspan style=\"color:#4C4F69;--shiki-dark:#7AA89F\">unstable\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-dark:#9CABCA\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">panic-immediate-abort \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#FE640B;--shiki-dark:#FFA066\"> true\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">build-std \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-dark:#9CABCA\"> [\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\">\"std\"\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-dark:#9CABCA\">,\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> \"panic_abort\"\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-dark:#9CABCA\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\n\u003Cp>C'est considéré comme \"instable\" (pour l'instant). Je préfère éviter de l'utiliser et rester sur le Rust \"stable\" \u003Csmall>que je n'arrive déjà pas à suivre\u003C/small>.\u003C/p>\n\n\u003Cp>Vous aurez un message d'erreur en tentant de compiler avec une version \"stable\":\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 1352px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/edit_exe/rust_immediate_abort_unsupported.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/edit_exe/rust_immediate_abort_unsupported.png\" alt=\"Erreur de compilation mentionnant que immediate-abort n'est pas considéré comme stable\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">Rust est censé être un langage \u003Cb>robuste\u003C/b> donc ça me choque pas\u003C/div>\n\u003C/div>\n\n\u003Ch2 id=\"toc_1_5_2_6\">split-debuginfo\u003C/h2>\n\u003Cp>Juste un prérequis pour l'option suivante qui, en gros, va virer les symboles dont on parlait bien plus haut (comme \u003Cb>strip\u003C/b>).\u003C/p>\n\n\u003Cp>On réfléchit pas et on ajoute ça dans le tas:\u003C/p>\n\n\u003Cpre class=\"shiki shiki-themes catppuccin-latte kanagawa-wave\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1F1F28;color:#4c4f69;--shiki-dark:#DCD7BA\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">split-debuginfo \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> \"packed\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\n\u003Ch2 id=\"toc_1_5_2_7\">strip\u003C/h2>\n\u003Cp>Ben ouais. On en avait déjà parlé. Permet de récupérer un max d'espace, c'est de loin l'option la plus importante, à conjuguer avec l'option précédente.\u003C/p>\n\n\u003Cp>De nouveau, me demandez pas à quoi servent ces symboles qu'on enlève, c'est toujours pas très clair surtout que, dans le cas de \u003Cb>edit\u003C/b>, il y a l'autre option \u003Cb>debug\u003C/b> qui est sur \"full\" ce qui me fait penser que ces symboles n'ont rien à voir avec le \u003Ci>débogage\u003C/i> sauf que par définition si.\u003C/p>\n\n\u003Cp>Pouquoi on gonfle artificiellement les exécutables Rust avec du texte qui a l'air de ne servir absolument à rien (comme mon chat)?\u003C/p>\n\n\u003Cp>**\u003Ci>Bruit du vent faisant vibrer deux lamelles de lard superposées\u003C/i>**\u003C/p>\n\n\u003Cp>Utiliser \"symbols\" revient au même que passer la valeur à \u003Cb>true\u003C/b>, on veut déshabiller un max de trucs:\u003C/p>\n\n\u003Cpre class=\"shiki shiki-themes catppuccin-latte kanagawa-wave\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1F1F28;color:#4c4f69;--shiki-dark:#DCD7BA\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">strip \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> \"symbols\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#727169;--shiki-dark-font-style:inherit\"># Equivalent:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#727169;--shiki-dark-font-style:inherit\">#strip = true\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\n\u003Ch2 id=\"toc_1_5_2_8\">incremental\u003C/h2>\n\u003Cp>Si placé à \u003Cb>true\u003C/b>, conserve encore plus de données dans le répertoire \u003Cb>target\u003C/b> de sorte à bien dépasser le Gigabyte pour un petit projet.\u003C/p>\n\n\u003Cp>Le but étant de re-compiler plus rapidement.\u003C/p>\n\n\u003Cp>Cette option de config n'a aucune incidence sur la taille du binaire final donc je m'en balance un peu et la laisse par défaut, ce qui correspond à \u003Cb>false\u003C/b> pour le profil \u003Ci>release\u003C/i> et \u003Cb>true\u003C/b> pour le profil \u003Ci>dev\u003C/i>.\u003C/p>\n\n\u003Ch1 id=\"toc_1_5\">Ce que je préconise\u003C/h1>\n\u003Cp>Ben ouais je suis quand même là pour avoir un avis pseudo-arrêté sur mon blog d'opinions extrêmement courageuses (\u003Csmall>\u003Ci>rires\u003C/i>\u003C/small>).\u003C/p>\n\n\u003Cp>Voici un bon compromis selon moi, à poser dans votre \u003Cb>Cargo.toml\u003C/b>:\u003C/p>\n\n\u003Cpre class=\"shiki shiki-themes catppuccin-latte kanagawa-wave\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1F1F28;color:#4c4f69;--shiki-dark:#DCD7BA\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#727169;--shiki-dark-font-style:inherit\"># Stole most of this from the Microsoft Edit repo\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7C7F93;--shiki-dark:#9CABCA\">[\u003C/span>\u003Cspan style=\"color:#4C4F69;--shiki-dark:#7AA89F\">profile\u003C/span>\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">.\u003C/span>\u003Cspan style=\"color:#4C4F69;--shiki-dark:#7AA89F\">release\u003C/span>\u003Cspan style=\"color:#7C7F93;--shiki-dark:#9CABCA\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">codegen-units \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#FE640B;--shiki-dark:#D27E99\"> 1\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">lto \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#FE640B;--shiki-dark:#FFA066\"> true\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">panic \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> \"abort\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">split-debuginfo \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> \"packed\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4C4F69;--shiki-dark:#DCD7BA\">strip \u003C/span>\u003Cspan style=\"color:#179299;--shiki-dark:#9CABCA\">=\u003C/span>\u003Cspan style=\"color:#40A02B;--shiki-dark:#98BB6C\"> \"symbols\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\n\u003Cp>Avec ces options pour un \u003Ca href=\"https://github.com/dkvz/win-kill-gui\" target=\"_blank\" rel=\"noopener noreferrer\">programme Windows à la con\u003C/a> je passe de 1800&nbsp;Kb à \u003Cb>371&nbsp;Kb\u003C/b>.\u003C/p>\n\n\u003Cp>Avec ce genre d'économies on a même plus besoin du détroit d'Hormuz.\u003C/p>\n\n\u003Cdiv class=\"card-panel z-depth-3 article-image center-image\" style=\"max-width: 1200px\">\n\u003Cimg-lightbox>\n\u003Ca href=\"/wp-content/stuff/edit_exe/edit_exe_windows.png\" target=\"_blank\">\u003Cimg src=\"/wp-content/stuff/edit_exe/edit_exe_windows_1200.png\" alt=\"Windows 11 avec Windows Terminal et edit.exe affichant le Cargo.toml d'un projet\" class=\"responsive-img\">\u003C/a>\n\u003C/img-lightbox>\n\u003Cdiv class=\"image-legend\">Mon nouveau WORKFLOW | AU REVOIR VIM\u003C/div>\n\u003C/div>\n\n\u003Cp>Au passage, j'utilise vraiment plus \u003Cb>Notepad\u003C/b> sous Windows maintenant (quand mon environnement de dev Neovim n'est pas installé).\u003C/p>\n\n\u003Cp>Déjà, les fichiers qui se re-ouvrent tout seuls ça me hérissait les poils de tétons chaque fois mais en plus y a un bouton COPILOT et \u003Ca href=\"https://www.threatlocker.com/blog/windows-notepad-vulnerability-markdown-risk-explained\" target=\"_blank\" rel=\"noopener noreferrer\">des failles de sécurité\u003C/a>.\u003C/p>\n\n\u003Cp>Au moins \u003Cb>edit\u003C/b> c'est juste un µ&é!mù$ d'éditeur de texte qui édite du texte. Zavez-vu cet article m'a fait grandir aussi en tant qu'utilisateur de Windows.\u003C/p>\n",[14],{"id":15,"name":16,"mainTag":17},4,"Informatique & Web",1,{"readingTimeStr":19,"toc":20},"18 minutes de lecture (facile)","\u003Cul>\u003Cli>\u003Ca href=\"#toc_1_1\" target=\"_self\">Introduction\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#toc_1_2\" target=\"_self\">Attends, je viens de télécharger VS Code et il fait 300MB\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#toc_1_3\" target=\"_self\">Comment réduire la taille de mon exécutable?\u003C/a>\u003C/li>\n\u003Cul>\u003Cli>\u003Ca href=\"#toc_1_4_2_1\" target=\"_self\">Le cas Microsoft Edit\u003C/a>\u003C/li>\n\u003Cul>\u003Cli>\u003Ca href=\"#toc_1_4_2_2_3_1\" target=\"_self\">VASY je veux cet éditeur! Il me manquait que ça pour passer ma vie en ligne de commande\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#toc_1_4_2_2_3_2\" target=\"_self\">Je peux savoir pourquoi on parle d'un éditeur de texte depuis une heure?\u003C/a>\u003C/li>\n\u003C/ul>\u003C/ul>\u003Cli>\u003Ca href=\"#toc_1_4\" target=\"_self\">Options de compilation à utiliser\u003C/a>\u003C/li>\n\u003Cul>\u003Cli>\u003Ca href=\"#toc_1_5_2_1\" target=\"_self\">codegen-units\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#toc_1_5_2_2\" target=\"_self\">debug\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#toc_1_5_2_3\" target=\"_self\">lto\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#toc_1_5_2_4\" target=\"_self\">opt-level\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#toc_1_5_2_5\" target=\"_self\">panic\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#toc_1_5_2_6\" target=\"_self\">split-debuginfo\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#toc_1_5_2_7\" target=\"_self\">strip\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#toc_1_5_2_8\" target=\"_self\">incremental\u003C/a>\u003C/li>\n\u003C/ul>\u003Cli>\u003Ca href=\"#toc_1_5\" target=\"_self\">Ce que je préconise\u003C/a>\u003C/li>\n\u003C/ul>",1780258279661]