Mozilla publie la version finale de son langage de développement Rust

Mozilla publie la version finale de son langage de développement Rust

Le beurre et l'argent du beurre

Avatar de l'auteur
Vincent Hermann

Publié dans

Logiciel

19/05/2015 4 minutes
146

Mozilla publie la version finale de son langage de développement Rust

Mozilla a annoncé il y a quelques jours la disponibilité officielle de son langage de développement Rust. Cette première mouture finale représente un pas important pour l’éditeur, Rust étant notamment employé pour la création du moteur de rendu Servo, qui doit remplacer à terme Gecko dans Firefox.

Les performances de C/C++ avec des avantages de langages haut niveau

Rust est un langage de développement multiparadigme qui s’adresse en priorité à ceux qui manipulent le C et le C++. Globalement, l’objectif de Rust est de garder les performances de ces langages de bas niveau tout en ouvrant la voie à l’ensemble des apports des langages de plus haut niveau.

Comme l’indique Mozilla dans le billet d’annonce sur son blog, « Rust est un langage de programmation système qui fonctionne incroyablement vite, empêche presque toutes les erreurs de segmentation, et garantit la sécurité des threads ». Il est donc orienté objet, concurrentiel et typé sûr. Mozilla aimerait que les développeurs l’utilisent pour obtenir des applications et projets performants, tout en s’affranchissant autant que possible de toutes les erreurs classiques qui conduisent trop souvent à des soucis de sécurité.

Un rythme de développement calqué sur celui de Firefox

Nous avions déjà abordé Rust il y a deux ans quand Mozilla avait évoqué Servo. Ce moteur de rendu, développé avec le soutien de Samsung notamment, doit à terme remplacer Gecko au sein de Firefox. C’est en priorité pour ce projet que Rust a été créé, les ingénieurs ayant alors cherché un langage compilé qui maintenait les performances de C/C++ tout en permettant une autre approche de la sécurité.

L’arrivée de la version 1.0 signale en fait pour les intéressés qu’il n’y aura plus de changement profond qui pourrait casser la compatibilité. Les développeurs peuvent donc s’en servir sans craindre de voir des évolutions remettre en cause ce qui a été appris. D’ailleurs, le développement du langage fonctionne sur le même modèle que celui de Firefox. Aux côtés de la version 1.0 stable est donc apparue la mouture 1.1 bêta, tandis qu’un canal Nightly a également été mis en place. Toutes les versions seront mises à jour toutes les six semaines, ce qui promet donc une évolution rapide.

Cargo et crates.io pour gérer les bibliothèques et les dépendances

Parallèlement à la disponibilité de Rust, Mozilla a également introduit Cargo et crates.io. Le premier est un gestionnaire de paquets et de dépendances qui sera utilisé notamment pour ajouter simplement de nouvelles bibliothèques. Mais comme l'indique l’éditeur, « pour utiliser une dépendance, il faut d’abord la trouver ». C’est la mission de crates.io, le répertoire central des bibliothèques Rust. Le développeur pourra y trouver les créations des autres, ou publier les siennes.

Mozilla a de bons espoirs pour son langage et de grands projets. Les évolutions prévues sont déjà nombreuses, notamment sur la vitesse de compilation du code. Rust pourrait notamment intéresser ceux qui développent pour des plateformes multiples. Il dispose d’ailleurs de moyens multiples de communiquer avec des API, comme Alex Crichton, de chez Mozilla, l’expliquait le mois dernier au sujet du C.

Rust 1.0 peut être téléchargé depuis son site officiel. Mozilla précise bien que la version est stable et que le compilateur, en tant que tel, ne peut pas être utilisé pour gérer des fonctionnalités encore labellisées « instables ».

Écrit par Vincent Hermann

Tiens, en parlant de ça :

Sommaire de l'article

Introduction

Les performances de C/C++ avec des avantages de langages haut niveau

Un rythme de développement calqué sur celui de Firefox

Cargo et crates.io pour gérer les bibliothèques et les dépendances

Fermer

Commentaires (146)


Me suis jamais INtéressé à RUST. Mauvais souvenirs avec le C <img data-src=" />

Mais bon, pourquoi pas jeter un oeil (ou les deux)


Justement, à priori, ça ne devrait pas être aussi casse-pied à programmer que C&nbsp;<img data-src=" />


Je comprends mal. C’est un langage pour supplanter C/C++ ?

Si c’est le cas, je vois mal comment ça pourrait arriver <img data-src=" />


ça ressemble fortement à ce qu’à présenter MS il y a quelques temps…



Sinon cela me fait aussi penser à True &nbsp;Detective.


intéressé, un peu curieux de voir à quel point c’est rapide et sûr. C++ c’est quand même bien amélioré question rapidité de codage avec les derniers /11 et /14, mais j’imagine bien qu’il est possible de faire mieux. Un peu surpris qu’il soit possible de faire aussi rapide que c++ sans jouer avec les pointeurs, j’attends des benchmarks :) (quelqu’un a testé ?)








brokensoul a écrit :



intéressé, un peu curieux de voir à quel point c’est rapide et sûr. C++ c’est quand même bien amélioré question rapidité de codage avec les derniers /11 et /14, mais j’imagine bien qu’il est possible de faire mieux. Un peu surpris qu’il soit possible de faire aussi rapide que c++ sans jouer avec les pointeurs, j’attends des benchmarks :) (quelqu’un a testé ?)





Un benchmark datant des alentours du 24 avril (donc ça a pu s’amélioré depuis):

http://www.viva64.com/media/images/content/b/0324_Criticizing-Rust-Language-Why-…



Yay, moteur d’inférence de type, pas de typage statique déclaratif! \o/ Il est à peine temps que ça arrive ça, tiens, au lieu de toujours avoir le choix entre se faire ch*er avec des déclarations partout et être rapide, ou pouvoir écrire son code sans s’occuper de ça et être lent…


Marrant. On a l’impression que le résultat classe aussi en X les types de langage (compilé/interprété etc.).








brokensoul a écrit :



Un peu surpris qu’il soit possible de faire aussi rapide que c++ sans jouer avec les pointeurs, j’attends des benchmarks :) (quelqu’un a testé ?)





C’est pas parce qu’on ne les voie pas qu’ils ne sont pas la (les pointeurs) regarde ne Java tout est bien encapsulé :)



C’est quand même utile pour un compilateur de savoir si tu traite du nombre et / ou autre chose.

&nbsp;Mais tant qu’on aura pas de vrais solution d’accompagnement (Tu sélectionnes tes 10 lignes et tu les tagges “integer”) et pas seulement un editeur de texte, bin voila.

&nbsp;


pfff, çà peine sortis qu’il est déjà rouillé ce langage! <img data-src=" />








Ewil a écrit :



C’est pas parce qu’on ne les voie pas qu’ils ne sont pas la (les pointeurs) regarde ne Java tout est bien encapsulé :)





&nbsp;Le problème de perf, c’est pas les pointeurs en soit, c’est la notion de “bound checking” qui va avec dans les langages qui proposent une abstraction complète de tout ce qui touche à l’accès mémoire.&nbsp; Et ce problème de perf en est de moins en moins un:



 - l'impact de ce genre de pratique sur la charge CPU est constant       

- la puissance dispo des CPU augmente régulièrement






 Donc en proportionnel, sans rien faire de spécial, juste en laissant faire le temps, l'impact relatif devient de plus en plus négligeable sur les perfs globales d'un soft.          






    Même principe pour d'autres concepts. D'une façon générale, c'est pas pour rien que le managé est très utilisé aujourd'hui et l'était peu il y a 15 ans: tout simplement parce que l'overhead était important à l'époque, mais devient tellement négligeable qu'il devient de moins en moins justifiable de se passer de tout ce qu'apportent les langages managés.         






   Restent un ou deux contre-exemples dans des domaines très spécifiques qui sont l'exception et non la règle ; et surtout les petits débats des Kevin dans la cours de récré. Ceux-là croient encore que la qualité d'un développeur se mesure au caractère bas-niveau du langage qu'il manipule.         

&nbsp;

&nbsp;


Rust connaitra-t-il le même succès que Vala, Go ou Nim, … ?



/ironic








127.0.0.1 a écrit :



Rust connaitra-t-il le même succès que Vala, Go ou Nim, … ?



/ironic





C’est sans doute ça le principal problème des langages actuels: même si le langage propose une vraie valeur ajoutée qu’on ne retrouve pas ailleurs, le langage seul ne se suffit désormais plus en lui-même: c’est son écosystème qui fait sa principale qualité.



A ce jeu (et si j’ai bien compris), la notion d’ajout de dépendances dans Rust avec des outils pratiques dans le style de ce que propose NPM pour nodeJS, c’est un vrai atout potentiel quand on compare à ce que (ne) propose (pas) C/C++.

&nbsp;









brazomyna a écrit :



Le problème de perf, c’est pas les pointeurs en soit, c’est la notion de “bound checking” qui va avec dans les langages qui proposent une abstraction complète de tout ce qui touche à l’accès mémoire.





Rust n’a pas ces problèmes car les vérifications sont faites statiquement, à la compilation.



&nbsp;





brazomyna a écrit :



Même principe pour d’autres concepts. D’une façon générale, c’est pas pour rien que le managé est très utilisé aujourd’hui et l’était peu il y a 15 ans: tout simplement parce que l’overhead était important à l’époque, mais devient tellement négligeable qu’il devient de moins en moins justifiable de se passer de tout ce qu’apportent les langages managés.



    &nbsp;







Pas uniquement. Les vm ont elles-même beaucoup progressé, les JIT sont beaucoup plus performants qu’avant. C’est un ensemble.









white_tentacle a écrit :



Rust n’a pas ces problèmes car les vérifications sont faites statiquement, à la compilation.






 Du bound checking à la compilation ?!       






 myArray&nbsp; = new Array(1000);       

function getMyValue(int myIndex) {

&nbsp;&nbsp; return myArray(myIndex);

}






 =&gt; tu peux toujours courrir pour vérifier pendant la compilation que jamais tu n'appelleras getMyValue avec une valeur plus grande que 999.   



&nbsp;



 &nbsp;








brazomyna a écrit :



Même principe pour d’autres concepts. D’une façon générale, c’est pas pour rien que le managé est très utilisé aujourd’hui et l’était peu il y a 15 ans: tout simplement parce que l’overhead devient tellement négligeable qu’il devient de moins en moins justifiable de se passer de tout ce qu’apporte les langages managés.





Les langages managés ont l’avantage énorme de permettre des choses comme le déploiement sur architectures hétérogènes, la génération de code à la volée, l’envoi de données et de morceaux de programme à d’autres process/ordis.

Il leur manque en général les SIMD/la vectorisation, ce qui est dommage.









brazomyna a écrit :



Du bound checking à la compilation ?!




 myArray&nbsp; = new Array(1000);       

function getMyValue(int myIndex) {

&nbsp;&nbsp; return myArray(myIndex);

}






 =&gt; tu vérifies comment à la compilation, que jamais tu n'appelleras getMyValue avec une valeur plus grande que 999&nbsp; ?       

&nbsp;







Tu le vérifies parce que tu utilises des ranges et pas des accès aléatoires. Par exemple :



&nbsp;let v: &[Foo] = &[a, b, c];

&nbsp;&nbsp;&nbsp; for e in v {

&nbsp;&nbsp;&nbsp; bar(e);

}



ne fait pas de bound-checking -&gt; les accès sont garantis bons.









127.0.0.1 a écrit :



Rust connaitra-t-il le même succès que Vala, Go ou Nim, … ?



/ironic





Go&nbsp; a l’air d’avoir une bonne communauté.



Thanks !


Go se porte tres bien. C’est juste une qu’une communauté autour d’un langage “bas niveau” ça se construit lentement, et ça sera le meme chose avec Rust qui apporte pourtant pas mal d’avantages.


+1 globalement, mais pas forcément dans les détails..

l’impact du code managé sur les perfs doit être plus ou moins constant en pourcentage, pas du tout en valeur absolue. Si le processeur est tel que tu n’as besoin que d’une fraction de ses perfs, alors effectivement tu te&nbsp; fous que le code soit managé ou pas. Si tu es dans une situation CPU-limited (super courant sur du mobile par exemple), alors les 10% que te bouffe le code managé fait mal aux fesses. C’est pas pour rien que les moteurs de jeux sont en c++, ou plus globalement les applications temps réel qui touchent à l’image par exemple.



