OVH Cloud OVH Cloud

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
Wykaaa
En news:, wykaaa va escriure:
J'ai peut-être des oeillères mais je ne suis intervenu dans ma
carrière (j'arrive à la retraite...) que sur des projets d'au moins
200 000 lignes de code et ça approchait le plus souvent le million ou
plusieurs millions. dans ce cadre là, des langages comme Python font
plutôt figure de langages jouets.


Euh, dans un projet de cette taille, tu dois avoir plusieurs langages, non ?
Genre, essentiellement du C++ et un peu de Make et de
LALRspécifiqueSimpleFaitMaison (histoire de caricaturer un peu). Est-ce que
les deux derniers doivent être classés dans la catégorie « jouets » ?


Non, pas forcément. La version 3 d'Oracle (c'est de l'histoire ancienne)
était entièrement en C (après macro expansion ça faisait 2,5 millions de
lignes. Mais la modularité n'était pas vraiment au rendez-vous...).

sache que, même dans un compilateur, il n'y a pas intérêt à faire du
LALRspécifiqueSimpleFaitMaison.

Ceci dit, j'ai vu, dans l'industrie, un développeur qui avait écrit une
application de 60 000 lignes de Gnu Make sous X11 !!


J'ai audité des millions de lignes de code (à l'aide de Logiscope).
Ce que je peux dire c'est que [...] 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...


Je ne comprends pas le syllogisme. J'ai appris à programmer en Basic, puis
en langages d'assemblage, puis en Ada, puis en Pascal, puis en C. Bien plus
tard, dans un autre boulot, j'ai eu à programmer des petits scripts en
Python.
Si on suppose (hypothèse de nécessité) que je programmai*s*
« proprement » avant, pourquoi est-ce que j'aurais alors basculé
définitivement hors de cette catégorie ? Quelle tâche indélébile ce langage
a-t-il marqué sur mon parcours ?
Et pourquoi C n'a-t-il pas imprimé une telle tâche ?


Attention danger : chacun ici, sort mes propos du contexte. J'ai dit
que, selon mon expérience (à la fois de développeur, de consultant et
d'enseignant), seulement 10% des programmeurs (EN GENERAL, quelque soit
le langage) programmaient proprement. Il me paraît donc non souhaitable
de mettre entre les mains des développeurs ni d'enseigner des langages
qui permettent à ceux-ci d'être (très) laxistes comme peut l'être Python
ou C.
Je suis donc, effectivement, pour des langages à la syntaxe et à la
sémantique parfaitement définies. Je ne pense pas que la plupart des
langages répondent à ces critères. Par rapport à ces 2 critères, il me
semble que ADA et OCaml se rapprochent de ces critères (ce sont pourtant
2 langages très différents).

Évidemment, tout est contenu dans l'½uf « proprement », qui n'est pas
explicité. Si je retourne le syllogisme, tu affirmes (axiome) qu'il est
impossible de programmer « proprement » en Python. Même si j'ai des idées
(nombreuses) sur les raisons qui pourraient pousser à prouver de tels
axiomes, je préférerai que ce soit explicité.


J'ai déjà explicité le "proprement" par ailleurs, mais je le rappelle
ici. Il ne s'agit pas des bogues mais de ce qu'on appelle, en général,
les caractéristiques non fonctionnelles comme la réutilisabilité,
l'évolutivité, la maintenabilité, la testabilité, l'interchangeabilité
de modules, l'interopérabilité (qui tend à devenir de + en + une
caractéristiques fonctionnelle), l'exploitabilité, etc.

Par ailleurs, je n'ai jamais dit que Python ne permettait pas de
programmer proprement, j'ai seulement dit que ce n'est pas la peine de
donner aux 90% de programmeurs qui ne programment pas proprement un
langage qui ne va pas les aider à le faire...

Pour les 10% restants, on peut leur donner n'importe quel langage, même
le plus "sale".


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).


