Drole de main()

Le
David Remacle
Salut,

En me documentant pour un petit historique des Os d'Apple, je suis tombé
sur une image de A/UX (l'un des premier Unix d'Apple) avec un drole de
façon de déclarer main.

http://www.kernelthread.com/publications/appleoshistory/images/aux.gif

J'ai bien sur essayé de voir dans mon codeblocks si ca compile. et oui
ça compile mais tout de même je me pose des questions sur cette façon de
présenter main.

A bientôt.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 4
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Vivien MOREAU
Le #20794541
On 2009-12-18, David Remacle wrote:

Salut,

En me documentant pour un petit historique des Os d'Apple, je suis tombé
sur une image de A/UX (l'un des premier Unix d'Apple) avec un drole de
façon de déclarer main.



C'est du K&R C, celui d'avant la standardisation de 1989 par
l'ANSI, à priori.

--
Vivien MOREAU / vpm
JKB
Le #20795891
Le 18-12-2009, ? propos de
Drole de main(),
David Remacle ?crivait dans fr.comp.lang.c :
Salut,



Bonsoir,

En me documentant pour un petit historique des Os d'Apple, je suis tombé
sur une image de A/UX (l'un des premier Unix d'Apple) avec un drole de
façon de déclarer main.

http://www.kernelthread.com/publications/appleoshistory/images/aux.gif

J'ai bien sur essayé de voir dans mon codeblocks si ca compile. et oui
ça compile mais tout de même je me pose des questions sur cette façon de
présenter main.



C'est à ça qu'on voit si on a affaire à un dinosaure avec des
écailles ou à un petit jeune ;-)