Globalement je pense que ca converge de toute facons :




  • le code managé te permet souvent d’appeler des libs binaires pour garder les performances du natif (par exemple un jeu scripté en C# qui appelle une lib de rendu binaire, à la Unity), et dans ce cas l’overhead pratique peut être nul pour ton application, et tu as tous les avantages du managé

    &nbsp;

  • les langages natifs progressent vers plus d’abstraction (c++1114, Rust donc, avec des threads et des smart pointers en natif), et améliorent leur syntaxe. Par exemple un même code en C++14 et en Java ne sera pas toujours plus long en C++..



    La grosse différence est surtout que dans un cas l’optimisation est offline (la compile) ou online (la VM), sachant que même ca peut être un peu flou (genre Android ART et compile AOT)

    &nbsp;



    &nbsp;




    brazomyna a écrit :

    &nbsp;Le problème de perf, c’est pas les pointeurs en soit, c’est la notion de “bound checking” qui va avec dans les langages qui proposent une abstraction complète de tout ce qui touche à l’accès mémoire.&nbsp; Et ce problème de perf en est de moins en moins un:
    - l’impact de ce genre de pratique sur la charge CPU est constant
    - la puissance dispo des CPU augmente régulièrement

    Donc en proportionnel, sans rien faire de spécial, juste en laissant faire le temps, l’impact relatif devient de plus en plus négligeable sur les perfs globales d’un soft.

    Même principe pour d’autres concepts. D’une façon générale, c’est pas pour rien que le managé est très utilisé aujourd’hui et l’était peu il y a 15 ans: tout simplement parce que l’overhead était important à l’époque, mais devient tellement négligeable qu’il devient de moins en moins justifiable de se passer de tout ce qu’apportent les langages managés.

    Restent un ou deux contre-exemples dans des domaines très spécifiques qui sont l’exception et non la règle ; et surtout les petits débats des Kevin dans la cours de récré. Ceux-là croient encore que la qualité d’un développeur se mesure au caractère bas-niveau du langage qu’il manipule.
    &nbsp;
    &nbsp;




Il y a quand même une bonne différence de perfs, on n’est pas prêts de passer sur Rust dans ma boîte dans ces conditions… Je suis surpris de voir c++ plus lent que c par contre








brokensoul a écrit :



+1 globalement, mais pas forcément dans les détails..



 l'impact du code managé sur les perfs doit être plus ou moins constant en pourcentage, pas du tout en valeur absolue. Si le processeur est tel que tu n'as besoin que d'une fraction de ses perfs, alors effectivement tu te&nbsp; fous que le code soit managé ou pas. Si tu es dans une situation CPU-limited (super courant sur du mobile par exemple), alors les 10% que te bouffe le code managé fait mal aux fesses.







Sauf que c’était peut-être encore vrai quand la plomberie bouffait 10% sur un CPU de téléphone moyen en 2010, mais elle en ne bouffe plus que 1% sur un téléphone de 2015 (chiffres évidemment alacon, c’est pour l’exemple).

&nbsp;





brokensoul a écrit :



C’est pas pour rien que les moteurs de jeux sont en c++, ou plus globalement les applications temps réel qui touchent à l’image par exemple.





Ce sont les contre-exemples dont je parle, qui sont l’exception à la règle. tu as sans aucun doute 99% du code produit dans le monde chaque année qui n’est pas dans ce cas là. Le reste ce sont quelques développeurs d’OS, de moteurs 3D ou d’applications temps réel très spécifiques.









brokensoul a écrit :





  • le code managé te permet souvent d’appeler des libs binaires pour garder les performances du natif (par exemple un jeu scripté en C# qui appelle une lib de rendu binaire, à la Unity), et dans ce cas l’overhead pratique peut être nul pour ton application, et tu as tous les avantages du managé





    C’est exactement ça: en dehors des développeurs d’Unity eux-même (pour qui du natif est requis, je ne dis pas le contraire), le besoin de tous ceux qui utilisent Unity (et qui vont pondre mille fois plus de code que ce que tu as dans Unity) est à peu près nul.

    &nbsp;



Go rencontre un petit succès tout de même. Fais un tour sur GitHub, le nombre de frameworks / librairies dispos et maintenues pour Go croit de jour en jour.








brokensoul a écrit :



Je suis surpris de voir c++ plus lent que c par contre





Pareil. J’aimerai bien voir la tronche du code benché (oui, benché). Je n’arrive plus à mettre la main sur le post en question mais il me semble que par exemple Ms était en réécriture de parties de Windows depuis C vers C++ pour justement gagner des performances.



LOL ! T’as déjà regardé le code généré par un compilateur C++ et les trucs qu’il fait dans ton dos ? Quand c’est trop lent en C (compilé avec gcc en -O3) je passe en assembleur et j’ai un gain significatif ; mais en général&nbsp; C est satisfaisant et avec de l’expérience tu as une idée du code qui est créé.

Maintenant en fonction des contraintes, tel ou tel langage peut être plus adapté à une situation, mais pour du code très rapide c’est C + ASM et surtout un (des) très bon(s) développeur(s).








francois-battail a écrit :



Quand c’est trop lent en C (compilé avec gcc en -O3) je passe en assembleur et j’ai un gain significatif





Ca fait bien longtemps que les compilo sont bien plus capable d’optimiser en prenant en compte un bien plus grand nombre de paramètres comparé à un humain.



cépa vré !

moua je sé ecrir en acen beurre <img data-src=" />

lé ho nivo cé pour les null


C’est clair que si tu écris strcmp() ou strlen() en C++ pur ça va être plus rapide que la libc GNU (hint : c’est écrit en assembleur). Principe de localité, SSE, … le nombre de trucs que l’on peut pervertir pour obtenir un gain de 30 - 50% avec des astuces monstrueuses, c’est le propre de l’être humain, accessoirement c’est rigolo.








Thoscellen a écrit :



cépa vré !

moua je sé ecrir en acen beurre <img data-src=" />

lé ho nivo cé pour les null





On a un gros poisson, justement ^^&nbsp;<img data-src=" />



ca dépend de la taille de la base de code.. Je ne doute pas que C puisse être super rapide si tu fais tout à la main (par définition, au pire tu prends ce que sort le compilo, au mieux tu améliore, donc globalement tu améliores forcément), mais en pratique tu as des limites en temps de développement et en nombre de personnes impliquées. C’est aussi ce à quoi Rust tente de répondre : faire du code rapide en temps limité, avec une équipe limitée. Les problèmes en temps infini, ce n’est pas super intéressant…

Du coup je suis curieux de ce benchmark : si c’est sur des trucs classiques (algos de tri, ..) alors le c++ peut très bien être aussi optimisé que le c, en y passant du temps (le c est plus ou moins inclus dans le c++, donc par définition tu peux faire aussi rapide) . Si ce n’est pas sur des trucs si classiques que ca, avec une grosse base de code, alors je suis curieux de voir les détails.


ca dépend complètement de ton application, le fait de se foutre des perfs. Si la valeur ajoutée de ta boîte est dans une fonction cpu-limited ou power-limited, alors les langages tels que le c++ ont tout leur sens. Dire que c’est marginal comme domaine, c’est un peu rapide… Certains domaines n’ont pas de middleware qui font le sale boulot, comme unity, et dans ce cas il n’y a pas le choix, il faut mettre les mains dans le cambouis. Il faut de tout pour faire un monde :)

&nbsp;








francois-battail a écrit :



Quand c’est trop lent en C (compilé avec gcc en -O3) je passe en assembleur et j’ai un gain significatif ; mais en général  C est satisfaisant et avec de l’expérience tu as une idée du code qui est créé.





Je me méfie de l’assembleur. Le gain significatif devient parfois trop lié à la bécane.

Je suis plus intéressé par du managé avec plus d’opcodes comme dans la LLVM, histoire de permettre l’utilisation de SIMD ou autres.

Les pragmas comme on en trouvait en fortran pour mplib/openmp sont sympa aussi: tu écris le code, puis tu indique en commentaire pour OpenMP: “cette variable est locale” “cette variable est volatile” “si tu paralélises, coupes plutôt en tronçons de 4”…

Le code reste propre, et la surcouche au-dessus est tellement efficace que ce serait perdre de sa vie que de ne pas l’utiliser…



Ouais bah le poisson il a été punit il doit écrire qu’en VB.NET au boulot, et ça l’ennui. <img data-src=" />


Recherche dans un Btree (un red black tree), en C : indice (durée) 1, en ASM : 0,60 en utilisant en particulier la mise en cache (prefetcht0, prefetchnta), l’optimisation de l’anticipation de&nbsp; saut, l’alignement de boucle pour le décodeur d’instruction, …



J’ai juste 300 lignes d’assembleur pour un total de 23000 lignes (essentiellement en C) dans mon appli, certes ça coûte très cher à écrire mais au final ça le vaut largement. Maintenant il y a aussi d’autres aspects : conception en bottom-up, tests intensifs en particulier profiling mais bon quand il faut gérer plus de 4.10^9 objets complexes il faut aussi y mettre les moyens.


Oui, l’assembleur n’est pas portable, c’est un choix qui dépend de l’application et des contraintes. Maintenant reste à savoir s’il faut mettre en avant le confort (tout relatif) du développeur ou la performance d’une application dans un contexte donné.


S’il propose les mêmes performances tout en étant plus simple à écrire, la réponse à ta question est évidente.

Le C/C++ sont des plaies, il faut être très rigoureux dans son écriture et il faut faire soi même des choses qu’un bon compilation/machine virtuelle pourraient très bien faire tout seuls. En contrepartie ils n’y a pas mieux pour maîtriser son application au poil et pour les performances.


Au moins avec ça plus de soucis pour sortir des RUSTines <img data-src=" />



<img data-src=" /> <img data-src=" />








Khalev a écrit :



Un benchmark datant des alentours du 24 avril (donc ça a pu s’amélioré depuis):

http://www.viva64.com/media/images/content/b/0324_Criticizing-Rust-Language-Why-…





A terme il n’y a aucune raison pour que Rust soit plus lent que le C++ : ses abstractions ont un coût nul par rapport à ce qu’écrirait un dév C++ : toute la question de la gestion mémoire est résolue à la compilation.



Bon, pour l’instant cela dit le compilateur conserve certains sécurités à l’exécution (boundaries checks par exemple), du fait de l’orientation sécurité de ce langage, mais on trouvera bien des compilateurs pour les désactiver à l’avenir.









brokensoul a écrit :



intéressé, un peu curieux de voir à quel point c’est rapide et sûr. C++ c’est quand même bien amélioré question rapidité de codage avec les derniers /11 et /14, mais j’imagine bien qu’il est possible de faire mieux. Un peu surpris qu’il soit possible de faire aussi rapide que c++ sans jouer avec les pointeurs, j’attends des benchmarks :) (quelqu’un a testé ?)





Le principe sous-jacent du système de types de Rust est de générer un code de gestion de la mémoire aussi efficace que celui que tu aurais pu écrire manuellement.









TexMex a écrit :



C’est quand même utile pour un compilateur de savoir si tu traite du nombre et / ou autre chose.

Mais tant qu’on aura pas de vrais solution d’accompagnement (Tu sélectionnes tes 10 lignes et tu les tagges “integer”) et pas seulement un editeur de texte, bin voila.





Les types sont inférés à la compilation. Le compilateur sait parfaitement qu’il traite des entiers parce qu’à un moment tu lui as fourni une entrée qui, elle, était typée comme entier, et tout le reste a été inféré correctement.









Oryzon a écrit :



ça ressemble fortement à ce qu’à présenter MS il y a quelques temps…





Au niveau système MS travaille sur deux approches, l’une ressemblant un peu à Rust pour la sécurité de la concurrence (mais avec de grosses différences quand même, chercher Joe Duffy et M#), l’autre basée sur des spécifications (spec#).









brazomyna a écrit :



Et ce problème de perf en est de moins en moins un:



 - l'impact de ce genre de pratique sur la charge CPU est constant       

- la puissance dispo des CPU augmente régulièrement







La puissance séquentielle des CPU n’augmente plus ou quasiment plus depuis dix ans, et le ralentissement s’accélère.



Quant à la taxe elle a toujours était proportionnellement constant : n% hier, n% demain. Elle restera toujours inacceptable pour de nombreux usages et elle va le devenir de plus en plus dans un monde à la puissance CPU finie.









brice.wernet a écrit :



Les langages managés ont l’avantage énorme de permettre des choses comme le déploiement sur architectures hétérogènes, la génération de code à la volée, l’envoi de données et de morceaux de programme à d’autres process/ordis.

Il leur manque en général les SIMD/la vectorisation, ce qui est dommage.





Question de priorités. Mais le nouveau compilo C# supporte la vectorisation et JS va bientôt gagner ça dans ses standards.









ErGo_404 a écrit :



S’il propose les mêmes performances tout en étant plus simple à écrire, la réponse à ta question est évidente.

Le C/C++ sont des plaies, il faut être très rigoureux dans son écriture et il faut faire soi même des choses qu’un bon compilation/machine virtuelle pourraient très bien faire tout seuls. En contrepartie ils n’y a pas mieux pour maîtriser son application au poil et pour les performances.





c++ une plaie ? Qu’est-ce qu’il ne faut pas entendre :) c’est plus vraiment ce qu’on apprenait à l’école, avec des malloc et free dans tous les sens hein. Faut regarder du code moderne, c’est _beau_ ! (ok, si on commence à templater ca pique un peu les yeux)



Je pense que le passage au C++ permet d’aller plus vite pour développer. Je ne suis pas sûr que les compilateurs produisent du code machine qui soit significativement plus performant pour le C++ que pour le C.








brokensoul a écrit :



Dire que c’est marginal comme domaine, c’est un peu rapide… Certains domaines n’ont pas de middleware qui font le sale boulot, comme unity, et dans ce cas il n’y a pas le choix, il faut mettre les mains dans le cambouis. Il faut de tout pour faire un monde :)&nbsp;





C’est pourtant la réalité. Dans le monde pro, tu dois avoir 90% de l’IT qui est représenté par l’informatique de gestion, un truc où les gains en perfs via de l’optimisation ou un langage moins rapide à écrire (/développer/tester/bugproof) sont désormais ridicule comparé au coût du hardware d’un serveur en plus ou en moins.



Restent une petite dizaine de pourcents qui sont consistués par de l’applicatif pour de l’utilisateur, où le temps réel n’est pas une contrainte.



Et puis tu as sans doute 1% de code qui est réellement contraint par le temps réel, les capacités CPU réduites, etc… (des ordinateurs de bord de ta bangole jusqu’aux systèmes de la Nasa en passant par une myriade d’applications intermédiaires: commandes de machines outils, etc…). Et d’ailleurs, souvent dans ce contexte là, le langage est rarement un choix libre mais plus une contrainte imposée par l’écosystème dans lequel vient s’insérer ton tool.



Le seul projet sur lequel j’ai pu bosser avait des templates dans tous les sens. Tu te retrouves à modifier 15 fichiers pour rajouter une pauvre fonction quelque part. C’était probablement pas un bon exemple de beau code C++.

Après je n’ai jamais vraiment travaillé un projet là dessus, je dis ça juste avec mon expérience “de débutant”. Ce n’est pas un langage facile à appréhender je trouve, contrairement à d’autres langages comme le Python, qui non seulement est très simple mais propose un nombre de libs incroyable.


Tu dis des choses qui étaient vraies dans les années 90, beaucoup moins maintenant.



Par exemple, entre C et C++, le code C++, à niveau d’abstraction égal (même si cette notion est toujours subjective), est plus rapide que le code C. La comparaison classique (c’est un cas d’école en fait) entre qsort() et std::sort le montre aisément : un appel de fonction via pointeur contre un appel inliné : qsort() perd à tous les coups. En général, les benchmarks qui donnent C plus rapides que C++ s’expliquent par la naïveté du code C++ testé.



Pour l’assembleur, j’étais tombé sur une présentation (je ne la retrouve plus, j’aurais mis le lien sinon) qui expliquait comment écrire du C++ optimisable. Le type comparait, notamment, comment il avait remplacé ~200 lignes d’assembleur dans une lib de décodage vidéo (je crois que c’était ffmpeg) par 5 lignes de C++, et comment les perfs s’étaient améliorées en conséquences (le code asm était écrit pour des processeurs anciens, sur un processeur moderne il était moins efficace que celui généré par gcc). Il avait d’abord optimisé le code ASM en question, mais même sa version, plus efficace que le code initial, l’était moins que celle générée par gcc.



Après, tout est bien sûr question de mesures et de cas particuliers. Quand on en est à ce niveau d’optimisation, la seule vérité c’est le profiling.


Dépend des cas, justement parce que les templates permettent des optimisations assez bourrinnes (l’exemple typique c’est std::sort VS qsort &lt;- grillé par @white_tentacle xD). Sans compter qu’un code plus facile à lire c’est aussi un code plus facile à optimiser si cette facilité n’est due pas à un manque d’expressivité.



Quant à ta remarque sur la complexité d’apprentissage de C++, c’est principalement dû au fait que les enseignements de ce langage se font à la mode historique (du C avec des classes) alors que d’une part la gestion des ressources dans un langage à exception, ça se fait pas manuellement si on n’est pas maso (en C++ le RAII, ça sauve des vies) et que d’autre part, il est très facile d’écrire en C++ avec une approche moderne comme celle qu’introduisent les dernières normes.


On apprend le C/C++ dans beaucoup de cours d’informatique et c’est ultra-implanter dans beaucoup de milieux.

La tâche s’annonce rude.


Vive le COBOL <img data-src=" />





Parti très très loin ==&gt; []


Merci, c’est intéressant. Maintenant entre l’inline et l’appel de fonction c’est pas un secret, d’ailleurs c’est un gros reproche que l’on peut faire aux TMV (tables de méthodes virtuelles) en C++, non ?



Donc, voici le code C, pas vraiment subtil, de recherche dans un Btree :





extern inline sw_item_t sw_rb_tree_search (sw_rb_tree_t tree, sw_item_t * item)

{

&nbsp;&nbsp;&nbsp; register sw_rb_node_t * node ;

&nbsp;&nbsp;&nbsp; int cc ;



&nbsp;&nbsp;&nbsp; node = tree-&gt;root ;

&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp; while (node)

&nbsp;&nbsp;&nbsp; {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cc = (* tree-&gt;cmp) (& node-&gt;item, item) ;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (! cc)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return & node-&gt;item ;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cc &lt; 0)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = node-&gt;links [SW_RIGHT] ;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = node-&gt;links [SW_LEFT] ;

&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp; return NULL ;

}





