Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Erreur du preprocesseur

113 réponses
Avatar
candide
Bonjour,

Dans le bouquin de Ph. Drix ("Le langage C ANSI"), je trouve l'exemple
suivant pour illustrer les "substitutions réitérées" par le préprocesseur :


------------- 8< -------------------------------
#define w 0,1
#define f(x,y) (x)+(y)

f(w) /* est remplacé par (0)+(1) */
------------- >8 -------------------------------


Or, chez moi sur gcc, ça ne marche pas :

------------- 8< -------------------------------
candide@candide-desktop:~$ gcc -E test.c

test.c:4:4: erreur: macro « f » requiert 2 arguments, mais seulement 1
ont été passés
f
------------- >8 -------------------------------

Pourtant il me semble que l'exemple est valide, non ?

10 réponses

Avatar
Francois
Pardonnez-moi mais je suis certinement déformé par les projets et les
milieux que j'ai fréquentés qui requièrent effectivement un très haut
niveau d'exigence concernant la fiabilité et la sûreté de fonctionnement.


Mais vous êtes tout excusé. Au contraire, c'est intéressant d'avoir
votre point de vue.


Pour te donner une idée, l'ensemble des logiciels (y compris les
programmes de tests, les simulations logicielles, etc.) pour l'ISS
représentent environ 80 millions de lignes de code.

Mais un simple compilateur COBOL fait déjà dans les 250 mille lignes de
code.


Pfou !!! Ça donne le vertige.


François

Avatar
Wykaaa


J'ai audité des millions de lignes de code (à l'aide de Logiscope). Ce
que je peux dire c'est que, même dans les domaines les plus pointus et
qui requièrent une grande fiabilité et sûreté de fonctionnement comme le
nucléaire, l'avionique ou le spatial, il n'y a pas 10% de programmeurs
qui programment "proprement.



La faute aux variables globales !! :)) Non sérieux , tu peux un peu
détailler stp, enfin concernant le C pour pas être trop hors-sujet ?
Quand tu dis que 90% ne savent pas programmer des applications
nécessitant une grande sécurité, quelle part de l'incompétence
attribues-tu à une mauvaise connaissance (universitaire) du langage C
lui-même ? est-ce juste une question de formation incomplète au pas
assez poussée ou une question de relâchement dans la façon de coder ?


Excuse-moi de te reprendre, Candide, mais en logiciel on parle surtout
de fiabilité et de sûreté de fonctionnement (lorsque le logiciel est
intégré dans du matériel, comme pour un missile ou une centrale nucléaire).

Il n'y a pas que la fiabilité mais aussi, l'évolutivité, la
maintenabilité, l'interopérabilité, l'interchangeabilité, la
réutilisabilité, etc., du logiciel.
Je ne parlais pas des bogues quand je disais "proprement".

Sans vouloir taper sur l'enseignement universitaire (dont je suis
d'ailleurs issu et je m'en félicite), il faut bien avouer que les
langages ne sont pas très bien enseignés (C et C++ en particulier car ce
sont des langages difficiles).
Il y a donc, effectivement, une formation incomplète mais rien ne
remplace l'expérience. Il faut coder, coder et encore coder...