1º La fabrication des automobiles (au sens où on le comprend généralement)
et celles des avions sont industriellement différentes : dans un cas on est
sur des pratiques de grande série (comme pour des yaourts ou des paquets de
lessive), dans l'autre il s'agit d'artisanat et de toute petite séries
(comme pour l'industrie du luxe). À quoi compares-tu l'industrie du logiciel
? Je ne peux qu'être d'accord si tu compares avec la grande série et ses
chaînes...


Oui je comparais avec la grande série. Bien qu'un logiciel n'existe
qu'en un seul exemplaire (après on le copie, on ne le refabrique pas) il
faut lui appliquer, à la fabrication, les procédures de fabrication de
grande série, ce qui est assez paradoxal et que beaucoup de développeurs
ont du mal à comprendre très souvent.

2º Si on regarde l'aéronautique, entre Airbus ou Boeing et celui qui
assemble son ULM dans son garage, il y a d'énormes différences. Pourtant,
tous les deux fabriquent des avions, non ?


Tu pousses le bouchon un peu loin, il me semble.
<troll>
Dans un ULM, il n'y a pas d'hôtesses
</troll>

3º Même dans la fabrication des automobiles, certaines tâches sont très
artisanales. Mais alors, très très très artisanales ! Genre, on ne veut
surtout pas qu'il existe une procédure précise qui décrive un processus
donné, soit parce que l'on ne veut pas que la dite procédure puisse «
disparaître » (sachant qu'elle ne sera pas « disparue » pour tout le monde),
soit parce que l'expérience a prouvé qu'en laissant faire les spécialistes
on obtenait de meilleurs résultats qu'en appliquant les procédures.
Si on ramène cela au cas des langages d'utilisation marginale comme Python,
on voit bien que même si le corps principal peut être dans un langage «
adulte », il reste aussi de la place autour pour les jouets.


De toute façon, l'artisan ou l'expert (un vrai !) fera toujours mieux
qu'un "laborieux". Les procédures permettent juste aux non spécialistes
d'éviter les erreurs les plus communes...


Avatar
Wykaaa
En news:47f0f724$0$26796$, Francois va escriure:
Je pensais que l'indentation chez Python était une force et je
découvre qu'en fait ce point est un vrai sujet de controverse. C'est
vrai que ça peur d'imaginer qu'un script Python très très long puisse
s'effondrer parce qu'une personne inamicale ajoute un minuscule espace
quelque part au beau milieu du code.


Euh, il n'y a pas besoin d'un cas aussi extrême.
Perso, un script très court exploité sur deux machines, donc deux éditeurs
de texte différents, dont les paramètres par défaut pour la génération
correspondant à la touche TAB du clavier étaient différents (HT d'un côté et
série d'espace de l'autre).
Résultat, au premier coup de correction à chaud pour « réparer » une c***ie
au milieu d'une focntion sur « l'autre » machine, crac tu casses le script
(en fait, il ne charge même pas, l'interpréteur détecte le souci, preuve
selon moi que je ne suis pas le premier à qui cela arrive ;-) ).

Depuis, j'ai sur les *deux* machines reconfigurer les éditeurs pour
visualiser les espaces et les tabulations « dures ».
Cela doit s'appeler l'expérience, non ?


Oui, et aussi une belle preuve de ce que je disais à propos de Python.
Car dans le "programmer propre", il y a évidemment la portabilité...
(dans différents environnements et pas seulement sur des machines
différentes).
Il suffit de penser simplement au immenses possibilités de paramétrage
d'Emacs pour s'imaginer les tortures subies par les scripts Python !


Avatar
Wykaaa
In article <47f24354$0$898$,
Wykaaa wrote:
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...


Le plus gros probleme est d'ordre psychologique: les vraies bases sont
tres simples. Elles s'expliquent en cinq minutes, mais sont dures a
appliquer correctement... je crois plus a l'approche _refactoring_ pour
enseigner ces notions.

Prend un cours `classique' d'oriente objet, tu vas expliquer abstraction et
encapsulation en cinq minutes, et passer 3/4 h sur l'heritage... et apres,
si tu demandes a un etudiant de te caracteriser programmation OO, forcement
il va te parler d'heritage...


Dans l'enseignement de l'approche objet, j'ai toujours adopté l'approche
de Grady Booch.
Je dis (et je décris) que les 4 concepts majeurs de l'objet sont :
- le concept d'abstraction
- le concept d'encapsulation
- le concept de modularité (au sens objet et non pas dans son sens plus
ancien) qui s'appuie sur les deux principes de : 1- Forte cohésion
interne d'une abstraction, 2- faible couplage entre abstraction
- La notion de hiérarchie : héritage, mais aussi agrégation et
composition qui sont toutes 3 des relations d'ordre strict entre
abstractions (c'est fondamental de comprendre ça pour éviter des erreurs
de conception)

Une fois exposer ces 4 concepts majeurs, j'indique, en insistant
fortement, que ce n'est qu'à la condition que ces 4 concepts soient mis
en oeuvre conjointement qu'on peut parler d'approche objet.

Après, il faut faire de nombreuses études de cas pour montrer comment,
EFFECTIVEMENT, ces 4 concepts doivent être mis en oeuvre ENSEMBLE dans
une réelle approche objet et comment ils contribuent les uns aux autres
à cette approche.

Pédagogiquement parlant, je ne passe pas plus de temps sur la notion de
hiérarchie (et pas seulement l'héritage, c'est ça la clé) que sur les
autres concepts.

Enfin, je ne suis pas d'accord que les "vraies" bases s'expliquent en 5
minutes car moi j'y passe 3 (oui trois) jours sur les 4 concepts.
Et tant pour les exemples que pour les études de cas, je ne parle ni
d'UML, ni des langages objets (tout ceci vient après).


Avatar
Wykaaa
En news:, wykaaa va escriure:
Pour le Web, les gens utilisent n'importe quoi et il n'y a qu'à
regarder les résultats catastrophiques concernant l'interopérabilité
multi-plateformes (les sites qui ne marchent qu'avec tel OS ou tel
navigateur, ou le machin flash dernier cri, etc.).


Il semble clair que l'interopérabilité multi-plateforme n'est *PAS* le
critère primordial d'un serveur web.


Ceci est contraire à l'esprit des pionniers de l'Internet.

Par contre, en ce qui concerne le délivré, actuellement les choses
s'améliorent beaucoup, les normes étant nettement moins mouvantes... En
effet, quand la période entre deux versions incompatibles entre elles des
« standards » est inférieure au temps moyen de développement d'un site web,
il est difficile de réussir l'impossible. Depuis que 1º Microsoft a imposé
un navigateur sur >90% des machines cibles, et que 2º --en rupture complète
avec le passé immédiat-- a cessé de le développer dans toutes les directions
pendant 6 ans, c'est beaucoup mieux ! Le bienfait des standards...


Les standards de l'Internet (et pas seulement du Web) sont les RFC, ceux
du W3C et de l'IETF (Internet Engineering Task Force).
Microsoft n'a fabriqué quasiment aucun standard (quand il a tenté,
souvent il s'est fait renvoyé dans les cordes...). Il semble qu'il ait
une chance avec Office OpenXML.
Quant à son navigateur, parlons-en, il n'est plus développé sur Mac
depuis la version 5.2. Pour Linux, je ne sais pas. C'est donc un total
non respect des plates-formes et des OS.
Un navigateur doit respecter les standards du W3C. Point
Il existe un test pour les navigateurs (ACID3. Voir :
http://www.depannetonpc.net/actualite/lire_2702_un-nouveau-test-pour-les-navigateurs-acid-3.html)

La politique de Microsoft a conduit beaucoup de gouvernements à adopter
les standards et, par voie de conséquence, les logiciels libres qui se
basent dessus (plus généralement, ils se basent sur les standards
ouverts. Voir :
http://formats-ouverts.org/blog/2004/07/01/12-un-article-de-loi-definit-ce-que-sont-les-formats-ouverts

Ce qui nous amène à...

Je rappelle (étant
un très vieil utilisateur d'Arpanet et d'Internet, bien avant le Web)
que les développeurs pionniers du réseau des réseaux se sont toujours
efforcé, dans leur choix, de faire en sorte que les protocoles et les
outils soient indépendants des plateformes.


Hou, je ne suis pas franchement d'accord avec le « toujours » ci-dessus. En
fait, j'en connais plusieurs qui ont essayé justement le contraire, imposer
leurs plateformes ou leurs outils ou leurs protocoles au dépend de
l'interopérabilité (en général sans succès).


Avant le Web, les seuls standards de l'Internet étaient les RFC.
Je parle des pionniers de l'Internet (voir :
http://www.ibiblio.org/pioneers/index.html)

Ce qui est vrai (et intéressant), c'est que dans leur majorité les normes
d'internet qui ont eu du succès sont celles qui ont favorisé
l'interopérabilité (souvent en standardisant sur un existant-qui-fonctionne,
parfois en cassant exprès quelque chose d'existant dont on « sentait » que
cela était suboptimal, l'exemple le plus évident étant le modèle OSI).


Il y a deux types de standards les standards de Jure et les standards de
Facto. Les seconds sont en bien plus grand nombre...


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


Après le web, on continue sur l'analyse des phénomènes de mode ?


Ok, on arrête :-)


Il est hors de question d'utiliser un langage à typage dynamique dans
des applications qui requièrent une très grande fiabilité et une
excellente sûreté de fonctionnement.


C'est marrant, moi cela me rappelle des phrases entendues il y a peut-être
15 ou 20 ans, où l'on parlait de langages-objets et C++ et d'inadaptation au
temps réel.


Tu as raison.


En news:47f16b4b$0$904$, Wykaaa va escriure:
[...] syntaxe simple, inspirée par Eiffel et Ada (ce qui
est forcément un plus, ces deux langages étant reconnus
pour leur "propreté syntaxique").


Connais pas Eiffel, mais je ne trouve pas Ada (83) très propre
syntaxiquement : en fait, par rapport à Pascal qui était ma référence à
l'époque, je trouvais Ada plutôt sale à cause des multiples concepts
supplémentaires pas franchement orthogonaux (generic, task) ou carrément
lourdingues (TEXT_IO, ASCII). Évidemment, Ada devait cela en partie à sa
richesse sans commune mesure avec celle du Pascal ISO. Et évidemment aussi,
à la même époque C était pour moi bien pire, en particulier à cause de sa
manière anglo-saxone/germanique de définir les objets.
Mais on se fait à tout, n'est-ce-pas ?


Les créateurs du langage (dont Jean Ichbiah) ont été tenu par le cahier
des charges du DoD (le ministère de la défense aux US) et n'ont pas pu
faire ce qu'ils souhaitaient. Par exemple Jean Ichbiah ne voulait pas de
goto dans le langage (c'est pour cette raison que les étiquettes en ADA
sont entourées de << >> pour montrer que "ça pique").

La généricité est très bien fichue en ADA. Je n'en dirais pas autant du
multitasking (ça s'est amélioré avec ADA 95).


Avatar
Thierry Chappuis

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.



Cet argument m'amuse toujours. Qu'est-ce qui n'est pas objet dans
Python? C'est d'ailleurs un des modèles objets les plus élégants que je
connaisse

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



Comme à peu près tous les langages modernes, y compris Java ou Python.

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.


Ce n'est pas aussi simple. Pour Python, il existe Psyco et le projet
PyPy dont le JIT pour RPython (un sous-ensemble de Python) promet beaucoup.

Thierry

Avatar
Stephane Legras-Decussy
"Wykaaa" a écrit dans le message de news:
47f29e3d$0$863$
Il existe un test pour les navigateurs (ACID3. Voir :
http://www.depannetonpc.net/actualite/lire_2702_un-nouveau-test-pour-les-navigateurs-acid-3.html)


ça me fait marrer ce genre de truc...
la norme est tellement complexe que comment
savoir si c'est le navigateur qui comprend rien
ou si c'est le concepteur du test qui comprend rien à la
norme ?

et si la norme est ambigue (plus que probable) ? on fait quoi ?

tiens mon firefox 2.0.0.11 se vautre à 52% ...
j'espère que l'A380 passe le test acid à 100%...
planquez vous...

Avatar
Laurent Deniau
Wykaaa wrote:
In article <47f24354$0$898$,
Wykaaa wrote:
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 sujet s
(la plupart en anglais, hélas...)
J'ai fabriqué des cours sur tout ça, faudrait que je les mette en
ligne...


Le plus gros probleme est d'ordre psychologique: les vraies bases sont
tres simples. Elles s'expliquent en cinq minutes, mais sont dures a
appliquer correctement... je crois plus a l'approche _refactoring_ pour
enseigner ces notions.

Prend un cours `classique' d'oriente objet, tu vas expliquer
abstraction et encapsulation en cinq minutes, et passer 3/4 h sur
l'heritage... et apres, si tu demandes a un etudiant de te
caracteriser programmation OO, forcement
il va te parler d'heritage...


Dans l'enseignement de l'approche objet, j'ai toujours adopté l'approche
de Grady Booch.


Le probleme c'est que cette approche est fortement correlee avec les
langages static avec single-dispatch. Dans les languages dynamiques
et/ou avec multiple-dispatch, les responsabilites sont reparties tres
differement.

Je dis (et je décris) que les 4 concepts majeurs de l'objet sont :
- le concept d'abstraction
- le concept d'encapsulation
- le concept de modularité


Ce "concept" (qui n'en est pas un) est un terme vague (inspire de la
notion de module?) incluant l'encapsulation et la reutilisabilite qui
inclue elle-meme la composabilite.

(au sens objet et non pas dans son sens plus
ancien) qui s'appuie sur les deux principes de : 1- Forte cohésion
interne d'une abstraction, 2- faible couplage entre abstraction


Ce ne sont pas des principes mais des metriques (ordinal) tres utiles
pour eviter/detecter les mauvais designs.

- La notion de hiérarchie : héritage, mais aussi agrégation et
composition qui sont toutes 3 des relations d'ordre strict entre
abstractions (c'est fondamental de comprendre ça pour éviter des erreu rs
de conception)

Une fois exposer ces 4 concepts majeurs, j'indique, en insistant
fortement, que ce n'est qu'à la condition que ces 4 concepts soient mis
en oeuvre conjointement qu'on peut parler d'approche objet.


Interessant. Sauf que la notion de Programmation Orientee Objet n'est
pas clairement definie a ma connaissance (avec d'interminable debat
sur
le sujet). La notion d'heritage inclue plusieurs concepts bien souvent
melanges ce qui rend son enseignement difficile. Enfin, puisque vous
connaissez plus de 50 languages, vous devriez savoir que les concepts
cites ci-dessus sont aussi presents dans des languages _non_ objet
(fonctionnel ou prototype par exemple) et donc ne suffisent pas a
caracteriser un language OO.

Ce qui _pourrait_ caracteriser un language OO, c'est subtyping +
polymorphisme (d'inclusion). Ces deux concepts sont les seuls vraiment
present dans tous les languages OO et absent dans les non OO.

Après, il faut faire de nombreuses études de cas pour montrer comment,
EFFECTIVEMENT, ces 4 concepts doivent être mis en oeuvre ENSEMBLE dans
une réelle approche objet et comment ils contribuent les uns aux autres
à cette approche.


J'ai fait ca pas plus tard que la semaine derniere a des physiciens
qui
ne connaissait rien d'autre que Fortran 77 (qui sevit encore ici, he
oui...) et un peu C. Ca m'a pris 6-7 heures, dont la moitie sur
l'impact
des concepts des languages de programmations sur le design de
software.
En revanche mon approche n'est pas dans les livres (et donc discutable
a
souhait, en particulier ma classification des concepts). Neanmoins,
tout
le monde a compris en 1h a 2h (pour la partie OO).