(Note : c’est en inline quand même, alors qu’en assembleur il y a le coût de l’appel de fonction mais négligeable par rapport au gain apporté). Si en C++ on peut faire mieux, ça m’intéresse mais comme j’ai aussi ma version assembleur, j’en doute…


Ah ben en lisant les commentaires, je vois que HarmattanBlow t’a déjà répondu ce que j’allais répondre. <img data-src=" />

J’ajoute quand même un truc: l’inférence de type est super-intéressante aussi quand ça ne marche pas. Ca paraît bizarre dit comme ça, mais j’avais vu un article sur le Web - il y a longtemps, je n’ai plus la référence - qui montrait le moteur d’inférence de types de OCaml détecter… une boucle infinie dans le code. En gros, on s’attendait à un type de retour donné, et celui inféré par le compilo n’était pas celui attendu. C’était à cause d’un cas pas/mal traité qui faisait partir le programme en vrille, et le moteur d’inférence de type l’avait détecté. Malgré sa prédominance un peu partout, quand on creuse un peu, le typage statique déclaratif n’a vraiment pas beaucoup d’avantage en fait, à part pour celui qui écrit le compilo. <img data-src=" />


Ah mais je ne suis pas contre Python, au contraire, je l’utilise beaucoup. Comme je le disais plus tôt, il faut de tout pour faire un monde, ca dépend vraiment des applications cherchées.



&nbsp;@brazomyna : tu y gagnerais quand même à voir ce qu’il se passe à l’extérieur de ton secteur d’activité.. “1% de code réellement contraint par le temps réel”, c’est assez risible pour le coup, je ne sais même pas si ca vaut le coup de réagir.. Je bosse ici, et le C++ est un peu utile par exemple, alors que la finalité est relativement simple / grand public. On est nombreux dans ce cas… (le code était initialement en C#, encore utilisé parfois pour prototyper, la différence de perfs avec C++ doit être dans les 10x et on est contraints par le CPU dans pas mal de scénarios…)


le code c++ serait quasi-exactement le même évidemment..


<img data-src=" /> Oui, mais c’est pas le cas du code assembleur !








brokensoul a écrit :



Je bosse ici, et le C++ est un peu utile par exemple, alors que la finalité est relativement simple / grand public.





Non, ce qui constitue l’applicatif grand public ce sont toutes les applications qui font usage de la techno que tu développes.

Tout comme Unity qui est développé une fois et utilisé dans des milliers d’applications ensuite.

&nbsp;



La première chose qui va être mieux en C++, c’est l’appel à cmp via pointeur de fonction qui va être inliné (ton btree va être paramétré par ton type, pas besoin de pointeur de fonction à ce niveau là).



Sinon, plutôt que d’implémenter toi-même une version améliorée, je t’invite à comparer les perfs de ton code avec celles de std::map (qui fournit un btree red/black). Si ton code fait mieux, je te tire mon chapeau : ça veut dire qu’à minima tu maîtrise bien ce que tu fais :).


J’ai parlé de ‘finalité’ grand public, pour être précis.. Et je maintiens, tout le monde ne peut pas se reposer sur un Unity, ca n’existe pas dans tous les domaines ou ca peut ne pas coller avec le business model. Exemple trivial qui explose tes 1% : l’écrasante majorité des applis iPhone était codée jusqu’il y peu en objective-c, un langage.. compilé. Ca représente du monde, iOS

Autre exemple

&nbsp;


Désolé, je suis resté à C++ 1.0, en particulier les templates sont encore pires que le préprocesseur et cela a contribué à mon dégoût pour ce langage et en particulier pour&nbsp; les libs. Maintenant « inliner » la fonction de comparaison c’est du gagne petit comparé au principe de localité (en gros maintenir les données utiles en cache L1/L2/L3).

Sur mon application, par rapport à ce qui existe, j’ai un gain de 20, donc j’imagine que le travail de conception et d’optimisation n’a pas été inutile, mais en même temps quand on arrive à dépasser 64 Go de mémoire utilisée&nbsp; (physique et swap) on cherche vraiment la petite bête dès le début, d’où une conception en bottom-up. Maintenant, au risque de me répéter, tout dépend de l’application et des contraintes.








brokensoul a écrit :



tout le monde ne peut pas se reposer sur …&nbsp;






 C'est pas faute d'avoir déjà expliqué que dans certains cas ça se justifie pleinement. Mais ça n'en fait pas une généralité pour autant.       









brokensoul a écrit :



Exemple



  trivial qui explose tes 1% : l'écrasante majorité des applis iPhone        

était codée jusqu'il y peu en objective-c, un langage.. compilé. Ca

représente du monde, iOS&nbsp;








 Compilé et managé ne recoupent pas exactement les même choses. On peut très bien compiler du Java.       






 Les applis iphone sont en objective-c parce qu'Apple impose l'objective-c.  Ca n'a rien d'un choix, encore moins d'un besoin que ne pourrait pas couvrir un langage managé. Ca ne change en particulier rien au fait que 99% des applis iPhone se contenteraient  parfaitement bien d'un langage managé pour faire exactement la même chose avec la même expérience utilisateur au final. C'est d'ailleurs le cas du côté du ptit robot (*)       






 Pour rappel, je parle bien de besoin, donc de cas où le managé ne pourrait pas faire ce qu'on fait avec du compilé, notamment pour des problématiques de perfs.      






 (*) et à propos de l'usage du NDK chez Android: là aussi dans la grande majorité des   cas c'est avant tout pour réutiliser du code déjà existant en C/C++ et   pour la portabilité inter-OS (iOS/Andro, le socle commun est le C), plus que pour un vrai besoin de perf).       








 &nbsp;








brokensoul a écrit :



c++ une plaie ? Qu’est-ce qu’il ne faut pas entendre :) c’est plus vraiment ce qu’on apprenait à l’école, avec des malloc et free dans tous les sens hein. Faut regarder du code moderne, c’est _beau_ ! (ok, si on commence à templater ca pique un peu les yeux)





Beau ?! Le C++ “moderne” ?! Qu’est-ce qu’il ne faut pas entendre ! Désolé mais cette phrase prouve que tu n’as pas fait l’effort d’aller voir ailleurs.



Non une gestion mémoire semi-automatisée avec des annotations de vingt caractères n’est PAS beau. Non ces itérateurs de cinquante caractères dont l’interface empêchent l’écriture d’un beau code ne sont pas beaux. Surtout pas à l’heure où les langages modernes, eux, font tous ça avec zéro caractères et adoptent les substitutions de chaîne, le pattern matching, les types algrébriques, linq et les continuations de listes, l’inférence de types, les types structurels anonymes, etc. Le tout avec des compilations instantanées parce que le modèle de compilation n’a plus à être compilable avec 32ko de mémoire.



Quand j’entends “C++ moderne” j’entends un politicien souffrant d’Alzheimer raconter à ses électeurs qu’on est encore jeune à cent ans. Ben voyons !



Le C++ est une horreur. Un anachronisme encore nécessaire pour un moment, dont les remplaçants tardent à émerger, mais un anachronisme toxique aussi moderne que Cobol. Et beaucoup de grands noms de l’industrie qui codent en C++ en sont convaincus, voire par exemple le célèbre diaporama Sweeney expliquant de quel langage l’industrie du JV aurait besoin aujourd’hui. Et je ne parle même pas du monde des OS où tout le monde s’acharne à bâtir un remplaçant vu l’inadaptation pure et simple d’un langage aussi invérifiable que le C++ à l’écriture d’un OS.



Arrêtez de prendre la défense de ce langage. Scandalisez-vous plutôt qu’en 2015 il n’y ait pas encore de vraie alternative pour la prog bas-niveau / haute performance / portable.









HarmattanBlow a écrit :



Arrêtez de prendre la défense de ce langage. Scandalisez-vous plutôt qu’en 2015 il n’y ait pas encore de vraie alternative pour la prog bas-niveau / haute performance / portable.





Ça tombe bien c’est exactement le credo de rust :).









white_tentacle a écrit :



Ça tombe bien c’est exactement le credo de rust :).





Non, et la preuve en est que le compilateur standard n’autorise pas la désactivation des vérifications des indices des tableaux, et que pendant longtemps le langage n’a pas supporté les modèles à base de mémoire partagée.



Rust a été fait pour être vérifiable par le compilateur. Pas pour être rapide. Ce sont deux besoins différents, irréconciliables une partie non-négligeable du temps). Le fait qu’on ait utilisé C++ pour ces deux besoins a été une erreur, il faut deux langages.



Rust pourrait devenir un langage performant mais ce n’est pas l’intention de Mozilla. Par ailleurs je doute que ceux qui ont besoin de performances soient prêts à se farcir les fourches caudines du langage. Enfin je ne pense pas qu’il soit assez sécurisé pour devenir le nouveau langage système de référence.



Difficile de savoir quel sera l’avenir de Rust.



Une gestion mémoire semi-automatisée ? Avec les shared_ptr, elle est totalement automatique. Des itérateurs de 50 caractères ? “auto” : 4 lettres. 4, c’est beaucoup moins que 50. Pour le reste, ce n’est pas très clair de quoi tu veux parler, mais je suis sûr que le C++ le fait très bien. Bref, tu ne sais pas de quoi tu parles.


Rust est fait pour être un compromis entre sûreté, performance, facilité d’écrire du code. Donc quelque soit un aspect, tu trouveras à critiquer : c’est le principe d’un compromis.



Si tu ne veux pas de compromis, tu choisis C++. Mais l’analyse statique de code C++, c’est un défi énorme.



Mozilla souhaite utiliser Rust pour son moteur de rendu html. Et les perfs de Rust sont suffisante pour ce point. C’est nettement mieux que tout ce qu’on nous a vendu comme alternatives à C++ pour l’instant…








lysbleu a écrit :



Une gestion mémoire semi-automatisée ? Avec les shared_ptr, elle est totalement automatique.





Bien sûr que non :

Tu dois écrire shared_ptr partout au lieu de Actor (ou Actor en D).



* Si jamais tu as un cycle dans ton graphe, ton shared_ptr va créer une fuite mémoire. Or le compilateur est incapable de détecter pour toi cette fuite et rien n’est fait pour t’aider à la détecter.



* Tu ne vas pas écrire partout shared_ptr pour des raisons de perfs, tu vas continuer à considérer systématiquement comment ta variable sera utilisée et choisir un unique_ptr, un shared_ptr, un weak_ptr, un pointeur, une référence ou une allocation in-situ. Puis tu vas décider de définir ou non la constante de compilation spécifiant l’utilisation d’un compteur non-atomique, sachant que ça a toutes les chances de te rentrer dedans à l’avenir. Autant de choses que le compilateur pourraient faire pour toi.



Ce n’est pas ce que j’appelle complètement automatisé !





Des itérateurs de 50 caractères ? “auto” : 4 lettres.



Et personne n’utilise auto. Pourquoi ? Tout simplement parce que le putain de modèle de compilation de C++ rend extrêmement difficile son analyse, ce qui fait que tous les putains d’outils sont pourris et qu’aucun putain d’IDE n’est foutu de t’afficher correctement une putain de tooltip par-dessus “auto” pour te dire quel est le vrai type de cette putain de variable. En 2015 !



Quand je code dans un langage moderne avec un IDE fonctionnel j’utilise l’inférence de types a tout bout de champ. Quand je code en C++ je n’utilise jamais “auto” parce que sur les dix plus gros IDE du marché il n’y en a aucun qui soit bon avec le C++ (seul celui de QT fait un bon boulot décent sur l’analyse).





Pour le reste, ce n’est pas très clair de quoi tu veux parler, mais je suis sûr que le C++ le fait très bien. Bref, tu ne sais pas de quoi tu parles.



<img data-src=" />









MrCal3x a écrit :



ça ne devrait pas être aussi casse-pied à programmer que C&nbsp;<img data-src=" />





&nbsp;En qui le C serait “casse-pieds”?



&nbsp;Jusqu’à preuve du contraire, c’est bien le seul language qui permette de tout faire, au delà des quelques dizaines à centaines d’instructions (selon le processeur) de pur démarrage: Dès que l’on a pu initialiser une pile qqpart (même temporaire, par exemple via un cache configuré en SRAM pour ne même pas avoir l’init DDR à se faire en assembleur), à part qq primitives tapant direct dans les registres du µP (gestion bas niveau horloges, MMU, caches…), absolument tout peut se faire en C et cela reste la grande force de ce language.



Ce n’est pas pour rien que tout le kernel Linux et ses modules ainsi que, avant eux (par ordre d’exécution en sortie de reset), boot loader (u-boot) / BIOS sont codés en C.



Par contre il est clair que comme avec tout ce qui offre de grandes libertés afin de tout permettre niveau codage ou presque, il importe de ne pas faire n’importe quoi.



Moi ce que je trouve casse-pieds, c’est les langages ou tu es bordé comme un bébé. Question de point de vue.









white_tentacle a écrit :



Rust est fait pour être un compromis entre sûreté, performance, facilité d’écrire du code. Donc quelque soit un aspect, tu trouveras à critiquer : c’est le principe d’un compromis.





Et personne ne veut de compromis, c’est bien là le problème. L’industrie du JV et d’autres ne veulent pas d’un langage deux fois plus lent et MS et d’autres ne veulent pas d’un langage un peu plus sûr pour leurs OS.



Quant au C++ il ne fait pas de compromis : il ne s’encombre pas de la sécurité, il lui crache au visage. Ce qui est une démarche acceptable dans bien des cas. Son seul problème c’est qu’il est vieux et improductif, et qu’on peut quand même faire plus vérifiable sans empiéter sur les perfs.





C’est nettement mieux que tout ce qu’on nous a vendu comme alternatives à C++ pour l’instant…



Je suis bien d’accord. Mais pour l’heure ça ne suffit pas encore. Mais comme je l’ai dit plus tôt, ce langage a le potentiel pour devenir un remplaçant au C++ avec un autre compilateur. Malheureusement cet avenir n’est pas compatible avec les objectifs actuels de Mozilla pour ce langage, qui font passer la sécurité d’abord.









HarmattanBlow a écrit :



Je suis bien d’accord. Mais pour l’heure ça ne suffit pas encore. Mais comme je l’ai dit plutôt, ce langage a le potentiel pour devenir un remplaçant au C++ avec un autre compilateur. Malheureusement cet avenir n’est pas compatible avec les objectifs actuels de Mozilla pour ce langage, qui font passer la sécurité d’abord.





C’est tout le problème de faire face à un standard établi. Si Rust et C++ avaient le même niveau de maturité / développement, en ce qui me concerne le choix serait vite fait et en faveur de Rust : les quelques avantages de C++ ne se justifient pas face à la sûreté de Rust.

&nbsp;

Mais on est dans une situation différente, et effectivement, Rust n’apporte pas une plus-value suffisante pour justifier un changement technologique. Rajoute à ça le risque inhérent à une technologie jeune, et le choix est vite fait…

&nbsp;









white_tentacle a écrit :



C’est tout le problème de faire face à un standard établi. Si Rust et C++ avaient le même niveau de maturité / développement, en ce qui me concerne le choix serait vite fait et en faveur de Rust : les quelques avantages de C++ ne se justifient pas face à la sûreté de Rust.