Ensuite le relâchement, comme tu dis.
Je ne crois pas que ce soit le problème car j'ai rencontré très, très
peu de développeurs qui ne souhaitaient pas faire du "mieux possible".
C'est plutôt la façon dont sont gérés les projets dans la réalité qui
est à mettre en cause. Il faut toujours aller au plus vite et livrer
"pour la veille". Ce faisant, comme le travail n'a pas pu être
correctement effectué la première fois, il faut faire des corrections et
des nouvelles versions. Au total, cela coûte plus cher que de faire bien
dès la première fois (c'est un des leitmotiv de l qualité logicielle).
Aujourd'hui, les "clients" qui font appel aux sociétés de services
choisissent souvent le "moins disant", c'est-à-dire celui qui fait
l'estimation la moins chère. En fait, les clients font leur malheur
eux-mêmes. Ensuite, ils appellent des consultants (comme moi) qui font
des audits et des préconisations pour réparer les dégâts.
Tout ceci, au final, coûte très cher.



Mais je suis d'accord que pour des non informaticiens scientifiques qui
doivent faire des petites simulations ou des petits modèles, ce genre de
langage peut rendre des services mais alors il ne faut pas parler
d'informatique au sens industriel du terme (quand je dis industriel, je
rapproche la fabrication de logiciels à la fabrication d'automobiles ou
d'avions).


Et à l'heure actuelle, on utilise massivement quel langage en
informatique industrielle ? Vois-tu un avenir au C "industriel" autre
que de la maintenance d'applications (tout du moins dans le domaine que
tu connais) ?


Je ne peux te donner que "ma vision". J'ai principalement travaillé dans
le domaine militaire, l'énergie et le transport et sur des très gros
projets, comme je l'ai déjà dit.
Ces 5 dernières années, dans le domaine militaire, je n'ai vu que du C++
et du Java.
Le système de télésurveillance de la RATP est en C++
Beaucoup de logiciels du RTE (le transport de l'électricité et la
régulation du réseau électrique) sont également en C++ et en Java.

Ces derniers temps, je n'ai vu que ces deux langages. Encore un peu de C
de temps en temps...
Au ministère des finances, pour les impôts (calcul et recouvrement),
c'est encore en COBOL (mais ça va changer). Ceci s'explique par l'âge
des applications (+ de 30 ans !).

Pour répondre à ta dernière question : de moins en moins de C dans les
domaines cités, voire déjà plus du tout...

Wykaaa

Merci, je suis très intéressé par tes réponses.


J'espère avoir répondu à tes espérances :-)

Wykaaa


Avatar
Wykaaa
In article , wykaaa wrote:
Très intéressant mais comme le fait remarquer zeavan dans le forum, cela
reflète plus le monde académique.
Je remarque une forte poussée de Ruby, qui est un bien meilleur langage
que Python , dans le même genre de famille de langage


Bien meilleur ? en quoi ? pour l'instant, l'implementation se traine
un peu, etant purement interpretee et sans byte-code... ce qui la plombe un
peu par rapport aux voisins.


Je ne parlais pas de l'implémentation mais du langage lui-même.

Ruby utilise une syntaxe simple, inspirée par Eiffel et Ada (ce qui est
forcément un plus, ces deux langages étant reconnus pour leur "propreté
syntaxique").

Il est "pur objet", un peu à la SmallTalk (même les types sont des
objets). Un langage "pur objet" est toujours un plus dans l'approche objet.

Et immense avantage, il a les threads indépendants du système
d'exploitation (on ne peut se passer du multi-threading aujourd'hui...)

Ce dernier trait a effectivement une contrepartie : une certaine lenteur.
Il suffira de faire pour Ruby ce qui a été fait pour Java (des JIT :
Just in Time Compilers) et la question sera réglée.


Avatar
candide

Il y a donc, effectivement, une formation incomplète mais rien ne
remplace l'expérience. Il faut coder, coder et encore coder...



OK mais en définitive, si je résume c'est plus des insuffisances en
génie logiciel et de travail en équipe que de langage à proprement parler.


Merci, je suis très intéressé par tes réponses.


J'espère avoir répondu à tes espérances :-)



Oui merci tu as bien répondu ... mais pas à mes espérances quand je
vois ce qui reste du C, on dirait que c'est devenu le latin de
l'informatique, un truc pour déchiffrer des vieilles pierres et faire de
la scholastique ! snif !


Avatar
espie
In article <47f16b4b$0$904$,
Wykaaa wrote:
In article , wykaaa
wrote:

