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