Le concept de null

Quelques raccourcis :

Vous trouverez à ../Divers--cplusplus/CPP--NULL.html des détails sur l'histoire de NULL (et 0, et nullptr, et...) en C++. La présente page porte sur le concept de null pris dans une acception plus large.

Notez que le nom null est moins important ici que le concept de null. Plusieurs langages utilisent un symbole distinct pour le même concept : Pascal le nomme nil, le C traditionnel utilise NULL, C++ 03 privilégie 0, C++ 11 pour nullptr, C# et Java utilisent null, VB.NET préfère Nothing...

Une erreur qui coûte très cher?

On attribue à Tony Hoare (C. A. R. Hoare) l'idée du null, avec ALGOL 60 : une valeur particulière pour représenter l'absence de quelque chose. Historiquement, le concept de null est lié à celui d'indirection : si une référence ou un pointeur peut mener vers divers objets dans un programme, comment peut-on représenter le fait qu'elle ne mène essentiellement nulle part?

Le concept de pointeur nul ou de référence nulle a fait époque, étant repris dans beaucoup, beaucoup de langages de programmation. Dans les langages tels que C ou C++, où il est possible d'adresser de la mémoire directement, on doit distinguer l'idée de « pointeur non-initialisé » de celle que « pointeur nul », au sens où le pointeur nul a une valeur a priori reconnaissable comme ne menant sur aucun objet, alors qu'un pointeur non-initialisé ne peut être distingué d'un pointeur menant bel et bien sur un objet. Dans les langages qui se disent plus sécuritaires, par exemple Java ou C#, les références sont typiquement initialisées à null par défaut.

Réaliser (erronément) des indirections à travers un pointeur nul est une faute classique en programmation quelque peu imprudente. C'est pour cette raison que Tony Hoare a nommé ce concept son One Billion Dollar Mistake. Pour une retranscription de cette présentation, voir http://mattcallanan.blogspot.ca/2010/09/tony-hoare-billion-dollar-mistake.html par Matt Callanan en 2010.

En 2013, Yin Wang prend position à l'effet que null n'est pas un défaut en soi, mais n'est pas convenablement pris en charge par les systèmes de types : http://yinwang0.wordpress.com/2013/06/03/null/

En 2009, pour le 75e anniversaire de Tony Hoare, Bertrand Meyer, Alexander Kogtenvov et Emmanuel Stapf ont publié un article sur l'éradication de l'accès aux références nulles dans Eiffel : https://docs.eiffel.com/sites/default/files/void-safe-eiffel.pdf Cet article ne prend pas une position selon laquelle null serait une mauvaise idée, mais tient plutôt un discours selon lequel permettre d'utiliser une référence nulle pour accéder à des « services » est l'aberration contre laquelle un système de types doit se défendre.

En 2015, Paul Draper revient sur ce concept qu'il qualifie de « pire erreur de l'histoire de l'informatique » : https://www.lucidchart.com/techblog/2015/08/31/the-worst-mistake-of-computer-science/

Qualités

Dans les langages comme C ou C++, où il est possible d'adresser de la mémoire directement, le pointeur nul est un marqueur reconnaissable pour un pointeur qui ne mène pas vers un objet. Un pointeur est testable comme un booléen, étant considéré faux s'il est nul.

Dans un langage ne permettant pas un accès direct aux objets, comme Java ou C#, la référence nulle constitue une valeur par défaut pertinente pour les références non-initialisées.

Défauts

Texte de 2014 présentant null comme une sorte de « syndrome de Stockholm » des systèmes de types : http://blog.pshendry.com/2014/09/null-stockholm-syndrome.html

Selon les langages

Le NULL de C :

Le concept de null en C# :

Petite histoire de NULL, 0, nullptr et variantes en C++ : ../Divers--cplusplus/CPP--NULL.html

Le null de JavaScript est particulier (!) en ceci que null == 0 est faux, null > 0 est faux, mais null >= 0 est vrai. Texte d'Abinav Seelan en 2017 : https://blog.campvanilla.com/javascript-the-curious-case-of-null-0-7b131644e274

Comprendre le NULL de SQL :

Ceylon serait-il un des rares langages à gérer intelligemment le concept de pointeur nul? Texte de 2016 : http://blog.jooq.org/2016/03/15/ceylon-might-just-be-the-only-language-that-got-nulls-right/

Lectures complémentaires

Quelques liens pour enrichir le propos.


Valid XHTML 1.0 Transitional

CSS Valide !