Les engins JavaScript modernes sont des monstres d'optimisation JIT. Cette fonction est extrêmement simple et se compile très bien. Il n'y a aucun polymorphisme, aucune branche, juste une boucle et des calculs flottants.
Il faut se garder d'en tirer des conclusions générales sur la performance de JavaScript, vu que la plupart du code réel ne passe pas la majorité de son temps dans des calculs numériques comme ça.
Au passage, voici une manière de ramener le code Python au même ordre de grandeur de performance que C et JavaScript :
Je confirme. Mon propre serveur (pour https://lilypond.community) a été en blacklist dès le premier message (pourquoi tant de haine ?) et j'ai dû les relancer de multiples fois et refuser d'accepter plusieurs réponses « désolés, notre bullshit automatisé a déterminé que nous ne pouvions pas répondre favorablement à votre demande » avant d'obtenir le déblacklistage.
Même système (Fedora 40). J'ai cloné ton dépôt et fait sudo dnf install libshumate-devel meson; meson setup build; cd build; ninja. Pas d'erreur, j'obtiens un exécutable qui affiche une jolie carte.
Tu as passé des options particulières à Meson ? Tu as des réglages particuliers de pkg-config ? (env | grep PKG_CONFIG)
Maintenant que l'UE, le Royaume-Uni et le Japon l'ont fait, on peut espérer que d'autres pays suivent, mais quelqu'un sait-il ce qu'il en est aux États-Unis ? Est-ce qu'il y a des velléités dans ce sens ? Est-ce que leurs autorités de concurrence ou je ne sais-quoi observent les mesures des autres pays ? Ou est-ce que c'est simplement impensable dans leur culture ?
[Zut, le mot « théorie » dans le titre est une coquille pour « théorique ».]
Dans ce billet de blog, je parle du théorème de Gödel, donc pas vraiment dans le sujet des logiciels libres, mais comme j'ai aussi essayé d'expliquer ce qu'est l'informatique théorique en tant que science, je me suis dit que ça pouvait intéresser ceux qui se demandent ce que peuvent bien faire les universitaires dans les départements d'informatique.
En fait, j'étais surtout inquiet car cette quantité de connexions me paraissait anormale, mais de ce que je comprends de toutes les réponses, c'est en fait courant. L'Internet est encore moins joli que ce que je croyais !
Pour la différence entre TCP et UDP, c'est simple:
Un paquet TCP entre dans un bar, et commande une bière. Vous voulez une bière ? Oui, je voudrais une bière. Voici une bière.
Un paquet UDP entre dans un bar, et commande un bière.
Oui, je comprends la différence à ce niveau-là. Mais je ne saurais pas expliquer comment s'agencent les bits d'un message TCP (en fait je ne connais même pas la taille moyenne d'un paquet TCP). Je ne cherche pas des réponses à toutes ces questions ici (je suis en train de me renseigner sur les réseaux en ce moment, de manière générale), je dis juste que j'ai beau être compétent en informatique — surtout du côté théorique — j'ignore plein de choses qui font partie des connaissances de base des gens qui administrent de vrais systèmes et réseaux.
Je suis bien d'accord que c'est un cauchemar que l'État français officialise que les deux seuls compétiteurs possibles sur le marchés des smartphones soient Google et Apple. Pour les autres inconvénients, je n'en avais pas conscience et ça m'incite à me renseigner, merci pour l'info. En tous cas, je parlais plus du principe général que de l'implémentation particulière.
Personnellement, j'ai toujours trouvé l'application GNOME Software atrocement lente au point de l'avoir tout simplement désinstallée à chaque fois. Je désinstalle aussi le démon packagekitd, qui périodiquement se mettait à faire chauffer l'ordinateur en prenant beaucoup de CPU, et dont je suppose qu'il est à la racine de la lenteur de GNOME Software. J'installe tout en ligne de commande avec dnf et flatpak.
Peut-être qu'on va enfin se mettre à déployer à grande échelle des systèmes de cryptographie asymétrique comme PGP ou S/MIME, en les liant à une vraie vérification d'identité comme l'identité numérique certifiée.
Non, pardon, c'est juste moi qui rêve, là. Les mails vont continuer d'avoir une sécurité nulle et on va continuer les « Bonjour, vous avez été classé premier au concours de maître de conférences en cryptographie et nous vous en félicitons. Afin d'organiser votre recrutement, merci de nous envoyer par mail un scan de votre carte d'identité ainsi que le document ci-joint avec une photo de votre signature »…
… qui ressort d'une discussion avec un proche, c'est que ce genre de marketing n'est pas à destination des utilisateurs, mais à destination des investisseurs et de la bourse.
C'est drôle, je n'y avais absolument pas pensé, ce qui prouve bien que je n'y comprends rien au monde de l'entreprise.
En gros : la proposition a très peu de chances d'aboutir telle quelle. Par contre, il se dit ouvert à des propositions pour rendre KDE plus visible aux côtés de GNOME, sans pour autant changer le fait que GNOME est ce que vont télécharger les gens qui n'y connaissent rien et qui cliquent juste sur le premier lien dans le site de Fedora.
Oui, tu as absolument raison, j'aurais dû le préciser. Il y a quand même un certain nombre de cas où le compilateur ne peut pas déduire que l'indice est dans les bornes, comme quand on stocke des indices dans un tableau à l'intérieur d'un autre tableau, mais ce n'est pas si courant.
Par contre, dans le dernier exemple, j'ai l'erreur suivante:
Tu as oublié l'inversion des lignes selected_share = Some(share); et share_size = share_array.len();. Il faut d'abord finir d'utiliser share_array avant d'en transférer la propriété vers selected_share.
Il faut aussi que je m’intéresse plus à la partie unsafe et au lifetime.
La partie « unsafe » n'est pas utile pour 95% de la programmation en Rust. Mieux vaut réserver ça aux experts du langage qui en ont vraiment besoin et qui savent s'en servir correctement (comme les contributeurs à std), parce que c'est compliqué. Écrire du Rust unsafe correct est bien plus difficile qu'écrire du C correct. Il faut une compréhension fine de la sémantique du langage. Armin Ronacher a écrit un post de blog que je trouve intéressant à ce sujet.
Les lifetimes, par contre, font partie des bases du langage.
Sur la partie lifetime, j'ai beau comprendre à quoi cela sert et comment ça marche en théorie, je ne suis pas encore à l'aise avec. (Quand je parlerai de le deviner automatiquement, je pensais à l’élision qui pour le coup n'est pas vraiment du devinage). Je vais creuser un peu plus cette partie.
Je ne sais pas si ça va t'aider, mais pour ma part j'ai compris comment fonctionne le système quand j'ai réalisé les choses suivantes, que je ne trouve pas très bien expliquées dans la plupart des tutoriels.
D'abord, tout le monde parle du borrow checker et comme c'est magique, mais ce n'est pas le borrow checker qui fait tout. Par exemple, cette fonction ne compile pas : fn<'a>(x: &'a str) -> &'static str { x }. Et heureusement qu'elle ne compile pas, vu qu'on ne peut pas prendre une référence valable seulement pendant une durée déterminée et la transformer impunément en une référence valable pour toute l'exécution du programme ! Mais ce n'est pas le borrow checker qui vérifie ça, c'est juste le système de typage. Tout ce que fait le borrow checker, c'est l'inférence des lifetimes implicites à l'intérieur d'une fonction. Il ne remplace pas le système de typage.
En fait, une bonne façon de comprendre les lifetimes, c'est de les voir comme des types fantômes. On peut imaginer une variante du langage qui aurait de l'héritage entre structs (à la programmation orientée objet), et où les références seraient implémentées comme ceci :
structRef<T,U>{// correspond à « &'T U »ptr: *U,// le pointeur vers la valeur de type Utoken: T,// un « jeton de validité » de type T}
Le code
fnconvert<'a,'b: 'a>(x: &'bstr)-> &'astr{x}
est traduit en quelque chose comme ceci dans ce langage imaginaire :
fnconvert<T,UsubtypeofT>(x: Ref<U,str>)-> Ref<T,str>{letRef{ptr,token}=x;Ref{ptr,// ptr est déjà de type *str, pas besoin de conversiontokenasT,// token est du type U, qui est sous-type de T, donc on peut le convertir en T}}
et le code
{// 'alets=String::from("foo");lets_ref=&s;// référence valable pour 'a{// 'blets_ref2=s_ref;// référence valable pour 'b}}
L'héritage entre structs n'existe pas, ma syntaxe struct ValidityB inherits ValidityA est imaginaire, mais tu vois l'idée. (En fait, le sous-typage existe en Rust uniquement à cause des lifetimes.)
Bref, fondamentalement, les lifetimes sont juste des paramètres de type comme les autres. En théorie, rien n'empêcherait que tous les lifetimes soient implémentés via des paramètres de type normaux. Le fait d'avoir une syntaxe différente est surtout une question de lisibilité.
L'idée de Rust est qu'à la compilation, on ne peut pas avoir de problème de concurrence, de fuite mémoire, de segmentation.
Mais en cherchant comment faire certaines opérations sur internet, je me retrouve avec du code contenant le mot unsafe. Je me suis refusé à l'utiliser mais pourquoi faire un langage qui se veut sûr et qui permet de faire des choses unsafe ?
Dans un certain nombre de situations, qu'on le veuille ou pas, il est absolument nécessaire de faire des choses qui ne peuvent pas être vérifiées à la compilation.
Par exemple :
Appeler une fonction dans une bibliothèque C (i.e., faire de la FFI) Le compilateur ne peut pas vérifier qu'elle est bien appelée ni que l'interaction avec le modèle de gestion mémoire de la bibliothèque est correcte.
Sauter un bound check (vérification que i est entre 0 et t.len() quand on fait t[i]) dans une boucle appelée des millions de fois, quand on est sûr que l'indice est bien dans les bornes.
Faire des appels à l'allocateur de mémoire et travailler avec ce qu'il donne, pour implémenter une structure de données.
unsafe est l'une des fonctionnalités les plus intéressantes du langage. Ça permet d'écrire quand même toutes ces choses en Rust, plutôt que dans des langages qui font très peu de vérifications comme le C, et quand on veut auditer la sécurité du code, il suffit de se concentrer sur les blocs unsafe plutôt que de regarder absolument tout. Par ailleurs, il y a des outils pour vérifier à l'exécution que le unsafe ne déclenche pas d'undefined behavior (Miri) et il y a des projets de recherche pour créer des outils de preuve formelle de sûreté de code unsafe (RustBelt).
Sans unsafe, la bibliothèque standard std ne pourrait pas être elle-même écrite en Rust. Le noyau Linux n'aurait pas pu incorporer du code Rust. Et tu ne pourrais pas utiliser dans ton code la bibliothèque C fuse.
La syntaxe des durées de vie est complexe et rend le code peu lisible. Là aussi, je trouve dommage que Rust ne soit pas capable de gérer ces durées de vie tout seul.
Je ne trouve pas la syntaxe complexe. Les paramètres de lifetime sont déclarés exactement de la même manière que les paramètres de type, en mettant juste un ' devant.
« Gérer les durées de vie tout seul »… difficile de savoir ce que tu entends par là. Si tu veux dire inférer les lifetimes dans les signatures, c'est tout à fait possible, de même que l'inférence de types — en fait il n'y a pas de distinction, c'est la même chose que l'inférence de types. Et le compilateur le fait bel et bien à l'intérieur d'une fonction. Mais il y a un choix de la part des concepteurs du langage d'exiger toujours que le type d'une fonction soit déclaré explicitement, pour qu'il soit facile de comprendre comment utiliser une fonction sans avoir à lire son code.
Cela dit, l'élision des lifetimes allège très souvent les déclarations (par exemple fn id(x: &str) -> &str { x } au lieu de fn<'a> id(x: &'a str) -> &'a str { x }, les règles sont ici).
De la même manière, j'ai l'impression que Rust nous oblige souvent à utiliser le clonage d'objet. Parfois j'aurais préféré ne pas cloner l'objet mais faire une référence (pour des questions de performances), mais là on se retrouve à gérer des durées de vie. Parfois je n'ai pas trouvé comment éviter le clonage simplement.
Il faut un tout petit peu d'expérience, mais on trouve rarement des cas où le compilateur force vraiment un clonage non-nécessaire.
Je n'y ai passé que quelques minutes, mais en parcourant les appels clone(), j'en ai déjà trouvé un certain nombre qui peuvent s'éviter simplement :
J'avais juste la flemme de chercher quels pays arabophones avaient la plus grande population 🙂 (Apparemment, c'est l'Égypte avec 110 millions d'habitants, suivie de l'Algérie, le Soudan, l'Irak, le Maroc et l'Arabie Saoudite, qui sont tous entre 30 millions et 40 millions d'habitants.)
# Pas très surprenant
Posté par jeanas (site web personnel, Mastodon) . En réponse au message Je veux bien que JavaScript soit optimisé, mais quand même !.... Évalué à 7.
Les engins JavaScript modernes sont des monstres d'optimisation JIT. Cette fonction est extrêmement simple et se compile très bien. Il n'y a aucun polymorphisme, aucune branche, juste une boucle et des calculs flottants.
Il faut se garder d'en tirer des conclusions générales sur la performance de JavaScript, vu que la plupart du code réel ne passe pas la majorité de son temps dans des calculs numériques comme ça.
Au passage, voici une manière de ramener le code Python au même ordre de grandeur de performance que C et JavaScript :
[^] # Re: MS et le mail : une plaie
Posté par jeanas (site web personnel, Mastodon) . En réponse au lien Pypi bloque les mails en outlook.com et hotmail.com. Évalué à 8.
Je confirme. Mon propre serveur (pour https://lilypond.community) a été en blacklist dès le premier message (pourquoi tant de haine ?) et j'ai dû les relancer de multiples fois et refuser d'accepter plusieurs réponses « désolés, notre bullshit automatisé a déterminé que nous ne pouvions pas répondre favorablement à votre demande » avant d'obtenir le déblacklistage.
# ChezMoiÇaMarche ®
Posté par jeanas (site web personnel, Mastodon) . En réponse au message [résolu] Problème de dépendance dans un build meson. Évalué à 2.
Même système (Fedora 40). J'ai cloné ton dépôt et fait
sudo dnf install libshumate-devel meson; meson setup build; cd build; ninja
. Pas d'erreur, j'obtiens un exécutable qui affiche une jolie carte.Tu as passé des options particulières à Meson ? Tu as des réglages particuliers de
pkg-config
? (env | grep PKG_CONFIG
)# Et les US ?
Posté par jeanas (site web personnel, Mastodon) . En réponse au lien Le Japon impose le choix du navigateur à Apple. Évalué à 2.
Maintenant que l'UE, le Royaume-Uni et le Japon l'ont fait, on peut espérer que d'autres pays suivent, mais quelqu'un sait-il ce qu'il en est aux États-Unis ? Est-ce qu'il y a des velléités dans ce sens ? Est-ce que leurs autorités de concurrence ou je ne sais-quoi observent les mesures des autres pays ? Ou est-ce que c'est simplement impensable dans leur culture ?
# C'est crodwsourcé depuis Mastodon
Posté par jeanas (site web personnel, Mastodon) . En réponse au lien La politique de confidentialité de XScreenSaver pour Android. Évalué à 5.
Ici : https://mastodon.social/@jwz/112580392962217146
# Arrivé trop tard ?
Posté par jeanas (site web personnel, Mastodon) . En réponse au journal Publication de Moustache, votre nouvel ami dans la transformation de texte . Évalué à 6.
Il existe déjà Minijinja, un clone de Jinja en Rust par le même auteur (Armin Ronacher). Avec la CLI kivabien.
# Autres réactions
Posté par jeanas (site web personnel, Mastodon) . En réponse au lien Nouvelle proposition à l'UE pour casser le chiffrement de bout en bout des messageries. Évalué à 3.
# Mi-HS
Posté par jeanas (site web personnel, Mastodon) . En réponse au lien Vulgarisation sur l'informatique théorique et le théorème d'incomplétude de Gödel. Évalué à 3.
[Zut, le mot « théorie » dans le titre est une coquille pour « théorique ».]
Dans ce billet de blog, je parle du théorème de Gödel, donc pas vraiment dans le sujet des logiciels libres, mais comme j'ai aussi essayé d'expliquer ce qu'est l'informatique théorique en tant que science, je me suis dit que ça pouvait intéresser ceux qui se demandent ce que peuvent bien faire les universitaires dans les départements d'informatique.
[^] # Re: Éviter le bruit
Posté par jeanas (site web personnel, Mastodon) . En réponse au message Nombre de connexions SSH malveillantes à un serveur. Évalué à 2.
Merci pour ces pistes, je vais regarder ça.
En fait, j'étais surtout inquiet car cette quantité de connexions me paraissait anormale, mais de ce que je comprends de toutes les réponses, c'est en fait courant. L'Internet est encore moins joli que ce que je croyais !
Oui, je comprends la différence à ce niveau-là. Mais je ne saurais pas expliquer comment s'agencent les bits d'un message TCP (en fait je ne connais même pas la taille moyenne d'un paquet TCP). Je ne cherche pas des réponses à toutes ces questions ici (je suis en train de me renseigner sur les réseaux en ce moment, de manière générale), je dis juste que j'ai beau être compétent en informatique — surtout du côté théorique — j'ignore plein de choses qui font partie des connaissances de base des gens qui administrent de vrais systèmes et réseaux.
# Quoi ??
Posté par jeanas (site web personnel, Mastodon) . En réponse au lien Qu’est-ce qu’Albert, l’intelligence artificielle française déployée par le gouvernement ?. Évalué à 7.
« [Albert] sera également mis au service […] de la gestion RH des fonctionnaires. »
Pardon ?
# Merci
Posté par jeanas (site web personnel, Mastodon) . En réponse à la dépêche Fedora Linux 40 est de sortie avec un nouveau GNOME et KDE Plasma. Évalué à 9. Dernière modification le 23 avril 2024 à 11:35.
C'est un plaisir de lire une dépêche aussi détaillée, en plus bien écrite.
[^] # Re: Intéressant
Posté par jeanas (site web personnel, Mastodon) . En réponse au lien La signature scannée n'est pas une preuve suffisante du consentement à une obligation. Évalué à 2.
Je suis bien d'accord que c'est un cauchemar que l'État français officialise que les deux seuls compétiteurs possibles sur le marchés des smartphones soient Google et Apple. Pour les autres inconvénients, je n'en avais pas conscience et ça m'incite à me renseigner, merci pour l'info. En tous cas, je parlais plus du principe général que de l'implémentation particulière.
[^] # Re: gnome-software
Posté par jeanas (site web personnel, Mastodon) . En réponse à la dépêche Fedora Linux 40 Beta est disponible pour les tests. Évalué à 2.
Personnellement, j'ai toujours trouvé l'application GNOME Software atrocement lente au point de l'avoir tout simplement désinstallée à chaque fois. Je désinstalle aussi le démon packagekitd, qui périodiquement se mettait à faire chauffer l'ordinateur en prenant beaucoup de CPU, et dont je suppose qu'il est à la racine de la lenteur de GNOME Software. J'installe tout en ligne de commande avec
dnf
etflatpak
.# Intéressant
Posté par jeanas (site web personnel, Mastodon) . En réponse au lien La signature scannée n'est pas une preuve suffisante du consentement à une obligation. Évalué à 8. Dernière modification le 18 avril 2024 à 14:23.
Peut-être qu'on va enfin se mettre à déployer à grande échelle des systèmes de cryptographie asymétrique comme PGP ou S/MIME, en les liant à une vraie vérification d'identité comme l'identité numérique certifiée.
Non, pardon, c'est juste moi qui rêve, là. Les mails vont continuer d'avoir une sécurité nulle et on va continuer les « Bonjour, vous avez été classé premier au concours de maître de conférences en cryptographie et nous vous en félicitons. Afin d'organiser votre recrutement, merci de nous envoyer par mail un scan de votre carte d'identité ainsi que le document ci-joint avec une photo de votre signature »…
# J'aurais dû me douter qu'il y avait un XKCD là-dessus
Posté par jeanas (site web personnel, Mastodon) . En réponse au journal Le marketing des logiciels, épisode 20240410. Évalué à 3.
Je suis tombé sur celui-ci par hasard : https://xkcd.com/1707/
# Une explication possible…
Posté par jeanas (site web personnel, Mastodon) . En réponse au journal Le marketing des logiciels, épisode 20240410. Évalué à 9.
… qui ressort d'une discussion avec un proche, c'est que ce genre de marketing n'est pas à destination des utilisateurs, mais à destination des investisseurs et de la bourse.
C'est drôle, je n'y avais absolument pas pensé, ce qui prouve bien que je n'y comprends rien au monde de l'entreprise.
# Réaction de Drew DeVault
Posté par jeanas (site web personnel, Mastodon) . En réponse au lien [Reddit] Le créateur de Hyprland (tiling compositor pour wayland) banni de Freedesktop. Évalué à 5.
https://drewdevault.com/2024/04/09/2024-04-09-FDO-conduct-enforcement.html
[^] # Re: Quelqu'un pour donner un avis éclairé ?
Posté par jeanas (site web personnel, Mastodon) . En réponse au lien Joshua Strobl propose à Fedora de remplacer GNOME par Plasma par défaut. Évalué à 3.
Réaction du Fedora project leader : https://discussion.fedoraproject.org/t/f42-change-proposal-fedora-plasma-workstation-system-wide/111343/41
En gros : la proposition a très peu de chances d'aboutir telle quelle. Par contre, il se dit ouvert à des propositions pour rendre KDE plus visible aux côtés de GNOME, sans pour autant changer le fait que GNOME est ce que vont télécharger les gens qui n'y connaissent rien et qui cliquent juste sur le premier lien dans le site de Fedora.
# Réaction du projet Python
Posté par jeanas (site web personnel, Mastodon) . En réponse au lien Backdoor in upstream xz/liblzma leading to ssh server compromise. Évalué à 3.
Rassurante : https://discuss.python.org/t/cpython-pypi-and-many-python-packages-are-not-affected-by-the-backdoor-of-xz/49873
# Une réponse argumentée
Posté par jeanas (site web personnel, Mastodon) . En réponse au lien Réfléchissez à deux fois avant d'abandonner Xorg. Wayland casse tout !. Évalué à 10.
https://refi64.dev/posts/dont-boycott-wayland.html démonte un certain nombre d'arguments plus ou moins fallacieux dans ce gist au ton excessivement polémique.
[^] # Re: Gestion mémoire etc.
Posté par jeanas (site web personnel, Mastodon) . En réponse au journal PullRequest d'une application en Rust. Évalué à 1.
Oui, tu as absolument raison, j'aurais dû le préciser. Il y a quand même un certain nombre de cas où le compilateur ne peut pas déduire que l'indice est dans les bornes, comme quand on stocke des indices dans un tableau à l'intérieur d'un autre tableau, mais ce n'est pas si courant.
[^] # Re: Gestion mémoire etc.
Posté par jeanas (site web personnel, Mastodon) . En réponse au journal PullRequest d'une application en Rust. Évalué à 5.
Tu as oublié l'inversion des lignes
selected_share = Some(share);
etshare_size = share_array.len();
. Il faut d'abord finir d'utilisershare_array
avant d'en transférer la propriété versselected_share
.La partie « unsafe » n'est pas utile pour 95% de la programmation en Rust. Mieux vaut réserver ça aux experts du langage qui en ont vraiment besoin et qui savent s'en servir correctement (comme les contributeurs à
std
), parce que c'est compliqué. Écrire du Rust unsafe correct est bien plus difficile qu'écrire du C correct. Il faut une compréhension fine de la sémantique du langage. Armin Ronacher a écrit un post de blog que je trouve intéressant à ce sujet.Les lifetimes, par contre, font partie des bases du langage.
Je ne sais pas si ça va t'aider, mais pour ma part j'ai compris comment fonctionne le système quand j'ai réalisé les choses suivantes, que je ne trouve pas très bien expliquées dans la plupart des tutoriels.
D'abord, tout le monde parle du borrow checker et comme c'est magique, mais ce n'est pas le borrow checker qui fait tout. Par exemple, cette fonction ne compile pas :
fn<'a>(x: &'a str) -> &'static str { x }
. Et heureusement qu'elle ne compile pas, vu qu'on ne peut pas prendre une référence valable seulement pendant une durée déterminée et la transformer impunément en une référence valable pour toute l'exécution du programme ! Mais ce n'est pas le borrow checker qui vérifie ça, c'est juste le système de typage. Tout ce que fait le borrow checker, c'est l'inférence des lifetimes implicites à l'intérieur d'une fonction. Il ne remplace pas le système de typage.En fait, une bonne façon de comprendre les lifetimes, c'est de les voir comme des types fantômes. On peut imaginer une variante du langage qui aurait de l'héritage entre structs (à la programmation orientée objet), et où les références seraient implémentées comme ceci :
Le code
est traduit en quelque chose comme ceci dans ce langage imaginaire :
et le code
se traduit par
L'héritage entre structs n'existe pas, ma syntaxe
struct ValidityB inherits ValidityA
est imaginaire, mais tu vois l'idée. (En fait, le sous-typage existe en Rust uniquement à cause des lifetimes.)Bref, fondamentalement, les lifetimes sont juste des paramètres de type comme les autres. En théorie, rien n'empêcherait que tous les lifetimes soient implémentés via des paramètres de type normaux. Le fait d'avoir une syntaxe différente est surtout une question de lisibilité.
# Gestion mémoire etc.
Posté par jeanas (site web personnel, Mastodon) . En réponse au journal PullRequest d'une application en Rust. Évalué à 10.
Dans un certain nombre de situations, qu'on le veuille ou pas, il est absolument nécessaire de faire des choses qui ne peuvent pas être vérifiées à la compilation.
Par exemple :
i
est entre 0 ett.len()
quand on faitt[i]
) dans une boucle appelée des millions de fois, quand on est sûr que l'indice est bien dans les bornes.unsafe
est l'une des fonctionnalités les plus intéressantes du langage. Ça permet d'écrire quand même toutes ces choses en Rust, plutôt que dans des langages qui font très peu de vérifications comme le C, et quand on veut auditer la sécurité du code, il suffit de se concentrer sur les blocsunsafe
plutôt que de regarder absolument tout. Par ailleurs, il y a des outils pour vérifier à l'exécution que leunsafe
ne déclenche pas d'undefined behavior (Miri) et il y a des projets de recherche pour créer des outils de preuve formelle de sûreté de codeunsafe
(RustBelt).Sans
unsafe
, la bibliothèque standardstd
ne pourrait pas être elle-même écrite en Rust. Le noyau Linux n'aurait pas pu incorporer du code Rust. Et tu ne pourrais pas utiliser dans ton code la bibliothèque Cfuse
.Je ne trouve pas la syntaxe complexe. Les paramètres de lifetime sont déclarés exactement de la même manière que les paramètres de type, en mettant juste un
'
devant.« Gérer les durées de vie tout seul »… difficile de savoir ce que tu entends par là. Si tu veux dire inférer les lifetimes dans les signatures, c'est tout à fait possible, de même que l'inférence de types — en fait il n'y a pas de distinction, c'est la même chose que l'inférence de types. Et le compilateur le fait bel et bien à l'intérieur d'une fonction. Mais il y a un choix de la part des concepteurs du langage d'exiger toujours que le type d'une fonction soit déclaré explicitement, pour qu'il soit facile de comprendre comment utiliser une fonction sans avoir à lire son code.
Cela dit, l'élision des lifetimes allège très souvent les déclarations (par exemple
fn id(x: &str) -> &str { x }
au lieu defn<'a> id(x: &'a str) -> &'a str { x }
, les règles sont ici).Il faut un tout petit peu d'expérience, mais on trouve rarement des cas où le compilateur force vraiment un clonage non-nécessaire.
Je n'y ai passé que quelques minutes, mais en parcourant les appels
clone()
, j'en ai déjà trouvé un certain nombre qui peuvent s'éviter simplement :# Ailleurs sur le Web
Posté par jeanas (site web personnel, Mastodon) . En réponse au lien 43 millions de comptes France-Travail potentiellement compromis. Évalué à 2.
https://www.lemonde.fr/pixels/article/2024/03/13/france-travail-victime-d-une-cyberattaque-les-donnees-de-43-millions-de-personnes-menacees_6221831_4408996.html
C'est assez dément, quand même.
[^] # Re: Résumé
Posté par jeanas (site web personnel, Mastodon) . En réponse au lien Unicode misconceptions. Évalué à 2.
J'avais juste la flemme de chercher quels pays arabophones avaient la plus grande population 🙂 (Apparemment, c'est l'Égypte avec 110 millions d'habitants, suivie de l'Algérie, le Soudan, l'Irak, le Maroc et l'Arabie Saoudite, qui sont tous entre 30 millions et 40 millions d'habitants.)