AccueilđŸ‡«đŸ‡·Chercher

Booléen

En programmation informatique, un booléen est un type de variable à deux états (généralement notés vrai et faux), destiné à représenter les valeurs de vérité de la logique et l'algÚbre booléenne. Il est nommé ainsi d'aprÚs George Boole, fondateur dans le milieu du XIXe siÚcle de l'algÚbre portant son nom. Le type de données booléen est principalement associé à des états conditionnels. C'est un cas particulier du type de données logique, la logique n'étant pas toujours de type booléen.

George BOOLE (1864-1865) L'homme ayant mis en place la premiÚre structure algébrique utilisée en logique mathématique, en informatique et en électronique.

Généralités

Dans les langages de programmation avec un type de donnĂ©es boolĂ©en, comme le Pascal ou le Java, les opĂ©rateurs de comparaison tels que > et ≠ sont gĂ©nĂ©ralement dĂ©finis pour retourner une valeur boolĂ©enne. Les structures conditionnelles et itĂ©ratives peuvent ĂȘtre dĂ©finies afin de tester des expressions boolĂ©ennes.

Les langages sans type de donnĂ©es boolĂ©en, comme C90 et Lisp, peuvent quand mĂȘme reprĂ©senter la vĂ©ritĂ© des valeurs par un autre type de donnĂ©es. Common Lisp utilise une liste vide pour faux et toute autre valeur pour vrai. Le langage C quant Ă  lui utilise le type de donnĂ©es entier, oĂč les expressions relationnelles telles que i > j et les expressions logiques reliĂ©es par && et || sont dĂ©finies de façon Ă  avoir la valeur 1 si la valeur est vrai et 0 si elle est fausse, alors que les tests effectuĂ©s par if, while, for, etc., considĂšrent toutes les valeurs non nulles comme vrai[1].

En effet, un boolĂ©en peut ĂȘtre considĂ©rĂ© (et implĂ©mentĂ©) en tant que variable numĂ©rique avec un bit, pouvant stocker deux valeurs. Cependant, l'implĂ©mentation des boolĂ©ens dans l'architecture des processeurs est plus susceptible d'ĂȘtre reprĂ©sentĂ©e par des mots, plutĂŽt que par un bit. Cela est dĂ» Ă  la maniĂšre dont les ordinateurs transfĂšrent des blocs d'informations.

La plupart des langages de programmation, y compris ceux n'ayant pas explicitement le type booléen, supportent les opérations booléennes et l'algÚbre de Boole telles que la conjonction (AND, ET, &, *), la disjonction (OR, OU, |, +), l'équivalence (EQ, EQV, =, ==), ou exclusif/non-équivalence (XOR, NEQV, ^, !=), et la négation (NOT, PAS, ~, !)

Dans certains autres langages, comme le Ruby, le Smalltalk, ou le Alice les valeurs vrai et faux appartiennent Ă  des classes sĂ©parĂ©es, c'est-Ă -dire Vrai et Faux, respectivement, il n'y a donc pas de type boolĂ©en.

En SQL, qui utilise une logique ternaire pour les comparaisons explicites en raison de son traitement particulier pour les valeurs NULL, le boolĂ©en (introduit en SQL:1999) est Ă©galement dĂ©fini pour inclure plus de deux valeurs, de sorte que les boolĂ©ens dans SQL peuvent stocker toutes les valeurs logiques rĂ©sultant de l'Ă©valuation des prĂ©dicats dans SQL. Une colonne de type boolĂ©en peut cependant ĂȘtre uniquement restreinte aux valeurs TRUE et FALSE .

Algorithmique et intégration du booléen

L'un des premiers langages de programmation à intégrer explicitement le type booléen fut le ALGOL 60 (1960) avec des valeurs vrai et faux et des opérateurs logiques indiqués par les symboles '' (et), '' (ou), '' (implique), '' (équivalence), et '' (non). En raison des limites des périphériques d'entrée et du jeu de caractÚres de l'époque, la plupart des compilateurs utilisaient des représentations alternatives et pour la plupart, AND, ou "AND".

Cette approche booléenne comme type de données (prédéfini) a été adopté plus tard par beaucoup de langages de programmation, tels que (entre autres) Simula 67 (1967), ALGOL 68 (1970)[2], Pascal (1970), Ada (1980), Java (1995), et C# (2000).