C’est vite dit mais par exemple dans le JV un rapport de performances du simple au double ça veut dire laisser ton super modèle d’illumination de côté et rester sur les technos de la génération PS2-PS3.



Okay, soit, tout n’est pas automatisé, il faut réfléchir et utilisée alternativement shared_ptr et weak_ptr. La raison est simple, le tout automatisé mène à des fuites mémoires contre lesquelles tu ne peux rien faire (sauf attendre une correction de ta VM / ton compilateur) alors que si tu réfléchis, tu peux être bien plus performant. Quant à auto, il est couramment utilisé pour les itérateurs, chose à laquelle je répondais. Le C++ est un langage typé, pour le meilleur, donc auto ne doit pas être utilisé à tout bout de champs… Bref, tu crois tout connaître, ton idée sur la question est la meilleure, et tu le montres de manière ostentatoire, bravo <img data-src=" />.


« Pour le reste, ce n’est pas très clair de quoi tu veux parler, mais je suis sûr que le C++ le fait très bien. Bref, tu ne sais pas de quoi tu parles.&nbsp; »



&nbsp;Il te montre juste que si, il sait mieux que toi de quoi il parle… Les attaques ad hominem c’est pas bien <img data-src=" />








white_tentacle a écrit :



« Pour le reste, ce n’est pas très clair de quoi tu veux parler, mais je suis sûr que le C++ le fait très bien. Bref, tu ne sais pas de quoi tu parles.  »



 Il te montre juste que si, il sait mieux que toi de quoi il parle… Les attaques ad hominem c’est pas bien <img data-src=" />





substitutions de chaîne, le pattern matching : Présent en C++ de manière standard, donc je ne vois pas de quoi il parle lorsqu’il sous-entend que c’est inexistant en C++.

Type algébrique : je ne vois pas ce qui empêche de le faire en C++.

Linq : Apparemment c’est spécifique VS / C#, donc effectivement je ne connais pas.

types structurels anonymes, continuation de liste : Je ne connais pas ces termes, Google non plus, peut-être qu’ils désignent des choses communes mais ce n’est pas comme ça qu’on a l’habitude de les nommer.

Inférence de type : C’est limité en C++, certes, mais c’est possible depuis 2011.



Visiblement, tu ne maitrises pas la notion “d’attaque ad hominem”, je vais donc t’aider : cela consiste à remettre en cause la crédibilité de l’adversaire en ignorant totalement ses arguments, ce que je n’ai pas fait.









Khalev a écrit :



Un benchmark datant des alentours du 24 avril (donc ça a pu s’amélioré depuis):

http://www.viva64.com/media/images/content/b/0324_Criticizing-Rust-Language-Why-…



Cet article est mal renseigné, et&nbsp; publié par une société qui vend des outils d’analyse statique de code C++.







brokensoul a écrit :



Il

y a quand même une bonne différence de perfs, on n’est pas prêts de

passer sur Rust dans ma boîte dans ces conditions… Je suis surpris de

voir c++ plus lent que c par contre



Pour ce qui est des benchmarks, sur 3 d’entre eux ont des résultat entre le C et Rust sont équivalents

Sur les autres :

&nbsp;-

Regex-dna:&nbsp;

le programme C du test utilise une bibliothèque de Regex plus rapide

mais moins complète, que celle incluse par défaut dans Rust.




  • Fasta: Le code C est Mutithreadé, celui en Rust ne l’est pas.

  • n-body: Le code&nbsp; C fait appel à du SSE alors que le code Rust ne le fait pas

    Bref si on ne compare pas des programmes équivalent ont peut tirer toutes les conclusions qu’on veut.

    &nbsp;

    Il y a aussi des différence notable dans la méthodes employées par les programmes C et C++ ce qui explique aussi les écarts. Le problème du “benchmark-game” c’est que c’est comme son nom l’indique un jeu du codeur qui fera le meilleur code, pas vraiment un bon outil pour comparer des langages.

    &nbsp;





    brazomyna a écrit :



    &nbsp;Le problème de perf, c’est pas les pointeurs en soit, c’est la notion de “bound checking” qui va avec dans les langages qui proposent une abstraction complète de tout ce qui touche à l’accès mémoire.&nbsp; Et ce problème de perf en est de moins en moins un.

    &nbsp;



    Le bound checking est en effet un point ou le performance de Rust peuvent être en deçà du C. Cependant comme tu le dis dans la plupart des cas l’impact est négligeable, d’autant plus que Rust est capable de s’en passer totalement quand on utilise un itérateur.

    Si on se retrouve dans un des rares cas ou on a une section de code critique au niveau des performances qui doit faire beaucoup d’accès a des indice variés d’un tableau,&nbsp; on peut utiliser un bloc unsafe pour faire des accès non vérifiés localement.



    &nbsp;



Des frameworks, librairies et autres bindings c’est bien. Mais pour construire quelle genre d’application, au final ?








lysbleu a écrit :



substitutions de chaîne, le pattern matching : Présent en C++ de manière standard, donc je ne vois pas de quoi il parle lorsqu’il sous-entend que c’est inexistant en C++.

Type algébrique : je ne vois pas ce qui empêche de le faire en C++.





Voici un exemple de type algébrique couplé à du pattern matching (qui, non, n’est pas présent en C++).



enum expr = Number | Addition(x, y) | Mutliplication (x,y)



def factoriseEquation(expr) match expr



 case Addition(Multiplication(a, x), Multiplication(b, x)) =&gt; Multiplication(x, Addition(a, b))   

case \_ =&gt; expr





Amuse-toi à écrire ça en C++. Et pas seulement un pauvre bidouillage, quelque chose qui pourrait comme ici servir de fondation à quelque chose de plus vaste. ;)



NB : l’indentation a été virée par PCI/NXI, désolé.





Linq : Apparemment c’est spécifique VS / C#, donc effectivement je ne connais pas.



Linq ou les continuations de listes dans bien d’autres langages (list continuations) permettent par exemple d’écrire :



// Parmi les étudiants ayant assisté à 90% des cours on retient les 20 avec la meilleure note moyenne

var étudiantsSélectionnés = étudiants



  where présenceAuCours &gt; 90    

order by notes.Average()

take 20





Amuse-toi à écrire ça en C++.





types structurels anonymes



Besoin de faire une requête SQL pour ne récupérer que deux pauvres champs de la ligne ? Dans certains langages tu peux écrire :



var rows = select (name, address) from table where age &gt; 50   





Un type anonyme est alors créé avec deux champs name et address. Tout ça est inféré à la compilation et intellisense pourra compléter.



Amuse-toi à écrire ça en C++. Pardon à faire tourner ton outil de génération de code ORM après avoir cliqué sur des boutons pour lui dire que tu as besoin de faire telle requête.





cela consiste à remettre en cause la crédibilité de l’adversaire en ignorant totalement ses arguments, ce que je n’ai pas fait.



“Pour le reste, ce n’est pas très clair de quoi tu veux parler (…) Bref, tu ne sais pas de quoi tu parles.”.



Même si je suis un peu à la rue n’utilisant principalement que le C# vu que j’ai pas besoin de grosses perf … Je trouve cette discussion plutôt intéressante même si un peu agressive par moment.



Je viens quand même de découvrir qu’en survolant “var” dans mon code, il me donnait le type qui allait être interprété, c’est plutôt intéressant !



Pour ce qui est du C/C++, je trouve ça assez imbuvable. Quand on compare au java/C# on en est quand même loin ! Alors certe ce n’est pas optimisé, et pas vraiment optimisable du fait de leur fonctionnement, mais c’est quand même bien plus facile à lire et plus simple à écrire.



Pour revenir à la base, ce langage à l’air intéressant comme l’a été Go à sa sortie, ou d’autres encore … Mais force est de constater qu’ils n’ont pas vraiment percés. La présence d’écosystème à bien aidé les langages “récent” comme objective-C, java (pour android notamment, même si ça marchait bien avant ça), VB/C# .NET (windows) pour se trouver un public.








HarmattanBlow a écrit :



Amuse-toi à écrire ça en C++. Et pas seulement un pauvre bidouillage, quelque chose qui pourrait comme ici servir de fondation à quelque chose de plus vaste. ;)





Toi tu as essayé boost::spirit :).









HarmattanBlow a écrit :



Beau ?! Le C++ “moderne” ?! Qu’est-ce qu’il ne faut pas entendre ! Désolé mais cette phrase prouve que tu n’as pas fait l’effort d’aller voir ailleurs.



Non une gestion mémoire semi-automatisée avec des annotations de vingt caractères n’est PAS beau. Non ces itérateurs de cinquante caractères dont l’interface empêchent l’écriture d’un beau code ne sont pas beaux. Surtout pas à l’heure où les langages modernes, eux, font tous ça avec zéro caractères et adoptent les substitutions de chaîne, le pattern matching, les types algrébriques, linq et les continuations de listes, l’inférence de types, les types structurels anonymes, etc. Le tout avec des compilations instantanées parce que le modèle de compilation n’a plus à être compilable avec 32ko de mémoire.



Quand j’entends “C++ moderne” j’entends un politicien souffrant d’Alzheimer raconter à ses électeurs qu’on est encore jeune à cent ans. Ben voyons !



Le C++ est une horreur. Un anachronisme encore nécessaire pour un moment, dont les remplaçants tardent à émerger, mais un anachronisme toxique aussi moderne que Cobol. Et beaucoup de grands noms de l’industrie qui codent en C++ en sont convaincus, voire par exemple le célèbre diaporama Sweeney expliquant de quel langage l’industrie du JV aurait besoin aujourd’hui. Et je ne parle même pas du monde des OS où tout le monde s’acharne à bâtir un remplaçant vu l’inadaptation pure et simple d’un langage aussi invérifiable que le C++ à l’écriture d’un OS.



Arrêtez de prendre la défense de ce langage. Scandalisez-vous plutôt qu’en 2015 il n’y ait pas encore de vraie alternative pour la prog bas-niveau / haute performance / portable.





  • compilation &gt; super rapide avec clang, sinon un petit ccache est bien efficace. Pas un problème en pratique

    &nbsp;- inférence de type &gt; jette un oeil sur c++ d’après 1995, tu as le droit de te renseigner sur ce que tu commentes. “auto”, c’est pour la poubelle ?



    • gestion mémoire ‘semi automatisée’ : la gestion des pointeurs est quand même super simple maintenant, et ca te donne des gains en perfs dont d’autres langages peuvent encore rêver

    • la plupart de tes critiques sur du code trop verbeux concerne les templates. Tu as le droit de ne pas les utiliser..

    • pas allé voir ailleurs ? Sans doute pas assez, j’utilise Python tous les deux jours, j’ai un peu utilisé Java et C#. Je n’ai sans doute pas vu toute la ménagerie pour autant, mais l’utilité de c++ n’est sans doute pas non plus au niveau que tu décris, et je ne suis pas le seul à le penser.&nbsp;



      &nbsp;Maintenant si tu dis que tel ou tel langage super exotique fait ‘évidemment’ beaucoup mieux, reste :

    • à le prouver

    • à avoir un écosystème qui le rend utilisable (l’inconvénient de partir de zéro, on ne gagne pas à tous les coups)

      &nbsp;










bast73 a écrit :



Pour revenir à la base, ce langage à l’air intéressant comme l’a été Go à sa sortie, ou d’autres encore … Mais force est de constater qu’ils n’ont pas vraiment percés. La présence d’écosystème à bien aidé les langages “récent” comme objective-C, java (pour android notamment, même si ça marchait bien avant ça), VB/C# .NET (windows) pour se trouver un public.






 Tu as aussi l'exemple de NodeJS qui remet au goût du jour un vieux langage, mais dont les qualités sont redécouvertes du fait de nouveaux besoins exprimés par l'évolution de l'IT, le tout couplé à un écosystème en pleine ébulition.      






 Dans ce cas là aussi, on voit que les problématiques de perfs passent clairement au second niveau au profit d'autres paramètres (facilité d'écriture de code, partage du même code entre client et serveur, sérialisation/désérialistion immédiate, ce qui se fait de mieux en terme de gestion des dépendances dans un projet, ...).       

&nbsp;








HarmattanBlow a écrit :



// Parmi les étudiants ayant assisté à 90% des cours on retient les 20 avec la meilleure note moyenne

var étudiantsSélectionnés = étudiants



   where présenceAuCours &gt; 90     

order by notes.Average()

take 20





Amuse-toi à écrire ça en C++.



avec des lambdas et la std, c’est trivial









brazomyna a écrit :



Le problème de perf, c’est pas les pointeurs en soit, c’est la notion de “bound checking” qui va avec dans les langages qui proposent une abstraction complète de tout ce qui touche à l’accès mémoire.  Et ce problème de perf en est de moins en moins un:



 - l'impact de ce genre de pratique sur la charge CPU est constant       

- la puissance dispo des CPU augmente régulièrement









Justement, la loi de moore c’est fini depuis quelques temps déjà.



Donc maintenant, pour gagner en puissance, il faudra apprendre à optimiser avec les dents.



C’est terminé le farniente…





Donc en proportionnel, sans rien faire de spécial, juste en laissant faire le temps, l’impact relatif devient de plus en plus négligeable sur les perfs globales d’un soft.





Non, on ne peut pas dire cela. L’impact dépends principalement du type de logiciel.



Beaucoup de programmeurs le pensent (a tort) pour la simple raison que les logiciels qu’ils codent en SS2I sont typiquement le genre d’application qui y est peu sensible (et de toute façon tellement mal codée que c’est pas le premier souci…).





Même principe pour d’autres concepts. D’une façon générale, c’est pas pour rien que le managé est très utilisé aujourd’hui et l’était peu il y a 15 ans: tout simplement parce que l’overhead était important à l’époque, mais devient tellement négligeable qu’il devient de moins en moins justifiable de se passer de tout ce qu’apportent les langages managés.





Les langages managés sont très utilisés en SS2I car ils permettent de limiter la casse quand on embauche de la main d’oeuvre bas de gamme (stagiaires ou débutants).



De fait, ils conviennent très bien pour des projets ou la performance n’est pas très importante.





Restent un ou deux contre-exemples dans des domaines très spécifiques qui sont l’exception et non la règle ; et surtout les petits débats des Kevin dans la cours de récré. Ceux-là croient encore que la qualité d’un développeur se mesure au caractère bas-niveau du langage qu’il manipule.





Par expérience, je dirais qu’un programmeur qui ne maîtrise pas les mécanismes de bas niveau ne codera jamais correctement.



Quand des programmeurs utilisent des fonctions sans avoir la moindre idée de ce qui se passe en dessous, ça aboutit bien souvent à des aberrations techniques et des gros problèmes.









HarmattanBlow a écrit :



Non, et la preuve en est que le compilateur standard n’autorise pas la désactivation des vérifications des indices des tableaux, et que pendant longtemps le langage n’a pas supporté les modèles à base de mémoire partagée.

Rust a été fait pour être vérifiable par le compilateur. Pas pour être rapide. Ce sont deux besoins différents, irréconciliables une partie non-négligeable du temps). Le fait qu’on ait utilisé C++ pour ces deux besoins a été une erreur, il faut deux langages.



Rust pourrait devenir un langage performant mais ce n’est pas l’intention de Mozilla. Par ailleurs je doute que ceux qui ont besoin de performances soient prêts à se farcir les fourches caudines du langage. Enfin je ne pense pas qu’il soit assez sécurisé pour devenir le nouveau langage système de référence.



