j'imagine que ça ne gère pas les cas où la variable de départ est modifiée pour retrouver sa valeur initiale
C'est le rôle de la propagation de constante. Le SSA transformera du code comme
intx=3;x=x+1;x=x-1;
en
intx0=3;x1=x0+1;x2=x1-1;
Là dessus, dans un tel cas, on peut déduire (de la même manière que les constexpr (ou la métaprogrammation avec des template) en C++ si tu vois ce que c'est, que x1=4 et donc x2=3 rien qu'en évaluant les expressions.
Évidemment c'est pas possible si il y a trop de non constantes impliquées, mais le côté "propagation" c'est qu'une expression peut devenir constante une fois qu'on en a évalué d'autres.
S'il te faut 10 secondes de calcul pour déterminer si tu dois compiler ou pas 3 lignes de code, au final tu n'y gagnes pas grand chose...
Ça fait partie des phases que le compilateur fait typiquement, ce genre d'analyse (la propagation de constante et le SSA de nos jours). Les autres font partie d'analyse de code qu'on peut faire par ailleurs pour trouver des bugs par analyse statiques ou pour calculer des lifetime de Rust, et c'est pas inutile dans ce genre de cadre. Potentiellement en conjugaison de ce genre d'analyse c'est un effet de bord "gratuit".
Tu peux faire ça aussi uniquement lors de la phase de compilation finale avant déploiement, et les gains seront partout là ou ça va être déployé, sans forcément faire ça continûment pendant le développement ou ça peut être gênant. Effectivement les gains les plus importants potentiellement sont sur de plus grosses bases de code. C'est aussi les plus dures à analyser et les plus longues à compiler en général.
[^] # Re: bah non
Posté par thoasm . En réponse au journal Le bon sens et le C++. Évalué à 3.
C'est le rôle de la propagation de constante. Le SSA transformera du code comme
en
Là dessus, dans un tel cas, on peut déduire (de la même manière que les constexpr (ou la métaprogrammation avec des template) en C++ si tu vois ce que c'est, que x1=4 et donc x2=3 rien qu'en évaluant les expressions.
Évidemment c'est pas possible si il y a trop de non constantes impliquées, mais le côté "propagation" c'est qu'une expression peut devenir constante une fois qu'on en a évalué d'autres.
Ça fait partie des phases que le compilateur fait typiquement, ce genre d'analyse (la propagation de constante et le SSA de nos jours). Les autres font partie d'analyse de code qu'on peut faire par ailleurs pour trouver des bugs par analyse statiques ou pour calculer des lifetime de Rust, et c'est pas inutile dans ce genre de cadre. Potentiellement en conjugaison de ce genre d'analyse c'est un effet de bord "gratuit".
Tu peux faire ça aussi uniquement lors de la phase de compilation finale avant déploiement, et les gains seront partout là ou ça va être déployé, sans forcément faire ça continûment pendant le développement ou ça peut être gênant. Effectivement les gains les plus importants potentiellement sont sur de plus grosses bases de code. C'est aussi les plus dures à analyser et les plus longues à compiler en général.