Fortran

La premiĂšre version du FORTRAN (1957) et son successeur, FORTRAN II (1958) n'avaient pas de valeurs ou d'opĂ©rations logiques; mĂȘme le conditionnel SI prenait une expression arithmĂ©tique et se ramifiait en trois situations en fonction de son signe. Le FORTRAN IV (1962), cependant, suivit l'exemple d'ALGOL 60 en fournissant un type de donnĂ©es boolĂ©en (LOGICAL) avec comme Ă©tats (.TRUE. et .FALSE.), comme opĂ©rateurs de comparaison de valeurs boolĂ©ennes (.EQ., .GT., etc.), et d'opĂ©rateurs logiques (.NOT., .AND., .OR.). Dans les dĂ©clarations FORMAT, un caractĂšre de contrĂŽle ('L') Ă©tait fourni pour l'analyse syntaxique ou de la mise en forme de valeurs logiques[3].

Lisp et Scheme

Le langage Lisp (1958) n'a jamais eu un type boolĂ©en intĂ©grĂ©. Au lieu de cela, les structures conditionnelles comme les cond supposent que la valeur logique faux est reprĂ©sentĂ©e par la liste vide (), dĂ©finie de la mĂȘme façon que l'atome nil ou NIL, alors que les autres s-expression sont interprĂ©tĂ©es comme vrai. Pour plus de commoditĂ©, la plupart des dialectes modernes de Lisp prĂ©dĂ©finissent l'atome t Ă  la valeur t, de sorte que t peut ĂȘtre utilisĂ© comme une notation mnĂ©monique pour vrai (ou true en anglais).

Cette approche (toute valeur peut ĂȘtre utilisĂ©e comme une valeur boolĂ©enne) fut rĂ©utilisĂ©e dans la plupart des dialectes: Lisp (Common Lisp, Scheme, Emacs Lisp), et des modĂšles similaires ont Ă©tĂ© adoptĂ©s par de nombreux langages de script, mĂȘme ceux ayant un type boolĂ©en distinct ou des valeurs boolĂ©ennes; la maniĂšre dont les valeurs sont interprĂ©tĂ©es comme fausses ou vraies varie d'un langage Ă  l'autre. Dans le Scheme par exemple, la valeur fausse est un atome distinct de la liste vide, de sorte que ce dernier est interprĂ©tĂ© comme vrai.

Pascal, Ada et Haskell

Le langage Pascal (1970) a introduit le concept de types Ă©numĂ©rĂ©s dĂ©fini du point de vue du dĂ©veloppeur. Un boolĂ©en intĂ©grĂ© a ensuite Ă©tĂ© introduit comme un type Ă©numĂ©rĂ© prĂ©dĂ©fini avec les valeurs FALSE et TRUE. Par dĂ©finition, toutes les comparaisons, les opĂ©rations logiques et les instructions conditionnelles donnent des valeurs boolĂ©ennes. Sinon, le type boolĂ©en avait toutes les installations disponibles pour les types Ă©numĂ©rĂ©s en gĂ©nĂ©ral, telles que la commande et l'utilisation en tant qu'indice. En revanche, la conversion entre les boolĂ©ens et les nombres entiers (ou tout autre type) demandait toujours des tests explicites ou des appels de fonction comme dans ALGOL 60. Cette approche (le boolĂ©en est un type Ă©numĂ©rĂ©) fut adoptĂ©e plus tard par la plupart des langages qui avait des types Ă©numĂ©rĂ©s, tels que Modula, Ada, et Haskell.

C, C++, Objective-C, AWK

Les implémentations initiales du langage C (1972) n'ont fourni aucun type booléen, et à ce jour, les valeurs booléennes dans les programmes en C sont souvent représentées par d'autres types de données, notamment les entiers (int). Les opérateurs de comparaison (>, ==, etc.) sont définis pour retourner un entier signé avec comme résultat, soit 0 (faux) ou 1 (vrai). Les opérateurs logiques (&&, ||, !, etc.) et les tests (if, while) supposent que le zéro est faux et que toutes les autres valeurs sont vraies.