Difficile de savoir quel sera l’avenir de Rust.



On ne peut pas désactiver le bound checking globalement dans tout le programme mais on peut le faire au cas par cas via un bloc unsafe, ce qui est a mon avis amplement suffisant car les situations ou le bound checking est un vrai frein aux performance est en général facilement identifiable.



Je trouve au contraire que Rust essaie clairement d’offrir le compromis le plus réaliste possible entre sécurité et performance. Ils ont clairement fait de vrais compromis pour les performances par exemple en ne détectant les integer overflow qu’en mode débuggage.









bast73 a écrit :



Pour ce qui est du C/C++, je trouve ça assez imbuvable. Quand on compare au java/C# on en est quand même loin ! Alors certe ce n’est pas optimisé, et pas vraiment optimisable du fait de leur fonctionnement, mais c’est quand même bien plus facile à lire et plus simple à écrire.&nbsp;





Autant si je suis globalement d’accord avec @HarmattanBlow sur un certain nombre de points quand à la lourdeur de C++ due&nbsp; son passif. Et pas trop d’accord quant à la promotion des langages à GC par défaut. Il faut ne pas avoir codé en C++ depuis les normes 11 et 14 pour dire que C# et Java sont largement plus accessibles. Aujourd’hui en terme d’écriture et de lecture, la différence est hyper ténue et pour certaines choses la bibliothèque standard de C++ est simplement plus puissante (à noter : puissante, pas fournie).



C’est sûr que ça se fera pas un en jour. Mais ça n’empêche pas que l’objectif soit de l’ordre du possible, si le langage lui même est intéressant bien sûr. Notamment s’il est simple à utiliser.


Le problème c’est que dans les environnements “contraints” tu n’as pas toujours accès à un compilateur qui suit la dernière norme.



Maintenant si ce que tu dis est vrai, j’aimerais bien avoir un tuto qui couvre directement le C++ “moderne”. J’en suis effectivement resté au C++ “surcouche de C”, en sachant que le C lui même ne me convenait pas.








ErGo_404 a écrit :



Le problème c’est que dans les environnements “contraints” tu n’as pas toujours accès à un compilateur qui suit la dernière norme.



Maintenant si ce que tu dis est vrai, j’aimerais bien avoir un tuto qui couvre directement le C++ “moderne”. J’en suis effectivement resté au C++ “surcouche de C”, en sachant que le C lui même ne me convenait pas.





tu auras à mon sens une bonne&nbsp; idée des changements avec ca (rapide hein, ca ne couvre pas tout. Ensuite avec la lib standard, tu peux vraiment faire plein de choses proprement









HarmattanBlow a écrit :



Beau ?! Le C++ “moderne” ?! Qu’est-ce qu’il ne faut pas entendre ! Désolé mais cette phrase prouve que tu n’as pas fait l’effort d’aller voir ailleurs.



Non une gestion mémoire semi-automatisée avec des annotations de vingt caractères n’est PAS beau. Non ces itérateurs de cinquante caractères dont l’interface empêchent l’écriture d’un beau code ne sont pas beaux. Surtout pas à l’heure où les langages modernes, eux, font tous ça avec zéro caractères et adoptent les substitutions de chaîne, le pattern matching, les types algrébriques, linq et les continuations de listes, l’inférence de types, les types structurels anonymes, etc. Le tout avec des compilations instantanées parce que le modèle de compilation n’a plus à être compilable avec 32ko de mémoire.



Quand j’entends “C++ moderne” j’entends un politicien souffrant d’Alzheimer raconter à ses électeurs qu’on est encore jeune à cent ans. Ben voyons !



Le C++ est une horreur. Un anachronisme encore nécessaire pour un moment, dont les remplaçants tardent à émerger, mais un anachronisme toxique aussi moderne que Cobol. Et beaucoup de grands noms de l’industrie qui codent en C++ en sont convaincus, voire par exemple le célèbre diaporama Sweeney expliquant de quel langage l’industrie du JV aurait besoin aujourd’hui. Et je ne parle même pas du monde des OS où tout le monde s’acharne à bâtir un remplaçant vu l’inadaptation pure et simple d’un langage aussi invérifiable que le C++ à l’écriture d’un OS.



Arrêtez de prendre la défense de ce langage. Scandalisez-vous plutôt qu’en 2015 il n’y ait pas encore de vraie alternative pour la prog bas-niveau / haute performance / portable.







C’est un peu excessif, mais globalement je suis d’accord. C/C++ est un langage possédant de nombreux défauts.



Ce langage reste irremplaçable pour une raison essentielle : il permet un contrôle quasi total et donc de gérer finement les mécanismes pour (entre autres)obtenir des performances maximales.



Qu’ont fait les langages qui prétendent le remplacer ? Ils ont encadré un certain nombre de mécanismes.



Sauf qu’en faisant cela, ils ont tapé à côté : quand on veut de la performance, un mécanisme unique ne conviendra jamais à tous les cas de figure.



Donc au final, tous les langages qui prétendaient améliorer C/C++ n’ont fait que consacrer sa suprématie en le rendant plus indispensable encore.



Ta conclusion est très pertinente, s’il y a une chose que l’on peut regretter, c’est qu’aucun langage moderne ne soit aujourd’hui en mesure de voler la couronne à ce vieux roi.



Malgré le fait qu’il soit plein de rides et d’athrose, il gagne toujours la course à la performance…









ErGo_404 a écrit :



Le problème c’est que dans les environnements “contraints” tu n’as pas toujours accès à un compilateur qui suit la dernière norme.



J’ai toujours eu du mal avec l’approche pédagogique “commençons par l’environnement contraint”.





ErGo_404 a écrit :



Maintenant si ce que tu dis est vrai, j’aimerais bien avoir un tuto qui couvre directement le C++ “moderne”. J’en suis effectivement resté au C++ “surcouche de C”, en sachant que le C lui même ne me convenait pas.



Le cours de @gbdivers est encore en construction mais adopte une approche moderne.









HarmattanBlow a écrit :



Non, et la preuve en est que le compilateur standard n’autorise pas la désactivation des vérifications des indices des tableaux, et que pendant longtemps le langage n’a pas supporté les modèles à base de mémoire partagée.



Rust a été fait pour être vérifiable par le compilateur. Pas pour être rapide. Ce sont deux besoins différents, irréconciliables une partie non-négligeable du temps). Le fait qu’on ait utilisé C++ pour ces deux besoins a été une erreur, il faut deux langages.



Rust pourrait devenir un langage performant mais ce n’est pas l’intention de Mozilla. Par ailleurs je doute que ceux qui ont besoin de performances soient prêts à se farcir les fourches caudines du langage. Enfin je ne pense pas qu’il soit assez sécurisé pour devenir le nouveau langage système de référence.



Difficile de savoir quel sera l’avenir de Rust.







Totalement d’accord avec cela…



Pour ceux qui aime les chifre.





The current supported properties allow Servo to be mostly operational on

static sites like Wikipedia and GitHub, with a surprisingly small code

footprint. It has only about 126K lines of Rust code, and the Rust compiler and libraries are about 360K lines.

For comparison, in 2014 Blink had about 700K lines of C++ code, and

WebKit had around 1.3M lines, including platform specific code.


Faudr ajuste que Mozilla le documente correctement et ne l’abandonne pas au bout de quelques années, comme ils ont fait avec XPFE.


Merci !


Merci !


Commentaires passionnés et très intéressant !



Sinon j’avais vu passé ces 2 lien sur l’état actuel de la compilation statique et dynamique :http://www.emulators.com/docs/nx38_staticopt.htm



http://www.emulators.com/docs/nx39_dynopt.htm








brokensoul a écrit :



avec des lambdas et la std, c’est trivial





C’était déjà trivial avant ça, le problème c’est que c’est verbeux. Moins depuis l’introduction les lambdas, mais c’est toujours verbeux, la faute à la gestion manuelle de la mémoire qui fait obstacle aux modèles fonctionnels et à l’interface des itérateurs.



Aujourd’hui ta solution reposera sur la création d’une liste puis sa mutation. Et elle fera cinq fois plus de caractères. Et pour ces raisons en C++ on optera plutôt pour des boucles. Dommage : un programmeur passe pourtant des heures par semaine à écrire ce genre de boucles.







  • compilation &gt; super rapide avec clang, sinon un petit ccache est bien efficace. Pas un problème en pratique



    Déni de réalité. Va dire ça aux grands noms de l’industrie qui exposent à la cppcon les efforts qu’ils doivent déployer pour garder le temps de compilation sous contrôle et le pourquoi des modules.





  • inférence de type &gt; jette un oeil sur c++ d’après 1995, tu as le droit de te renseigner sur ce que tu commentes. “auto”, c’est pour la poubelle ?



    • gestion mémoire ‘semi automatisée’ : la gestion des pointeurs est quand même super simple maintenant, et ca te donne des gains en perfs dont d’autres langages peuvent encore rêver



      (…)Maintenant si tu dis que tel ou tel langage super exotique fait ‘évidemment’ beaucoup mieux, reste :

    • à le prouver



      J’ai déjà répondu à cela dans ce fil, je t’invite à cliquer sur mon nom pour voir mes messages récents si cela t’intéresse.






  • la plupart de tes critiques sur du code trop verbeux concerne les templates. Tu as le droit de ne pas les utiliser..



    Le problème ne réside pas dans les templates, le problème réside dans le fait de devoir avoir recours à des templates pour émuler des comportements qui sont bien mieux pris en charge autrement par d’autres langages. Ces langages ont pourtant des équivalents aux templates.





    (reste) à avoir un écosystème qui le rend utilisable (l’inconvénient de partir de zéro, on ne gagne pas à tous les coups)



    J’ai moi-même dénoncé les limites de la solution Rust à l’heure actuelle.



Pourquoi ca serait le cas ? Le gros avantage est que Mozilla l’utilise pour son prochain moteur de rendu, Servo. Ce qui tire le langage et la commu vers le haut, sachant qu’un moteur de rendu avec tous les specs HTML5/CSS, c’est pas rien.



Honnêtement, Rust a de bonnes chances d’être intéressant dans le futur.


<img data-src=" /> Bah oui, travailler sur un micro-contrôleur 32 bits avec 4 ko de RAM et 16 ko de FLASH, c’est sûr qu’en Java, Python ou n’importe quel truc à la mode ça va être du tonnerre <img data-src=" />

Le C colle au système / architecture avec un niveau d’abstraction suffisant&nbsp; pour la portabilité - quand cela est souhaité -, on peut faire avec du code de bootstrap de quelques octets sans connaître l’assembleur du processeur cible !

Mais bon c’est vrai qu’il n’y a pas de collecteur d’ordures (GC) d’intégré et qu’il faut savoir ce que l’on fait, mais c’est un métier aussi, on a tendance à l’oublier.








Crysalide a écrit :



Pourquoi ca serait le cas ? Le gros avantage est que Mozilla l’utilise pour son prochain moteur de rendu, Servo. Ce qui tire le langage et la commu vers le haut, sachant qu’un moteur de rendu avec tous les specs HTML5/CSS, c’est pas rien.



Honnêtement, Rust a de bonnes chances d’être intéressant dans le futur.







Le problème de Rust, c’est que ce langage risque de rester coincé entre les gros ténors (Java et C#) et le C/C++ qu’il ne remplacera pas.



Restera donc une petite niche de gens intéressés par ses features spécifiques. Pas sûr que cela suffise à long terme.



J’ai connu de nombreux langages dans ma vie. La plupart ont disparu.



A l’heure actuelle, pour s’imposer sur ce terrain, il faut des arguments très solides et répondre à des besoins très forts.






Docker par exemple est programmé en Go. Mais aussi le serveur de DL de Google aussi (dl.google.com), gogs (un gitlab like), etc, etc. Voirhttp://en.m.wikipedia.org/wiki/Go_(programming_language) section “Notable users”



L’intérêt est énorme. Je t’ai retrouvé un article sympa sur le sujet:http://blog.iron.io/2013/03/how-we-went-from-30-servers-to-2-go.html?m=1 :)








HarmattanBlow a écrit :



Voici un exemple de type algébrique couplé à du pattern matching (qui, non, n’est pas présent en C++).



enum expr = Number | Addition(x, y) | Mutliplication (x,y)



def factoriseEquation(expr) match expr



 case Addition(Multiplication(a, x), Multiplication(b, x)) =&gt; Multiplication(x, Addition(a, b))   

case \_ =&gt; expr





Amuse-toi à écrire ça en C++. Et pas seulement un pauvre bidouillage, quelque chose qui pourrait comme ici servir de fondation à quelque chose de plus vaste. ;)



NB : l’indentation a été virée par PCI/NXI, désolé.





Linq ou les continuations de listes dans bien d’autres langages (list continuations) permettent par exemple d’écrire :



// Parmi les étudiants ayant assisté à 90% des cours on retient les 20 avec la meilleure note moyenne

var étudiantsSélectionnés = étudiants



  where présenceAuCours &gt; 90    

order by notes.Average()

take 20





Amuse-toi à écrire ça en C++.





Besoin de faire une requête SQL pour ne récupérer que deux pauvres champs de la ligne ? Dans certains langages tu peux écrire :



var rows = select (name, address) from table where age &gt; 50   





Un type anonyme est alors créé avec deux champs name et address. Tout ça est inféré à la compilation et intellisense pourra compléter.



Amuse-toi à écrire ça en C++. Pardon à faire tourner ton outil de génération de code ORM après avoir cliqué sur des boutons pour lui dire que tu as besoin de faire telle requête.





Le gain en efficacité de codage est minime. Ce dont tu me parles, c’est d’élégance et oui, la programmation fonctionnelle est plus élégante que la programmation objet, ce depuis 1958. Une boucle, c’est 5s à taper. 100 boucles, 500s. Ce n’est pas ça qui prend du temps dans la journée d’un développeur, ça ne nuit absolument pas à la clarté, et ça peut être plus efficace du point de vue machine. Mais c’est moins élégant, ça décoiffe moins c’est sûr.



“Pour le reste, ce n’est pas très clair de quoi tu veux parler (…) Bref, tu ne sais pas de quoi tu parles.”.



Les deux phrases n’ont aucun lien entre elles. “Bref” n’est pas un lien logique, mais j’admets que cela pouvait mal s’interpréter. Ce dont tu parlais par la suite n’était pas clair pour moi, ton message suivant m’a éclairé.



Pour la dernière phrase, je persiste, car le C++ est moderne, et se modernise d’autant plus à chaque nouvelle révision tout en conservant son paradigme objet, qui se justifie. Tout le sucre syntaxique que peuvent avoir d’autres langage n’est pas envisageable pour le C++, qui se doit de rester léger dans ses mécanismes. Charge au développeur de ne pas en mésuser. Charge à la MOE de choisir le langage adapté.



@eb303 - @HarmattanBlow