Pédagogiquement parlant, je ne passe pas plus de temps sur la notion de
hiérarchie (et pas seulement l'héritage, c'est ça la clé) que sur les
autres concepts.


C'est dommage, parce que dans les languages a typage statique, la
notion
de hierarchie est intrinsequement liee a celle de couplage que l'on
cherche a eviter. Le jeux consiste donc a montrer comment reorganiser
les hierarchies pour diminuer le couplage sans rendre Liskov furieux.

C++ utilise les templates presque partout pour resoudre ce probleme,
mais les autres languages n'ont guere le choix que d'utiliser des
interfaces (au sens Java du terme).

Enfin, je ne suis pas d'accord que les "vraies" bases s'expliquent en 5
minutes car moi j'y passe 3 (oui trois) jours sur les 4 concepts.


Je suis d'accord, 3-4 jours c'est ce qu'il faut pour un etudiant moyen
n'ayant aucun background sur le sujet. Ne serait-ce que pour lui
laisser
le temps de se faire a l'idee (comme pour les pointeurs). Le probleme,
c'est qu'il faut encore 1-2 ans pour savoir le mettre a profit dans
des
gros projets (design).

a+, ld



Avatar
Bruno Desthuilliers
En news:47f0f724$0$26796$, Francois va escriure:
Je pensais que l'indentation chez Python était une force et je
découvre qu'en fait ce point est un vrai sujet de controverse. C'est
vrai que ça peur d'imaginer qu'un script Python très très long puisse
s'effondrer parce qu'une personne inamicale ajoute un minuscule espace
quelque part au beau milieu du code.


