User avatar
🪨 @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

User avatar
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
User avatar
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
User avatar
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
User avatar
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
User avatar
🪨 @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
User avatar
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
User avatar
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
User avatar
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
User avatar
🪨 @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
User avatar
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