[gull] Types : [was: Php/MsSQL obsoletes?]
Daniel Cordey
dc at mjt.ch
Fri Sep 30 09:02:23 CEST 2005
On Friday 30 September 2005 00:30, Marc Mongenet wrote:
> La fonction printf a le prototype suivant :
> int printf(const char *, ...);
> L'usage des "..." sert justement à faire sauter la vérification du type
> et du nombre de paramètres passés.
Dans le sens ou cette verification ne sera pas faite de maniere 'statique' par
le compilateur. Il est evident que ce genre de truc et laisse a l'execution
le choix du 'trap' a generer en cas d'erreur...
> Printf me semble donc plutôt démontrer le fort typage de C,
C'est aussi mon avis.
> puisqu'il faut avoir recourt à un mécanisme certes fort utilisé
> (avec printf, sprintf, fprintf) mais finalement exotique et très
> peu connu
Heureusement !
> (qui a déjà écrit une fonction C à liste de paramètres
> variable ?)
Moi... et en assembleur... pour printf() justement. C'est la que l'on decouvre
les joies des differentes architectures, OS, compilateurs... Par exemple sur
HP-PA (HP-UX), les arguments ne sont pas passes dans le stack, mais, pour les
6/8 premiers, par les registres. Le probleme se corse lorsque l'on passe des
double/float... ces arguments ne sont pas passes dans les registres generaux
mais dans les regirtres FP... Doux melange entre registres genereaux et FP...
Les arguments aditionnels sont par contre dans le stack. C'est vraiment
galere.
Pour de multiples raisons, il est donc fortement deconseille d'adopter ce
genre de pratique en C et C++. Dans le cas de Python (ou autres langages
interpretes), il est possible de traitre ce probleme de maniere propre. Voir
d'utiliser des arguments 'nommes', comme :
fonction(**kwd)
On peut alors appeler la fonction avec :
x = fonction(file = 'toto', mode = 'rw', append = False)
On peut mettre les arguments dans un order quelconque et l'on recupere ceux-ci
dans la fonction sous une forme de dictionnaire. CAD, Tableau indexe a l'aide
des noms des arguments.
Il est aussi possible, comme en C, d'avoir des arguments "libres" a l'appel.
CAD que l'on peut appeler la fonction avec moins d'arguments que le nombre
defini. Ceci, seulement si l'on a declarer explicitement ces arguments comme
optionnels en precisant une valeur par defaut en cas d'absence.
Naturellement, ce luxe a un prix qui se paie au runtime, puisque
l'interpreteur doit effectuer toutes ces verifications lors de chaque appel.
> Si C était né avec toutes les vérifications de types que chacun utilise
> aujourd'hui, tous le monde citerait C comme exemple de langage
> fortement typé avec simplement quelques (dangeureux mais pour la
> plupart évitables) archaïsmes. Je soupçonne d'ailleurs 90% de la
> critique actuel de C de n'être que des échos de la critique, en ce
> temps fondée, des années1970.
On ne peut plus vrai !
dc
More information about the gull
mailing list