Fichier créé le 14 novembre 1997.

L'erreur dans le résultat de la seconde phrase est due à une implémentation fausse de la primitive not (qui se comportait en fait comme l'identité). Cela n'explique cependant pas pourquoi la première phrase est évaluée correctement. La raison en est que le compilateur effectue les transformations suivantes sur le code qui lui est soumis:

Ce qui fait que le code compilé pour la première phrase était réduit par le compilateur à l'évaluation de l'entier 2, ce qui est correct, et élimine complètement l'appel à la primitive not.

En revanche la seconde phrase obligeait le compilateur à compiler une application de not, ce qui mettait en évidence le code faux de not. Le compilateur aurait aussi pu réduire l'expression not true en false, ce qui aurait aussi masqué l'erreur poour la seconde phrase! (Dans Caml V3.0, cette optimisation avait été jugée inutile car not true n'apparaît pratiquement jamais directement dans les programmes source.)

Le plus intéressant dans l'histoire c'est que le compilateur était capable de se recompiler sans erreur: les occurrences de not, employé en tant que fonction, sont très rares; en tout cas aucune n'apparaissait dans le compilateur lui-même.


Dernière modification: Friday, January 23, 1998
Copyright © 1994-2009, INRIA. Tous droits réservés.

Contacter l'auteur Pierre.Weis@inria.fr