Category Archives: Général

La Programmation Orientée Objet

Nous avons vu précédemment la structure générale d’un programme, dans les grandes lignes. Aujourd’hui je vais vous parler de la programmation orientée objet (POO). La POO est un paradigme de programmation informatique élaboré dans les années 1960-1970. C’est suffisamment ancien et suffisamment utilisé dans presque tous les langages de programmation pour que je vous en parle.

Définition d’un objet

Un objet, en programmation informatique, représente un concept, une idée, ou toute autre entité. Il peut représenter une personne, un livre, un ordinateur … Il possède une structure interne et un comportement, et sait interagir avec ses pairs. On pourrait considérer un objet comme un sous-programme interne au logiciel que l’on développe. De nos jours, c’est un concept important à prendre en compte lors du développement de son programme, permettant de le simplifier au possible, telles que les fonctions qui simplifient déjà le programme.

Un objet possède des propriétés (dans le cas d’une voiture par exemple, ce serait la couleur de la carrosserie, le nombre de rapports de la boite de vitesses, la vitesse maximale …), mais aussi des méthodes, permettant d’agir sur l’objet en question – des actions (toujours dans le cas d’une voiture : avancer, reculer, tourner …).

Représentation d’un objet

En programmation, un objet peut être vu comme un conteneur, possédant des variables (propriétés), et des fonctions (méthodes) pouvant agir sur lui-même. L’objet une fois définit devient un nouveau type de variable à part entière. Vous connaissiez les entiers (signés ou non), les nombres à virgule, maintenant vous connaissez aussi les objets.

Nous pouvons représenter simplement un objet de la manière ci-après, mais ce n’est qu’un exemple de représentation, et est très personnel. De plus, je souhaite rester au format texte pour dessiner le schéma.

Voiture
+-- CHAMPS
|   +-- CouleurCarrosserie
|   +-- NombreRapports
|   +-- VitesseMaximale
+-- METHODES
    +-- Avancer
    +-- Reculer
    +-- Tourner

Encore une fois, ce n’est qu’une façon de représenter schématiquement un objet, et cet objet est de toutes façons incomplet (il manque la vitesse courante, la position de la voiture …).

Ce sera tout pour la théorie, dans la pratique, les possibilités sur les objets sont plus nombreuses que de simplement avoir des champs et des méthodes, mais tout dépendra du langage de programmation utilisé. Vous verrez donc la suite en fonction du langage de programmation que vous souhaitez apprendre.

Structure d’un programme

Un programme, qu’il soit informatique ou autre, est défini par plusieurs choses :

  1. Des instructions
  2. Des variables
  3. Des opérateurs
  4. Des embranchements conditionnels
  5. Des boucles
  6. Des méthodes

Nous avons déjà un programme simple sous le coude dans mon précédent article, nous allons le reprendre ensemble. Je me cite : « Je souhaites réaliser un programme qui me dit si je suis majeur ou mineur, et qui devra effectuer des actions précises dans les deux cas de figure. ». Reprenons donc mon algorithme :

Début

Demander Age
  Si Age >= 18 Faire ActionMajeur
  Sinon Faire ActionMineur

Fin

Pour commencer, j’ai un début et une fin de programme. Je le rappelle, un programme possède toujours un début et une fin, quel qu’il soit.

Dans ce programme, j’ai besoin d’une variable « Age », qui devra exécuter une action « ActionMajeur » ou « ActionMineur ». J’ai utilisé pour ce faire une condition, et on pourrait imaginer les deux actions comme des méthodes.

Je ne vais pas vous donner d’exemple du programme ici dans un langage précis, cela ne servirait à rien. On va rester très général encore une fois.

1) Les instructions

Suivant la machine, le jeu d’instruction ne sera pas le même. Par exemple, un processeur ARM ne comprend rien à un programme écrit pour un processeur Intel, et un programme Intel ne sera pas non plus compris par un processeur AMD. Il en existe bien d’autres, mais limitons-nous déjà à ces trois fabriquants de micro-processeurs.

