Skip to content

Commit 4433a27

Browse files
authored
Merge pull request #31 from MrScriptX/le-futur-de-la-programmation
Update Ruby version to 3.4.2 and add new dependencies for CSV, Base64…
2 parents 89c2211 + a279721 commit 4433a27

File tree

6 files changed

+211
-27
lines changed

6 files changed

+211
-27
lines changed

Gemfile

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
ruby '2.7.4'
1+
ruby '3.4.2'
22
source "https://rubygems.org"
33
# Hello! This is where you manage which Jekyll version is used to run.
44
# When you want to use a different version, change it below, save the
@@ -30,3 +30,11 @@ end
3030
# Performance-booster for watching directories on Windows
3131
gem "wdm", "~> 0.1.1", :install_if => Gem.win_platform?
3232

33+
34+
gem "csv", "~> 3.3"
35+
36+
gem "base64", "~> 0.2.0"
37+
38+
gem "bigdecimal", "~> 3.1"
39+
40+
gem "webrick", "~> 1.9"

Gemfile.lock

Lines changed: 53 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,31 @@
11
GEM
22
remote: https://rubygems.org/
33
specs:
4-
addressable (2.8.0)
5-
public_suffix (>= 2.0.2, < 5.0)
4+
addressable (2.8.7)
5+
public_suffix (>= 2.0.2, < 7.0)
6+
base64 (0.2.0)
7+
bigdecimal (3.1.9)
68
colorator (1.1.0)
7-
concurrent-ruby (1.1.10)
9+
concurrent-ruby (1.3.5)
10+
csv (3.3.3)
811
em-websocket (0.5.3)
912
eventmachine (>= 0.12.9)
1013
http_parser.rb (~> 0)
1114
eventmachine (1.2.7)
12-
ffi (1.15.5)
15+
ffi (1.17.1)
16+
ffi (1.17.1-aarch64-linux-gnu)
17+
ffi (1.17.1-aarch64-linux-musl)
18+
ffi (1.17.1-arm-linux-gnu)
19+
ffi (1.17.1-arm-linux-musl)
20+
ffi (1.17.1-arm64-darwin)
21+
ffi (1.17.1-x86-linux-gnu)
22+
ffi (1.17.1-x86-linux-musl)
23+
ffi (1.17.1-x86_64-darwin)
24+
ffi (1.17.1-x86_64-linux-gnu)
25+
ffi (1.17.1-x86_64-linux-musl)
1326
forwardable-extended (2.6.0)
1427
http_parser.rb (0.8.0)
15-
i18n (1.10.0)
28+
i18n (1.14.7)
1629
concurrent-ruby (~> 1.0)
1730
jekyll (4.2.2)
1831
addressable (~> 2.4)
@@ -29,63 +42,77 @@ GEM
2942
rouge (~> 3.0)
3043
safe_yaml (~> 1.0)
3144
terminal-table (~> 2.0)
32-
jekyll-feed (0.16.0)
45+
jekyll-feed (0.17.0)
3346
jekyll (>= 3.7, < 5.0)
3447
jekyll-sass-converter (2.2.0)
3548
sassc (> 2.0.1, < 3.0)
3649
jekyll-seo-tag (2.8.0)
3750
jekyll (>= 3.8, < 5.0)
3851
jekyll-watch (2.2.1)
3952
listen (~> 3.0)
40-
kramdown (2.4.0)
41-
rexml
53+
kramdown (2.5.1)
54+
rexml (>= 3.3.9)
4255
kramdown-parser-gfm (1.1.0)
4356
kramdown (~> 2.0)
44-
liquid (4.0.3)
45-
listen (3.7.1)
57+
liquid (4.0.4)
58+
listen (3.9.0)
4659
rb-fsevent (~> 0.10, >= 0.10.3)
4760
rb-inotify (~> 0.9, >= 0.9.10)
4861
mercenary (0.4.0)
49-
minima (2.5.1)
62+
minima (2.5.2)
5063
jekyll (>= 3.5, < 5.0)
5164
jekyll-feed (~> 0.9)
5265
jekyll-seo-tag (~> 2.1)
5366
pathutil (0.16.2)
5467
forwardable-extended (~> 2.6)
55-
public_suffix (4.0.7)
56-
rb-fsevent (0.11.1)
57-
rb-inotify (0.10.1)
68+
public_suffix (6.0.1)
69+
rb-fsevent (0.11.2)
70+
rb-inotify (0.11.1)
5871
ffi (~> 1.0)
59-
rexml (3.3.9)
60-
rouge (3.29.0)
72+
rexml (3.4.1)
73+
rouge (3.30.0)
6174
safe_yaml (1.0.5)
6275
sassc (2.4.0)
6376
ffi (~> 1.9)
6477
terminal-table (2.0.0)
6578
unicode-display_width (~> 1.1, >= 1.1.1)
6679
thread_safe (0.3.6)
67-
tzinfo (1.2.10)
80+
tzinfo (1.2.11)
6881
thread_safe (~> 0.1)
69-
tzinfo-data (1.2022.1)
82+
tzinfo-data (1.2025.2)
7083
tzinfo (>= 1.0.0)
7184
unicode-display_width (1.8.0)
7285
wdm (0.1.1)
86+
webrick (1.9.1)
7387

7488
PLATFORMS
89+
aarch64-linux-gnu
90+
aarch64-linux-musl
91+
arm-linux-gnu
92+
arm-linux-musl
93+
arm64-darwin
7594
ruby
76-
x86_64-linux
95+
x86-linux-gnu
96+
x86-linux-musl
97+
x86_64-darwin
98+
x86_64-linux-gnu
99+
x86_64-linux-musl
77100

78101
DEPENDENCIES
102+
base64 (~> 0.2.0)
103+
bigdecimal (~> 3.1)
104+
csv (~> 3.3)
79105
jekyll (~> 4.2.2)
80106
jekyll-feed (~> 0.12)
81107
jekyll-seo-tag
82108
minima (~> 2.5.1)
83109
tzinfo (~> 1.2)
84110
tzinfo-data
85-
wdm (~> 0.1.1)
86-
87-
RUBY VERSION
88-
ruby 2.7.4p191
89-
90-
BUNDLED WITH
91-
2.4.7
111+
wdm (~> 0.1.1)
112+
webrick (~> 1.9)
113+
114+
RUBY VERSION
115+
ruby 3.4.2p28
116+
117+
BUNDLED WITH
118+
2.6.6
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
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+
![Les devs C quand on leur dit qu'il faut passer au Rust](/assets/img/2025-03/kaamelott-leodagan.gif)
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+
![Les devs Rust en un mot](/assets/img/2025-03/rust-devs-in-a-nutshell.webp)
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.
189 KB
Loading
40 KB
Loading
1.79 MB
Loading

0 commit comments

Comments
 (0)