Peculiar Florist
Instance
Federation
Register
Login
Peculiar Florist
Instance
Federation
Register
Login
Peculiar Florist
Instance
Federation
Register
Login
🪨
@Varpie
@peculiar.florist
1mo
Les gens qui aiment Go et considèrent que c'est un langage moderne, comment vous vivez le fait que ça ne supporte pas l'optimisation de récursion terminale (tail call) ?
1
1
0
0
kazé
@fabi1cazenave
@mastodon.social
1mo
@Varpie
Sauf erreur de ma part, je crois que ce type d’optimisation n’est pas garantie en Rust non plus. Faudrait vérifier auprès de gens compétents comme
@PacoVelobs
ou
@NuclearSquid
.
1
0
0
0
NuclearSquid
@NuclearSquid
@piaille.fr
1mo
@fabi1cazenave
@Varpie
@PacoVelobs
De mémoire, C++ est très mauvais à ce jeu là (comme souvent quand tu cherches à faire du fonctionnel), mais que Rust est assez bon à ça (pas garanti, mais plutôt bon).
Après, c’est quand même relativement niche comme optimisation en fait. C’est ULTRA CRITIQUE en Haskell ou OCaml, vu que tu fais pratiquement que ça, mais c’est rare de faire ces types de fonctions en Rust en vrai.
La syntaxe, sémantique et structures de données font que ces algos récursifs sont assez peu pertinent, et vu qu’il faut que ta fonction soit pure, ça exclue tous les cas de Dynamic Programming.
Donc ouais, la tail call optimisation osef un peu
2
0
0
0
kazé
@fabi1cazenave
@mastodon.social
1mo
@NuclearSquid
@Varpie
@PacoVelobs
Ah, il me semblait bien.
En cherchant un peu j’ai vu qu’on pouvait demander explicitement de la tail recursion (explicit_tail_calls), mais que c’était toujours une feature nightly et non un truc standard dans le langage ?
1
0
0
0
NuclearSquid
@NuclearSquid
@piaille.fr
1mo
@fabi1cazenave
@Varpie
@PacoVelobs
Oui, y’a pas mal de directives de compilation de ce genre en Rust. J’ai pas regardé pourquoi c’est que du nightly encore, mais j’imagine que c’est parce que tu peux te retrouver avec erreurs de compilations si c’est appliqué dans un contexte qui le permet pas (tu peux pas
toujours
remplacer un algo récursif par de l’impératif)
Après même si c’est dans le langage de base, ces directives c’est un peu du "use at your own risk". C’est très rapide de complètement te faire avoir si tu les utilises à mauvais escient (le cas d’école étant forcer l’inlining)
0
0
0
0
🪨
@Varpie
@peculiar.florist
1mo
@NuclearSquid
@fabi1cazenave
@PacoVelobs
C supporte la TCO, je ne vois pas pourquoi C++ ne la supporterait pas
​:akko_thonk:​
2
0
0
0
NuclearSquid
@NuclearSquid
@piaille.fr
1mo
@Varpie
@fabi1cazenave
@PacoVelobs
De mémoire c’est une question de move sémantics, qui font que pour pas mal des types de données un peu avancées, le compilateur arrive pas à détecter qu’il peut faire l’opti.
godbolt.org/z/fxbzE1K3s
Le même genre de dingueries qui fait que si tu passes un pointeur de fonction, le compilo arrivera jamais à inliner le résultat de ta fonction d’ordre supérieur, SAUF si tu wrap ton pointeur de fonction dans une lambda
godbolt.org/z/ePWbzv335
1
0
0
0
NuclearSquid
@NuclearSquid
@piaille.fr
1mo
@Varpie
@fabi1cazenave
@PacoVelobs
Du coup j’ai envoyé un exemple pour chaque truc dont je parlais. Si jamais tu sais pas lire l’assembleur x86_64, globalement si les fonctions ont été inliné correctement, on a main qui devient juste ça :
mov eax, <resultat>
ret
Donc ouais, pour moi quand on commence à vouloir taper dans ces niveaux d’optis, il faut :
0. lancer un mother-fucking profileur pour être sûr qu’on gagne au bon endroit
1. tout vérifier, même si on est sûr
2. mesurer le moindre changement
3. savoir lire un peu d’assembleur, pour comprendre ce que le compilo fabrique (t’écrira jamais du code meilleur que lui, mais au moins tu comprends tout ça)
0
0
0
0
kazé
@fabi1cazenave
@mastodon.social
1mo
@Varpie
De ce que j’en comprends, C ne garantit pas la TCO non plus : le compilateur fait ce type d’optimisation aussi souvent que possible, mais rien ne garantit qu’il la fasse — même pour des cas où ça devrait être trivial à faire.
stackoverflow.com/questions/59257543/when-is-tail-recursion-guaranteed-in-rust
@PacoVelobs
@NuclearSquid
1
0
0
0
🪨
@Varpie
@peculiar.florist
1mo
@fabi1cazenave
@PacoVelobs
@NuclearSquid
La TCO n'est pas dans la spec de C, mais tous les compilos fréquemment utilisés (GCC, clang, le truc de Windows là ) l'implémentent, au moins pour les cas simples. Après oui comme indiqué par NuclearSquid, avec les structures de données complexes ça peut devenir moins certain, mais quand tout est sur le stack et que tu gardes la même taille, y a pas de raison de ne pas le vouloir (sauf si t'es Go apparemment)
1
0
0
0
kazé
@fabi1cazenave
@mastodon.social
1mo
@Varpie
@PacoVelobs
@NuclearSquid
Ah, si c’est pas juste une question de
garantir
la TCO mais carrément de la
refuser
explicitement, oui c’est un peu bizarre. J’aurais pas imaginé qu’un langage fasse ce choix-là , en effet.
0
0
0
0