OVH Cloud OVH Cloud

[C99] gcc et fonctions 'inline'

33 réponses
Avatar
JKB
Bonjour à tous,

Je suis en train de modifier les sources d'un programme pour le
rendre compilable par un compilo C99 (une en-tête moisie de Solaris
demande C99 dès que _POSIX_C_SOURCE est défini avec une valeur
supérieure ou égale à 200112L, contrairement aux autres systèmes que
j'ai sous la main). J'ai eu quelques problèmes avec 'inline' mais là, ça
compile correctement.

En revanche, j'ai un tas de warnings du type :

rpl.conv.h:2811: warning: inline function ‘librpl_write_atomic’ declared
but never defined
rpl.conv.h:2809: warning: inline function ‘librpl_read_atomic’ declared
but never defined
rpl.conv.h:2589: warning: inline function ‘librpl_scrutation_injection’
declared but never defined
rpl.conv.h:2477: warning: inline function ‘librpl_analyse_instruction’
declared but never defined

et j'en passe qui me polluent allègrement les logs de compilation.
Ça ne correspond pas à une erreur, j'ai un fichier d'en-tête qui
reprend toutes les fonctions 'inlinées', fonctions qui ne sont pas
utilisées dans tous mes fichiers de sources.

Je viens de lire (plusieurs fois) la doc de gcc et je n'ai pas
trouvé d'option empêchant l'affichage de ce genre de warning.
J'aimerais autant ne pas voir ces warnins qui ne sont pas des
erreurs pour mieux voir ce qui pourrait poser problème...

Une idée ?

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.

10 réponses

1 2 3 4
Avatar
Antoine Leca
Marc Espie écrivit :
In article <hs9172$jkd$,
Antoine Leca wrote:
JKB écrivit :
une en-tête moisie de Solaris demande C99 dès que _POSIX_C_SOURCE
est défini avec une valeur supérieure ou égale à 200112L,


Cela paraît sain, si tu donnes cette valeur c'est que tu prétends
utiliser la norme Posix de 2001, qui sous-entend l'utilisation d'un
compilo C99...



Ces defines, ca a toujours ete la merde.



C'est pas faux, cela.

le principal objectif de ces defines, c'est de dedouaner ton vendeur



Possible. Mais à mon sens, c'est encore plus <censuré> : j'ai bien
l'impression que l'objectif est double : d'un côté dédouaner de
l'utilisation des anciens outils (« c'est plus supporté ») et d'un autre
côté de forcer la migration vers les nouveaux outils : à défaut
d'argument techniques reconnus, l'obsolescence imposée par les comités,
c'est d'un pratique ! (Et si la migration peut être payante ce serait le
top; mais bon, on dirait que l'environnement déteint sur les idées...)


Cependant, la position de JKB qui utilise -D_POSIX_C_SOURCE 0112 et se
plaint subséquemment de devoir utiliser C99 est ÀMHA intenable : soit tu
mets-à-jour en augmentant la constante, et le comité POSIX (pas C, qui a
vu cela d'un mauvais œil) t'obliges à passer à C99 ; soit tu ne veux pas
faire la migration, mais alors on ne peut pas réclamer le beurre et
l'argent du beurre, c'est-à-dire que le résultat est bancal, et va
probablement réclamer de la micro-chirurgie de portabilité...


Pratiquement personne ne programme
avec une norme precise, et les divers systemes ont toujorus des petites
differences d'interpretation de l'un a l'autre.



Oui. Cependant, il faut comparer par rapport à ce qu'il y avait avant ;
et les normes C et POSIX représentent quand même de gros progrès, il y a
un gros pan des bases qui sont maintenant communes à tout le monde.


Du coup, on se retrouve a dire qu'on est posix, mais pas xdg-chose, et
tutti-quanti, et generalement ca foire dans des gros projets sur des entetes
qui ne sont pas compatibles avec eux-memes (ou presque).



Oui. Avant, cela foirait _aussi_ sur les petits projets !
Et sur le long terme, les projets qui font leurs nids, ce sont ceux qui
soit imposent leur norme, soit s'alignent sur le moins-disant (ANSI ou
POSIX:96); je n'arrive pas à décider si POSIX:2001 (donc y compris mmap,
sockets et pas mal d'autres trucs) prend du poids et donc domine XPG>4 ?


Et je pourrais un peu raler aussi sur le comite de normalisation C qui a
fait C99 (et sa future suite) un peu tout seul dans son coin, en ignorant
superbement les magnifiques problemes de compatibilite que ca allait poser
avec C++...



D'abord, cela n'a pas grand chose à voir : ils étaient aussi très seuls
avec bien peu de gens qui voulaient mettre la main à la pâte (tous les
vendeurs s'intéressant à C++ et surtout, à l'époque, à Java) ; ensuite,
le résultat est évident, C99 n'a pas, et de très loin, le poids de C90
(et le comité souhaite que C1x corrige le tir, mais c'est un souhait) :
en conséquence, la bonne attitude, c'est de l'ignorer (dans la mesure du
possible); ce qui, si on revient au problème de JKB, revient à ne pas
utiliser POSIX:2001... et je n'ai pas l'impression d'être le seul avec
cette idée-là en tête.


Par ailleurs, à propos des fameux problèmes de compatibilité C++ :
je sais qu'il y a un binz avec inline (que je n'ai pas compris dans la
pratique; l'argument qui dit « tu peux écrire en C légal du code qui est
stupide _et_ qui ne respecte pas la norme C++ » est aussi intelligent
que de vouloir à tout prix utiliser class comme nom de type global...)
Mais au-delà je n'ai toujours pas compris où était le(s) problème(s) ?
Qui a des pointeurs (raisonnables) ?

Quant à dire que les ajouts de C99 pèsent sur la compatibilité, c'est
aussi une tautologie : chaque modification qui précise un point d'une
norme quelle qu'elle soit, constitue pour une partie des précédents
utilisateurs une régression : l'idée étant que cette partie soit la plus
petite possible, et que dans l'autre plateau de la balance la
contrepartie soit la plus grande possible : il en est ainsi de l'idée
comme quoi long dev[r]ait désigner le plus grand type entier, qui
découle de la rédaction de K&R puis de C89 (sans que ce soit l'intention
initiale) et que certains ont mis en avant pour réfuter C99, alors même
que dans la pratique long joue dans la migration 32/64 bits le même rôle
que jouait int dans la migration 16/32... Et si long ne vaut pas 64 bits
sur (toutes) les machines 64 bits, cela ne vient pas de l'empressement
du comité C mais au contraire, ils furent mis devant le fait accompli.


Antoine
Avatar
JKB
Le 10-05-2010, ? propos de
Re: [C99] gcc et fonctions 'inline',
Antoine Leca ?crivait dans fr.comp.lang.c :
Marc Espie écrivit :
In article <hs9172$jkd$,
Antoine Leca wrote:
JKB écrivit :
une en-tête moisie de Solaris demande C99 dès que _POSIX_C_SOURCE
est défini avec une valeur supérieure ou égale à 200112L,


Cela paraît sain, si tu donnes cette valeur c'est que tu prétends
utiliser la norme Posix de 2001, qui sous-entend l'utilisation d'un
compilo C99...



Ces defines, ca a toujours ete la merde.



C'est pas faux, cela.

le principal objectif de ces defines, c'est de dedouaner ton vendeur



Possible. Mais à mon sens, c'est encore plus <censuré> : j'ai bien
l'impression que l'objectif est double : d'un côté dédouaner de
l'utilisation des anciens outils (« c'est plus supporté ») et d'un autre
côté de forcer la migration vers les nouveaux outils : à défaut
d'argument techniques reconnus, l'obsolescence imposée par les comités,
c'est d'un pratique ! (Et si la migration peut être payante ce serait le
top; mais bon, on dirait que l'environnement déteint sur les idées...)


Cependant, la position de JKB qui utilise -D_POSIX_C_SOURCE 0112 et se
plaint subséquemment de devoir utiliser C99 est ÀMHA intenable : soit tu
mets-à-jour en augmentant la constante, et le comité POSIX (pas C, qui a
vu cela d'un mauvais œil) t'obliges à passer à C99 ; soit tu ne veux pas
faire la migration, mais alors on ne peut pas réclamer le beurre et
l'argent du beurre, c'est-à-dire que le résultat est bancal, et va
probablement réclamer de la micro-chirurgie de portabilité...



Je ne me plains pas d'utiliser C99. À l'extrême limite, je m'en
contrefiche. Mon problème est sur un point de détail du
fonctionnement de inline résolu depuis. Ce que je trouve très con,
c'est que les différents fichiers d'en-têtes proposés par les
différents OS que je teste n'ont pas dû lire les mêmes specs. Je
rappelle que pour avoir je ne sais plus quel signal sous MacOS X, il faut
-D_POSIX_C_SOURCE 0112 (au moins) et que c'est ce truc qui
m'impose en retour C99. Au passage, sous MacOS X, je n'ai pas besoin
d'avoir C99 avec -D_POSIX_C_SOURCE 0112. Avec ma debian non plus,
mais sous Solaris, c'est nécessaire.

Ce qui serait vraiment bien, c'est que tout ce petit monde se mette
d'accord, d'autant que j'utilise _partout_ gcc 4.2 (au moins).

Pratiquement personne ne programme
avec une norme precise, et les divers systemes ont toujorus des petites
differences d'interpretation de l'un a l'autre.



Oui. Cependant, il faut comparer par rapport à ce qu'il y avait avant ;
et les normes C et POSIX représentent quand même de gros progrès, il y a
un gros pan des bases qui sont maintenant communes à tout le monde.



Ouaips, mais il ne faut pas trop chercher dans les détails. Ce que
je produis doit fonctionner de la mêem façon sous NetBSD, FreeBSD
(Open, j'ai abandonné !), Linux et Solaris. J'ai tout de même une
palanquée et demi de macros absconses pour contourner des problèmes
d'implantation (comme les retours en EINTR sous Solaris !).

Du coup, on se retrouve a dire qu'on est posix, mais pas xdg-chose, et
tutti-quanti, et generalement ca foire dans des gros projets sur des entetes
qui ne sont pas compatibles avec eux-memes (ou presque).



Oui. Avant, cela foirait _aussi_ sur les petits projets !
Et sur le long terme, les projets qui font leurs nids, ce sont ceux qui
soit imposent leur norme, soit s'alignent sur le moins-disant (ANSI ou
POSIX:96); je n'arrive pas à décider si POSIX:2001 (donc y compris mmap,
sockets et pas mal d'autres trucs) prend du poids et donc domine XPG>4 ?


Et je pourrais un peu raler aussi sur le comite de normalisation C qui a
fait C99 (et sa future suite) un peu tout seul dans son coin, en ignorant
superbement les magnifiques problemes de compatibilite que ca allait poser
avec C++...



D'abord, cela n'a pas grand chose à voir : ils étaient aussi très seuls
avec bien peu de gens qui voulaient mettre la main à la pâte (tous les
vendeurs s'intéressant à C++ et surtout, à l'époque, à Java) ; ensuite,
le résultat est évident, C99 n'a pas, et de très loin, le poids de C90
(et le comité souhaite que C1x corrige le tir, mais c'est un souhait) :
en conséquence, la bonne attitude, c'est de l'ignorer (dans la mesure du
possible); ce qui, si on revient au problème de JKB, revient à ne pas
utiliser POSIX:2001... et je n'ai pas l'impression d'être le seul avec
cette idée-là en tête.



J'irais dire ça aux petits gars de chez Apple. Utiliser POSIX:2001
n'est pas un choix, c'est une obligation en raison de problèmes
spécifiques liés à MacOS X. J'ai essayé de faire sans, mais ces
includes sont tellement mal foutus qu'il est illusoire de rajouter
les trucs qui manquent à la main sans avoir des effets de bords
intéressants (et je passe sur certaines autres conneries comme
strdup() qui n'utilise pas malloc(), ce qui peut avoir des effets
comment dire ? assez surprenants !).

Par ailleurs, à propos des fameux problèmes de compatibilité C++ :
je sais qu'il y a un binz avec inline (que je n'ai pas compris dans la
pratique; l'argument qui dit « tu peux écrire en C légal du code qui est
stupide _et_ qui ne respecte pas la norme C++ » est aussi intelligent
que de vouloir à tout prix utiliser class comme nom de type global...)
Mais au-delà je n'ai toujours pas compris où était le(s) problème(s) ?
Qui a des pointeurs (raisonnables) ?

Quant à dire que les ajouts de C99 pèsent sur la compatibilité, c'est
aussi une tautologie : chaque modification qui précise un point d'une
norme quelle qu'elle soit, constitue pour une partie des précédents
utilisateurs une régression : l'idée étant que cette partie soit la plus
petite possible, et que dans l'autre plateau de la balance la
contrepartie soit la plus grande possible : il en est ainsi de l'idée
comme quoi long dev[r]ait désigner le plus grand type entier, qui
découle de la rédaction de K&R puis de C89 (sans que ce soit l'intention
initiale) et que certains ont mis en avant pour réfuter C99, alors même
que dans la pratique long joue dans la migration 32/64 bits le même rôle
que jouait int dans la migration 16/32... Et si long ne vaut pas 64 bits
sur (toutes) les machines 64 bits, cela ne vient pas de l'empressement
du comité C mais au contraire, ils furent mis devant le fait accompli.



JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Avatar
espie
In article <hs9i5g$res$,
Antoine Leca wrote:

Pratiquement personne ne programme
avec une norme precise, et les divers systemes ont toujorus des petites
differences d'interpretation de l'un a l'autre.



Oui. Cependant, il faut comparer par rapport à ce qu'il y avait avant ;
et les normes C et POSIX représentent quand même de gros progrès, il y a
un gros pan des bases qui sont maintenant communes à tout le monde.



Au niveau trucs recents, il y a beaucoup de merdes issues de la glibc ou
du monde microsoft qui sont passees dans posix 1998. Du coup, ca perd un
peu de son poids (c'est limite s'ils ne te standardiseraient pas make
sur gmake, tiens).

Et je pourrais un peu raler aussi sur le comite de normalisation C qui a
fait C99 (et sa future suite) un peu tout seul dans son coin, en ignorant
superbement les magnifiques problemes de compatibilite que ca allait poser
avec C++...



D'abord, cela n'a pas grand chose à voir : ils étaient aussi très seuls
avec bien peu de gens qui voulaient mettre la main à la pâte (tous les
vendeurs s'intéressant à C++ et surtout, à l'époque, à Java) ; ensuite,
le résultat est évident, C99 n'a pas, et de très loin, le poids de C90
(et le comité souhaite que C1x corrige le tir, mais c'est un souhait) :
en conséquence, la bonne attitude, c'est de l'ignorer (dans la mesure du
possible); ce qui, si on revient au problème de JKB, revient à ne pas
utiliser POSIX:2001... et je n'ai pas l'impression d'être le seul avec
cette idée-là en tête.



Qu'on soit clair, il y a des bouts tres bons dans C99. stdint et cie, c'est
indispensable, et je pense que tout le monde s'en sert aujourd'hui.

Non, c'est plus les aneries de fonctions mathematiques polymorphes mal
foutues qui ont tendance a foutre le bazar.

Par ailleurs, à propos des fameux problèmes de compatibilité C++ :
je sais qu'il y a un binz avec inline (que je n'ai pas compris dans la
pratique; l'argument qui dit « tu peux écrire en C légal du code qui est
stupide _et_ qui ne respecte pas la norme C++ » est aussi intelligent
que de vouloir à tout prix utiliser class comme nom de type global...)
Mais au-delà je n'ai toujours pas compris où était le(s) problème(s) ?
Qui a des pointeurs (raisonnables) ?



Le inline "simple" (code dans le fichier d'entetes fonctionne sans
gros souci). c'est plus les extensions gcc a la extern inline et
static inline qui foutent le bazar (entre autres parce qu'un certain
Linus Torvalds a cru bon de s'en servir comme si c'etait standardise
et garanti alors qu'en fait, non). Mais bon, le probleme, c'est bien plus
les compilo C, qui pour etre "vendables" au niveau specmark, sont de
plus en plus agressifs cote optimisation (et en particulier, inter-fichiers.
La on est en train de nettoyer du code openbsd pour un eventuel passage a
gcc4, et ca implique entre autres d'annoter plein de trucs avec __used
pour dire au compilo "non, ca tu me laisses dans mon fichier objet, si
je l'ai mis, c'est pour que ca serve". Bon d'accord c'est des trucs
utiles pour ld.so ou pour le profiler, mais quand meme).

Quant à dire que les ajouts de C99 pèsent sur la compatibilité, c'est
aussi une tautologie : chaque modification qui précise un point d'une
norme quelle qu'elle soit, constitue pour une partie des précédents
utilisateurs une régression : l'idée étant que cette partie soit la plus
petite possible, et que dans l'autre plateau de la balance la
contrepartie soit la plus grande possible : il en est ainsi de l'idée
comme quoi long dev[r]ait désigner le plus grand type entier, qui
découle de la rédaction de K&R puis de C89 (sans que ce soit l'intention
initiale) et que certains ont mis en avant pour réfuter C99, alors même
que dans la pratique long joue dans la migration 32/64 bits le même rôle
que jouait int dans la migration 16/32... Et si long ne vaut pas 64 bits
sur (toutes) les machines 64 bits, cela ne vient pas de l'empressement
du comité C mais au contraire, ils furent mis devant le fait accompli.



ce que je reproche a C99, c'est qu'en etant sorti apres C++98, qui essayait
d'etre "le plus" compatible possible avec C90, ils n'ont apparemment meme
pas demande leur avis aux gens du comite C++98, et il y a deux/trois bouts
qui ont ete refaits differemment ET de facon incompatible pour redonner
certaines fonctionnalites du C++.

Enfin bon, c'est vrai que ceux-ci n'ont pas trop reagi correctement depuis,
et du coup on ne sait pas trop si les fonctions maths de C99 doivent
vivre dans std::, tr1:: ou ailleurs en C++ (alors que ca aurait ete assez
simple de faire un espace de nom genre stdc99:: ou assimile...)
Avatar
Marc
Marc Espie wrote:

Qu'on soit clair, il y a des bouts tres bons dans C99. stdint et cie, c'est
indispensable, et je pense que tout le monde s'en sert aujourd'hui.



Enfin sauf que sous windows stdint n'est apparu qu'il y a un mois...

Non, c'est plus les aneries de fonctions mathematiques polymorphes mal
foutues qui ont tendance a foutre le bazar.



C'est quoi le problème ?

Le inline "simple" (code dans le fichier d'entetes fonctionne sans
gros souci). c'est plus les extensions gcc a la extern inline et
static inline qui foutent le bazar



Euh, c'est plutôt static inline qui marche sans problème, et inline et
extern inline qui posent problème, notamment parce que leur signification
dans gcc est en gros inversée selon l'argument -std=.

La on est en train de nettoyer du code openbsd pour un eventuel passage a
gcc4, et ca implique entre autres d'annoter plein de trucs avec __used
pour dire au compilo "non, ca tu me laisses dans mon fichier objet, si
je l'ai mis, c'est pour que ca serve".



Ça me semble raisonnable qu'il faille dire quelque chose de spécial au
compilateur dans ce genre de cas, que ce soit une option globale qui
supprime toute optimisation, ou des indications locales comme __used.

ce que je reproche a C99, c'est qu'en etant sorti apres C++98, qui essayait
d'etre "le plus" compatible possible avec C90, ils n'ont apparemment meme
pas demande leur avis aux gens du comite C++98, et il y a deux/trois bouts
qui ont ete refaits differemment ET de facon incompatible pour redonner
certaines fonctionnalites du C++.



Ça, le comité du C ne semble pas toujours très copain avec le C++...
(J'aime bien en particulier un passage de C++0X qui dit explicitement
d'ignorer une note de C99 qui se mêle de la façon dont les programmes C++
doivent interpréter telle fonctionnalité.)

Enfin bon, c'est vrai que ceux-ci n'ont pas trop reagi correctement depuis,
et du coup on ne sait pas trop si les fonctions maths de C99 doivent
vivre dans std::, tr1:: ou ailleurs en C++ (alors que ca aurait ete assez
simple de faire un espace de nom genre stdc99:: ou assimile...)



Elles peuvent vivre dans :: quand on inclut math.h et nulle part quand on
inclut cmath.
Avatar
Antoine Leca
Marc écrivit:
Marc Espie wrote:

Qu'on soit clair, il y a des bouts tres bons dans C99. stdint et cie, c'est
indispensable, et je pense que tout le monde s'en sert aujourd'hui.



Enfin sauf que sous windows stdint n'est apparu qu'il y a un mois...



Non. Par exemple, pour l'implémentation avec le moins de ressources:
1 /* ISO C9x 7.18 Integer types <stdint.h>
2 * Based on ISO/IEC SC22/WG14 9899 Committee draft (SC22 N2794)
3 *
4 * THIS SOFTWARE IS NOT COPYRIGHTED
5 *
6 * Contributor: Danny Smith
...
15 *
16 * Date: 2000-12-02
17 */
18
http://mingw.cvs.sourceforge.net/viewvc/mingw/runtime/include/stdint.h?hideattic=0&view=log

Quant à Q8 (http://www.lysator.liu.se/c/q8/), la version 2 (compatible
TC1) est datée de novembre 1999, et je n'ai pas vu de problème avec
Windows ; peut-être quelque chose m'a échappé ?


Donc si sur *ton* Windows il n'est apparu qu'il y a un mois, c'est
peut-être le fruit d'une certaine volonté de ne PAS l'utiliser...


Non, c'est plus les aneries de fonctions mathematiques polymorphes mal
foutues qui ont tendance a foutre le bazar.



C'est quoi le problème ?



Que <tgmath.h> implique l'utilisation de magie au niveau du compilateur
(dans la plus pure tradition des années 70 et 80), donc ce morceau de la
bibliothèque dépend beaucoup (beaucoup trop) de la manière dont c'est
implémenté dans le compilateur proprement dit : ce qui est un problème
lorsque les deux choses sont des projets distincts, et encore plus
compliqué lorsque les deux projets ont des objectifs affichés de
polyvalence.

Qui plus est, au contraire de <stdarg.h> qui est dans la même situation
mais existe depuis longtemps et est une fonctionnalité reconnue,
<tgmath.h> est un truc obscur et peu utilisé qui ne fait manifestement
pas l'objet du même degré d'attention, et la qualité du résultat est en
conséquence, faible voire insuffisante.


La on est en train de nettoyer du code openbsd pour un eventuel passage a
gcc4, et ca implique entre autres d'annoter plein de trucs avec __used
pour dire au compilo "non, ca tu me laisses dans mon fichier objet, si
je l'ai mis, c'est pour que ca serve".



Ça me semble raisonnable qu'il faille dire quelque chose de spécial au
compilateur dans ce genre de cas, que ce soit une option globale qui
supprime toute optimisation,



Mauvaise solution (mais trop souvent proposée par les services de
dépannage) : puisque la nouvelle fonctionnalité puissante mais un peu
difficile à maîtriser pose problème, on efface et on enlève *tout*.
Cela s'appelle aussi jeter le bébé avec l'eau du bain.


ou des indications locales comme __used.



Oui, et c'est bien ce que sous-entend Marc Espie. Il n'en reste pas
moins qu'il s'agit d'un problème de compatibilité ascendante mal
maîtrisée (par les développeurs de GCC), en l'occurrence incapables
d'avoir annoncer à l'avance dans quel sens ils allaient évoluer (ce qui
aurait permis de poser les __used avant ; ou de standardiser ARGSUSED ou
que sais-je), et qui en plus avancent à marches forcées au niveau des
fonctionnalités de ce genre (bref, ils n'ont pas donné de temps au temps.)

Au moins ils ont changé la version majeure de GCC quand ils se sont mis
à œuvrer avec force vers les optimisations, ce qui donne un point de
repère clair ; ce que je ne comprend pas, c'est pourquoi gcc3 s'est
arrêté au même moment : d'habitude cela provoque une scission, certains
passent sur le nouveau projet (souvent pour l'attrait technique), tandis
que d'autres restent sur l'ancien, pour peaufiner ce qui existe et
donner de ce fait un chemin d'évolution ascendante plus facile à gérer
pour les usagers, qui devraient être la priorité ; ici rien de tel...
ce qui est préoccupant, car cela pourrait affecter la crédibilité du
projet GCC tout entier (c'est une loi d'airain du marketing : si tu ne
te préoccupes pas de tes clients, à terme tu es mort ; quoi qu'en pense
Dilbert, c'est vrai aussi en TIC, et aussi pour le logiciel libre.)


ce que je reproche a C99, c'est qu'en etant sorti apres C++98, qui essayait
d'etre "le plus" compatible possible avec C90,





Euh... il y a un problème dû au timing. C++98 est sorti après de
loooongues années de normalisation (exactement comme C89 d'ailleurs) ;
mais en fait il ressemble plus à une norme C++96 ; C99 de son côté a été
accéléré (pour éviter de s'appeler C00) mais appartient, au moins
théoriquement, à une autre génération. Ce télescopage de dates comme on le
voit aujourd'hui n'est donc qu'une coïncidence.


ce que je reproche a C99, c'est qu'en etant sorti apres C++98, qui essayait
d'etre "le plus" compatible possible avec C90, ils n'ont apparemment meme
pas demande leur avis aux gens du comite C++98, et il y a deux/trois bouts
qui ont ete refaits differemment ET de facon incompatible pour redonner
certaines fonctionnalites du C++.



Ça, le comité du C ne semble pas toujours très copain avec le C++...



Et vice-versa.

(J'aime bien en particulier un passage de C++0X qui dit explicitement
d'ignorer une note de C99 qui se mêle de la façon dont les programmes C++
doivent interpréter telle fonctionnalité.)



Exemple parfait du contraire de ce que tu as dit, savoir qu'il s'agit
ici d'une démonstration de mauvaise humeur de la part du comité C++.

L'intéressant ici est que la dite note n'a pas été commentée en son
temps par les membres du comité C++ présents au comité C (et chargés d'y
représenter le premier), voire dans ce cas précis sont en partie à
l'origine de la rédaction adoptée...
En effet dans un comité Lambda, les remarques affectant d'une manière ou
d'une autre le sujet d'un autre comité n'émanent PAS des membres qui n'y
connaissent rien, n'ayant aucune légitimité devant leurs pairs ; parfois
(et c'est là le problème) cela vient de ceux qui s'y connaissent sans en
avoir la légitimité, mais les comités le savent et sont en général très
suspicieux quand cela arrive, car ils savent les conséquences que cela
induit ; c'est pourquoi il y a un réseau de liaisons, personnes qui sont
dans plusieurs comités, représentant la position de l'un dans les
délibérations de l'autre (et souvent vice-versa), et possèdent les
compétences _et_ la légitimité pour améliorer la cohérence globale du
système, au profit des _deux_ comités.

Si on réfléchit un peu à la situation, une solution évidente pourrait
être de n'avoir qu'un seul comité : mais la conséquence est encore plus
évidente, c'est la mort du langage C à court terme, remplacé par C++.
C'est d'ailleurs la position plus ou moins clairement exprimée de
plusieurs acteurs du domaine. Le seul souci mais il est de taille, ce
sont (encore une fois) les usagers, qui « persistent » en nombre à
vouloir continuer à utiliser le langage C... et cela inclut des gros,
des énormes projets comme Windows. Bref, il faut faire avec.

Dans ce cadre, C99 a été pour une partie importante la recherche par le
comité C d'une alternative à l'évolution vers C++ fondée sur les
performances et en particulier celles des compilateurs Fortran (d'où
entres autres <tgmath.h>).


Antoine
Avatar
espie
In article <hsglos$2d6$,
Antoine Leca wrote:
Au moins ils ont changé la version majeure de GCC quand ils se sont mis
à œuvrer avec force vers les optimisations, ce qui donne un point de
repère clair ; ce que je ne comprend pas, c'est pourquoi gcc3 s'est
arrêté au même moment : d'habitude cela provoque une scission, certains
passent sur le nouveau projet (souvent pour l'attrait technique), tandis
que d'autres restent sur l'ancien, pour peaufiner ce qui existe et
donner de ce fait un chemin d'évolution ascendante plus facile à gérer
pour les usagers, qui devraient être la priorité ; ici rien de tel...
ce qui est préoccupant, car cela pourrait affecter la crédibilité du
projet GCC tout entier (c'est une loi d'airain du marketing : si tu ne
te préoccupes pas de tes clients, à terme tu es mort ; quoi qu'en pense
Dilbert, c'est vrai aussi en TIC, et aussi pour le logiciel libre.)



Il y a effectivement pas mal de choses preoccupantes dans le developpement
actuel de gcc.

- celui-ci est surtout finance par quelques boites tres specifiques, qui
paient des gens a plein temps pour bosser dessus.
- c'est pas du tout evident de faire des choses avec le gcc mainstream,
j'ai essaye il y a quelques annees, et j'ai plus ou moins abandonne.

Bon, deja, les normes de codage sont assez bizarres (je fais un peu
d'allergie au style GNU), mais lorsque tu es semi-exterieur au projet, tu
te retrouves souvent a poirauter pas mal avant que quelqu'un donne un okay
a un patch (et si tu as plante une virgule dans l'entree de ChangeLog,
ca va plus souvent se terminer en un retour a l'envoyeur plutot qu'un
"okay modulo corrections mineures").

La ou ca devient carrement chiant, c'est quand tu bosses sur quelque chose
d'un peu specifique qui interesse peu de monde dans les developperus de la
core-team (en gros, pas linux-i386 ou linux-amd64... je suis un peu mauvaise
langue, mais a peine). Ca te fait souvent des delais d'un ou deux mois.
Si en plus tu travailles avec des interfaces sur lesquelles d'autres personnes
font des modifs, tu te retrouves souvent a devoir resoumettre le meme patch
trois fois (le temps que quelqu'un le regarde, l'interface a evolue), ce qui
fait facile 3 a 4 mois de delais. Comme en plus tu travailles sur une
plateforme non mainstream, dans l'interim, le bootstrap sur ta machine a casse,
ce qui te donne encore 2 mois de plus, le temps que les gens de la core-team
daignent s'occuper de ton cas (voir a ce sujet la definition des plateformes
de niveau 1, niveau 2, et le reste... perso, je ne bosse que sur "le reste".
du coup, si ca casse chez moi, du point de vue de la core-team, c'est pas
grave).

Pas encore degoute ? Alors on en ajoute encore. La politique de gcc, en plus,
depuis pas mal d'annees, c'est de ne jamais accepter de patchs pour la version
stable: il faut que tu fasses ton developpement en -current, fasse accepter le
patch en -current... pour apres pouvoir dire que ton patch est critique,
refaire un 2e patch en stable (sur une version supportee, hein), pour pouvoir
le commiter sur la stable en question (si ton patch affecte du code plus ou
moins MI, et qu'il repare une fonctionnalite sur une plateforme de second
ordre, bonne chance... il faudra qu'un maintaineur de plateforme "importante"
daigne verifier que ca marche toujours pour lui). Du coup, tu peux compter
environ 1 an et demi avant que ton code soit dans la branche qui t'interesse...
et environ deux ans avant qu'il y ait une release officielle de la branche
en question.

Apres, tu t'etonnes moins qu'il y ait des patchs non committes pour gcc sur
a peu pres toutes les archis un peu obscures: il y a tellement de red tape
au niveau de la FSF qu'une grosse partie des developpeurs opensource ont
totalement laisse tomber (rappel: on fait ca pour le fun, si on doit se
taper un process qui est encore plus chiant que celui de la SSII moyenne...)

En gros, les gens qui developpent sur gcc aujourd'hui, c'est soit des gens
qui sont payes a plein temps pour ca, soit des gens qui ne participent que a
ca comme projet opensource, et qui ont investi plein de temps pour "rentrer
dans le process" (et qui travaillent le plus souvent sur des plateformes
considerees comme critique pour la FSF, donc du coup, qui peuvent enlever
les 2/3 des barrieres dont je parlais).

A comparer avec les projets opensource qui marchent avec lesquels tu peux
facilement bosser (qui, quand ils ont une "branche commerciale" font tout
pour simplifier la vie des developpeurs, histoire justement d'attirer les
gens).


Ah, pour completer, il y a aussi le cote politique de la chose.

Tu as dans gcc un projet qui possede plusieurs enormes defaults cote
technique, en grande partie parce qu'initialement, Stallman avait peur
que les mechants commerciaux reutilisent son code avec du code ferme.

Du coup, tu n'as pas de separation propre frontend/backend (parce
que ca aurait permis a des gros mechants de faire des backends fermees
sur la frontend C++...), et ca n'est que tres recemment (4.5.0) que gcc
a gagne un mecanisme de plugins qui permet de faire un minimum d'analyse
de code.

En plus, c'est le compilo de la FSF. L'objectif officiel du projet, c'est
d'etre le compilo du systeme gnu. Du coup, au fil des annees, il est devenu
de plus en plus dependant d'autres outils gnu (par exemple, il reclame
gmake pour bootstrapper... tous les bsd ont du reverse-engineerer ca pour
faire un systeme de build sans gmake. Et on s'est vu opposer une fin de
non-recevoir a chaque fois qu'on a essaye d'enlever des gnu-makeries du
makefile officiel)... plus gmp, mpfr, et quelques autres gros trucs vachement
indispensables pour un compilo C :(

Il faut quand meme que je rajoute une note finale sur le passage de GPLv2
a GPLv3, qui n'a pas fait que des amis. C'est pas un hasard si dans Open,
on va peut-etre passer a gcc 4.2.1 (c'est la derniere version sous GPLv2),
et il est fort possible qu'il y ait a terme un fork officiel de gcc base
sur cette version (les gens de l'embarque ne sont pas du tout chaud pour faire
du GPLv3...)

J'ai bien envie de faire un parallele avec facebook et la polemique sur
la privacy policy qui va autour. Une fois que tu as assez de parts de marche,
tu es en position de force et tu peux imposer/essayer d'imposer des trucs
aux gens. C'est exactement ce que la FSF et la GPLv3 sont en train de faire
(pour ceux qui n'ont pas suivi en detail, la GPLv3, c'est officiellement
"juste" la GPL reecrite pour etre plus claire legalement... et aussi, en
subtexte, le fait qu'elle est beaucoup plus contraignante et peu gentille
vis-a-vis des brevets, mais ca c'etait moins vendeur, donc ca moins ete
annonce). Ne pas oublier non plus le grand foutage de gueule novlanguesque
sur la LGPL d'il y a quelques annees. Initialement, la LGPL, c'etait la
"Library GPL", simple a adopter, peu contraignante... et plutot une meilleure
chose que pas de licence du tout quand on ne sait pas trop. D'un coup,
celle-ci a ete renommee "lesser gpl" avec dans l'idee que c'etait juste un
mal temporaire, et que les projets vraiment bien, ben ils devaient faire
du GPL pur (a peu pres a la meme epoque ou qt avait une licence specifique,
et ou Stallman etait monte sur sa boite a savon pour engueuler les gens de
kde qui avaient ose mixe du code "pur" sous GPL avec du code sous une autre
licence... histoire qui s'etait bien resolue, car les gens de KDE sont
des gens pratiques, et donc ils sont arrive a obtenir un qt sous GPL, mais
qui n'a rien change a l'ire de Stallman, qui a continue a exiger des excuses
de la part des dev. KDE).


Mais bon, ca bouffe des ressources, tout ca. Quand en plus ca ne correspond
pas a tes propres convictions en matiere d'opensource, tu as plus envie
de mettre des billes dans d'autres projets sous licence BSD...
Avatar
Antoine Leca
Marc Espie écrivit :
plus gmp, mpfr, et quelques autres gros trucs vachement
indispensables pour un compilo C :(



C'est un détail en passant, mais là pour le coup (et à la différence de
tout le reste) je ne suis pas d'accord, je pense qu'ils ont eu raison :
- au lieu d'inventer, ils ont pioché à côté qqch qui marche ; en soi,
c'est suffisamment rare pour qu'il faille le souligner !
- ils ont gardé l'indépendance des projets, à comparer avec liberty
d'une part (asphyxié dans GCC & cie alors que ce code devrait être
ailleurs), et plein d'autres exemples en dehors, où le gros projet pique
le source du p'tit projet, l'incorpore dans son arbre et l'y fait
vivre... sans trop renvoyer l'ascenseur, donc le p'tit projet est
dépouillé et tombe dans l'oubli ; ici au moins les développeurs de ces
deux projets sont connus (à défaut ou avant d'être reconnus), et leurs
projets restent viables indépendamment
- dans ces cas précis, pour le coup je n'ai pas vu de problèmes
pratiques lorsque j'ai commencé avec eux, et pourtant j'étais sur une
plateforme brinquebalante (Win x64, en 2007) avec un GCC qui lui ne
tournait pas du tout, et des binutils approximatifs et à peine dégrossis
Je ne dis pas que cela doit marcher du feu de dieu sur toutes les
plateformes, par exemple je ne suis pas sûr que les fanas du PDP11 vont
être enchantés... peut-être d'ailleurs que cela marche, et dans ce
cas-là mes félicitations aux programmeurs de ces deux projets !
- ce ne sont pas des /gros/ trucs ; un gros truc, en l'occurrence,
c'est llvm, qui d'ailleurs pourrait bien se retrouver lié à GCC_de_base
d'ici quelque temps... parce que sinon, il va se retrouver en face !!!


Antoine
Avatar
Marc
Antoine Leca wrote:

Marc écrivit:

Enfin sauf que sous windows stdint n'est apparu qu'il y a un mois...




[...]
Donc si sur *ton* Windows il n'est apparu qu'il y a un mois, c'est
peut-être le fruit d'une certaine volonté de ne PAS l'utiliser...



J'ai écris windows au lieu de microsoft visual c++, c'est vrai, mais je
pense que ça se comprend quand même... (pour info je n'utilise presque
jamais windows, et en particulier je n'ai jamais utilisé de compilateur
sous windows, que ce soit msvc ou mingw)

Que <tgmath.h> implique l'utilisation de magie au niveau du compilateur



Ah, j'avais bien vu qu'il y avait des choses comme ça prévues pour C1X,
mais je n'avais pas fait attention que c'était déjà dans C99, désolé.

Ça me semble raisonnable qu'il faille dire quelque chose de spécial au
compilateur dans ce genre de cas, que ce soit une option globale qui
supprime toute optimisation,



Mauvaise solution (mais trop souvent proposée par les services de
dépannage) : puisque la nouvelle fonctionnalité puissante mais un peu
difficile à maîtriser pose problème, on efface et on enlève *tout*.
Cela s'appelle aussi jeter le bébé avec l'eau du bain.



On peut bien sûr faire des options pour désactiver chaque optimisation
indépendamment, mais c'est du boulot, et visiblement les gens intéressés
ne l'ont pas fait.

Oui, et c'est bien ce que sous-entend Marc Espie. Il n'en reste pas
moins qu'il s'agit d'un problème de compatibilité ascendante mal
maîtrisée (par les développeurs de GCC), en l'occurrence incapables
d'avoir annoncer à l'avance dans quel sens ils allaient évoluer (ce qui
aurait permis de poser les __used avant ; ou de standardiser ARGSUSED ou
que sais-je),



Effectivement, dans l'idéal, le __used aurait été standardisé il y a
longtemps. En même temps, comme il n'avait pas d'effet au début, les gens
ne l'auraient pas pour autant utilisé dans leur code.

et qui en plus avancent à marches forcées au niveau des
fonctionnalités de ce genre (bref, ils n'ont pas donné de temps au temps.)



Personne n'est obligé d'utiliser la dernière version du compilateur, je
ne vois pas bien comment ils étaient censés faire...

Le seul souci mais il est de taille, ce
sont (encore une fois) les usagers, qui « persistent » en nombre à
vouloir continuer à utiliser le langage C... et cela inclut des gros,
des énormes projets comme Windows. Bref, il faut faire avec.



Je ne suis pas sûr que ce soit le meilleur exemple, puisque microsoft
refuse d'implémenter C99 dans son compilateur C/C++, et ne s'est mis que
très récemment à ajouter des bouts de C99 en tant que C++0X.
Avatar
espie
In article <hsh7pp$20cm$, Marc wrote:
Antoine Leca wrote:
et qui en plus avancent à marches forcées au niveau des
fonctionnalités de ce genre (bref, ils n'ont pas donné de temps au temps.)



Personne n'est obligé d'utiliser la dernière version du compilateur, je
ne vois pas bien comment ils étaient censés faire...



C'est pas entierement vrai. Le fait d'avoir une front-end et une back-end
fortement couplees font que tu te retrouves force de passer sur une nouvelle
version pour pouvoir supporter de nouvelles architectures...
Avatar
Marc
Marc Espie wrote:

- celui-ci est surtout finance par quelques boites tres specifiques, qui
paient des gens a plein temps pour bosser dessus.



Tu ne vas pas me dire que c'est une mauvaise chose que des gens soient
payés pour bosser sur ce code...

La ou ca devient carrement chiant, c'est quand tu bosses sur quelque chose
d'un peu specifique qui interesse peu de monde dans les developperus de la
core-team (en gros, pas linux-i386 ou linux-amd64... je suis un peu mauvaise
langue, mais a peine).



C'est effectivement plus difficile, ne serait-ce que pour des raisons de
nombre de développeurs, mais cygwin, ou powerpc, ne se débrouillent pas
si mal.

Ca te fait souvent des delais d'un ou deux mois.



Pour être sûr qu'on se comprend : je suis tout à fait d'accord que c'est
difficile de contribuer (je n'ai même pas encore passé l'étape
légale...).

Comme en plus tu travailles sur une plateforme non mainstream, dans
l'interim, le bootstrap sur ta machine a casse, ce qui te donne encore
2 mois de plus, le temps que les gens de la core-team daignent
s'occuper de ton cas



Et quelques lignes plus loin tu critiques le fait de devoir vérifier que
ton patch ne casse pas le bootstrap sur une autre archi.

Pas encore degoute ? Alors on en ajoute encore. La politique de gcc,
en plus, depuis pas mal d'annees, c'est de ne jamais accepter de patchs
pour la version stable: il faut que tu fasses ton developpement en
-current, fasse accepter le patch en -current... pour apres pouvoir
dire que ton patch est critique, refaire un 2e patch en stable



Ne fais pas semblant de ne pas comprendre pourquoi ils font ça. Il est
gentil ton patch sur une vieille version, mais du coup il ne sera pas
dans la version suivante, donc il sera perdu, c'est la louze. Pour la
difficulté des backports pour une architecture non "prioritaire", je te
crois, mais dans ce cas tu te fais un arbre de sources qui suit la
release en question et où tu ajoutes tes patchs (je suis sûr que les BSD
font déjà ça). Puisque que tu les as mis dans le trunk de gcc, ils seront
dans la prochaine release officielle, et ton projet propose sa propre
version patchée de la vieille version stable. Oui c'est un peu de
travail.

Apres, tu t'etonnes moins qu'il y ait des patchs non committes pour gcc sur
a peu pres toutes les archis un peu obscures: il y a tellement de red tape
au niveau de la FSF qu'une grosse partie des developpeurs opensource ont
totalement laisse tomber (rappel: on fait ca pour le fun, si on doit se
taper un process qui est encore plus chiant que celui de la SSII moyenne...)



C'est un aspect révélateur de ta conception des choses, tu parles de
"développeur opensource" pour désigner les hobbyists, alors que la
majorité est professionnelle (ie payée pour, je ne fais pas de jugement
sur la qualité du boulot).

de plus en plus dependant d'autres outils gnu (par exemple, il reclame
gmake pour bootstrapper... tous les bsd ont du reverse-engineerer ca pour
faire un systeme de build sans gmake. Et on s'est vu opposer une fin de
non-recevoir a chaque fois qu'on a essaye d'enlever des gnu-makeries du
makefile officiel)...



Parce qu'aucun outil BSD n'utilise les extensions du make BSD ? Tant
qu'ils font l'effort que gmake soit portable...

plus gmp, mpfr, et quelques autres gros trucs vachement
indispensables pour un compilo C :(



Eh bien oui, c'est utile pour un compilo C. C'est même particulièrement
utile pour les cross-compilateurs (ça devrait te plaire, ce n'est pas un
linux compilant linux).

Ce que tu cherches dans un compilateur (une certaine minimalité) ne colle
pas avec les objectifs ne gcc (optimiser le code), mais ça ne dit pas que
gcc a tort (même si en effet il a ses problèmes).

Il faut quand meme que je rajoute une note finale sur le passage de GPLv2
a GPLv3, qui n'a pas fait que des amis. C'est pas un hasard si dans Open,
on va peut-etre passer a gcc 4.2.1 (c'est la derniere version sous GPLv2),
et il est fort possible qu'il y ait a terme un fork officiel de gcc base
sur cette version (les gens de l'embarque ne sont pas du tout chaud pour faire
du GPLv3...)


[...]

Eh bien oui, tu aimes le principe de BSD, il n'y a pas de mal à ça.
D'autres gens aiment le principe de la GPL, ce n'est pas un mal non plus,
c'est leur choix. Les corrections à la GPL (Affero, v3) servent à
traduire légalement ces valeurs. Si les gens de l'embarqué trouvent ça
trop dur de mettre leurs patchs sur le net, ils peuvent aller regarder du
côté de BSD, c'est à eux de choisir.

Tu devrais plutôt être content de l'apparition de la GPL3, ça a incité un
certain nombre de "profiteurs" (vu du camp GPL) à mettre des ressources
sur des projets à licence plus permissive (Apple avec llvm par exemple).
1 2 3 4