AprÚs que les types énumérés (enum) ont été ajoutés à l' American National Standards Institute version de C (1989), de nombreux programmeurs C se sont habitués à définir leurs propres types booléens pour des raisons de lisibilité. Cependant, les types énumérés sont équivalents à des entiers selon les normes linguistiques; de sorte que l'efficacité de l'identité entre les Booléens et les nombres entiers est encore valable pour les programmes en C.

Le C standard (depuis C99) fournit un type boolĂ©en, appelĂ© _Bool. En incluant l'en-tĂȘte stdbool.h, on peut utiliser le nom plus intuitif de bool et les constantes true et false. Le langage garantit que deux variables boolĂ©ennes de valeur « vraie » seront considĂ©rĂ©es comme Ă©gales (ce qui n'Ă©tait pas possible avant l'arrivĂ©e du type). Les valeurs boolĂ©ennes continuent de se comporter comme des entiers, elles peuvent ĂȘtre stockĂ©es dans des variables de type entier, et utiliser n'importe oĂč un entier serait valide, y compris pour l'indexation, l'arithmĂ©tique, l'analyse ou le formatage. Cette approche (valeurs boolĂ©ennes sont juste des entiers) fut conservĂ©e dans toutes les versions ultĂ©rieures du C.

Le C++ dispose d'un type de données booléen bool, mais avec des conversions automatiques de scalaires et de valeurs de pointeur qui sont trÚs semblables à ceux du C. Cette approche fut aussi adoptée plus tard par beaucoup d'autres langages, en particulier par certains langages de script tels que AWK.

L'Objective-C a Ă©galement un type de donnĂ©es boolĂ©en BOOL intĂ©grĂ©, dont les valeurs possibles sont YES ou NO, respectivement Ă©quivalents Ă  vrai et faux[4]. D'autre part, dans les compilateurs Objective-C qui prennent en charge C99, le type _Bool C peut ĂȘtre utilisĂ©, puisque Objective-C est un sur-ensemble de C.

Perl et Lua

Perl n'a pas de type de données booléen. Au lieu de cela, toute valeur peut se comporter comme un booléen dans un contexte booléen (condition de if ou boucle while, l'argument de && ou ||, etc.). Le nombre 0, la chaßne de caractÚres "0" et "", la liste vide (), et la valeur spéciale undef sont interprétés comme la valeur faux[5]. Tout le reste est évalué à vrai.

Le Lua a un type de données booléen, mais les variables d'un type différent peuvent aussi se comporter comme des booléens. La valeur non nil est interprétée comme faux, alors que tous les autres type de données renvoient toujours vrai, quelle que soit leur valeur.

Tcl

Le Tcl n'a pas de type booléen. Comme en C, les nombres entiers 0 (faux) et 1 (vrai - en fait n'importe quel entier non nul) sont utilisés[6].

Exemples de codage :

set v 1 if { $v } { puts "V is 1 or true" }

L'exemple ci-dessus va afficher « V est 1 ou true » car l'expression renvoie la valeur 1.

set v "" if { $v } ....

L'exemple ci-dessus renverra une erreur, puisque la variable v ne peut pas ĂȘtre Ă©valuĂ©e en tant que 0 ou 1.

Python, Ruby et JavaScript