Les processeurs ne connaissent que des instructions simple, comme mettre un nombre à un emplacement mémoire, ajouter, soustraire … Cependant, certains processeurs possèdent des instructions un peu plus complexes conçues pour accélérer l’exécution des programmes, comme par exemple l’instruction Intel x86 « CRC » (Cyclic Redundancy Check). On pourrait parfaitement la programmer avec des instructions simples.

Le jeu d’instruction qu’un micro-processeur connaît, encore une fois, dépend de son fabriquant. Les instructions sont codées en binaire au niveau de la machine, et ont une longueur indéterminée. Elles sont généralement codées en octets (un octet étant représenté sur 8 bits). Cependant, inutile d’écrire un programme en binaire, ça ne se fait plus depuis l’invention du premier compilateur, fort heureusement. De plus, les programmes devenant de plus en plus complexes au fils des ans, il est nécessaire aujourd’hui d’avoir un compilateur sachant transcoder notre programme en langage machine.

2) Les variables

On a parfois besoin de variables dans un programme. Par exemple, si on a besoin d’ajouter 2 à un nombre donné par l’utilisateur, il nous sera nécessaire de définir une variable en mémoire, puis de lui ajouter 2. Les variables peuvent avoir une portée globale (visible par tout le programme), ou locale (visible par une portion du programme).

En pratique, il est fortement déconseillé d’utiliser des variables globales, générant plus facilement des bogues, ou, dans le cas de certains programmes, des failles de sécurité.

Plusieurs types de variables existent : les nombres entiers, les nombres à virgule (flottante ou fixe), les chaines de caractères et par extension les caractères (qui eux-mêmes sont représentés par des entiers). Les nombres ont une représentations dite signée (le bit de poids le plus fort sert à savoir si le nombre est positif (0) ou négatif (1)) ou non signée (le nombre étant alors strictement positif ou nul). La machine possède une limite de taille maximum pour une variable, en fonction de son architecture. Par exemple, un processeur 32 bits ne peut supporter que des nombre de 32 bits de longueur – un bit étant représenté par un 0 ou un 1. En conséquences, sur un nombre entier, sa taille maximum peut être calculé de la façon suivante : 2^32. Sa plage de valeurs peut être calculée de la façon suivante :

  • Pour un nombre entier non signé : [ 0 ; 2^32 – 1 ]
  • Pour un nombre entier signé : [ -2^(32-1) ; 2^(32-1) – 1 ]

Note: le caractère « ^ » signifie « exposant ».

La représentation des nombres en mémoire dépend de l’architecture de la machine (ARM, Intel, AMD …) et donc du fabriquant. Le compilateur existe entre autres choses pour nous épargner la tâche de conversion entre les différentes machines.

3) Les opérateurs

Il existe plusieurs catégories d’opérateurs. Les plus courant sont les opérateurs mathématiques : « + » pour additionner, « – » pour soustraire, « * » pour multiplier, et « / » pour diviser. Ils existent dans presque tous les langages de programmation. Il existe aussi dans certains langages un opérateur de concaténation, utilisé pour assembler deux chaines de caractères ensemble.

Nous possédons aussi à notre éventail des opérateurs logiques (AND, OR, XOR), souvent un opérateur de négation (« ! » ou « NOT »), parfois l’ensemble de ces deux catégories, et des opérateurs binaires (AND, OR, XOR, NOT).

Suivant le langage de programmation choisi, ils ne s’écrivent pas de la même façon (le Basic et le C# sont par exemple complètement différent l’un de l’autre sur les opérateurs).

4) Les embranchements conditionnels

On a parfois besoin d’un embranchement conditionnel pour effectuer une tâche en fonction d’un ou plusieurs paramètres. Nous l’avons vu dans mon exemple de programme. Le code à l’intérieur d’une condition n’est exécuté que si la condition est vraie. Si la condition est fausse, on saute à l’instruction de fin de condition. Une condition doit toujours posséder un début et une fin, sinon, risque de bogue ou de faille de sécurité en perspective! Les conditions sont souvent combinées avec des opérateurs logiques.

5) Les boucles

On a parfois besoin de faire une boucle, elle parfois constituée d’une condition d’entrée, et possède presque toujours une condition de sortie. Un conseil, évitez d’écrire des boucles infinies, elles finissent toujours par mal tourner. En pratique, on les évite comme la peste.

