Samuel Devulder writes:Mais au final, dans mon Tetris, dès fois je vais tomber sur un carré
et dès fois sur un demi-T de mamière aléatoire. Donc, au final,
forcémentx quelque part dans le code j'aurais au moins une fois un
swith (ou des if), non ?
En fait oui,
Non.pour la simple et bonne raison qu'un processeur standard
n'a fondamentalement pas de notion de d'heritage et de polymorphisme,
et que la seule chose qu'il sache faire ce sont du calcul
arithméthique, et des gotos +/- conditionnels.
Et des branchements indirects. L'équivalent d'appeler une fonction en
C via un pointeur, d'une certaine façon. C'est comme cela que la
liaison dynamique est faite.
-- Alain.
Samuel Devulder <samuel-dot-devulder@geensys.com> writes:
Mais au final, dans mon Tetris, dès fois je vais tomber sur un carré
et dès fois sur un demi-T de mamière aléatoire. Donc, au final,
forcémentx quelque part dans le code j'aurais au moins une fois un
swith (ou des if), non ?
En fait oui,
Non.
pour la simple et bonne raison qu'un processeur standard
n'a fondamentalement pas de notion de d'heritage et de polymorphisme,
et que la seule chose qu'il sache faire ce sont du calcul
arithméthique, et des gotos +/- conditionnels.
Et des branchements indirects. L'équivalent d'appeler une fonction en
C via un pointeur, d'une certaine façon. C'est comme cela que la
liaison dynamique est faite.
-- Alain.
Samuel Devulder writes:Mais au final, dans mon Tetris, dès fois je vais tomber sur un carré
et dès fois sur un demi-T de mamière aléatoire. Donc, au final,
forcémentx quelque part dans le code j'aurais au moins une fois un
swith (ou des if), non ?
En fait oui,
Non.pour la simple et bonne raison qu'un processeur standard
n'a fondamentalement pas de notion de d'heritage et de polymorphisme,
et que la seule chose qu'il sache faire ce sont du calcul
arithméthique, et des gotos +/- conditionnels.
Et des branchements indirects. L'équivalent d'appeler une fonction en
C via un pointeur, d'une certaine façon. C'est comme cela que la
liaison dynamique est faite.
-- Alain.
Alain Ketterlin a écrit :Mais au final, dans mon Tetris, dès fois je vais tomber sur un carré
et dès fois sur un demi-T de mamière aléatoire. Donc, au final,
forcémentx quelque part dans le code j'aurais au moins une fois un
swith (ou des if), non ?
En fait oui,
Non.
Ah, serait-ce possible d'avoir un bout de code java (même un peu
elliptique par endroit), où l'on crée dès fois une pièce de type
Carre, dès fois de type demi-T, sans utiliser le moindre switch ou if
équivalent ?
J'imagine qu'il y aura une classe abstraite Piece qui contient une
méthode abstraite faireTourner(). Puis, on aura deux classes Carre et
DemiT qui hériteront de la classe Piece et qui implémenteront à leur
manière la méthode faireTourner(). Ok.
Car là, je ne vois pas du tout comment c'est possible.
Alain Ketterlin a écrit :
Mais au final, dans mon Tetris, dès fois je vais tomber sur un carré
et dès fois sur un demi-T de mamière aléatoire. Donc, au final,
forcémentx quelque part dans le code j'aurais au moins une fois un
swith (ou des if), non ?
En fait oui,
Non.
Ah, serait-ce possible d'avoir un bout de code java (même un peu
elliptique par endroit), où l'on crée dès fois une pièce de type
Carre, dès fois de type demi-T, sans utiliser le moindre switch ou if
équivalent ?
J'imagine qu'il y aura une classe abstraite Piece qui contient une
méthode abstraite faireTourner(). Puis, on aura deux classes Carre et
DemiT qui hériteront de la classe Piece et qui implémenteront à leur
manière la méthode faireTourner(). Ok.
Car là, je ne vois pas du tout comment c'est possible.
Alain Ketterlin a écrit :Mais au final, dans mon Tetris, dès fois je vais tomber sur un carré
et dès fois sur un demi-T de mamière aléatoire. Donc, au final,
forcémentx quelque part dans le code j'aurais au moins une fois un
swith (ou des if), non ?
En fait oui,
Non.
Ah, serait-ce possible d'avoir un bout de code java (même un peu
elliptique par endroit), où l'on crée dès fois une pièce de type
Carre, dès fois de type demi-T, sans utiliser le moindre switch ou if
équivalent ?
J'imagine qu'il y aura une classe abstraite Piece qui contient une
méthode abstraite faireTourner(). Puis, on aura deux classes Carre et
DemiT qui hériteront de la classe Piece et qui implémenteront à leur
manière la méthode faireTourner(). Ok.
Car là, je ne vois pas du tout comment c'est possible.
Wykaaa a écrit :.J'a... doooooore !
Mais je ne voulais pas effrayer François ;-)
C'est gentil d'avoir pensé à moi. :-)
Je garde ce code dans un coin pour essayer de le potasser, car là comme
ça c'est trop dur.
Wykaaa a écrit :.
J'a... doooooore !
Mais je ne voulais pas effrayer François ;-)
C'est gentil d'avoir pensé à moi. :-)
Je garde ce code dans un coin pour essayer de le potasser, car là comme
ça c'est trop dur.
Wykaaa a écrit :.J'a... doooooore !
Mais je ne voulais pas effrayer François ;-)
C'est gentil d'avoir pensé à moi. :-)
Je garde ce code dans un coin pour essayer de le potasser, car là comme
ça c'est trop dur.
Alain Ketterlin a écrit :
Et des branchements indirects. L'équivalent d'appeler une fonction en
C via un pointeur, d'une certaine façon. C'est comme cela que la
liaison dynamique est faite.
-- Alain.
Les branchements sont indirects (pointeur sur la table des fonctions
virtuelles) mais il y a aussi une indexation pour appeler la "bonne"
fonction.
Ceci est la génération "générique" du polymorphisme mais en
fonction des options d'optimisation et du nombre de fonctions
virtuelles, on peut aussi mettre la table dans chaque classe (on perd
en mémoire mais on gagne l'indirection à chaque fois).
Tous les assembleurs ne permettent pas forcément de faire un
branchement indirect ET indexé en une seule instruction.
Dans les assembleurs qui le permettent, on peut aussi faire générer
les switch de cette façon par le compilo dans le cas où le tableau du
switch est "creux" par rapport au nombre de cas possibles (pointeur
sur la table et index sur le bon cas).
Alain Ketterlin a écrit :
Et des branchements indirects. L'équivalent d'appeler une fonction en
C via un pointeur, d'une certaine façon. C'est comme cela que la
liaison dynamique est faite.
-- Alain.
Les branchements sont indirects (pointeur sur la table des fonctions
virtuelles) mais il y a aussi une indexation pour appeler la "bonne"
fonction.
Ceci est la génération "générique" du polymorphisme mais en
fonction des options d'optimisation et du nombre de fonctions
virtuelles, on peut aussi mettre la table dans chaque classe (on perd
en mémoire mais on gagne l'indirection à chaque fois).
Tous les assembleurs ne permettent pas forcément de faire un
branchement indirect ET indexé en une seule instruction.
Dans les assembleurs qui le permettent, on peut aussi faire générer
les switch de cette façon par le compilo dans le cas où le tableau du
switch est "creux" par rapport au nombre de cas possibles (pointeur
sur la table et index sur le bon cas).
Alain Ketterlin a écrit :
Et des branchements indirects. L'équivalent d'appeler une fonction en
C via un pointeur, d'une certaine façon. C'est comme cela que la
liaison dynamique est faite.
-- Alain.
Les branchements sont indirects (pointeur sur la table des fonctions
virtuelles) mais il y a aussi une indexation pour appeler la "bonne"
fonction.
Ceci est la génération "générique" du polymorphisme mais en
fonction des options d'optimisation et du nombre de fonctions
virtuelles, on peut aussi mettre la table dans chaque classe (on perd
en mémoire mais on gagne l'indirection à chaque fois).
Tous les assembleurs ne permettent pas forcément de faire un
branchement indirect ET indexé en une seule instruction.
Dans les assembleurs qui le permettent, on peut aussi faire générer
les switch de cette façon par le compilo dans le cas où le tableau du
switch est "creux" par rapport au nombre de cas possibles (pointeur
sur la table et index sur le bon cas).
Et des branchements indirects. L'équivalent d'appeler une fonction en
C via un pointeur, d'une certaine façon. C'est comme cela que la
liaison dynamique est faite.
Et des branchements indirects. L'équivalent d'appeler une fonction en
C via un pointeur, d'une certaine façon. C'est comme cela que la
liaison dynamique est faite.
Et des branchements indirects. L'équivalent d'appeler une fonction en
C via un pointeur, d'une certaine façon. C'est comme cela que la
liaison dynamique est faite.
Alain Ketterlin a écrit :Et des branchements indirects. L'équivalent d'appeler une fonction en
C via un pointeur, d'une certaine façon. C'est comme cela que la
liaison dynamique est faite.
Perso je n'oserai pas parler de polymorphisme en parlant de
jsr @a0
sur un 680x0:)
Mais bon, ca se discute. Cela dit, dans le calcul de l'adresse que
l'on met dans a0, il y aura bien des gotos et des tests sur des
valeurs numériques.
Alain Ketterlin a écrit :
Et des branchements indirects. L'équivalent d'appeler une fonction en
C via un pointeur, d'une certaine façon. C'est comme cela que la
liaison dynamique est faite.
Perso je n'oserai pas parler de polymorphisme en parlant de
jsr @a0
sur un 680x0:)
Mais bon, ca se discute. Cela dit, dans le calcul de l'adresse que
l'on met dans a0, il y aura bien des gotos et des tests sur des
valeurs numériques.
Alain Ketterlin a écrit :Et des branchements indirects. L'équivalent d'appeler une fonction en
C via un pointeur, d'une certaine façon. C'est comme cela que la
liaison dynamique est faite.
Perso je n'oserai pas parler de polymorphisme en parlant de
jsr @a0
sur un 680x0:)
Mais bon, ca se discute. Cela dit, dans le calcul de l'adresse que
l'on met dans a0, il y aura bien des gotos et des tests sur des
valeurs numériques.
Wykaaa writes:Alain Ketterlin a écrit :Et des branchements indirects. L'équivalent d'appeler une fonction en
C via un pointeur, d'une certaine façon. C'est comme cela que la
liaison dynamique est faite.
-- Alain.Les branchements sont indirects (pointeur sur la table des fonctions
virtuelles) mais il y a aussi une indexation pour appeler la "bonne"
fonction.
C'est connu par le compilateur, il n'y rien à rechercher. Ou alors je
comprends mal ce que tu dis.
Ceci est la génération "générique" du polymorphisme mais en
fonction des options d'optimisation et du nombre de fonctions
virtuelles, on peut aussi mettre la table dans chaque classe (on perd
en mémoire mais on gagne l'indirection à chaque fois).
Je ne connais pas de cas où la table n'est pas associée à la classe.
On peut éviter de consulter la table si tout est connu à la
compilation, mais en Java c'est fortement compromis par le chargement
dynamique de classes.Tous les assembleurs ne permettent pas forcément de faire un
branchement indirect ET indexé en une seule instruction.
Dans ce cas on en fait deux.
Dans les assembleurs qui le permettent, on peut aussi faire générer
les switch de cette façon par le compilo dans le cas où le tableau du
switch est "creux" par rapport au nombre de cas possibles (pointeur
sur la table et index sur le bon cas).
Dans le cas d'un appel de méthode, le tableau ne peut jamais être
"creux". Mais c'est un peu compliqué par l'héritage. Voir la
définition de "invokevirtual" dans la ref. JVM.
-- Alain.
Wykaaa <wykaaa@yahoo.fr> writes:
Alain Ketterlin a écrit :
Et des branchements indirects. L'équivalent d'appeler une fonction en
C via un pointeur, d'une certaine façon. C'est comme cela que la
liaison dynamique est faite.
-- Alain.
Les branchements sont indirects (pointeur sur la table des fonctions
virtuelles) mais il y a aussi une indexation pour appeler la "bonne"
fonction.
C'est connu par le compilateur, il n'y rien à rechercher. Ou alors je
comprends mal ce que tu dis.
Ceci est la génération "générique" du polymorphisme mais en
fonction des options d'optimisation et du nombre de fonctions
virtuelles, on peut aussi mettre la table dans chaque classe (on perd
en mémoire mais on gagne l'indirection à chaque fois).
Je ne connais pas de cas où la table n'est pas associée à la classe.
On peut éviter de consulter la table si tout est connu à la
compilation, mais en Java c'est fortement compromis par le chargement
dynamique de classes.
Tous les assembleurs ne permettent pas forcément de faire un
branchement indirect ET indexé en une seule instruction.
Dans ce cas on en fait deux.
Dans les assembleurs qui le permettent, on peut aussi faire générer
les switch de cette façon par le compilo dans le cas où le tableau du
switch est "creux" par rapport au nombre de cas possibles (pointeur
sur la table et index sur le bon cas).
Dans le cas d'un appel de méthode, le tableau ne peut jamais être
"creux". Mais c'est un peu compliqué par l'héritage. Voir la
définition de "invokevirtual" dans la ref. JVM.
-- Alain.
Wykaaa writes:Alain Ketterlin a écrit :Et des branchements indirects. L'équivalent d'appeler une fonction en
C via un pointeur, d'une certaine façon. C'est comme cela que la
liaison dynamique est faite.
-- Alain.Les branchements sont indirects (pointeur sur la table des fonctions
virtuelles) mais il y a aussi une indexation pour appeler la "bonne"
fonction.
C'est connu par le compilateur, il n'y rien à rechercher. Ou alors je
comprends mal ce que tu dis.
Ceci est la génération "générique" du polymorphisme mais en
fonction des options d'optimisation et du nombre de fonctions
virtuelles, on peut aussi mettre la table dans chaque classe (on perd
en mémoire mais on gagne l'indirection à chaque fois).
Je ne connais pas de cas où la table n'est pas associée à la classe.
On peut éviter de consulter la table si tout est connu à la
compilation, mais en Java c'est fortement compromis par le chargement
dynamique de classes.Tous les assembleurs ne permettent pas forcément de faire un
branchement indirect ET indexé en une seule instruction.
Dans ce cas on en fait deux.
Dans les assembleurs qui le permettent, on peut aussi faire générer
les switch de cette façon par le compilo dans le cas où le tableau du
switch est "creux" par rapport au nombre de cas possibles (pointeur
sur la table et index sur le bon cas).
Dans le cas d'un appel de méthode, le tableau ne peut jamais être
"creux". Mais c'est un peu compliqué par l'héritage. Voir la
définition de "invokevirtual" dans la ref. JVM.
-- Alain.
Mais pour calculer quoi ? Un pointeur et un index dans un tableau
suffisent, le pointeur est conservé explicitement et l'index est
déterminé à la compilation. Il n'y a plus rien à faire à l'exécution.
Mais pour calculer quoi ? Un pointeur et un index dans un tableau
suffisent, le pointeur est conservé explicitement et l'index est
déterminé à la compilation. Il n'y a plus rien à faire à l'exécution.
Mais pour calculer quoi ? Un pointeur et un index dans un tableau
suffisent, le pointeur est conservé explicitement et l'index est
déterminé à la compilation. Il n'y a plus rien à faire à l'exécution.
Alain Ketterlin a écrit :Mais pour calculer quoi ? Un pointeur et un index dans un tableau
suffisent, le pointeur est conservé explicitement et l'index est
déterminé à la compilation. Il n'y a plus rien à faire à l'exécution.
Ca marche pas avec le bytecode java. Le invoke prend en argument une
chaine décrivant la méthode, donc il faut aller consulter une table et
comparer des chaines, ce qui implique des tests et des sauts au bas
(très bas) niveau.
Alain Ketterlin a écrit :
Mais pour calculer quoi ? Un pointeur et un index dans un tableau
suffisent, le pointeur est conservé explicitement et l'index est
déterminé à la compilation. Il n'y a plus rien à faire à l'exécution.
Ca marche pas avec le bytecode java. Le invoke prend en argument une
chaine décrivant la méthode, donc il faut aller consulter une table et
comparer des chaines, ce qui implique des tests et des sauts au bas
(très bas) niveau.
Alain Ketterlin a écrit :Mais pour calculer quoi ? Un pointeur et un index dans un tableau
suffisent, le pointeur est conservé explicitement et l'index est
déterminé à la compilation. Il n'y a plus rien à faire à l'exécution.
Ca marche pas avec le bytecode java. Le invoke prend en argument une
chaine décrivant la méthode, donc il faut aller consulter une table et
comparer des chaines, ce qui implique des tests et des sauts au bas
(très bas) niveau.