Très intéressant mais comme le fait remarquer zeavan dans le forum, cela
reflète plus le monde académique.
Je remarque une forte poussée de Ruby, qui est un bien meilleur langage
que Python , dans le même genre de famille de langage


Bien meilleur ? en quoi ? pour l'instant, l'implementation se traine
un peu, etant purement interpretee et sans byte-code... ce qui la plombe un
peu par rapport aux voisins.


Je ne parlais pas de l'implémentation mais du langage lui-même.

Ruby utilise une syntaxe simple, inspirée par Eiffel et Ada (ce qui est
forcément un plus, ces deux langages étant reconnus pour leur "propreté
syntaxique").

Il est "pur objet", un peu à la SmallTalk (même les types sont des
objets). Un langage "pur objet" est toujours un plus dans l'approche objet.

Et immense avantage, il a les threads indépendants du système
d'exploitation (on ne peut se passer du multi-threading aujourd'hui...)

Ce dernier trait a effectivement une contrepartie : une certaine lenteur.
Il suffira de faire pour Ruby ce qui a été fait pour Java (des JIT :
Just in Time Compilers) et la question sera réglée.


Permet-moi d'etre sceptique, sur plusieurs points.
- la syntaxe de ruby n'est pas si simple, il a quand meme repique un
grand nombre d'idiosyncrasies de perl.
- l'approche `tout objet', ca fait surtout plaisir aux gens qui comparent
les langages pour le plaisir. Si ca n'etait pas le cas, on programmerait
tous en Smalltalk (mais la vraie approche objet n'est pas evidente pour
des gens qui ont ete eduques avec du procedural, soit l'immense majorite
des programmeurs professionnels... meme ceux qui font aujourd'hui du
java)
- threads independants du systeme: ca c'est juste une question de
bibliotheque. Rien qui n'empeche les autres langages de s'y mettre.
Et d'ailleurs on y vient.
- performance `il suffit de'... encore faut-il que quelqu'un la fasse, cette
implementation rapide... ca n'est pas si simple que ca, surtout sur un
langage tres dynamique. Il faut des programmeurs competents et qui y passent
du temps, ce qui demande pas mal de sous. Sauf interet d'un gros
industriel, j'y crois vraiment peu...



Avatar
Wykaaa
In article <47f16b4b$0$904$,
Wykaaa wrote:
In article , wykaaa
wrote:

Très intéressant mais comme le fait remarquer zeavan dans le forum, cela
reflète plus le monde académique.
Je remarque une forte poussée de Ruby, qui est un bien meilleur langage
que Python , dans le même genre de famille de langage
Bien meilleur ? en quoi ? pour l'instant, l'implementation se traine

un peu, etant purement interpretee et sans byte-code... ce qui la plombe un
peu par rapport aux voisins.
Je ne parlais pas de l'implémentation mais du langage lui-même.


Ruby utilise une syntaxe simple, inspirée par Eiffel et Ada (ce qui est
forcément un plus, ces deux langages étant reconnus pour leur "propreté
syntaxique").

Il est "pur objet", un peu à la SmallTalk (même les types sont des
objets). Un langage "pur objet" est toujours un plus dans l'approche objet.

Et immense avantage, il a les threads indépendants du système
d'exploitation (on ne peut se passer du multi-threading aujourd'hui...)

Ce dernier trait a effectivement une contrepartie : une certaine lenteur.
Il suffira de faire pour Ruby ce qui a été fait pour Java (des JIT :
Just in Time Compilers) et la question sera réglée.


Permet-moi d'etre sceptique, sur plusieurs points.
- la syntaxe de ruby n'est pas si simple, il a quand meme repique un
grand nombre d'idiosyncrasies de perl.
Je te l'accorde.

- l'approche `tout objet', ca fait surtout plaisir aux gens qui comparent
les langages pour le plaisir. Si ca n'etait pas le cas, on programmerait
tous en Smalltalk (mais la vraie approche objet n'est pas evidente pour
des gens qui ont ete eduques avec du procedural, soit l'immense majorite
des programmeurs professionnels... meme ceux qui font aujourd'hui du
java)


