In article
,
James Kanze wrote:Historiquement, C++ a inventé les prototypes de fonctions, et
les a rendus obligatoire dès ses débuts : la seule écriture
légale était :
void clear() ;
En C, aussi, c'était la seule écriture légale, mais avec un
autre sémantique : ça signifiait qu'on ne donnait aucune
information en ce qui concerne les paramètres. (Je ne suis pas
sûr, mais je crois qu'on ne pouvait pas donner d'information
dans une declaration, seulement dans une définition.)
Oui, C se comportait comme un assembleur: on declare juste
qu'on utilise des symboles, avec extremement peu de controle
sur les symboles en question.
D'ailleurs, globalement, on utilise toujours des editeurs de
lien de cette epoque, d'ou le `name-mangling' pour encoder le
typage des fonctions qui est utilise par la plupart des
implementations de C++.
En fait, les prototypes n'existaient pas du tout en C
Kernighan et Richie, y compris pour les definitions de
fonctions, ou on ecrivait quelque chose tel que:
f(a)
int a;
{
}
(en l'absence de void, une fonction telle que f etait reputee
`traditionnellement' ne renvoyer rien, le compilateur jetant
un voile pudique sur le `int' implicite)
Le passage au C ANSI ne s'est pas fait sans douleur, puisque
les fonctions sans prototypes avaient des regles differentes
de coercion de type. Par exemple, impossible de passer un char
ou un float une fonction sans prototype, les arguments etant
d'office promu en int et double respectivement.
Ca a conduit a quelques-uns des pieges les plus vicieux du langage.
Ainsi, pour une definition de fonction en
f(a)
char a;
{
}
le prototype correspondant est bien
extern int f(int);
Ouch...
d'ou profonde rigolade lors de phases d'ansifications d'arbre source, vu
que le passage de l'un a l'autre n'est vraiment pas automatique.
et si on veut convertir *aussi* la definition de fonction, ca
ne donne rien de simple:
int
f(int a_)
{
char a = (char)a_;
}
Bref, le comite a essaye de casser les choses le moins
possible tout en modernisant fortement le langage... certaines
des autres decisions (et leurs applications) sont encore plus
fourbes et ont poses encore plus de problemes (confere toute
la polemique autour de restrict, ou les decisions de certains
compilo `d'optimiser' les appels a memset qui `ne servent a
rien')
[...]
Ton resume de la suite est correct, mais il y manque un
element pedagogique.
C'est bien de permettre l'ecriture de void clear(void); en
C++, ca permet de simplifier les regles a retenir entre C et
C++.
Meme si c'est pas `le plus propre' possible, je prefere dire
aux gens d'ecrire
void clear(void);
systematiquement, entre le C et le C++.
Tot ou tard, ils vont se retrouver a devoir utiliser les deux
langages,
et cette syntaxe est la seule qui est sans surprise, et qui va
fonctionner sans devoir connaitre tous ces points de details
obscurs...
In article
<7449fce7-e9c7-4870-8ab1-32cb02adb...@n20g2000hsh.googlegroups.com>,
James Kanze <james.ka...@gmail.com> wrote:
Historiquement, C++ a inventé les prototypes de fonctions, et
les a rendus obligatoire dès ses débuts : la seule écriture
légale était :
void clear() ;
En C, aussi, c'était la seule écriture légale, mais avec un
autre sémantique : ça signifiait qu'on ne donnait aucune
information en ce qui concerne les paramètres. (Je ne suis pas
sûr, mais je crois qu'on ne pouvait pas donner d'information
dans une declaration, seulement dans une définition.)
Oui, C se comportait comme un assembleur: on declare juste
qu'on utilise des symboles, avec extremement peu de controle
sur les symboles en question.
D'ailleurs, globalement, on utilise toujours des editeurs de
lien de cette epoque, d'ou le `name-mangling' pour encoder le
typage des fonctions qui est utilise par la plupart des
implementations de C++.
En fait, les prototypes n'existaient pas du tout en C
Kernighan et Richie, y compris pour les definitions de
fonctions, ou on ecrivait quelque chose tel que:
f(a)
int a;
{
}
(en l'absence de void, une fonction telle que f etait reputee
`traditionnellement' ne renvoyer rien, le compilateur jetant
un voile pudique sur le `int' implicite)
Le passage au C ANSI ne s'est pas fait sans douleur, puisque
les fonctions sans prototypes avaient des regles differentes
de coercion de type. Par exemple, impossible de passer un char
ou un float une fonction sans prototype, les arguments etant
d'office promu en int et double respectivement.
Ca a conduit a quelques-uns des pieges les plus vicieux du langage.
Ainsi, pour une definition de fonction en
f(a)
char a;
{
}
le prototype correspondant est bien
extern int f(int);
Ouch...
d'ou profonde rigolade lors de phases d'ansifications d'arbre source, vu
que le passage de l'un a l'autre n'est vraiment pas automatique.
et si on veut convertir *aussi* la definition de fonction, ca
ne donne rien de simple:
int
f(int a_)
{
char a = (char)a_;
}
Bref, le comite a essaye de casser les choses le moins
possible tout en modernisant fortement le langage... certaines
des autres decisions (et leurs applications) sont encore plus
fourbes et ont poses encore plus de problemes (confere toute
la polemique autour de restrict, ou les decisions de certains
compilo `d'optimiser' les appels a memset qui `ne servent a
rien')
[...]
Ton resume de la suite est correct, mais il y manque un
element pedagogique.
C'est bien de permettre l'ecriture de void clear(void); en
C++, ca permet de simplifier les regles a retenir entre C et
C++.
Meme si c'est pas `le plus propre' possible, je prefere dire
aux gens d'ecrire
void clear(void);
systematiquement, entre le C et le C++.
Tot ou tard, ils vont se retrouver a devoir utiliser les deux
langages,
et cette syntaxe est la seule qui est sans surprise, et qui va
fonctionner sans devoir connaitre tous ces points de details
obscurs...
In article
,
James Kanze wrote:Historiquement, C++ a inventé les prototypes de fonctions, et
les a rendus obligatoire dès ses débuts : la seule écriture
légale était :
void clear() ;
En C, aussi, c'était la seule écriture légale, mais avec un
autre sémantique : ça signifiait qu'on ne donnait aucune
information en ce qui concerne les paramètres. (Je ne suis pas
sûr, mais je crois qu'on ne pouvait pas donner d'information
dans une declaration, seulement dans une définition.)
Oui, C se comportait comme un assembleur: on declare juste
qu'on utilise des symboles, avec extremement peu de controle
sur les symboles en question.
D'ailleurs, globalement, on utilise toujours des editeurs de
lien de cette epoque, d'ou le `name-mangling' pour encoder le
typage des fonctions qui est utilise par la plupart des
implementations de C++.
En fait, les prototypes n'existaient pas du tout en C
Kernighan et Richie, y compris pour les definitions de
fonctions, ou on ecrivait quelque chose tel que:
f(a)
int a;
{
}
(en l'absence de void, une fonction telle que f etait reputee
`traditionnellement' ne renvoyer rien, le compilateur jetant
un voile pudique sur le `int' implicite)
Le passage au C ANSI ne s'est pas fait sans douleur, puisque
les fonctions sans prototypes avaient des regles differentes
de coercion de type. Par exemple, impossible de passer un char
ou un float une fonction sans prototype, les arguments etant
d'office promu en int et double respectivement.
Ca a conduit a quelques-uns des pieges les plus vicieux du langage.
Ainsi, pour une definition de fonction en
f(a)
char a;
{
}
le prototype correspondant est bien
extern int f(int);
Ouch...
d'ou profonde rigolade lors de phases d'ansifications d'arbre source, vu
que le passage de l'un a l'autre n'est vraiment pas automatique.
et si on veut convertir *aussi* la definition de fonction, ca
ne donne rien de simple:
int
f(int a_)
{
char a = (char)a_;
}
Bref, le comite a essaye de casser les choses le moins
possible tout en modernisant fortement le langage... certaines
des autres decisions (et leurs applications) sont encore plus
fourbes et ont poses encore plus de problemes (confere toute
la polemique autour de restrict, ou les decisions de certains
compilo `d'optimiser' les appels a memset qui `ne servent a
rien')
[...]
Ton resume de la suite est correct, mais il y manque un
element pedagogique.
C'est bien de permettre l'ecriture de void clear(void); en
C++, ca permet de simplifier les regles a retenir entre C et
C++.
Meme si c'est pas `le plus propre' possible, je prefere dire
aux gens d'ecrire
void clear(void);
systematiquement, entre le C et le C++.
Tot ou tard, ils vont se retrouver a devoir utiliser les deux
langages,
et cette syntaxe est la seule qui est sans surprise, et qui va
fonctionner sans devoir connaitre tous ces points de details
obscurs...
On Sun, 9 Dec 2007 12:59:48 +0000 (UTC), (Marc Espie):Meme si c'est pas `le plus propre' possible, je prefere dire
aux gens d'ecrire
void clear(void);
systematiquement, entre le C et le C++.
Bof... Ça contribue à alimenter le mythe qu'il y a un rapport
privilégié entre le C++ et le C.
Tot ou tard, ils vont se retrouver a devoir utiliser les deux langages,
Pas forcément ces deux-là en particulier.
On Sun, 9 Dec 2007 12:59:48 +0000 (UTC), es...@lain.home (Marc Espie):
Meme si c'est pas `le plus propre' possible, je prefere dire
aux gens d'ecrire
void clear(void);
systematiquement, entre le C et le C++.
Bof... Ça contribue à alimenter le mythe qu'il y a un rapport
privilégié entre le C++ et le C.
Tot ou tard, ils vont se retrouver a devoir utiliser les deux langages,
Pas forcément ces deux-là en particulier.
On Sun, 9 Dec 2007 12:59:48 +0000 (UTC), (Marc Espie):Meme si c'est pas `le plus propre' possible, je prefere dire
aux gens d'ecrire
void clear(void);
systematiquement, entre le C et le C++.
Bof... Ça contribue à alimenter le mythe qu'il y a un rapport
privilégié entre le C++ et le C.
Tot ou tard, ils vont se retrouver a devoir utiliser les deux langages,
Pas forcément ces deux-là en particulier.
Le C++ est complexe pour une toute autre raison : il a plus de
fonctionnalités que n'importe quel autre langage.
Le C++ est complexe pour une toute autre raison : il a plus de
fonctionnalités que n'importe quel autre langage.
Le C++ est complexe pour une toute autre raison : il a plus de
fonctionnalités que n'importe quel autre langage.
Le C++ est complexe pour une toute autre raison : il a plus de
fonctionnalités que n'importe quel autre langage. À peu près tous les
paradigmes sont utilisables en C++ (même la programmation
fonctionnelle, avec les templates), ce qui donne une grande liberté,
mais aussi plus de responsabilités, au programmeur.
Le C++ est complexe pour une toute autre raison : il a plus de
fonctionnalités que n'importe quel autre langage. À peu près tous les
paradigmes sont utilisables en C++ (même la programmation
fonctionnelle, avec les templates), ce qui donne une grande liberté,
mais aussi plus de responsabilités, au programmeur.
Le C++ est complexe pour une toute autre raison : il a plus de
fonctionnalités que n'importe quel autre langage. À peu près tous les
paradigmes sont utilisables en C++ (même la programmation
fonctionnelle, avec les templates), ce qui donne une grande liberté,
mais aussi plus de responsabilités, au programmeur.
On Mon, 10 Dec 2007, James Kanze wrote:
| On Dec 9, 11:48 pm, Fabien LE LEZ wrote:
|
| [...]
| > Le C++ est complexe pour une toute autre raison : il a plus de
| > fonctionnalités que n'importe quel autre langage.
|
| Non seulement.
Well, il y a Perl :-/
| Une des raisons principales pour sa manque de
| simplicité et d'élégance, c'est qu'il se base sur le C. Sans ce
| rapport avec le C, je suis sûr qu'il serait beaucoup plus simple
| et plus élégant (encore que les problèmes de compatibilité entre
| le C++ d'aujourd'hui, et celui du passée, exigeraient aussi des
| compromis). Sans ce rapport, il serait aussi beaucoup moins
| utilisé, vraiment beaucoup.
Note cependant que d'autres langages comme Java on Ada n'ont pas ce
poids de compatibilité avec le C, mais sont quand même assez complexes
(au moins aussi complexe que C++).
On Mon, 10 Dec 2007, James Kanze wrote:
| On Dec 9, 11:48 pm, Fabien LE LEZ <grams...@gramster.com> wrote:
|
| [...]
| > Le C++ est complexe pour une toute autre raison : il a plus de
| > fonctionnalités que n'importe quel autre langage.
|
| Non seulement.
Well, il y a Perl :-/
| Une des raisons principales pour sa manque de
| simplicité et d'élégance, c'est qu'il se base sur le C. Sans ce
| rapport avec le C, je suis sûr qu'il serait beaucoup plus simple
| et plus élégant (encore que les problèmes de compatibilité entre
| le C++ d'aujourd'hui, et celui du passée, exigeraient aussi des
| compromis). Sans ce rapport, il serait aussi beaucoup moins
| utilisé, vraiment beaucoup.
Note cependant que d'autres langages comme Java on Ada n'ont pas ce
poids de compatibilité avec le C, mais sont quand même assez complexes
(au moins aussi complexe que C++).
On Mon, 10 Dec 2007, James Kanze wrote:
| On Dec 9, 11:48 pm, Fabien LE LEZ wrote:
|
| [...]
| > Le C++ est complexe pour une toute autre raison : il a plus de
| > fonctionnalités que n'importe quel autre langage.
|
| Non seulement.
Well, il y a Perl :-/
| Une des raisons principales pour sa manque de
| simplicité et d'élégance, c'est qu'il se base sur le C. Sans ce
| rapport avec le C, je suis sûr qu'il serait beaucoup plus simple
| et plus élégant (encore que les problèmes de compatibilité entre
| le C++ d'aujourd'hui, et celui du passée, exigeraient aussi des
| compromis). Sans ce rapport, il serait aussi beaucoup moins
| utilisé, vraiment beaucoup.
Note cependant que d'autres langages comme Java on Ada n'ont pas ce
poids de compatibilité avec le C, mais sont quand même assez complexes
(au moins aussi complexe que C++).
On Sun, 9 Dec 2007, Fabien LE LEZ wrote:
| On Sun, 9 Dec 2007 22:08:14 +0000 (UTC), (Marc Espie):
|
| >>Bof... Ça contribue à alimenter le mythe qu'il y a un rapport
| >>privilégié entre le C++ et le C.
| >
| >C'est pas un mythe !
|
| Ah bon ?
Oui.
On Sun, 9 Dec 2007, Fabien LE LEZ wrote:
| On Sun, 9 Dec 2007 22:08:14 +0000 (UTC), espie@lain.home (Marc Espie):
|
| >>Bof... Ça contribue à alimenter le mythe qu'il y a un rapport
| >>privilégié entre le C++ et le C.
| >
| >C'est pas un mythe !
|
| Ah bon ?
Oui.
On Sun, 9 Dec 2007, Fabien LE LEZ wrote:
| On Sun, 9 Dec 2007 22:08:14 +0000 (UTC), (Marc Espie):
|
| >>Bof... Ça contribue à alimenter le mythe qu'il y a un rapport
| >>privilégié entre le C++ et le C.
| >
| >C'est pas un mythe !
|
| Ah bon ?
Oui.
On Mon, 10 Dec 2007, James Kanze wrote:
| On Dec 9, 11:48 pm, Fabien LE LEZ wrote:
| [...]
| > Le C++ est complexe pour une toute autre raison : il a plus de
| > fonctionnalités que n'importe quel autre langage.
| Non seulement.
Well, il y a Perl :-/
| Une des raisons principales pour sa manque de
| simplicité et d'élégance, c'est qu'il se base sur le C. Sans ce
| rapport avec le C, je suis sûr qu'il serait beaucoup plus simple
| et plus élégant (encore que les problèmes de compatibilité entre
| le C++ d'aujourd'hui, et celui du passée, exigeraient aussi des
| compromis). Sans ce rapport, il serait aussi beaucoup moins
| utilisé, vraiment beaucoup.
Note cependant que d'autres langages comme Java on Ada n'ont pas ce
poids de compatibilité avec le C, mais sont quand même assez complexes
(au moins aussi complexe que C++).
On Mon, 10 Dec 2007, James Kanze wrote:
| On Dec 9, 11:48 pm, Fabien LE LEZ <grams...@gramster.com> wrote:
| [...]
| > Le C++ est complexe pour une toute autre raison : il a plus de
| > fonctionnalités que n'importe quel autre langage.
| Non seulement.
Well, il y a Perl :-/
| Une des raisons principales pour sa manque de
| simplicité et d'élégance, c'est qu'il se base sur le C. Sans ce
| rapport avec le C, je suis sûr qu'il serait beaucoup plus simple
| et plus élégant (encore que les problèmes de compatibilité entre
| le C++ d'aujourd'hui, et celui du passée, exigeraient aussi des
| compromis). Sans ce rapport, il serait aussi beaucoup moins
| utilisé, vraiment beaucoup.
Note cependant que d'autres langages comme Java on Ada n'ont pas ce
poids de compatibilité avec le C, mais sont quand même assez complexes
(au moins aussi complexe que C++).
On Mon, 10 Dec 2007, James Kanze wrote:
| On Dec 9, 11:48 pm, Fabien LE LEZ wrote:
| [...]
| > Le C++ est complexe pour une toute autre raison : il a plus de
| > fonctionnalités que n'importe quel autre langage.
| Non seulement.
Well, il y a Perl :-/
| Une des raisons principales pour sa manque de
| simplicité et d'élégance, c'est qu'il se base sur le C. Sans ce
| rapport avec le C, je suis sûr qu'il serait beaucoup plus simple
| et plus élégant (encore que les problèmes de compatibilité entre
| le C++ d'aujourd'hui, et celui du passée, exigeraient aussi des
| compromis). Sans ce rapport, il serait aussi beaucoup moins
| utilisé, vraiment beaucoup.
Note cependant que d'autres langages comme Java on Ada n'ont pas ce
poids de compatibilité avec le C, mais sont quand même assez complexes
(au moins aussi complexe que C++).
Well, il y a Perl :-/
C'est vrai. Comme quoi, avec un peu d'effort, on peut donner
même à C++ l'air d'être simple et élégant en comparaison.
Well, il y a Perl :-/
C'est vrai. Comme quoi, avec un peu d'effort, on peut donner
même à C++ l'air d'être simple et élégant en comparaison.
Well, il y a Perl :-/
C'est vrai. Comme quoi, avec un peu d'effort, on peut donner
même à C++ l'air d'être simple et élégant en comparaison.