Dans les langages de haut niveau, il existe les boucles « Tant que condition … Faire instruction(s) … Fin Tant que », les boucles « Faire instruction(s) … Tant que condition« .

6) Les méthodes

Une méthode est un sous-programme, qui peut posséder zéro, un, ou plusieurs paramètres, qui a la possibilité de retourner un résultat, et qui est appelée par le programme principal.

Suivant le langage de programmation choisi, les méthodes ne s’écrivent pas de la même façon. De plus, tous les processeurs ne permettent pas forcément l’appel à des méthodes. Mais si vous souhaitez programmez en informatique, je vous rassure, tous nos processeurs peuvent faire appel à des méthodes!


Voila pour ce qui est des généralités de la programmation, si j’ai oublié quelque chose, ou si j’ai mal expliqué un point ou deux, merci de me laisser un message, soit en commentaire, soit par email en passant par le formulaire de contact.

Général – Définition et algorithmie

Vous voulez apprendre à programmer ? Vous êtes le bienvenu !

Comment ça marche ?

La programmation, c’est un peu comme une recette de cuisine. Si on compare la programmation informatique avec la cuisine d’un grand restaurant, on pourrait dire que le Chef du dit restaurant programme sa cuisine, et qu’un ordinateur lit la recette.

Un ordinateur, pour fonctionner, à besoin qu’on lui dise quoi faire, et comment le faire. Autant pour l’être humain, ce fonctionnement est inné, mais pour la machine, c’est une toute autre histoire.

On doit dire à notre machine, quelle qu’elle soit (ordinateur, téléphone, tablette, machines de production …) ce qu’elle doit faire. Pour ce faire, on va lui donner une série d’instructions, compatibles avec la machine, et cette dernières les interprètera non pas comme elle le voudrait, mais comme on le lui a dit. Cette série d’instruction sera donnée dans un langage que la machine comprend.

Oui, mais fondamentalement, comment ça marche ?