Bin en fait j’en parlais dans un sens large.&nbsp; Plus tu te rapproches de la machine mieux c’est de savoir l’avance et accessoirement de le rendre statique





  • pour : compiler un code spécifique plus adapté/optimisé (Ça fera pas de mal, hein monsieur LUA(Jt) )

  • Éviter les problèmes de “gourage total” du programmeur. Après tout il est sencé savoir ce qu’il fait.



    L’exemple tout bête étant le programme qui modifie le type d’une variable en cours de route sur condition (quand c’est permis). Le compilateur n’a pas vraiment le choix que de produire du code un peu plus “générique” permettant de gérer les deux cas. Bon pas exactement en fait, il duplique mais vous aurez compris. Donc de toute façons couteux à tous niveaux (RAM/temps d’exec)&nbsp; mais il n’a pas trop le choix. Et plus ca monte en niveau (language) plus la syntaxe est flexible et plus le compilateur doit réfléchir et faire des concessions.



    &nbsp;Le plus drôle étant qu’en assembleur on s’en fout un peu. On voit tout comme une donnée dans de la RAM et c’est le sens qu’on décide de lui donner a ce moment là qui compte, ou même comment on décide de la lire… Code gé né ré… la la la la la…. la la la la la…. (avec la musique et les papillons autour).

    &nbsp;

    Bref, oui l’inférence c’est bien mais pas ultime a mon sens.

    &nbsp;



    Sinon j’ai un projet qui me titille le bulbe depuis un moment et j’ai déjà écrit pas mal. Y’a des ASM boys motivés dans la salle ?








lysbleu a écrit :



Le gain en efficacité de codage est minime.





Oui, passer de 50 lignes à 3 c’est minime, de deux heures de code à une minute, de deux nouveaux bugs à zéro, c’est un détail.



Non je ne te parle ni d’élégance ni de programmation fonctionnelle. Je te parle d’avoir un langage qui a identifié des constructions nous permettant d’exprimer directement notre besoin afin que le compilateur l’implémente lui-même aussi efficacement que possible.



* Le pattern matching répond au besoin courant de reconnaissance de motifs parmi une structure de données

* Les continuations de listes (linq) répondent au besoin courant de filtrer, trier et transformer les données reçues

* Les types anonymes répondent au besoin courant de structurer un code local en objets via des PODS dont on a besoin à un niveau très local, souvent au sein d’une simple méthode.

* Et aussi au besoin de spécifier des codes spécifiques. Par exemple la fonction getMoney peut retourner integer | deadPeople | timeout. Tu ne veux pas créer un type spécifique, tu veux simplement renvoyer ces codes et que tout le monde puisse le voir en consultant la signature de la méthode.





Une boucle, c’est 5s à taper.



Bien sûr que non.



Reprends l’exemple que j’ai donné et qui m’a pris trente secondes à taper, il te faudra cinq à dix minutes pour écrire tes boucles en utilisant des lambdas, cinq à dix minutes pour écrire tes tests (inutiles avec le version linq car déjà au niveau des spécifications), et dix minutes pour déboguer puisque tu auras introduit une erreur. Et le jour où tu devras relire il te faudra quinze minutes pour comprendre ce que fait ce pavé indigeste.



Chronomètre-toi au quotidien, tu auras des surprises.







Pour la dernière phrase, je persiste, car le C++ est moderne, et se modernise d’autant plus à chaque nouvelle révision tout en conservant son paradigme objet, qui se justifie.



Un langage “moderne” âgé de cinquante ans dont les littéraux sont en ASCII et dont le modèle de compilation est extrêmement lent car conçu avec les contraintes d’être compilable avec moins de 32ko de RAM.



Et on est encore jeune à cent ans - tout est dans la tête. Ben tiens.









TexMex a écrit :



Bin en fait j’en parlais dans un sens large.  Plus tu te rapproches de la machine mieux c’est de savoir l’avance et accessoirement de le rendre statique





Non, tu as une conception erronée de l’inférence de types dans un langage statique.



Dans un langage comme Rust toi seul crée les types (sauf exception) et en général tu spécifies explicitement le type de chaque membre. Le compilateur ne fait qu’inférer les usages et tu peux passer ta souris sur un identifiant pour en voir le type dans ton IDE en mode édition - qui porte le nom que tu as choisi.

:)



Et il n’y a aucun surcoût possible à l’exécution. Au contraire : les types des arguments des méthodes sont plus spécifiques que ceux tu aurais écrit et il y a donc moins d’appels virtuels.



Cela veut aussi dire que le compilateur détecte les erreurs. Il ne va pas générer un membre “ogranisme” ni te permettre d’assigner un réel à un champ déclaré comme entier.





Tu comparais avec Luajit mais il y a deux grosses différences :

a) Luajit doit manuellement créer des types. Pas Rust. En Rust tu crées les types



b) Lua reste de nature dynamique parce que tu peux créer des membres à l’exécution via des chaînes générées à l’exécution. Et le halting problem empêche donc de connaître à la compilation tous les noms des membres qui pourraient être générées par les accès via une chaîne de caractères (ex : myTable[prefix + i]). Et cela veut aussi dire que chaque type généré doit conserver une interface dynamique puisque certains appels ne seront résolus qu’à l’exécution.



Je hais les langages dynamiques mais un langage statique avec inférence, ce n’est que du bonheur (je n’utilise l’inférence que pour les variables locales et les constructions génériques imbuvables). Il n’y a aucun inconvénient par rapport à un typage conventionnel - sauf à la rigueur si tu tombes sur un mauvais code écrit sans aucune mention de types, là c’est lourd.



En fait je parle pas de Rust en particulier mais de tous les langages (et la liste est longue) et de leurs fumant problèmes (que tu décris aussi) versus le compilateur. Du gros , demi gros plus que du pointu.


Je pense que tout le monde a un peu raison.



Pour ma part, je dirais qu’il faut utiliser un outil pour ce qu’il fait très bien.



C/C++ n’a jamais été le meilleur langage pour faire de l’abstraction, pour pondre un programme rapidement ou pour avoir la dernière “feature” à la mode.



Mais c’est juste le top du top quand on veut un meilleur contrôle sur ce qu’on fait pour obtenir les meilleures performances.















Uther a écrit :



On ne peut pas désactiver le bound checking globalement dans tout le programme mais on peut le faire au cas par cas via un bloc unsafe, ce qui est a mon avis amplement suffisant car les situations ou le bound checking est un vrai frein aux performance est en général facilement identifiable….



C’est justement l’erreur de beaucoup de concepteurs de langages de faire ce genre de supposition.



Ce qui est souvent vrai n’est pas pour autant toujours vrai : On est toujours étonné de ce que certains font parfois de vos créations. Vous n’avez pas idée de ce que certains font avec leur compilateur.



Celui qui fera le langage qui détrônera C/C++ sera celui qui ne fera absolument aucune supposition sur ce qui suffit aux besoins des programmeurs mais permettra le plus de choses possibles sans se poser de questions.









HarmattanBlow a écrit :



Le problème ne réside pas dans les templates, le problème réside dans le fait de devoir avoir recours à des templates pour émuler des comportements qui sont bien mieux pris en charge autrement par d’autres langages. Ces langages ont pourtant des équivalents aux templates.







C’est peu de dire que les Templates ne sont pas la chose la plus heureuse que le C++ ait apporté.



En même temps, je ne suis pas totalement convaincu que les autres langages aient la solution ultime.



Par exemple, j’aime assez l’idée de la méta programmation pour répondre à certains problèmes.










lysbleu a écrit :



Ce dont tu me parles, c’est d’élégance et oui, la programmation fonctionnelle est plus élégante que la programmation objet, ce depuis 1958.





Au passage : ce n’est pas une question de prog fonctionnelle contre objet (Rust est un langage objet), mais de les faire travailler ensemble. Le C++ se voulait multiparadigme (voir le document de propagande nommé C++ FAQ), car c’est LA bonne décision.



Mais il ne l’est plus en ne supportant que les paradigmes objets et procédural. Support ridicule du paradigme fonctionnel (les lambdas ne suffisent pas, il faudrait entre autres des itérateurs standalone et non pas appariés, des futurs, etc), pas de support des paradigmes événementiel, réactif, inductif, grammatical, par contrainte, etc.



Un bon langage moderne doit offrir des paradigmes adaptés aux différents modes cognitifs humains. Moins de code, moins de bogues.







sr17 a écrit :



C’est peu de dire que les Templates ne sont pas la chose la plus heureuse que le C++ ait apporté.



En même temps, je ne suis pas totalement convaincu que les autres langages aient la solution ultime.



Par exemple, j’aime assez l’idée de la méta programmation pour répondre à certains problèmes.





Je suis d’accord pour dire que la métaprogrammation est indispensable, et j’attends de tout langage moderne qu’il propose une solution efficace à ce problème (plutôt basé sur des manipulations de l’AST cela dit, et des attributs lorsque cela s’applique de classe/méthode).



Mais des choses comme la gestion de la mémoire devraient relever d’une prise en charge directe par le langage plutôt que par des templates. Tout simplement parce que ça prolifère partout dans le code.









HarmattanBlow a écrit :



Mais des choses comme la gestion de la mémoire devraient relever d’une prise en charge directe par le langage plutôt que par des templates. Tout simplement parce que ça prolifère partout dans le code.





Permets-moi de disconvenir respectueusement. La gestion de la mémoire c’est mon problème : à moi de trouver une ou des solutions en fonction de ce que j’ai à faire, et pitié pas de GC intégré / imposé surtout quand on fait du système ou de l’embarqué. Là on ne parle plus d’un langage de programmation mais d’un framework, et dans cette optique, le travail de programmation s’apparente plus à de la recherche documentaire (trouver la classe qui va bien pour ce qu’il faut faire), qu’à un véritable travail de conception en partant d’une feuille blanche.



Que ce genre de choses puissent être utiles pour certains types d’application et augmentent la productivité et la fiabilité, pourquoi pas. Mais généraliser et prétendre que c’est la bonne façon de faire et qu’elle est universelle, non. J’ai besoin d’être au plus près de la machine, de savoir ce qu’il va se passer au niveau des pipelines, des caches, l’anticipation des sauts.&nbsp; Le C est quasi-parfait dans ce rôle et tient depuis plus de quarante ans sans nécessiter de l’acharnement thérapeutique comme Cobol ou Fortran, il y a peut-être une raison…









francois-battail a écrit :



Permets-moi de disconvenir respectueusement. La gestion de la mémoire c’est mon problème





Il y a quiproquo, je ne dis pas que le langage doit la gérer automatiquement (*), simplement qu’il devrait offrir des sémantiques standard pour ça.



() A vrai dire je pense qu’un bon langage devrait gérer automatiquement les 90% de cas triviaux et nous laisser gérer le reste sans restriction. Par exemple Actor& signifierait pointeur brut ou comptage de référence au choix du compilateur (avec tooltip indiquant la solution retenue), Actor^ indiquerait une référence faible et Actor serait une gestion manuelle.





Que ce genre de choses puissent être utiles pour certains types d’application et augmentent la productivité et la fiabilité, pourquoi pas. Mais généraliser et prétendre que c’est la bonne façon de faire et qu’elle est universelle, non. J’ai besoin d’être au plus près de la machine, de savoir ce qu’il va se passer au niveau des pipelines, des caches, l’anticipation des sauts.



Et nous sommes d’accord là-dessus.









sr17 a écrit :



A l’heure actuelle, pour s’imposer sur ce terrain, il faut des arguments très solides et répondre à des besoins très forts.





Tu aurais pu dire exactement la même chose de NodeJS à ses débuts: ça ne marchera jamais, le JS c’est oldshcool, du monothread, on a déjà PHP, Ruby, etc… A l’heure actuelle, pour s’imposer sur ce terrain, il faut des arguments très solides et répondre à des besoins très forts”



On connaît la suite.



&nbsp;







&nbsp;

&nbsp;









HarmattanBlow a écrit :



Au passage : ce n’est pas une question de prog fonctionnelle contre objet (Rust est un langage objet), mais de les faire travailler ensemble. Le C++ se voulait multiparadigme (voir le document de propagande nommé C++ FAQ), car c’est LA bonne décision.



Mais il ne l’est plus en ne supportant que les paradigmes objets et procédural. Support ridicule du paradigme fonctionnel (les lambdas ne suffisent pas, il faudrait entre autres des itérateurs standalone et non pas appariés, des futurs, etc), pas de support des paradigmes événementiel, réactif, inductif, grammatical, par contrainte, etc.



Un bon langage moderne doit offrir des paradigmes adaptés aux différents modes cognitifs humains. Moins de code, moins de bogues.







Certes, il y a du bon sens.



Mais au fond, peut être aussi que beaucoup de programmeurs C/C++ ne cherchent justement pas à élever le niveau d’abstraction parce qu’ils se servent surtout de ce langage comme d’un langage de bas niveau.



Ils ne veulent pas plus d’abstraction, mais moins d’abstraction et plus de contrôle.



Dès lors qu’on élève le niveau d’abstraction, on perd vite le sens de ce qu’on écrit, ce qui aboutit rapidement à diminuer le niveau de maîtrise, ce qui aboutit rapidement à des soucis.



L’exemple, c’est le noyau Linux qui est écrit en c. Demandez à Linus ce qu’il pense de c++, vous ne serez pas déçu du voyage…



Beaucoup de programmes optimisés en C/C++ sont en réalité des programmes en C avec un peu d’objet. Et tout au plus un usage très léger des templates.



On peut deviner que pour beaucoup de programmeurs, ça leur suffit.





Je suis d’accord pour dire que la métaprogrammation est indispensable, et j’attends de tout langage moderne qu’il propose une solution efficace à ce problème (plutôt basé sur des manipulations de l’AST cela dit, et des attributs lorsque cela s’applique de classe/méthode).





Oui, pour qu’on puisse en faire des choses puissantes, il faut une forme d’interaction avec le compilateur.



Le problème est d’arriver à le faire de manière suffisamment simple pour que le code reste lisible.





Mais des choses comme la gestion de la mémoire devraient relever d’une prise en charge directe par le langage plutôt que par des templates. Tout simplement parce que ça prolifère partout dans le code.





En même temps, dans ce langage, quand on l’exploite pour ses performances, on privilégie souvent une gestion fine et personnalisée de la mémoire. Cela peut aboutir à des gains de performances importants, donc des choses qu’on cherche à maîtriser.



Après, comme on dit, un avantage entraîne un inconvénient. On peut pas tout avoir…



A noter d’ailleurs qu’en C++ on peut programmer beaucoup de choses, même du bound checking…









sr17 a écrit :



[…]

Demandez à Linus ce qu’il pense de c++, vous ne serez pas déçu du voyage…

[…]





Ah non, les enfants écoutent <img data-src=" />









sr17 a écrit :



Mais au fond, peut être aussi que beaucoup de programmeurs C/C++ ne cherchent justement pas à élever le niveau d’abstraction parce qu’ils se servent surtout de ce langage comme d’un langage de bas niveau.



Ils ne veulent pas plus d’abstraction, mais moins d’abstraction et plus de contrôle.





Les programmeurs qui ne veulent pas d’abstraction font du C. Ceux qui veulent de l’abstraction font du C++. Le problème de C++, c’est que plein de gens en font n’importe comment car c’est ce qui est mal enseigné à l’école (c’est d’ailleurs le seul argument censé de Linus quand il critique C++ : rester sur C élimine une partie des mauvais programmeurs).



&nbsp;





sr17 a écrit :



Dès lors qu’on élève le niveau d’abstraction, on perd vite le sens de ce qu’on écrit, ce qui aboutit rapidement à diminuer le niveau de maîtrise, ce qui aboutit rapidement à des soucis.





L’abstraction sert à diminuer la complexité (= difficulté, ≠ complexité algorithmique) du problème. Donc au contraire, ça élimine des soucis.



Mais effectivement, il vaut mieux savoir comment ça marche en dessous si on ne veut pas faire n’importe quoi.