C'est curieux comme cet argument ressort toujours quand on parle d'une
approche "pur objet".
Moi-même j'ai appris, à l'université, à programmer procédural (premier
langage Algol 60...). je me suis mis à la conception objet dès les
premiers articles de Grady Booch dans l'ACM (en 83 donc). Puis j'ai
appris C++ (en 89) et j'ai ensuite programmé et donné de nombreux cours
(en entreprise pour des programmeurs C) de C++. Puis j'ai appris Java et
j'ai également donné des cours à partir de 97.
Aujourd'hui, les professionnels de l'informatique qui ne maîtrisent pas
encore l'objet n'ont aucune excuse !

- threads independants du systeme: ca c'est juste une question de
bibliotheque. Rien qui n'empeche les autres langages de s'y mettre.
Et d'ailleurs on y vient.


Oui, lentement...

- performance `il suffit de'... encore faut-il que quelqu'un la fasse, cette
implementation rapide... ca n'est pas si simple que ca, surtout sur un
langage tres dynamique. Il faut des programmeurs competents et qui y passent
du temps, ce qui demande pas mal de sous. Sauf interet d'un gros
industriel, j'y crois vraiment peu...


Soit la communauté Ruby croit fortement et défend ce langage et fait
donc ce qu'il faut pour qu'il soit reconnu, soit, effectivement, rien
n'est fait et ça fera un langage de plus dans les poubelles de
l'histoire informatique (il y en a déjà près de 2 000 dans les poubelles...)




Avatar
espie
In article <47f1e89c$0$850$,
Wykaaa wrote:
- l'approche `tout objet', ca fait surtout plaisir aux gens qui comparent
les langages pour le plaisir. Si ca n'etait pas le cas, on programmerait
tous en Smalltalk (mais la vraie approche objet n'est pas evidente pour
des gens qui ont ete eduques avec du procedural, soit l'immense majorite
des programmeurs professionnels... meme ceux qui font aujourd'hui du
java)


C'est curieux comme cet argument ressort toujours quand on parle d'une
approche "pur objet".
Moi-même j'ai appris, à l'université, à programmer procédural (premier
langage Algol 60...). je me suis mis à la conception objet dès les
premiers articles de Grady Booch dans l'ACM (en 83 donc). Puis j'ai
appris C++ (en 89) et j'ai ensuite programmé et donné de nombreux cours
(en entreprise pour des programmeurs C) de C++. Puis j'ai appris Java et
j'ai également donné des cours à partir de 97.
Aujourd'hui, les professionnels de l'informatique qui ne maîtrisent pas
encore l'objet n'ont aucune excuse !


J'ai vu suffisamment de code C++ ou Java qui n'etait pas reellement objet,
et qui se presentait tel juste a cause du langage... ou du code construit
avec des classes enormes et des hierarchies mal foutues...

Plonger le nez dans une belle implementation smalltalk, comme squeak, fait
enormement de bien la-dessus.

A mon avis, ca n'est pas du tout evident de faire un vrai design qui donne
les benefices de l'approche objet (encapsulation, abstraction, evolutivite,
et souplesse), et j'en rencontre bien peu...


Avatar
Wykaaa
In article <47f1e89c$0$850$,
Wykaaa wrote:
- l'approche `tout objet', ca fait surtout plaisir aux gens qui comparent
les langages pour le plaisir. Si ca n'etait pas le cas, on programmerait
tous en Smalltalk (mais la vraie approche objet n'est pas evidente pour
des gens qui ont ete eduques avec du procedural, soit l'immense majorite
des programmeurs professionnels... meme ceux qui font aujourd'hui du
java)
C'est curieux comme cet argument ressort toujours quand on parle d'une

