Fichier créé en 1996.
Mes plus beaux bugs
En Caml V2-6.1:
Problème d'auto-génération du compilateur: le compilateur Caml est
écrit en Caml. Il doit donc se compiler lui-même; il faut donc qu'il
soit ``assez correct'' pour se compiler correctement! Alors, comment
corriger des erreurs dans le compilateur ? C'est quelquefois
difficile: il faut revenir en arrière, du temps où l'on disposait d'un
compilateur assez correct pour compiler correctement les corrections
d'erreur du compilateur corrigé!
C'est quelquefois tellement difficile qu'il faut une intervention
``manuelle'', par exemple la création d'un compilateur temporaire
incapable de se recompiler, mais capable de compiler une version du
compilateur qui pourra se recompiler elle-même.
Ce cas s'est produit lorsque le module du compilateur qui traite le filtrage
comportait une erreur dans l'analyse des cas de constructeurs
``superflus'', c'est-à-dire les constructeurs physiquement absents de la
représentation des valeurs (bien que logiquement présents d'après la
définition du type). Ce qui, dans certains cas particuliers, compilait
du code faux qui ne sélectionnait pas le bon cas de filtrage. Bien
entendu, et par un fait exprès, ce cas particulier se produisait
justement dans le fichier du compilateur de filtrage lui-même, ou plus
exactement apparaissait dans la correction ! Ce qui fait que le
compilateur erroné avait pu se recompiler correctement (l'ancien code
(faux) ne faisait pas apparaître le bug) mais il était incapable de
compiler correctement la correction qui nécessitait évidemment un
compilateur corrigé. Dans ce cas précis, au lieu de revenir en arrière
avec un ``vieux'' compilateur, j'ai carrément dû corriger le fichier
compilé à l'éditeur de texte, en effet
... ?
En Caml V3.0:
#if not true then 1 else 2;;
2 : num
#not true = false;;
false : bool
D'après la première phrase, il est clair que not true
s'évalue correctement en faux, puisque la seconde branche de
l'alternative est sélectionnée.
Cependant, la deuxième phrase renvoie un résultat complètement faux
qui semble indiquer que not true n'est pas égal à
false!
Comment expliquer que le même compilateur puisse compiler correctement
la première phrase et pas la seconde ?
En Caml V3.1:
#true && (true, true);;
false has an instance of type bool which should match type bool * bool in
true && (true,true),
one error in typechecking
Pourquoi ce message d'erreur étrange, et d'où vient ce ``false'' ?
En Caml Light:
En faisant des essais de génération de programmes polymorphes
produisant beaucoup de variables de types:
(f : 'a -> 'b -> ... -> 'z -> 'aa -> 'ab -> .. -> 'az -> 'ba -> ..);;
a produit une erreur de syntaxe à ma grande stupéfaction. Ce n'était
pas une erreur du compilateur mais une conséquence logique de la
syntaxe du langage. En effet ...
En Caml Special Light:
#if not true then 2 else 0;;
- : int = 1
Résultat franchement étrange! C'était une erreur du compilateur bien
sûr, mais la machine n'avait pas inventé ce 1, il venait de
... ?
En Scheme:
Christian Queinnec a eu une erreur étonnante avec le compilateur
Scheme->c qui engendrait des variables temporaires
notées r100, r101, r102, ... Un
jour, compilant un gros fichier scheme vers C, le compilateur a
trouvé une erreur de syntaxe. En regardant le code engendré Christian
a vu que la ligne erronée était r3000 = .... En effet ...
Dernière modification: Monday, November 20, 2000
Copyright
© 1994-2009, INRIA. Tous droits réservés.
Contacter l'auteur Pierre.Weis@inria.fr