sr17 a écrit :



Mais au fond, peut être aussi que beaucoup de programmeurs C/C++ ne cherchent justement pas à élever le niveau d’abstraction parce qu’ils se servent surtout de ce langage comme d’un langage de bas niveau. Ils ne veulent pas plus d’abstraction, mais moins d’abstraction et plus de contrôle.





C’est une remarque intéressante à laquelle je réfléchirai.



Mais peut-être qu’il leur faut simplement des abstractions prévisibles et vérifiables, comme le modèle objet qu’ils utilisent à longueur de journée. Plus simplement je pense que c’est un problème d’expérience utilisateur (l’utilisateur étant le programmeur) plutôt que d’abstraction.





L’exemple, c’est le noyau Linux qui est écrit en c. Demandez à Linus ce qu’il pense de c++, vous ne serez pas déçu du voyage…



Je ne suis pas sûr que ce soit une bonne référence. ;)



Cela dit le C++ n’est pas fait pour travailler en mode kernel, il faut quelque chose de très primitif du fait de l’absence de mémoire virtuelle et du risque de page fault. A à ce niveau je ne vois que le C.



Cela dit le code en mode kernel devrait être le plus petit possible et pour tout le reste je ne vois vraiment aucune raison d’utiliser le C à part la religion.





En même temps, dans ce langage, quand on l’exploite pour ses performances, on privilégie souvent une gestion fine et personnalisée de la mémoire. Cela peut aboutir à des gains de performances importants, donc des choses qu’on cherche à maîtriser.



Comme je l’ai expliqué dans mon précédent message, je ne voulais pas dire que le langage devrait gérer la mémoire.



Peut-on créer des interfaces graphiques avec Rust ?








sr17 a écrit :



Justement, la loi de moore c’est fini depuis quelques temps déjà.



Pas vraiment, la loi de Moore a toujours cours à l’heure actuelle et devrait survivre encore quelques années. Elle ne porte pas sur la vitesse d’horloge des processeurs mais sur le nombre de transistors qu’ils contiennent et de ce côté là, ça continue toujours d’augmenter à toute vitesse. :p









Herbefol a écrit :



Pas vraiment, la loi de Moore a toujours cours à l’heure actuelle et devrait survivre encore quelques années. Elle ne porte pas sur la vitesse d’horloge des processeurs mais sur le nombre de transistors qu’ils contiennent et de ce côté là, ça continue toujours d’augmenter à toute vitesse. :p







La aussi, on va rapidement se heurter à un mur. Celui de la finesse de gravure. Et sinon, le mur de la dissipation thermique.



D’autres techno vont peut être apparaître. Mais on ne repoussera pas éternellement les choses.



Comme on dit, les arbres ne grimpent jamais jusqu’au ciel.



A tout cela, il faut ajouter qu’il est moins simple d’accélérer les programmes avec plus de transistor qu’en augmentant la fréquence.









HarmattanBlow a écrit :



Cela dit le C++ n’est pas fait pour travailler en mode kernel, il faut quelque chose de très primitif du fait de l’absence de mémoire virtuelle et du risque de page fault. A à ce niveau je ne vois que le C.





C’est une légende urbaine et une négation de la genèse de C++ que de dire ça. En fait, Stroustrup a conçu le langage C++ pour l’écriture d’un système d’exploitation.



BeOS a notamment entièrement été écrit en C++ (Haiku OS aussi, de fait).









white_tentacle a écrit :



Les programmeurs qui ne veulent pas d’abstraction font du C. Ceux qui veulent de l’abstraction font du C++. Le problème de C++, c’est que plein de gens en font n’importe comment car c’est ce qui est mal enseigné à l’école (c’est d’ailleurs le seul argument censé de Linus quand il critique C++ : rester sur C élimine une partie des mauvais programmeurs).







L’ennui, c’est qu’il est très facile de faire n’importe quoi avec C++. Cela dit, personnellement, je ne me cantonne pas à C, mais je pense sincèrement que Linus à raison dans le cadre de son noyau.





L’abstraction sert à diminuer la complexité (= difficulté, ≠ complexité algorithmique) du problème. Donc au contraire, ça élimine des soucis.



Mais effectivement, il vaut mieux savoir comment ça marche en dessous si on ne veut pas faire n’importe quoi.





L’abstraction n’élimine pas la complexité, elle la cache.



Dans certains cas, c’est un bien, dans d’autres c’est un mal.



En gros, ça dépends de ce que tu fait…










HarmattanBlow a écrit :



Cela dit le code en mode kernel devrait être le plus petit possible et pour tout le reste je ne vois vraiment aucune raison d’utiliser le C à part la religion.





Arghh ! Je me suis auto-radicalisé à l’insu de mon plein gré et à cause d’Internet.

Quand tu as une volumétrie monstrueuse (vraiment monstrueuse), quand des portions de code sont exécutées des centaines de milliard de fois, que gratter 100ns à un endroit se traduit par un gain de 10 minutes au total, j’ai plutôt tendance à penser que choisir autre chose que le C (et l’assembleur) relèverait du dogmatisme (ou de la religion d’ailleurs).

À ce niveau là, comme l’a dit sr17, l’abstraction on s’en tape, on peut très bien en faire en C sous une forme satisfaisante et surtout contrôlable. Et désolé, mais il y a beaucoup d’applications - qui ne concernent pas directement le grand public - où c’est un « mal » nécessaire voire indispensable.









white_tentacle a écrit :



C’est une légende urbaine et une négation de la genèse de C++ que de dire ça. En fait, Stroustrup a conçu le langage C++ pour l’écriture d’un système d’exploitation.







Il rêvait bien le bonhomme…





BeOS a notamment entièrement été écrit en C++ (Haiku OS aussi, de fait).





Ca ne veut pas dire grand chose en soi de dire que c’est du C++. Suivant le mix de features utilisées, ça peut tout changer…



J’ai déjà écrit du C++ assez proche du matos. Donc oui, c’est possible. Ca demande juste de très bien savoir ce qu’on fait.









white_tentacle a écrit :



C’est une légende urbaine et une négation de la genèse de C++ que de dire ça. En fait, Stroustrup a conçu le langage C++ pour l’écriture d’un système d’exploitation.





Ce n’est pas une légende urbaine : quand tu réalises un appel de méthode virtuelle, que tu lèves une exception ou que tu utilises les RTTI tu demandes implicitement au processeur de lire une zone mémoire distante, généralement située dans une autre page mémoire.



En mode utilisateur ça ne pose pas de problème : si la page en question n’est pas chargée dans la mémoire le noyau intercepte la faute de page et procède au chargement. Mais il ne peut pas en faire de même pour son propre code, tout doit être chargé explicitement, ce qui ne sera pas forcément le cas lors de la réponse à un IRQ. Et là c’est le BSOD.



Donc, oui, tu peux utiliser le C++ si en substance tu n’utilises pas ce qui le différencie du C.









francois-battail a écrit :



Quand tu as une volumétrie monstrueuse (vraiment monstrueuse), quand des portions de code sont exécutées des centaines de milliard de fois, que gratter 100ns à un endroit se traduit par un gain de 10 minutes au total, j’ai plutôt tendance à penser que choisir autre chose que le C (et l’assembleur) relèverait du dogmatisme (ou de la religion d’ailleurs).





Faire du procédural en C++ donne exactement le même résultat. Et rien n’interdit de mixer de l’assembleur. Ce n’est pas un pêché (pour rester dans la métaphore religieuse) !



L’essentiel c’est quand même que pour toutes les parties de ton code où tu n’as pas à gratter sur les performances tu pourras bénéficier des avantages du C++ par rapport au C.



Mais bon, la formulation était sans doute abusive. D’ailleurs je vois au moins une bonne raison d’utiliser le C plutôt que le C++ : les plateformes dénuées de compilo C++.







Herbefol a écrit :



Pas vraiment, la loi de Moore a toujours cours à l’heure actuelle et devrait survivre encore quelques années. Elle ne porte pas sur la vitesse d’horloge des processeurs mais sur le nombre de transistors qu’ils contiennent et de ce côté là, ça continue toujours d’augmenter à toute vitesse. :p





Ces dernières années le nombre de transistors n’a doublé que tous les 3 ans environ. Tout comme la consommation électrique en pointe (joules par opération) qui elle aussi a souvent suivi la loi de Moore et a bien ralenti.



C’est fini.









francois-battail a écrit :



gratter 100ns à un endroit se traduit par un gain de 10 minutes au total, j’ai plutôt tendance à penser que choisir autre chose que le C (et l’assembleur) relèverait du dogmatisme (ou de la religion d’ailleurs) (…) il y a beaucoup d’applications - qui ne concernent pas directement le grand public - où c’est un « mal » nécessaire voire indispensable.






        10 minutes sur combien ? une heure ? Ca fait 17% de mieux.              






        Ok, mais optimiser:              

- ça ferait combien de coût en homme.jours puis en euros ?

- ça ferait combien de surcoût comparé à l'utilisation un langage de plus haut niveau (qui engendrera statistiquement moins de bugs, de choses à tester, à corriger, des développeurs/consultants plus facile à trouver sur le marché du travail, et donc aussi moins chers, etc) ?






        - et si à l'inverse on regardait le coût de l'upgrade du serveur pour récupérer ces 17% de temps d'exécution et donc parvenir au même résultat final, ça donnerait quel coût ?               






        - et au fur et à mesure que les volumes à processer augmenteront, comment évolueront en regard les coûts du hard ?              






        Voilà comment ça se passe dans la vraie vie, les questions qu'on se pose dans le monde pro.              






        Et une fois ces bases posées, il se trouve que les quelques k€ du prix d'un serveur sont très, très, très souvent bien moins chers que l'option "j'optimise à fond mon code". Et en conséquence, le bon chef de projet ne va pas opter pour l'optimisation du code, mais pour l'upgrade du serveur car c'est la voie optimum pour mener à bien ses objectifs en engageant le minimum de moyens et de risques.            






        Plus globalement, l'optimisation du code   n'est pas une fin en soi ; c'est juste un paramètre et une possibilité parmi la multitude   d'autres paramètres en jeu et les possibilités sur un projet. Et plus les choses avancent, plus la puissance dispo est accessible pour un (sur)coût faible, moins l'option "j'optimise mon code" est pertinente.     



&nbsp;









HarmattanBlow a écrit :



L’essentiel c’est quand même que pour toutes les parties de ton code où tu n’as pas à gratter sur les performances tu pourras bénéficier des avantages du C++ par rapport au C.





Sérieusement dans le C++, le seul truc qui m’intéressait c’était le premier + : des choses comme les paramètres par défaut par exemple, pour le reste, en objet, le polymorphisme c’est vrai qu’on peut faire des trucs concis et propres si la hiérarchie des classes a été bien conçue.

Mais j’ai du mal rétrospectivement à trouver un quelconque avantage significatif à C++ (je précise que j’ai pratiqué, enfin en C++ 1.0/2.0). Pour beaucoup, l’avantage c’est « l’écosystème » autour, des libs comme Boost. Donc si l’avantage c’est de pouvoir empiler des couches opaques à foison, C++ répond parfaitement au cahier des charges, le seul problème c’est que ça ne donne pas confiance et qu’un programmeur moyennement expérimenté est très vite noyé et ne maîtrise absolument plus ce qu’il fait, surtout en cas de reprise de la maintenance d’un programme.



Donc, j’ai tendance à regarder passer (et trépasser) les langages qui devraient me simplifier la vie, sachant qu’en C je peux quasiment tout faire, peut-être avec moins d’élégance et de concision mais avec plus de confiance et surtout plus de liberté.









JCDentonMale a écrit :



Peut-on créer des interfaces graphiques avec Rust ?



Pour le moment Rust n’inclut pas de système de GUI cross-plateforme dans sa bibliothèque standard.

Ceci dit, Rust peut techniquement s’interfacer avec les bibliothèques du système Win32API / Cocoa / Gtk+. Il y a des bindings pour ces bibliothèques disponibles sur crates.io.



Par contre, il n’y a pour le moment aucun projet de bibliothèque GUI cross-plateforme comme Qt ou wxWidget en Rust soit arrivé a un état mature.

Il y a bien une bibliothèque de GUI cross plateforme: Conrod&nbsp; mais elle est plutôt faite pour des appli graphiques.



Hum… pour le côté pro et intérêt c’est justement pour cela que c’est fait. T’as un programme qui met 81 heures à s’exécuter et un autre qui met 3h45, qu’est ce que tu préfères déployer chez un client (surtout si ça implique un déplacement et que le programme peut se casser la gueule si la machine du client n’est pas suffisamment musclée et refroidie) ?



Sur 23000 lignes de code, j’ai 300 lignes d’assembleur, tout le reste en C ; certes coder en assembleur c’est pas très productif surtout avec le temps passé à faire du profiling sur différents types de processeur, mais ce n’est pas significatif alors que le gain lui, est nettement perceptible.



Sur l’aspect bug, vu la quantité de données, le nombre de threads, de sections critiques, les pré-conditions et post-conditions et invariants, je vais être prétentieux mais le code est extrêmement fiable, ce n’est pas que du fait de l’outil mais de celui qui l’utilise, on a tendance à l’oublier.



Quant à utiliser une machine beaucoup plus puissante c’est aussi prévu mais ça viendra en plus. La petite différence avec un « bon » chef de projet, c’est que l’objectif n’est pas de pouvoir dire « j’ai tenu les délais et suis dans le budget alloué », mais plutôt d’innover et de rendre possibles de nouvelles choses. Ça se passe aussi (pas assez) comme ça dans le monde pro.








francois-battail a écrit :



T’as un programme qui met 81 heures à s’exécuter et un autre qui met 3h45






 2100% de gain, c'est un cas super représentatif de ce qu'on gagne en moyenne avec de l'optimisation de code, et donc qui permet de généraliser. <img data-src=">  

&nbsp;







francois-battail a écrit :



qu’est ce que tu préfères déployer chez un client






 Tout dépend des besoins du client.        

&nbsp;

Si l'objectif est que ça tourne en moins d'une semaine parce que de toute façon le client n'a pas besoin de plus, zéro action à prendre. Si ça doit tourner en 72h, je préfèrerai sans doute prendre l'option "81h" avec une upgrade des serveurs, et utiliser les marges réalisées sur ce point pour faire des choses en plus qui seront un vrai plus pour le client.

Si c'est 4h et que c'est in-atteignable avec un coût raisonnable avec une upgrade de la puissance dispo (ou la location de puissance de calcul au besoin), c'est l'option "optimisation du code" pour laquelle j'opterai, en ayant pris en compte tous les coûts cachés/risques que ça implique.

&nbsp;

A nouveau, le temps d'exécution n'est pas une finalité en soi, c'est une contrainte éventuelle si (et seulement si) ça correspond à un besoin de l'utilisateur.

&nbsp;

&nbsp;







francois-battail a écrit :



certes coder en assembleur c’est pas très productif






  Non seulement c'est peu productif, mais un projet c'est quelque chose qui se développe et se maintien dans le temps. Ca demande des compétences qu'on trouve moins facilement sur le marché du travail ; si c'est pour faire des bouts en assembleur qui mettront 3x plus de temps à maintenir, ou qui deviendront in-maintenable parce que le mec qui l'a écrit s'est barré de la boite et que je n'arrive plus à trouver sur le marché du dév. avec les compétences requises pour la maintenance (ou 3x plus cher), j'ai tout perdu.       






 Et le client, quand il me dira qu'il faut faire telle modif et que je serai contraint de lui répondre que c'est impossible, à ton avis, il en pensera quoi de ma presta sur le long terme ?       






 &nbsp;       







