Programme et instruction
Pour rappel, un programme Java porte un nom, qui est un identificateur Java, et est déclaré avec public class
suivi de ce nom. Le contenu du programme se trouve dans la méthode public static void main (String[] args)
. Le squelette d'un programme qui s'appelle MyProgram
est donc :
Le corps du programme est constitué d'instructions comme par exemple des déclarations de variable et constante, des affichages à l'écran ou des affectations d'une valeur à une variable ou constante. Ces exemples sont des instructions simples et doivent se terminer par un point-virgule ( ;
), sans quoi le compilateur génèrera une erreur de compilation. Il y a également des instructions complexes qui sont le sujet de ce chapitre. La définition des instructions est, tout comme pour les expressions, récursive. Pour rappel, cela signifie que les instructions sont définies à partir d'elles-mêmes, comme le résume la figure 1.
Comme vous le constatez, toutes les instructions simples se terminent par un point-virgule. L'instruction d'affichage à l'écran est en fait un cas particulier d'une autre instruction plus générale qui est l'appel de méthode, traité au chapitre 4. Vous voyez également qu'un point virgule tout seul est une instruction ! Il s'agit d'une instruction qui ne fait rien, appelée instruction vide. Il faut encore ajouter les expressions qui peuvent se comporter comme des instructions : affectation, incrémentation et décrémentation.
La figure 2 montre un programme ne comportant que des instructions simples. Chaque type d'instruction simple qu'on connait s'y retrouve. L'instruction vide ne sert évidemment à rien dans cet exemple.
Bloc de code
Un bloc de code est une instruction complexe qui consiste en une séquence d'instructions, délimitée par des accolades ( { }
). Voici un exemple de bloc de code :
L'exécution d'un bloc de code correspond simplement à l'exécution de chacune de ses instructions les unes à la suite des autres. Deux aspects intéressants sont liés aux blocs de code : l'imbrication et la portée des variables.
Imbrication
Un bloc de code étant une instruction, il est donc possible d'avoir un bloc de code dans un autre. On dit qu'on a un bloc de code qui est imbriqué dans un autre. Cette possibilité d'imbrication d'instructions est une conséquence de la définition récursive des instructions. Voici un exemple dans lequel on a imbriqué un bloc de code dans un autre :
Vous remarquerez qu'on a indenté le code, c'est-à-dire qu'on a ajouté des tabulations, de manière à voir directement le niveau d'imbrication de chaque instruction. C'est une bonne pratique qu'on ne peut que vous conseiller pour écrire des codes sources lisibles. On peut ainsi directement identifier à quel bloc de code appartient chacune des instructions d'un programme.
Portée des variables
Le second aspect important lié aux blocs de code est celui de portée des variables. La portée d'une variable définit les zones du programme où elle est définie. La portée d'une variable s'étend depuis sa déclaration jusque la fin du bloc contenant sa déclaration. La figure 3 montre un programme dans lequel les variables existant à divers endroits du programme sont indiquées en commentaire.
La variable a
existe donc de la ligne 6 (sa déclaration) jusqu'à la ligne 21 (fin du programme). Par contre, la première variable b
existe depuis la 10 (sa déclaration) jusque la ligne 12 (fin du bloc contenant sa déclaration). La variable c
existe de la ligne 17 à la ligne 19. Enfin, la seconde variable b
existe de la ligne 13 jusque la ligne 21 puisqu'elle est déclarée dans le bloc principal de la méthode main
.
On peut donc avoir plusieurs variables qui portent le même nom dans le même programme. La règle à suivre est qu'on peut déclarer une nouvelle variable avec un certain nom que si ce nom n'existe pas déjà dans la portée courante. C'est pourquoi on a pu déclarer une variable b
à la ligne 13 puisqu'il n'y avait pas de variable b
définie à cet endroit du programme. Tenter d'utiliser une variable qui n'existe pas ou déclarer une nouvelle variable dont le nom existe déjà dans la portée courante produit une erreur de compilation.
Déroulement d'un programme
Le déroulement d'un programme peut être représenté par des diagrammes appelés flowchart. Dans ce type de diagrammes, on retrouve des instructions et des flèches reliant ces instructions, indiquant l'ordre dans lequel elles sont exécutées. On retrouve également des boites correspondant à des « aiguillages » : une fois arrivé sur une telle boite, on peut en sortir par plusieurs chemins possibles, le choix du chemin dépendant d'une condition.
La figure 3 montre un tel diagramme. Lors de l'exécution de ce programme, la première instruction exécutée est instruction1
. Ensuite, on arrive sur le premier aiguillage qui est une condition. Le programme peut maintenant suivre deux chemins différents : soit la condition est satisfaite (vrai) et instruction2
est exécutée puis le programme est terminé. Soit la condition n'est pas satisfaite (faux) et c'est la branche de droite de la condition qui est suivie. Le programme arrive donc au second aiguillage qui est une expression. Le programme peut ensuite suivre plusieurs chemins en fonction de la valeur de l'expression.
Un chemin d'exécution dans un programme, c'est un chemin qui relie le début à la fin d'un programme. Un programme peut avoir plusieurs chemins d'exécutions possibles et une exécution d'un programme correspond à l'exécution des instructions se trouvant sur un des chemins possibles.
Le programme représenté sur la figure 3 possède quatre chemins d'exécution possible parmi lesquels on retrouve les exécutions (instruction1
, instruction2
) et (instruction1
, instruction4
), par exemple.