Euh, il n'y a pas besoin d'un cas aussi extrême.
Perso, un script très court exploité sur deux machines, donc deux
éditeurs
de texte différents, dont les paramètres par défaut pour la génération
correspondant à la touche TAB du clavier étaient différents (HT d'un
côté et
série d'espace de l'autre).
Résultat, au premier coup de correction à chaud pour « réparer » une
c***ie
au milieu d'une focntion sur « l'autre » machine, crac tu casses le
script
(en fait, il ne charge même pas, l'interpréteur détecte le souci, preuve
selon moi que je ne suis pas le premier à qui cela arrive ;-) ).



Tout ce que ça prouve, c'est que le compilateur (pas l'interpréteur)
fait correctement son boulot en détectant une erreur de syntaxe.

Depuis, j'ai sur les *deux* machines reconfigurer les éditeurs pour
visualiser les espaces et les tabulations « dures ».
Cela doit s'appeler l'expérience, non ?


Oui, et aussi une belle preuve de ce que je disais à propos de Python.
Car dans le "programmer propre", il y a évidemment la portabilité...
(dans différents environnements et pas seulement sur des machines
différentes).
Il suffit de penser simplement au immenses possibilités de paramétrage
d'Emacs pour s'imaginer les tortures subies par les scripts Python !