francois-battail a écrit :



je vais être prétentieux mais le code est extrêmement fiable, ce n’est pas que du fait de l’outil mais de celui qui l’utilise, on a tendance à l’oublier.






 En plus on a droit à un sur-homme qui ne fait jamais d'erreur. Je suis sûr que tu ne débogues jamais rien, que jamais tu n'as laissé passer le moindre defect en prod, voir même que tu n'as jamais besoin de déployer avant la release, vu que ton code est systématiquement parfait.       






 Et même en admettant ça: le jour où tu te barres de ta boite, ton employeur il fait quoi ?       











francois-battail a écrit :



l’objectif n’est pas de pouvoir dire « j’ai tenu les délais et suis dans le budget alloué », mais plutôt d’innover et de rendre possibles de nouvelles choses. Ça se passe aussi (pas assez) comme ça dans le monde pro.






 L'objectif c'est de répondre à un besoin sur le long terme. Optimiser, gagner du temps, etc... c'est uniquement pertinent si ça apporte une vraie valeur ajoutée au client. Et il s'avère qu'en règle générale, c'est rarement le cas.    





&nbsp;Et ça c’est bien trop souvent oublié par les techos, et sans doute la première source d’incompréhension entre les dev. (qui ont souvent une approche purement technique) et leur hiérarchie (qui a une approche projet: besoins, objectifs, efficience).

Les premiers ont souvent tendance à penser que les seconds se contentent de faire du médiocre au niveau qualité de code ; ce qu’ils ne comprennent pas c’est que les seconds veulent en fait surtout faire de l’optimum mais selon d’autres paramètres du projet que la seule qualité ou “beauté” du code.

&nbsp;









HarmattanBlow a écrit :



Ce n’est pas une légende urbaine : quand tu réalises un appel de méthode virtuelle, que tu lèves une exception ou que tu utilises les RTTI tu demandes implicitement au processeur de lire une zone mémoire distante, généralement située dans une autre page mémoire.



En mode utilisateur ça ne pose pas de problème : si la page en question n’est pas chargée dans la mémoire le noyau intercepte la faute de page et procède au chargement. Mais il ne peut pas en faire de même pour son propre code, tout doit être chargé explicitement, ce qui ne sera pas forcément le cas lors de la réponse à un IRQ. Et là c’est le BSOD.



Donc, oui, tu peux utiliser le C++ si en substance tu n’utilises pas ce qui le différencie du C.





La killer feature du C++ par rapport au C, c’est le RAII. Et ça ne nécessite ni RTTI (qui est désactivable), ni appels virtuels, ni exceptions.



Rien que pour ça, se passer de C++ dans un contexte noyau c’est du dogmatisme.



Bon, il y a certains aspects qui ne sont pas suffisamment explicites et c’est probablement de ma faute. Déjà je précise que mon patron c’est moi et que donc j’ai aussi en tête les contraintes commerciales.

&nbsp;

Les 2100% de gain par rapport à ce qui existe ne sont pas le seul fait de l’optimisation du code, mais avant tout de la conception, de l’architecture et le choix du bottom-up, tout cela est cohérent et permet de mettre un tour de vis sur l’optimisation parce qu’en bottom-up on commence par les tests unitaires - moment privilégié pour optimiser - et surtout ne plus avoir à se poser des questions après parce que ça rame.



Pour l’assembleur, certes, la portabilité en prend un coup, mais déjà des contraintes impliquent de travailler en 64 bits et par ailleurs une version strictement C du code assembleur peut être activée en recompilant. Simplement c’est un plus qui n’a pas coûté trop cher et qui apporte réellement quelque chose de perceptible.



Sur les bugs j’avais prévenu ;-) il y a surtout beaucoup de rigueur et des tests unitaires (encore une fois en bottom-up c’est presque par construction) ; bien sûr que j’ai eu des core dumps et que j’ai passé du temps dans des débugueurs, mais pas tant que ça par rapport à d’autres projets parce que je me prends pas d’un seul coup toutes les couches à la fois.&nbsp; Sur un jeu d’essai ridicule (moins de 0,05% des données à traiter) Valgrind dit ça :





==6199== HEAP SUMMARY:

==6199==&nbsp;&nbsp;&nbsp;&nbsp; in use at exit: 0 bytes in 0 blocks

==6199==&nbsp;&nbsp; total heap usage: 1,813,792 allocs, 1,813,792 frees, 786,799,125 bytes allocated

==6199==

==6199== All heap blocks were freed – no leaks are possible





Pourtant c’est du C et de l’assembleur avec des pointeurs partout et on peut quand même faire des choses très propres avec.

&nbsp;

Dans ce projet il ne s’agit pas simplement d’ajouter de la valeur, mais de créer de la valeur (en mode rupture), donc l’approche projet type corporate bullshit&nbsp; m’indiffère. Question d’objectif.








brazomyna a écrit :



L’objectif c’est de répondre à un besoin sur le long terme. Optimiser, gagner du temps, etc… c’est uniquement pertinent si ça apporte une vraie valeur ajoutée au client. Et il s’avère qu’en règle générale, c’est rarement le cas.



&nbsp;Et ça c’est bien trop souvent oublié par les techos, et sans doute la première source d’incompréhension entre les dev. (qui ont souvent une approche purement technique) et leur hiérarchie (qui a une approche projet: besoins, objectifs, efficience).

Les premiers ont souvent tendance à penser que les seconds se contentent de faire du médiocre au niveau qualité de code ; ce qu’ils ne comprennent pas c’est que les seconds veulent en fait surtout faire de l’optimum mais selon d’autres paramètres du projet que la seule qualité ou “beauté” du code.

&nbsp;





Pour certaines demandes, l’optimisation est à l’origine même de la demande. Il s’agit le plus souvent de programme créé il y a 10 ans qui mettent 30min à tourner parce que le code de l’époque suivait le fleuve de l’inspiration du poète insouciant. 10 ans après les intérêts du beau code et du portefeuille se rejoignent.



Autre cas de figure : quand l’équipe à l’origine du projet récupère la maintenance. Là bizarrement, la propreté du code devient prioritaire puisque les intérêts de tout le monde s’y retrouve (sauf le client qui paie une fortune des fonctionnalités mises en commentaires <img data-src=" /> ) .



Avec un lien ça aide, donc le voici RAII. Du coup je réalise que je fais du RAII dans mon code C mais ça s’appelle un pool et il y a aussi des destructeurs associés, donc le côté killer feature en tant que propriété intrinsèque et exclusive de C++ m’échappe.



(edit)Argh : affreuse faute(/edit)








francois-battail a écrit :



Avec un lien ça aide, donc le voici RAII. Du coup je réalise que je fais du RAII dans mon code C mais ça s’appelle un pool et il y a aussi des destructeurs associés, donc le côté killer feature en temps que propriété intrinsèque et exclusive de C++ m’échappe.





Tu ne peux pas faire du RAII en C car tu ne peux pas faire du RFID (ressource finalization is destruction) car il n’y a pas de destructeur.



En C, tu es obligé de faire quelque chose du genre :



FILE f1, f2;

f1 = fopen(“blabla.txt”);

f2 = fopen(“blabla2.txt”);

if(!f1)

{

&nbsp;&nbsp;&nbsp; printf(“file 1 error”);

&nbsp;&nbsp;&nbsp; result = err;

&nbsp;&nbsp;&nbsp; goto cleanup;

}

if(!f2)

{

&nbsp;&nbsp;&nbsp; printf(“file2 error”);

&nbsp;&nbsp;&nbsp; result = err;

&nbsp;&nbsp;&nbsp; goto cleanup;

}

// mon traitement

cleanup:

if(f1)

&nbsp;&nbsp; fclose(f1);

if(f2)

&nbsp;&nbsp; fclose(f2)

return result;



&nbsp;

En C++, ta vas faire :

fstream f1(“blabla.txt”);

if(!f1)

{

&nbsp;&nbsp;&nbsp; cout &lt;&lt; “file 1 error”;

&nbsp;&nbsp;&nbsp; return err;

}

if(!f2)

{

&nbsp;&nbsp; cout &lt;&lt; “file 2 error”;

&nbsp;&nbsp; return err;

}

// mon traitement

return result; // f1 et f2 sont forcément fermés ici, les ressources libérées par le destructeur



Et là, on parle d’un cas simple de gestion d’erreur -&gt; le code C++ est déjà deux fois plus court. Globalement, la gestion de la durée de vie des objets en C++ fait que la gestion des ressources est largement plus aisée et concise qu’en C.



Désolé mais je ne programme pas comme ça en C, chez moi ça donne ça :





FILE f1 = NULL , f2 = NULL;

pool = alloc_pool (POOL_DEFAULT) ;

if (! pool)

&nbsp;&nbsp;&nbsp; return -1 ;

f1 = fopen (“blabla.txt”, “r”) ;

f2 = fopen (“blabla2.txt”, “r”) ;

pool_push_dtor (pool, close, (void *) f1) ;

pool_push_dtor (pool, close, (void *) f2) ;

res = …

// Erreur ou pas, on libère toutes les ressources qui sont dans la portée et associées au pool

reset_pool (pool) ;

free (pool) ; &nbsp;

return res ;





Un seul point de sortie (sauf erreur triviale détectée avant l’allocation de ressource) et un minimum de code explicite, il faut juste un peu de rigueur, mais nul besoin d’empiler des gotos, et dans le pool on peut mettre bien sûr la mémoire allouée mais aussi des fonctions spécifiques appelées avec un pointeur sur le contexte.








warfie a écrit :



Pour certaines demandes, l’optimisation est à l’origine même de la demande. Il s’agit le plus souvent de programme créé il y a 10 ans qui mettent 30min à tourner parce que le code de l’époque suivait le fleuve de l’inspiration du poète insouciant.





Dans ce cas l’optim est évidemment pertinente. Ca reste quand même très rare ce genre de demande. Dans la plupart des cas, l’amélioration des capacités du hardware a largement compensé l’éventuelle évolution du volume à traiter.



De mon expérience, le cas de l’optim’ après coup est exceptionnel comparé au nombre de demandes pour migrer/refaire une application existante pour l’adapter à un nouvel environnement, de nouvelles technos (ou tout simplement des technos toujours maintenues), de nouveaux besoins, etc…



Et dans le cas n°1 comme n°2, l’intérêt d’un code lisible, sans aller chercher le super spécialiste méga-low-level difficile à trouver et payé à prix d’or (l’ancien s’étant&nbsp; bien entendu barré de la boite entre temps ou est parti à la retraite), il se fait subitement sentir.



&nbsp;









francois-battail a écrit :



chez moi ça donne ça :





Bref, t’as (ré)inventé une collection de destructeurs qu’il ne faut pas oublier d’appeler en fin de fonction sous peine de fuite de mémoire.

&nbsp;

&nbsp;



Et tu ne t’affranchis pas du « single exit » car il faut appeler tes destructeurs explicitement.



Question conne : pool_push_dtor ne peut pas échouer ? (pas d’allocation dynamique dedans, tu alloues par défaut suffisamment d’espace pour X destructeurs ?)


Pas exactement dans la mesure où le pool prend en charge nativement les allocations mémoires, j’ai juste ajouté la possibilité d’enregistrer dans la foulée des destructeurs pour faire des choses plus spécifiques si besoin est. Après c’est un appel effectivement explicite, mais il n’y a pas à gérer de multiples points de sortie donc à l’usage ce n’est pas franchement contraignant.

Enfin, pour l’allocation mémoire, contrairement à un compilateur qui ferait automatiquement des delete unitaires sur les objets, je travaille sur des blocs de 40 Mo ou de 16 Mo ce qui fait que je n’ai pas à faire une myriade d’appels systèmes sous mutex quand je détruis un pool, mine de rien ça se sent dans un programme qui fait des milliards d’allocations / désallocations.


Bonne question. Toute allocation mémoire dans le pool est testée au niveau le plus bas et donne lieu à fatal(), pas de récupération d’erreur possible, mais j’ai un mécanisme de régulation de la consommation mémoire avec seuil qui fait que quand la queue principale (en fait c’est plus compliqué) est trop remplie à mon goût, la production de données est interrompue le temps que la queue se vide.

Donc push_pull_dtor() alloue une cellule de liste chaînée dans le pool et peut très bien échouer mais comme, généralement j’arrête de continuer d’allouer de la mémoire lorsque j’ai atteint 20 Go (sur 32 Go + 32 Go de swap) et que j’attends de pouvoir recycler la mémoire qui passe en free list, ce cas de figure ne s’est jamais présenté.



Pour l’aspect explicite, ça demande un peu de rigueur, mais c’est vrai de chaque ligne de code, non ;-) ?


En tout cas, c’est intéressant, je n’ai jamais rencontré de code C qui mette cette technique en avant. La plupart que j’ai vus, quand ils géraient à peu près correctement les erreurs, avaient recours au goto cleanup.


À vrai dire moi non plus ! Le besoin est né parce que j’avais besoin de fiabilité et que malloc() / free() ne me convenaient pas et comme l’outil est permissif, l’implémentation était facile. Après j’ai ajouté des fioritures comme la possibilité d’enregistrer des destructeurs, non pas que je rechigne à utiliser des gotos (je fais même pire : setjmp() / longjmp() <img data-src=" />), mais plutôt pour créer une sémantique au dessus de C qui me convienne pour mon application.

Maintenant, je ne vais pas prétendre que c’est la panacée et que c’est le truc qui va sauver des chatons, mais dans mon cas j’arrive à un bon résultat, le code est plutôt propre et surtout très fiable, au final c’est ce qui compte et si ça fait fumer les processeurs, c’est encore mieux !








francois-battail a écrit :



À vrai dire moi non plus ! Le besoin est né parce que j’avais besoin de fiabilité et que malloc() / free() ne me convenaient pas et comme l’outil est permissif, l’implémentation était facile.





Il parlait du fait d’enregistrer le code de nettoyage dans une file à appeler à la fin de la méthode. Si tu t’en sers également pour les allocations alors c’est ce qu’on appelle une région.



Les régions sont assez courantes, en particulier tous les moteurs de jeux vidéos les utilisent pour les allocations temporaires au cours d’une image, justement pour éviter malloc. Une allocation se résume dès lors, en substance, à une simple addition la plupart du temps, et à la fin de l’image on fait simplement repartir le pointeur depuis le début.



Cela dit en général on ne les utilise pas pour le nettoyage en fin de méthode, on privilégie plutôt d’autres techniques dans des langages plus élevés (try finally / RAII). Mais j’ai déjà vu ça une fois justement dans un moteur de JV, pour enregistrer depuis les sous-fonctions des callbacks à exécuter à la fin de l’image.



Vous connaissez un bon éditeur pour apprendre le rust ? ( j’aimerais changer d’air car j’utilise depuis longtemps vim )


Pour le moment aucun éditeur n’est au poil, Mais il y a des plugin qui permettent d’avoir la gestion de la coloration syntaxique et parfois un support partiel de l’auto-completion pour pas mal d’éditeurs/IDE.



Je cite ceux qui me reviennent en tête mais il doit y en avoir d’autres :




&nbsp; appellerons-nous les correctifs rust-in ?


<img data-src=" />