|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: Le futur de la programmation système |
| 4 | +date: 2025-03-28 12:00:00 +0100 |
| 5 | +banner: /assets/img/2025-03/the_futur_of_programming.png |
| 6 | +categories: devlog |
| 7 | +--- |
| 8 | + |
| 9 | +On entend beaucoup parler de Rust ces derniers temps, notamment grâce aux controverses sur son intégration dans le noyau Linux. |
| 10 | +C'est un langage qui ne laisse personne indifférent, et pour cause : il a cette fâcheuse tendance à diviser la communauté en deux camps. |
| 11 | +D’un côté, ceux qui l’adorent et qui vous expliqueront (avec passion, voire agressivité) à quel point il résout tous les problèmes du monde. |
| 12 | +De l’autre, ceux qui, après avoir passé trois heures à se battre contre le borrow checker, se demandent si le C n’était pas une meilleure idée finalement. |
| 13 | + |
| 14 | + |
| 15 | +*Les devs C quand on leur dit qu'il faut passer au Rust* |
| 16 | + |
| 17 | +Rust s’est présenté comme le remplaçant du C++, promettant une sécurité mémoire absolue. Plus jamais de segfaults, plus jamais d’UB (undefined behavior), juste du code sûr et performant ! Enfin... sauf si vous essayez de comprendre pourquoi le compilateur refuse obstinément votre code valide sous prétexte que « ça pourrait être dangereux » dans un univers parallèle. |
| 18 | + |
| 19 | +Mais là où Rust est vraiment surprenant, c’est dans son adoption. |
| 20 | +Étrangement, une grande partie des développeurs qui l’embrassent viennent d’univers haut niveau comme Python ou JavaScript. |
| 21 | +Pourquoi ? Peut-être parce que Rust, avec son package manager intégré et sa philosophie du « fais confiance au compilateur, pas à toi-même », ressemble plus à un langage moderne de haut niveau déguisé en langage système. |
| 22 | +Pendant ce temps, les vétérans du C et du C++ haussent un sourcil en voyant des concepts exotiques comme les lifetimes ou la sémantique de l’emprunt qui transforment la programmation en une partie d’échecs contre le compilateur. |
| 23 | + |
| 24 | +Et c’est bien là le problème. En voulant réinventer la roue, Rust a aussi réinventé les routes, les panneaux de signalisation et le code de la route. Résultat ? Un langage puissant, certes, mais qui demande un manuel d’utilisation de 500 pages et une thérapie. |
| 25 | + |
| 26 | + |
| 27 | + |
| 28 | +Mais tout espoir n’est pas perdu. Il existe un langage qui m’a récemment tapé dans l’œil. Il est aussi simple à lire et comprendre que Lua, tout en étant un véritable langage système. Il ne cherche pas à vous imposer un paradigme mentalement épuisant et, surtout, il ne vous fait pas sentir incompétent à chaque erreur de compilation. |
| 29 | + |
| 30 | +J’ose l’affirmer : ce langage est un sérieux candidat pour remplacer le C. |
| 31 | + |
| 32 | +Je parle de Zig. |
| 33 | + |
| 34 | +## Zig |
| 35 | + |
| 36 | +Zig est un langage fabuleux, et ce, pour une raison simple : il ne cherche pas à réinventer toute la syntaxe du monde. |
| 37 | +Son objectif est clair : copier le C, mais sans ses absurdités, et en y ajoutant des fonctionnalités modernes et vraiment utiles. |
| 38 | + |
| 39 | +Le résultat ? Un langage qui offre sécurité et performances, tout en restant incroyablement agréable à lire et à écrire. Que demander de plus ? |
| 40 | + |
| 41 | +Cerise sur le gâteau, Zig s'interface parfaitement avec le C, et d’une manière si simple qu’on en viendrait presque à pleurer de joie. |
| 42 | +Vous pouvez importer directement des bibliothèques C, sans wrapper absurde, sans générateur de bindings alambiqué. |
| 43 | + |
| 44 | +Et ce n’est pas tout : Zig embarque son propre package manager, Zon, ainsi qu’un système de build écrit... en Zig ! |
| 45 | +Adieu Make, CMake et autres abominations, bonjour à un système qui ne vous donne pas envie de jeter votre PC par la fenêtre. |
| 46 | +(En vrai, il y a un petit temps d'adaptation quand même 😫). |
| 47 | +## La gestion mémoire 3.0 |
| 48 | + |
| 49 | +Regardons un "Hello, World!" en Zig : |
| 50 | + |
| 51 | +{% highlight zig %} |
| 52 | +const std = @import("std"); |
| 53 | + |
| 54 | +pub fn main() void { |
| 55 | + std.debug.print("Hello, world!\n", .{}); |
| 56 | +} |
| 57 | +{% endhighlight %} |
| 58 | + |
| 59 | +Jusque-là, rien de perturbant, tout le monde suit. Maintenant, parlons d’un sujet plus sérieux : les allocations mémoire. |
| 60 | + |
| 61 | +En Zig, aucune allocation n’est cachée. Vous savez toujours où, quand et comment la mémoire est allouée et libérée. |
| 62 | +Un concept révolutionnaire pour certains langages modernes, apparemment. |
| 63 | + |
| 64 | +Examinons un exemple avec un allocateur de type "Arena" : |
| 65 | + |
| 66 | +```zig |
| 67 | +const std = @import("std"); |
| 68 | +
|
| 69 | +pub fn main() void { |
| 70 | + var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); |
| 71 | + defer arena.deinit(); |
| 72 | + const allocator = arena.allocator(); |
| 73 | +
|
| 74 | + _ = try allocator.alloc(u8, 1); |
| 75 | + _ = try allocator.alloc(u8, 10); |
| 76 | + _ = try allocator.alloc(u8, 100); |
| 77 | +} |
| 78 | +``` |
| 79 | + |
| 80 | +À ce stade, vous avez peut-être quelques questions. Commençons par les plus évidentes : |
| 81 | + |
| 82 | +#### Pourquoi ces _ = devant les allocations ? |
| 83 | + |
| 84 | +Parce que Zig est un langage intelligent. Il vous avertit si vous déclarez une variable sans l’utiliser. |
| 85 | +Si vous voulez ignorer la valeur retournée sans faire hurler le compilateur, utilisez _. |
| 86 | + |
| 87 | +#### Que fait std.heap.ArenaAllocator ? |
| 88 | + |
| 89 | +C’est un allocateur secondaire qui s’appuie sur un allocateur primaire (ici, std.heap.page_allocator). |
| 90 | +Autrement dit, il vous permet de mieux gérer vos allocations en fonction de vos besoins. |
| 91 | + |
| 92 | +#### Pourquoi tout ce charabia alors que malloc() existe ? |
| 93 | + |
| 94 | +Parce que le vrai GOAT, c’est `defer`. |
| 95 | +### Le mot-clé defer, ou comment dire adieu aux fuites mémoire |
| 96 | + |
| 97 | +Le mot-clé `defer`, c’est un petit bijou. |
| 98 | +Il permet d’exécuter une instruction automatiquement à la sortie du bloc. |
| 99 | + |
| 100 | +Autrement dit, vous pouvez allouer de la mémoire et être certain qu’elle sera libérée. |
| 101 | +Finies les fuites mémoire accidentelles, les `free()` oubliés, et les cauchemars post-traumatiques liés à RAII en C++. |
| 102 | + |
| 103 | +Vous allouez, et vous libérez juste après avec un simple `defer`. |
| 104 | + |
| 105 | +C’est quand même plus simple que Rust, non ? |
| 106 | + |
| 107 | +### Et la cerise sur le gâteau ? |
| 108 | + |
| 109 | +La deuxième surprise, c’est ce qui vient après le `defer`. |
| 110 | + |
| 111 | +Toute la mémoire allouée avec notre allocateur mémoire est libérée d’un coup lorsqu’on libère l’allocateur lui-même. |
| 112 | + |
| 113 | +Autrement dit, pas besoin de traquer chaque allocation individuellement : il suffit de libérer l’allocateur pour que tout disparaisse proprement. |
| 114 | +Quelle simplicité ! |
| 115 | + |
| 116 | +### L’allocateur fixe : allocation instantanée, zéro overhead |
| 117 | + |
| 118 | +Allouer de la mémoire, c’est coûteux. Ce serait bien de tout allouer d’un coup, puis de distribuer les blocs selon nos besoins. |
| 119 | +Eh bien, Zig permet de faire exactement ça : |
| 120 | + |
| 121 | +```zig |
| 122 | +const std = @import("std"); |
| 123 | +
|
| 124 | +pub fn main() void { |
| 125 | + var buffer: [1000]u8 = undefined; |
| 126 | + var fba = std.heap.FixedBufferAllocator.init(&buffer); |
| 127 | + const allocator = fba.allocator(); |
| 128 | +
|
| 129 | + const memory = try allocator.alloc(u8, 100); |
| 130 | + defer allocator.free(memory); |
| 131 | +} |
| 132 | +``` |
| 133 | + |
| 134 | +Ici, on utilise un buffer pré-alloué et un allocateur fixe (FixedBufferAllocator). |
| 135 | +Résultat : aucun appel système inutile, aucune fragmentation mémoire, et des performances au top. |
| 136 | + |
| 137 | +## Conclusion |
| 138 | + |
| 139 | +Le but de cet article n’était pas d’être exhaustif, mais de vous montrer une chose essentielle : la gestion mémoire n’a pas besoin d’être une corvée. |
| 140 | + |
| 141 | +En Rust, on vous impose un borrow checker parfois aussi coopératif qu’un huissier de justice. |
| 142 | +En C++, vous jonglez avec des smart pointers et des segfaults inopinés. |
| 143 | +En Zig ? Vous avez le contrôle, la simplicité, et des outils efficaces. |
| 144 | + |
| 145 | +Je vous encourage vivement à explorer Zig par vous-même. |
| 146 | +Ce langage est d’une clarté remarquable, et contrairement à Rust, on ne se sent pas complètement perdu en l’utilisant. |
| 147 | + |
| 148 | +J’ose même dire que Zig pourrait devenir un candidat sérieux pour le noyau Linux. |
| 149 | +À condition que ce dernier ne continue pas de s’enfoncer dans le nouveau Java qu’est Rust. |
0 commit comments