C'est du C K&R (comprendre pré ANSI) avec les déclarations de
fonction telles que Dieu les a crées (euh, pardon, ça, c'est pour
les boucles en TeX, mais l'idée est la même ;-) ).

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.
Samuel Devulder
Le #20795591
David Remacle a écrit :
Salut,

En me documentant pour un petit historique des Os d'Apple, je suis tombé
sur une image de A/UX (l'un des premier Unix d'Apple) avec un drole de
façon de déclarer main.

http://www.kernelthread.com/publications/appleoshistory/images/aux.gif

J'ai bien sur essayé de voir dans mon codeblocks si ca compile. et oui
ça compile mais tout de même je me pose des questions sur cette façon de
présenter main.



C'est pas une drole de façon de présenter. C'est la syntaxe d'origine
(avant l'ansi), celle du K&R. En fait ca s'applique à toutes les
fonctions et pas uniquement au main() (le mains n'a rien de spéciale:
c'est une fonctionne comme une autre).

A la base cela revient à déclarer le type des arguments avant le bloc
contenant le code..

Et si on déclare rien alors? Et bien dans ce cas le C considère que ce
sont des entiers, ce qui fait que:

int
f(a)
{
return a>=0?1:a*f(a-1);
}

est valide. Autre exemple: (code de l'auteur de qemu, tcc.. un vrai
malade :) ) http://www.de.ioccc.org/2000/bellard.c

Cette construction est souvent utilisée dans les exercices/compétitions
de code C "illisibles, rikikis mais costauds" (http://www.ioccc.org/):
on évite de déclarer des entiers en les passant dans la déclaration des
args de la fonction et on gagne quelques caractères précieux dans
l'exercice, en plus de perdre celui qui tente de lire le code sans en
être l'auteur.

sam (pour se faire très peur: http://www.de.ioccc.org/years.html)
Wykaaa
Le #20795581
David Remacle a écrit :
Salut,

En me documentant pour un petit historique des Os d'Apple, je suis tombé
sur une image de A/UX (l'un des premier Unix d'Apple) avec un drole de
façon de déclarer main.

http://www.kernelthread.com/publications/appleoshistory/images/aux.gif

J'ai bien sur essayé de voir dans mon codeblocks si ca compile. et oui
ça compile mais tout de même je me pose des questions sur cette façon de
présenter main.

A bientôt.



C'est comme cela qu'étaient définis les paramètres des fonctions (pas
seulement de main) avant le C ANSI quand les prototypes de fonctions
n'étaient pas encore dans le langage. Les paramètres de fonction
devaient être définis entre l'en-tête de fonction et son bloc principal.

On ne pouvait pas faire une déclaration de fonction (prototype)
du genre :
f (int i);
espie
Le #20796161
In article JKB
Le 18-12-2009, ? propos de
Drole de main(),
David Remacle ?crivait dans fr.comp.lang.c :
Salut,



Bonsoir,

En me documentant pour un petit historique des Os d'Apple, je suis tombé
sur une image de A/UX (l'un des premier Unix d'Apple) avec un drole de
façon de déclarer main.

http://www.kernelthread.com/publications/appleoshistory/images/aux.gif

J'ai bien sur essayé de voir dans mon codeblocks si ca compile. et oui
ça compile mais tout de même je me pose des questions sur cette façon de
présenter main.



C'est à ça qu'on voit si on a affaire à un dinosaure avec des
écailles ou à un petit jeune ;-)

C'est du C K&R (comprendre pré ANSI) avec les déclarations de
fonction telles que Dieu les a crées (euh, pardon, ça, c'est pour
les boucles en TeX, mais l'idée est la même ;-) ).

Cordialement,

JKB



Juste pour completer, les declarations de fonction en question sont encore
valides en C ISO, que ce soit 89 ou 99, precisement pour comptabilite avec
le vieux code. Elles commencent a etre fortement depreciees (ca se traduit
comment deprecated) avec une nette envie du comite de les virer.

Le "passage au C ISO" n'est aucunement automatique, il ne suffit PAS de
prendre la declaration ancienne mode et de rajouter les types. Avec des
declarations K&R, on n'a pas de prototypes, et les conventions d'appels
sont differentes. Par exemples, les char sont etendues en int pour l'appel.

Ce qui fait que la definition suivante:

f(a)
char a;
{
/* faire quelque chose avec a */
}

se traduira le plus souvent en

void /* pas de type de retour, c'est int formellement, mais on s'en
* servait pour les fonctions ne renvoyant rien d'utile avant
* l'existence de void */
f(int a)
{
char b = a;
/* faire quelque chose avec b */
}


oui, c'est sacrement tordu, et ca a piege plus d'un programmeur confirme...
JKB
Le #20796511
Le 18-12-2009, ? propos de
Re: Drole de main(),
Marc Espie ?crivait dans fr.comp.lang.c :
In article JKB
Le 18-12-2009, ? propos de
Drole de main(),
David Remacle ?crivait dans fr.comp.lang.c :
Salut,



Bonsoir,

En me documentant pour un petit historique des Os d'Apple, je suis tombé
sur une image de A/UX (l'un des premier Unix d'Apple) avec un drole de
façon de déclarer main.

http://www.kernelthread.com/publications/appleoshistory/images/aux.gif

J'ai bien sur essayé de voir dans mon codeblocks si ca compile. et oui
ça compile mais tout de même je me pose des questions sur cette façon de
présenter main.



C'est à ça qu'on voit si on a affaire à un dinosaure avec des
écailles ou à un petit jeune ;-)

C'est du C K&R (comprendre pré ANSI) avec les déclarations de
fonction telles que Dieu les a crées (euh, pardon, ça, c'est pour
les boucles en TeX, mais l'idée est la même ;-) ).

Cordialement,

JKB



Juste pour completer, les declarations de fonction en question sont encore
valides en C ISO, que ce soit 89 ou 99, precisement pour comptabilite avec
le vieux code. Elles commencent a etre fortement depreciees (ca se traduit
comment deprecated) avec une nette envie du comite de les virer.

Le "passage au C ISO" n'est aucunement automatique, il ne suffit PAS de
prendre la declaration ancienne mode et de rajouter les types. Avec des
declarations K&R, on n'a pas de prototypes, et les conventions d'appels
sont differentes. Par exemples, les char sont etendues en int pour l'appel.

Ce qui fait que la definition suivante:

f(a)
char a;
{
/* faire quelque chose avec a */
}

se traduira le plus souvent en

void /* pas de type de retour, c'est int formellement, mais on s'en
* servait pour les fonctions ne renvoyant rien d'utile avant
* l'existence de void */
f(int a)
{
char b = a;
/* faire quelque chose avec b */
}


oui, c'est sacrement tordu, et ca a piege plus d'un programmeur confirme...



Mais c'est sacrément logique. C'est même à cause de ce genre de
trucs que je milite depuis très longtemps pour l'abrogation du K&R
dans sa première mouture !

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.
Jean-marc
Le #20796291
Marc Espie wrote:
In article JKB


Elles commencent a etre fortement
depreciees (ca se traduit comment deprecated) ...



"Dépréciées" est un faux-ami ici, malheureusement.

"Obsolète" ne convient pas : un poil trop strict.

"d'usage découragé" n'est pas mal et est exact, à défaut
d'être joli.

Finalement, "caduc" me semble le mieux et c'est ce que j'emploierais
si je devais traduire.

--
Jean-marc
Samuel Devulder
Le #20796581
Marc Espie a écrit :

f(a)
char a;
{
/* faire quelque chose avec a */
}

se traduira le plus souvent en

void /* pas de type de retour, c'est int formellement, mais on s'en
* servait pour les fonctions ne renvoyant rien d'utile avant
* l'existence de void */
f(int a)
{
char b = a;
/* faire quelque chose avec b */
}


oui, c'est sacrement tordu, et ca a piege plus d'un programmeur confirme...



En fait j'ai du mal à voir le problème: les paramètres sont alignés sur
la pile sur la taille d'un int. C'est pas tellement différent des ABI
actuelles ou les params sont passés dans des registres.

Peux tu préciser en quoi c'est piégeux? J'avoue ne pas suivre ici. Tu
veux dire que les conventions ABI sont différentes entre K&R et ANSI?

sam.
espie
Le #20797521
In article Samuel Devulder
En fait j'ai du mal à voir le problème: les paramètres sont alignés sur
la pile sur la taille d'un int. C'est pas tellement différent des ABI
actuelles ou les params sont passés dans des registres.



Certains parametres dans certaines conditions. Pas toutes les ABI.

Peux tu préciser en quoi c'est piégeux? J'avoue ne pas suivre ici. Tu
veux dire que les conventions ABI sont différentes entre K&R et ANSI?



Ben oui, les conventions sont differentes. En particulier, le compilo, s'il
a un prototype, peut optimiser les choses. Si tu passes plein de char a une
fonction, avec un prototype, le compilo peut tres bien te les coller sur la
pile serres les uns contre les autres, alors qu'avec l'ancienne declaration
il sera force de les etendre en int.

Si tu ne vois pas le probleme, c'est juste que tu n'as pas regarde assez loin.
Je ne te parle pas d'une fonction, mais d'un programme entier, censement
portable, ou tu vas convertir plusieurs centaines de fonctions d'un monde
a l'autre. Si tu le fais a la main, tu as de fortes chances de te planter sur
au moins quelques-unes. Et comme Murphy est toujours avec nous, tu es a peu
pres certain que ca va marcher sur ta machine courante, mais pas sur une
autre. Cas vecu: i386, amd64, ppc. Et paf le ppc.
JKB
Le #20797771
Le 19-12-2009, ? propos de
Re: Drole de main(),
Marc Espie ?crivait dans fr.comp.lang.c :
In article Samuel Devulder
En fait j'ai du mal à voir le problème: les paramètres sont alignés sur
la pile sur la taille d'un int. C'est pas tellement différent des ABI
actuelles ou les params sont passés dans des registres.



Certains parametres dans certaines conditions. Pas toutes les ABI.

Peux tu préciser en quoi c'est piégeux? J'avoue ne pas suivre ici. Tu
veux dire que les conventions ABI sont différentes entre K&R et ANSI?



Ben oui, les conventions sont differentes. En particulier, le compilo, s'il
a un prototype, peut optimiser les choses. Si tu passes plein de char a une
fonction, avec un prototype, le compilo peut tres bien te les coller sur la
pile serres les uns contre les autres, alors qu'avec l'ancienne declaration
il sera force de les etendre en int.

Si tu ne vois pas le probleme, c'est juste que tu n'as pas regarde assez loin.
Je ne te parle pas d'une fonction, mais d'un programme entier, censement
portable, ou tu vas convertir plusieurs centaines de fonctions d'un monde
a l'autre. Si tu le fais a la main, tu as de fortes chances de te planter sur
au moins quelques-unes. Et comme Murphy est toujours avec nous, tu es a peu
pres certain que ca va marcher sur ta machine courante, mais pas sur une
autre. Cas vecu: i386, amd64, ppc. Et paf le ppc.



Je rajouterai : "et paf le sparc !"

Il suffit de regarder mono, seamonkey, enfin tous ces trucs codés
sur i386/amd64 qui buserrorent à donf sur ces problèmes ;-)

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.
Publicité
Poster une réponse
Anonyme