Accéder au contenu principal

Les bases de la programmation : Le binaire

Le binaire

”Ce monde est un code binaire où nous avons seulement deux options : accepter ou refuser.

Ardit BEQIRI

Lorsque l’on parle d’ordinateur on dit très souvent que ce n’est qu’un outil qui traite des 0 et 1, et ce n’est pas faux. Si l’on résume un ordinateur à de l’électronique, effectivement la mémoire, le processeur, les périphériques peuvent se résumer à des suites binaires, donc des suites de 0 et de 1.

Mais c’est comme dire que le cerveau n’est qu’un imbroglio de neurones, c’est réducteur. La complexité du système est tel que l’on peut oublier qu’à la base c’est un système binaire, du reste un utilisateur d’ordinateur n’a même pas à savoir comment cela fonctionne, et même un programmeur n’a pas toujours à le savoir.

Cependant, tous les langages informatiques comprennent une partie binaire. Et donc la compréhension du binaire est essentielle à un moment ou à un autre. En fait il y a plusieurs sujets interconnectés, la logique binaire, les opérations binaires, les nombres binaires, etc.

La logique binaire

La logique binaire est une branche des mathématiques appelée l’algèbre de Boole. L’idée est d’étudier un algèbre (permettant de faire des calculs) reposant sur des propositions vraies ou fausses de façon à prendre des décisions.

L’algèbre de Boole définit ensuite des lois définissant des opérateurs. 

Ainsi la loi de conjonction (ET) dit : ”a ET b est VRAI si et seulement si a est VRAI et b est VRAI”. On utilise le signe comme opérateur.





Ainsi, dans la vie de tous les jours, je pourrais dire que si j’ai une voiture ET de l’essence je peux prendre la route.

La loi de disjonction (OU) dit : ”a OU b est VRAI si et seulement si a est VRAI ou b est VRAI”. On utilise le signe comme opérateur.



Dans la vie de tous les jours, je pourrais dire que si j’ai une voiture OU une moto je peux voyager.

La loi de négation dit : "a est VRAIE si et seulement si a est FAUX”. Il s’agit simplement d’une inversion de la proposition. On note la négation en utilisant une barre au-dessus de la proposition.



Dans la vie de tous les jours, on dirait que je peux me reposer si je n’ai PAS de travail à finir.

La loi de disjonction exclusive (XOR) dit : ”a XOR b est VRAI si et seulement si a est VRAI ou b est VRAI mais pas les deux”. On utilise le signe comme opérateur.



Dans la vie de tous les jours, on pourrait dire ”Je vais prendre la voiture OU la moto pour partir en vacances.”. La langue française ne fait pas la différence entre le ou inclusif (OU) et le ou exclusif (XOR).

Cette façon de penser les propositions est très utilisé en informatique, la notation diffère d’un langage à l’autre, mais l’esprit reste.

Les tests

À la base d’un processeur il y a des portes logiques, c’est à dire des éléments électroniques agissant comme un opérateur de l’algèbre de Boole. Une porte logique s’applique à une ou deux propositions (représentées par des bits).

  1. La porte NOT inverse la valeur, ainsi le 0 devient un 1, et le 1 devient un 0. C’est l’équivalent de la négation en algèbre de Boole.
  2. La porte OR est un ”ou inclusif”. Elle prend deux bits en entrée et si un des deux bits est à 1 elle renvoie 1, sinon elle renvoie 0. C’est l’équivalent de la disjonction inclusive en algèbre de Boole.
  3. La porte AND est un ”et”. Elle prend deux bits en entrée et si les deux bits sont à 1 elle renvoie 1. C’est l’équivalent de la conjonction en algèbre de Boole.

Les trois portes ne sont pas notées de la même façon selon les langages mais il y a en réalité deux grandes notations, celle qui vient du Basic et celle qui vient du C. Voici un tableau non-exhaustif montrant les différentes façons de faire.


Langage

NOT

ET

OU inclusif

Basic,

LISP,

Python,

LOGO,

Pascal,

PHP,

Forth,

Ruby

NOT

AND

OR

C,

C#, 

C++,

Objective-C,

JavaScript

!

&&

||

Perl,

Ocaml

!, not

&&, and

||, or

Prolog

\

/\

\/


Remarque: Ce tableau n’a évidemment rien d’exhaustif. Il existe des milliers de langages mais ce qu’il faut remarquer c’est la constance des opérations de base.

Prenons un exemple pour que cela soit plus parlant. Nous avons une voiture ou une moto et de l’essence à mettre dedans pour partir en vacances. En français nous dirions :

Je partirai en vacances si j’ai une voiture ou une moto et de l’essence à mettre dedans.

En Basic moderne nous écririons :

IF ( VOITURE OR MOTO ) AND ESSENCE THEN

GOTO VACANCES

ENDIF

En C, nous écririons :

if( ( VOITURE  || MOTO ) && ESSENCE ) { 

    partir_en_vacance( ); 

}

En Perl, nous écririons :

partir_en_vacance if( (VOITURE or MOTO) && ESSENCE );

On le voit, l’idée est la même, la syntaxe diffère. La plupart du temps il ne faut pas avoir peur d’un nouveau langage car presque tout ce que vous avez appris dans un autre langage est transposable, ou en tout cas l’essentiel.

Les grandes difficultés dans l’apprentissage d’un langage sont souvent concentrées dans le premier même si les spécificités de chaque langage demandent un effort supplémentaire. Mais les habitudes sont tenaces et lorsque l’on en a pris on a du mal à en sortir. Certains ne supportent pas python à cause de son organisation avec des tabulations, d’autres ne supportent pas le C avec ses points-virgules qui termine une fonction, d’autres encore ne supportent pas Java et ses trop nombreux fichiers, etc. 

On le voit, les problèmes sont souvent liés à la forme et pas au fond. Il faudrait être capable de faire abstraction de la forme lorsque l’on choisit un langage, mais nous sommes humains.


Commentaires

Posts les plus consultés de ce blog

xCode: auto-incrémentation du BUILD_VERSION

 Lorsque vous envoyez votre application à Apple, vous devez mettre à jour deux valeurs, le numéro de version et le numéro de build : Pour le numéro de Version, ce n'est pas vraiment un problème puisque celui-ci n'augmente que lors d'une mise à jour sur l'appStore. Cela peut être fait à la main. Pour le numéro de Build, c'est plus embêtant. Si vous êtes comme moi, et que vous faites de nombreuses bêta, il faut mettre à jour le numéro à chaque envoi de l'app, et on oublie souvent d'incrémenter la valeur. Le plus simple est alors d'incrémenter automatiquement la valeur à chaque compilation. Ainsi plus besoin de s'en occuper. J'avais trouvé ce script, à insérer avant la compilation : Cela fonctionnait très bien, mais xCode a changé, et les nouveaux projets ne range plus directement le numéro de Build dans le fichier Info.plist et cela ne fonctionne donc plus. J'ai donc cherché une nouvelle méthode, et la voici. Tout d'abord il faut changer l&

/etc/skel/

 Je ne connaissais pas... honte à moi ! Le répertoire /etc/skel/ peut contenir des fichiers et des répertoires qui seront dupliqué à la création d'un utilisateur (avec adduser). C'est tout simple, très unix. Par exemple, comme je suis en train de faire un serveur de mail, et que j'ai décidé d'utiliser Maildir pour stocker les messages, j'ai besoin d'un répertoire Maildir dans chaque $HOME de mes utilisateurs. Je mets donc ce qu'il faut dans /etc/skel/ et c'est fini. Chaque création d'un utilisateur, créera les répertoires qui vont bien... Génial.