Il y a deux cas de figures : les langages dit « compilés » (C++, ..), et les langages dit « interprété » (Python …). Nous avons aussi des langages de « haut niveau » (C++, C# …), et des langages de plus « bas niveau » (ASM, …).

Le langage utilisé dépendra avant tout de la machine qui devra comprendre les instructions, mais aussi des besoins – ce qu’on veut lui demander de faire, et des coûts (certains langages de programmation sont payants, ou des interfaces de programmation).

Quelles différences entre langage de haut niveau et langage de bas niveau ?

Plus un langage est dit de bas niveau, plus il est proche du code machine (qui ne fonctionne qu’en binaire, avec des 0 et des 1). En conséquences, il est plus difficile à lire pour un être humain. A l’inverse, plus un langage est dit de haut niveau, et plus il est généralement proche d’une grammaire compréhensible par un humain. L’ASM est le langage de plus bas niveau, ensuite on a par exemple le C et C++ qui sont déjà dit de haut niveau, et pour des langages de plus haut niveau encore, on a le C# avec lequel on peut presque faire des phases.

Quelles différences entre langage interprété et compilé ?

Un langage compilé, est un langage comme un autre, mais qui a besoin d’un compilateur pour fonctionner. Le rôle du compilateur est de transcoder le programme, généralement de haut niveau, en langage machine. Son rôle est donc très important. Un second rôle qui lui a été attribué au fil des ans, est d’optimiser le code machine pour la machine cible, pour que le code puisse être exécuté plus rapidement. Exemples de langages compilés: C++, Java …

Dans le cadre d’un langage interprété, on n’écrit pas du code pour une machine, mais pour un interpréteur. Il n’y a généralement pas d’optimisation du automatique du code, cependant, l’avantage de ce genre de langage est qu’il peut être interprété de la même façon quelle que soit la machine cible, pour peu que la machine cible est l’interpréteur de disponible. Exemples de langages interprétés: PHP, Python …

Description d’un langage de programmation

Un programme, quel qu’il soit contient un point d’entrée. Au plus bas niveau de la machine, c’est la première « ligne » du programme qui sera interprété, puis la seconde, et ainsi de suite. Dans le cadre d’un langage interprété, il en va de même en règle générale. Cependant, dans un langage plus structuré, le point d’entrée est généralement à un endroit précis du programme. Par exemple, par défaut, en langage C, c’est la fonction « main() » qui définit le point d’entrée du programme, et ce sera la première ligne de cette fonction qui sera lue par la machine.

Chaque langage possède sa propre grammaire et sa propre syntaxe. Chaque langage possède aussi des avantages et des inconvénients. Par exemple, rien qu’entre langage compilé et langage interprété, le premier sera plus rapide à s’exécuter (avantage pour la compilation), quant au second il sera « portable » d’une machine à une autre, sans recompilation (avantage pour l’interprétation).

Les points importants avant de choisir son langage

Avant de choisir un langage de programmation, il vous faut avant tout définir ce que le programme va faire. Allez-vous lui demander de faire des calculs complexes ? Ou encore d’afficher des graphiques complexes à l’écran ? Ou même de simplement envoyer des message d’une machine à une autre ? Rien que pour ces trois cas de figure, je n’utiliserais pas le même langage. Cependant, avant de choisir un langage, il faut définir l’ensemble du programme, le généraliser avec de l’algorithmie.

L’algorithme, ou comment concevoir un programme

L’écriture et la syntaxe d’un algorithme est très personnel, et ne changera pas en fonction du langage de programmation que vous utiliserez. Cependant, il va vous aider à bien concevoir un programme, et permettra par la même de distinguer les tâches à effectuer. Il existe des algorithmes généraux, et d’autre plus détaillés. L’algorithme est parfois proche d’un langage de programmation, cependant certains se schématisent. Cela permet de plus de simplifier le programme et le scinder en plusieurs parties et sous-ensembles, permettant de mieux visualiser son programme, et de requérir à d’autre programmeurs pour aider sur un ensemble ou sous-ensemble du programme.

Il existe toutefois des standards pour l’algorithmie (un standard, contrairement à une norme, n’est pas obligatoire). Si possible, restez au plus proche de ces standards, ils ont été conçus de sorte qu’un maximum de gens puisse comprendre ce que vous faites. Cependant, lorsque l’on souhaite programmer seul, et que ça le restera tout le long de l’écriture du programme, un peu de liberté ne fait jamais de mal.

Exemple d’algorithmes

Prenons un cas simple. Je souhaites réaliser un programme qui me dit si je suis majeur ou mineur, et qui devra effectuer des actions précises dans les deux cas de figure.

Algorithme général écrit:

Début

Demander Age
  Si Age >= 18 Faire ActionMajeur
  Sinon Faire ActionMineur

Fin

Algorithme général schématique:

Ces 2 algorithmes sont exactement les même et font la même chose, cependant, d’une ils ne sont pas écrit de la même façon, mais en plus, je ne respecte pas les standards algorithmiques. L’essentiel est de pouvoir structurer son code et ses pensées. Vous aurez remarqué que dans les deux algorithmes il y a un début et une fin. C’est simplement parce que tout programme, quel qu’il soit, quel que soit le langage utilisé ou la machine cible, comporte un début et une fin.

Note: Les plus pointilleux d’entre vous remarqueront que j’ai mis deux fins sur mon schéma, et que je n’ai pas aligné mes deux « Fin » (en plus!). Je rappelle qu’ici ce sont des exemples très personnels de programme.

Ce programme général est compatible avec n’importe quel langage de programmation. On pourrait même s’en servir ici pour en faire un circuit électronique, si on le souhaitait. C’est la magie de l’algorithme.

Conclusions

Avant d’écrire un programme, toujours penser à définir ce que va faire ce programme, qui permettra de faire un choix par la suite du langage de programmation à utiliser. Faire un algorithme permet de simplifier son programme et de le scinder en plusieurs sous-ensembles simple. On peut ensuite définir chaque sous-ensemble d’un programme en un ou plusieurs autres sous-ensembles. J’ai omis de définir les actions à réaliser dans mon programme, permettant ainsi une libre interprétation. Je reprendrais probablement cet exemple dans un autre article.

Bref, toujours bien définir les besoins de son programme, le réfléchir et le penser avant sur papier, puis ensuite définir quel langage utiliser en fonction de ce que l’on veut faire, mais aussi de ses préférences (ASP vs PHP, C vs C++, Java vs .Net, …).