J'utilise Python depuis =~ debut 2000 et je n'ai *absolument jamais* eu
de problème de cet ordre (en n'étant pas le seul à travailler sur les
projets, en utilisant différents éditeurs configurés différement . Non
que l'indentation significative soit AMHA une tellement bonne idée au
final, mais mon expérience est qu'en pratique ce type de problème est
rarissime. Bien plus que l'oubli des {} dans du C / C++ / java /
Javascript / PHP etc..., oubli qui, générant une erreur de logique mais
pas une erreur de syntaxe, n'est détecté par aucun compilo ou
interpréteur...

Arrêtez de fantasmer, les gars.



Avatar
JKB
Le 02-04-2008, à propos de
Re: Python,
Bruno Desthuilliers écrivait dans fr.comp.lang.c :
En news:47f0f724$0$26796$, Francois va escriure:
Je pensais que l'indentation chez Python était une force et je
découvre qu'en fait ce point est un vrai sujet de controverse. C'est
vrai que ça peur d'imaginer qu'un script Python très très long puisse
s'effondrer parce qu'une personne inamicale ajoute un minuscule espace
quelque part au beau milieu du code.


Euh, il n'y a pas besoin d'un cas aussi extrême.
Perso, un script très court exploité sur deux machines, donc deux
éditeurs
de texte différents, dont les paramètres par défaut pour la génération
correspondant à la touche TAB du clavier étaient différents (HT d'un
côté et
série d'espace de l'autre).
Résultat, au premier coup de correction à chaud pour « réparer » une
c***ie
au milieu d'une focntion sur « l'autre » machine, crac tu casses le
script
(en fait, il ne charge même pas, l'interpréteur détecte le souci, preuve
selon moi que je ne suis pas le premier à qui cela arrive ;-) ).



