1/Dans le monde à classe (Eiffel, donc), on effectue une analyse syntaxique (ou une analyse de flot) du code pour créer des procédure contextualisant le polymorphisme.
C'est à dire que le compilateur SmartEiffel va produire en C
BMP_affiche_toi()
JPG_affiche_toi()
et il colle un test du genre si besoin :
if (image->type == BMP) {
affiche_toi_BMP();
} else { // C'est du JPEG
affiche_toi_JPEG();
};
Je pinaille mais:
1. Ce n'est pas Eiffel qui fonctionne comme cela, mais SmartEiffel. Eiffel est un langage et n'impose rien pour l'implémentation du compilateur.
2. Je crois (j'espère!) que ce n'est pas comme ça : comme le compilo connait toutes les classes au moment de la compil, il fait un:
switch (image->type)
{
case BMP: affiche_toi_BMP(); break;
case JPEG: afficheçtoi_JPG(); break;
default: raise_exception (...);
}
et il se trouve que ce code n'est pas moins rapide (voire même plus rapide) que de passer par une VFT. Avec un if/else, le nombre de tests pourrait devenir bien plus important (et donc pénalisant par rapport à l'usage d'une VFT).
Mais ce n'est bien sûr possible que parce que *tous* les types sont connus au moment de la compilation. D'où l'impossibilité d'utiliser les DSO avec SmartEiffel.
[^] # Re: Supprimer la VFT
Posté par left . En réponse à la dépêche 23 mars: Conférence au LORIA sur Lisaac, un nouveau langage. Évalué à 4.
C'est à dire que le compilateur SmartEiffel va produire en C
BMP_affiche_toi()
JPG_affiche_toi()
et il colle un test du genre si besoin :
if (image->type == BMP) {
affiche_toi_BMP();
} else { // C'est du JPEG
affiche_toi_JPEG();
};
Je pinaille mais:
1. Ce n'est pas Eiffel qui fonctionne comme cela, mais SmartEiffel. Eiffel est un langage et n'impose rien pour l'implémentation du compilateur.
2. Je crois (j'espère!) que ce n'est pas comme ça : comme le compilo connait toutes les classes au moment de la compil, il fait un:
switch (image->type)
{
case BMP: affiche_toi_BMP(); break;
case JPEG: afficheçtoi_JPG(); break;
default: raise_exception (...);
}
et il se trouve que ce code n'est pas moins rapide (voire même plus rapide) que de passer par une VFT. Avec un if/else, le nombre de tests pourrait devenir bien plus important (et donc pénalisant par rapport à l'usage d'une VFT).
Mais ce n'est bien sûr possible que parce que *tous* les types sont connus au moment de la compilation. D'où l'impossibilité d'utiliser les DSO avec SmartEiffel.