et moi dans le tas!!!
Kevin Kofler
: Ben oui, c'est de leur faute si les MFC sont incompatibles avec le standard ISO C++98!
BeOS et AtheOS restent nettement plus lourds que MenuetOS qui est écrit en assembleur, ou la distribution Linux de LinuxASM (noyau en C avec un peu d'assembleur, utilitaires en assembleur).
Mais plein de trucs sont faits avec des templates alors que des macros suffisent. Exemple type: fonction min pour types quelconques. Et ne me viens pas avec les side-effects: ce n'est pas de ma faute que les comités C et C++ ont refusé de standardiser les "statement expressions" de GCC qui sont la solution optimale à ce problème, nettement plus simple que ces !@#$%^&*() de templates.
#define min(a,b) ({ typeof (a) _a = (a); typeof (b) _b = (b); _a < _b ? _a : _b; })
template<typename T> inline const T& min(const T& a, const T& b) { return a < b ? a : b; }
template<> inline const MyType& min(const MyType& a, const MyType& b) { ... }
Euh, tu parles de quoi là? CGEN? Si oui, vu que c'est du Scheme (beurk!), c'est normal que personne n'ose y toucher...
Thibaut
: Si GTC acceptait les classes, les utiliseriez-vous ?
nitro
:Kevin KoflerLeur compilateur C++ aussi, au début. Et alors, c'est leur OS, ils en font ce qu'ils veulent.
: Ben oui, c'est de leur faute si les MFC sont incompatibles avec le standard ISO C++98!
Tout le monde ne release pas des programmes parfaits du premier coup.
BeOS et AtheOS restent nettement plus lourds que MenuetOS qui est écrit en assembleur, ou la distribution Linux de LinuxASM (noyau en C avec un peu d'assembleur, utilitaires en assembleur).C'est quoi l'interet d'un OS comme MenuetOS sur lequel on ne peut utiliser aucun logiciel existant ?
De plus la différence on la voit quasiment pas sur les machines récentes.
Et puis écrire un assembleur ça fait beaucoup plus de lignes de code, et c'est un enfer à maintenir, sans parler du fait que ça ne tourne que sur une seule plateforme.
Mais plein de trucs sont faits avec des templates alors que des macros suffisent. Exemple type: fonction min pour types quelconques. Et ne me viens pas avec les side-effects: ce n'est pas de ma faute que les comités C et C++ ont refusé de standardiser les "statement expressions" de GCC qui sont la solution optimale à ce problème, nettement plus simple que ces !@#$%^&*() de templates.
Ok tu prends un cas extrême, on y va, voici la version macro :#define min(a,b) ({ typeof (a) _a = (a); typeof (b) _b = (b); _a < _b ? _a : _b; })
voici la version template :template<typename T> inline const T& min(const T& a, const T& b) { return a < b ? a : b; }
1ere constatation : gcc produit exactement le même code pour les deux.
2eme constatation : la version template est plus lisible (donc plus facile à maintenir), car c'est une fonction C++ normale, pas besoin d'extension GNU, de variables avec des underscores (qui vont collisionner en plus si on appelle min(_a, x)), et pas de parenthèses superflues autour des paramètres.
3eme constatation : la version template bénéficie d'un des avantages du typage, à savoir un message d'erreur clair en cas d'erreur de typage.
- version template : "error: no matching function for call to `min(st&, int)'" où il y a clairement la fonction et les types impliqués ;
- version macro : "error: invalid operands to binary <" alors que sur la ligne concernée il n'y a même pas de '<'.
4eme constatation : la version template bénéficie d'un avantage que la version macro ne peut pas faire, c'est la spécialisation en fonction du type de données. Effectivement, si dans mon programme j'utilise des types de données particuliers dont la fonction min peut être codée de manière beaucoup plus efficace (par exemple les entiers de l'intervale [0,1])
, inutile d'implémenter une fonction min2, comme on le ferait avec les macros, on peut toujours utiliser la fonction min en la spécialisant.
De même pour étendre la fonction min à des types non arithmétiques comme les structures.
Voilà à peu près ce que j'en pense, si tu as des constatations qui vont dans le sens des macro n'hésites pas.
Euh, tu parles de quoi là? CGEN? Si oui, vu que c'est du Scheme (beurk!), c'est normal que personne n'ose y toucher...Je parlais plus précisement de l'écriture de "peephole optimizers" pour les back-end, désolé. cf. define_peephole et define_peephole2. En gros, la nouvelle méthode est dispo depuis 4 ans deja, et permet l'application successive de plusieurs passes de peephole (donc plus d'optimisation), ce que ne permet pas la première. Pourtant, seulement environ 15% des back-ends l'utilisent exclusivement à l'heure actuelle.
Kevin Kofler
: Je ne suis pas d'accord! Les standards ISO ne sont pas là pour que M$ fasse ce qu'ils veulent!
Certes, mais eux ils s'en fichent toujours du caractère non-standard des MFC, ils le font même exprès pour empêcher à leurs concurrents de les utiliser avec leurs compilateurs.
C'est quoi l'interet d'un OS comme MenuetOS sur lequel on ne peut utiliser aucun logiciel existant ?
Sur BeOS non plus...![]()
AtheOS est quand-même à peu près compatible avec POSIX, mais BeOS carrément pas.
Reviens quand tu auras mis BeOS sur une disquette et quand elle sera toujours à moitié vide.
Et puis écrire un assembleur ça fait beaucoup plus de lignes de code, et c'est un enfer à maintenir, sans parler du fait que ça ne tourne que sur une seule plateforme.
C'est pour ça que le C (pas le C++) existe.
1ere constatation : gcc produit exactement le même code pour les deux.
Pas toujours. Regarde un peu dans Bugzilla, il y a pas mal de problèmes avec les templates.
2eme constatation : la version template est plus lisible (donc plus facile à maintenir), car c'est une fonction C++ normale, pas besoin d'extension GNU, de variables avec des underscores (qui vont collisionner en plus si on appelle min(_a, x)), et pas de parenthèses superflues autour des paramètres.C'est subjectif. Pour moi, la macro est au moins aussi claire que le template. Et même pour le compilateur, les macros sont plus "lisibles" (faciles à parser), les templates causent plein de conflits de parsing.
3eme constatation : la version template bénéficie d'un des avantages du typage, à savoir un message d'erreur clair en cas d'erreur de typage.Message d'erreur chinois typique du C++.
- version template : "error: no matching function for call to `min(st&, int)'" où il y a clairement la fonction et les types impliqués ;
- version macro : "error: invalid operands to binary <" alors que sur la ligne concernée il n'y a même pas de '<'.Très clair comme erreur. Comparaisons entre 2 types incompatibles, donc opérandes invalides pour un opérateur de comparaison. Là, je sais tout de suite ce qui ne va pas.
4eme constatation : la version template bénéficie d'un avantage que la version macro ne peut pas faire, c'est la spécialisation en fonction du type de données. Effectivement, si dans mon programme j'utilise des types de données particuliers dont la fonction min peut être codée de manière beaucoup plus efficace (par exemple les entiers de l'intervale [0,1])
Euh, il n'y en a pas beaucoup là.
#define min(a,b) ({ typeof (a) _a = (a); typeof (b) _b = (b); (__builtin_types_compatible_p(typeof(_a),mastruct) && __builtin_types_compatible_p(typeof(_b),mastruct))? (_a.value && _b.value) : (_a < _b ? _a : _b;) })
Je posterai un exemple de ld-tigcc quand je serai de retour chez moi. Non seulement, les macros sont utilisées comme des templates et ça marche très bien, mais on fait aussi du Item ## s pour construire un pluriel. Bonne chance pour faire ça avec un template.
Certains peepholes sont mieux exécutés tout à la fin, donc en define_peephole.
Thibaut
: J'ai tapé make comme ils disent mais ça déconne. J'ai DevC++. Je suppose qu'il faut une distribution précise de GCC. Laquelle ?
Kevin Kofler
:BeOS et AtheOS restent nettement plus lourds que MenuetOS qui est écrit en assembleur, ou la distribution Linux de LinuxASM (noyau en C avec un peu d'assembleur, utilitaires en assembleur).C'est quoi l'interet d'un OS comme MenuetOS sur lequel on ne peut utiliser aucun logiciel existant ?
Sur BeOS non plus...![]()
AtheOS est quand-même à peu près compatible avec POSIX, mais BeOS carrément pas.
De plus la différence on la voit quasiment pas sur les machines récentes.
Reviens quand tu auras mis BeOS sur une disquette et quand elle sera toujours à moitié vide.![]()
3eme constatation : la version template bénéficie d'un des avantages du typage, à savoir un message d'erreur clair en cas d'erreur de typage.
- version template : "error: no matching function for call to `min(st&, int)'" où il y a clairement la fonction et les types impliqués ;
Message d'erreur chinois typique du C++.
On peut aussi avec une macro:
#define min(a,b) ({ typeof (a) _a = (a); typeof (b) _b = (b); (__builtin_types_compatible_p(typeof(_a),mastruct) && __builtin_types_compatible_p(typeof(_b),mastruct))? (_a.value && _b.value) : (_a < _b ? _a : _b;) })
Vive le GNU C!![]()
On peut aussi utiliser __builtin_constant_p si tu ne veux pas de structure: __builtin_constant_p((a==0)||(a==1))&&((a==0)||(a==1)).
Là aussi, __builtin_types_compatible_p est ce que tu cherches.Cf. l'exemple ci-dessus.