approche "pur objet".
Moi-même j'ai appris, à l'université, à programmer procédural (premier
langage Algol 60...). je me suis mis à la conception objet dès les
premiers articles de Grady Booch dans l'ACM (en 83 donc). Puis j'ai
appris C++ (en 89) et j'ai ensuite programmé et donné de nombreux cours
(en entreprise pour des programmeurs C) de C++. Puis j'ai appris Java et
j'ai également donné des cours à partir de 97.
Aujourd'hui, les professionnels de l'informatique qui ne maîtrisent pas
encore l'objet n'ont aucune excuse !


J'ai vu suffisamment de code C++ ou Java qui n'etait pas reellement objet,
et qui se presentait tel juste a cause du langage... ou du code construit
avec des classes enormes et des hierarchies mal foutues...


Alors, là, je suis tout à fait d'accord avec toi !
Je dis toujours aux clients(en particulier les "managers") que coder en
C++ ou en Java comme en C, c'est bien pire que de rester en C (programmé
propre)

Plonger le nez dans une belle implementation smalltalk, comme squeak, fait
enormement de bien la-dessus.


Oh que oui !

A mon avis, ca n'est pas du tout evident de faire un vrai design qui donne
les benefices de l'approche objet (encapsulation, abstraction, evolutivite,
et souplesse), et j'en rencontre bien peu...


Ca dépend. Si seulement c'était bien enseigné !
Et aujourd'hui, il y a quand même de très bon bouquins sur ces sujets
(la plupart en anglais, hélas...)
J'ai fabriqué des cours sur tout ça, faudrait que je les mette en ligne...



Avatar
Bruno Desthuilliers
Le Mon, 31 Mar 2008 15:18:28 +0200, Marc Espie a écrit:

In article , wykaaa
wrote:
Comment comparer Java et Python ????
Java est utilisé dans des applications importantes qui requièrent
fiabilité, évolutivité, etc. (comme les applications militaires).
Où est Python dans l'industrie ??? NULLE PART
Python est bien un langage marginal.


Enleve tes oeilleres, ca te fera du bien...



+1

(snip)

Et puisque tu cites quelques langages du même ordre, sache que ruby a
toutes mes faveurs dans cette famille de langages.


Ruby dont le typage est tout aussi dynamique que celui de Python, et
dont l'implémentation est très loin derrière (pas de byte-code, des
sérieux problèmes de gestion mémoire...).

Très cohérent, tout ça.

J'ai audité des millions de lignes de code (à l'aide de Logiscope). Ce
que je peux dire c'est que, même dans les domaines les plus pointus et
qui requièrent une grande fiabilité et sûreté de fonctionnement comme le
nucléaire, l'avionique ou le spatial, il n'y a pas 10% de programmeurs
qui programment "proprement. Ce n'est pas avec des langages comme Python
qu'ils vons le faire...


Le langage n'y est pour rien. La preuve, même avec ADA, on peut crasher
une fusée...

Mais je suis d'accord que pour des non informaticiens scientifiques qui
doivent faire des petites simulations ou des petits modèles, ce genre de
langage peut rendre des services mais alors il ne faut pas parler
d'informatique au sens industriel du terme (quand je dis industriel, je
rapproche la fabrication de logiciels à la fabrication d'automobiles ou
d'avions).


Réveille-toi, Mossieur le consultant, il y a beaucoup d'autres domaines
d'application de l'informatique que les fusées et les centrales
nucléaires. Ce n'est pas parce qu'un tournevis n'est pas l'outil
approprié pour planter un clou qu'il faut en conclure que les tournevis
ne sont pas de bons outils. Et ce n'est pas parce qu'un domaine
d'application échappe à ta grande expérience qu'il est marginal ou
secondaire.

Amis prétentieux, bonsoir...



Avatar
Pierre Maurette

[...]

Donc, ce que je proposerai, c'est un repas complet ;)


N'oubliez pas une petite pipe avec le café, puisque pour la branlette
on a déjà bien avancé.

--
Pierre Maurette