[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