Python, à partir de la version 2.3, a un type bool qui est une sous-classe de type int, le standard de type entier[7]. Il y a deux valeurs possibles: True et False, qui sont des versions spéciales de 1 et 0, respectivement, et se comportent comme tel dans le contexte arithmétique. Aussi, une valeur numérique de zéro (entier ou fractionnaire), la valeur nulle (None), la chaßne de caractÚres vide et les contenants vides (c'est-à-dire les listes, ensembles, etc.) sont considérés comme une valeur booléenne fausse; toutes les autres valeurs sont considérées comme vrai par défaut[8]. Les classes peuvent définir la maniÚre dont les instances sont traitées dans un contexte booléen par le biais de la méthode spéciale __nonzero__ (Python 2) ou __bool__ (Python 3). Pour les conteneurs, __len__ (la méthode spéciale pour la détermination de la longueur de conteneurs) est utilisée si la méthode explicite de conversion booléenne n'est pas définie.

Néanmoins, en Ruby, seulement nil (la valeur nulle de Ruby) et un objet spécial false sont évalués comme faux, tout le reste (y compris l'entier 0 et des tableaux vides) sont vrai.

En JavaScript, la chaßne vide (""), null, undefined, NaN, +0, -0 et false[9] sont parfois appelées falsy, et leur complément, truthy, pour distinguer les booléens de type vérifiés stricts et contraint[10]. Des langages tels que PHP utilisent également cette approche.

SQL

Le SQL:1999 standard a introduit un type de donnĂ©es BOOLÉEN en option (T031). Si on le restreint Ă  une contrainte NOT NULL, un BOOLÉEN SQL se comporte comme les boolĂ©ens dans d'autres langages. Toutefois, en SQL le type BOOLÉEN peut prendre la valeur null par dĂ©faut comme tous les autres types de donnĂ©es SQL.

Bien que le SQL standard dĂ©finisse trois valeurs constantes pour le type BOOLEAN – TRUE, FALSE et UNKNOWN – il dit aussi que les valeurs NULL BOOLEAN et UNKNOWN « peuvent ĂȘtre utilisĂ©es de façon interchangeable pour dĂ©signer exactement la mĂȘme chose »[11] - [12]. Cela a causĂ© une certaine controverse, car cela soumet UNKNOWN Ă  la rĂšgle de comparaison d'Ă©galitĂ© de la valeur NULL. Plus prĂ©cisĂ©ment UNKNOWN = UNKNOWN n'est pas Ă©valuĂ© comme TRUE, mais comme UNKNOWN/NULL[13] en 2012, quelques grands SGBD utilisant le SQL implĂ©mentent l'option T031[14]. Le PostgreSQL est une exception notable, bien qu'il implĂ©mente pas de constante UNKNOWN; NULL peut ĂȘtre utilisĂ©e Ă  la place[15].

Voir aussi

Références

  1. Brian W Kernighan et Dennis M Ritchie, The C Programming Language, Englewood Cliffs, NJ, Prentice Hall, , 1st Ă©d. (ISBN 0-13-110163-3), p. 41
  2. « Report on the Algorithmic Language ALGOL 68, Section 10.2.2. » [archive du ] [PDF], (consulté le )
  3. Digital Equipment Corporation, DECSystem10 FORTRAN IV Programmers Reference Manual. Reprinted in Mathematical Languages Handbook. Online version « https://web.archive.org/web/20110814003524/http://www.bitsavers.org/pdf/tymshare/tymcom-x/Tymcom-X_Reference_Series_Fortran_IV_Jan73.pdf »(Archive.org ‱ Wikiwix ‱ Archive.is ‱ Google ‱ Que faire ?), accessed 2011-11-16.
  4. « Guides and Sample Code » [archive du ], sur developer.apple.com (consulté le )
  5. « perlsyn - Perl Syntax / Truth and Falsehood » [archive du ] (consulté le )
  6. « PEP 285 -- Adding a bool type » [archive du ], (consulté le )
  7. Guido Van Rossum, « PEP 285 -- Adding a bool type » [archive du ], (consulté le )
  8. « Expressions » [archive du ], sur Python v3.3.2 documentation (consulté le )
  9. « ECMAScript Language Specification » [archive du ], p. 43
  10. « The Elements of JavaScript Style » [archive du ], Douglas Crockford (consulté le )
  11. C. Date, SQL and Relational Theory : How to Write Accurate SQL Code, O'Reilly Media, Inc., , 428 p. (ISBN 978-1-4493-1640-2, présentation en ligne), p. 83
  12. ISO/IEC 9075-2:2011 §4.5
  13. Martyn Prigmore, Introduction to Databases With Web Applications, Pearson Education Canada, , 689 p. (ISBN 978-0-321-26359-9, présentation en ligne), p. 197
  14. Troels Arvin, Survey of BOOLEAN data type implementation « https://web.archive.org/web/20050309010315/http://troels.arvin.dk/db/rdbms/ »(Archive.org ‱ Wikiwix ‱ Archive.is ‱ Google ‱ Que faire ?),
  15. « PostgreSQL: Documentation: 10: 8.6. Boolean Type » [archive du ], sur www.postgresql.org (consultĂ© le )
Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.