Tout ce que ça prouve, c'est que le compilateur (pas l'interpréteur)
fait correctement son boulot en détectant une erreur de syntaxe.

Depuis, j'ai sur les *deux* machines reconfigurer les éditeurs pour
visualiser les espaces et les tabulations « dures ».
Cela doit s'appeler l'expérience, non ?


Oui, et aussi une belle preuve de ce que je disais à propos de Python.
Car dans le "programmer propre", il y a évidemment la portabilité...
(dans différents environnements et pas seulement sur des machines
différentes).
Il suffit de penser simplement au immenses possibilités de paramétrage
d'Emacs pour s'imaginer les tortures subies par les scripts Python !


J'utilise Python depuis =~ debut 2000 et je n'ai *absolument jamais* eu
de problème de cet ordre (en n'étant pas le seul à travailler sur les
projets, en utilisant différents éditeurs configurés différement . Non
que l'indentation significative soit AMHA une tellement bonne idée au
final, mais mon expérience est qu'en pratique ce type de problème est
rarissime. Bien plus que l'oubli des {} dans du C / C++ / java /
Javascript / PHP etc..., oubli qui, générant une erreur de logique mais
pas une erreur de syntaxe, n'est détecté par aucun compilo ou
interpréteur...

Arrêtez de fantasmer, les gars.


Il existe d'autres langages autrement mieux conçus. En Fortran, par
exemple (mais il y en a d'autres), c'est parfaitement impossible :

IF (A.eq.0) THEN
statements
END IF

Le bloc fait partie de la clause IF contrairement au C. S'il n'y a
pas de END IF à la fin, le compilateur renvoie une insulte et on
n'en parle plus. Pour moi, la syntaxe C est aussi moisie que la
syntaxe Python sur ce point parce que d'une part un bloc peut être
implicite (if () gnagnagna;) et d'autre part parce qu'une
instruction peut être nulle (if ();).

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
Bruno Desthuilliers

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.



Cet argument m'amuse toujours. Qu'est-ce qui n'est pas objet dans
Python?


les messages ?

C'est d'ailleurs un des modèles objets les plus élégants que je
connaisse


"élégant" n'est pas forcément le terme que j'utiliserais.

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



Comme à peu près tous les langages modernes, y compris Java ou Python.


PAQJS, les thread Python ne sont pas indépendants de l'OS. Par contre,
j'avoue ne pas comprendre l'intérêt de réimplémenter dans le langage une
fonctionnalités déjà fournie par l'OS.

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.



La compilation JIT pour un langage hautement dynamique (Ruby,
Javascript, Python etc) n'est pas précisément un problème trivial. Je
doute qu'il y ait un compiler JIT fonctionnel pour Ruby avant quelques
années au moins...

Ce n'est pas aussi simple. Pour Python, il existe Psyco et le projet
PyPy dont le JIT pour RPython (un sous-ensemble de Python) promet beaucoup.


"promet beaucoup", certes, mais on est encore loin du compte.