Instruction informatique
Une instruction informatique désigne une étape dans un programme informatique[1]. Une instruction dicte à l'ordinateur l'action qu'il doit effectuer avant de passer à l'instruction suivante. Un programme informatique est constitué d'une suite d'instructions.
Contexte théorique
Contrairement à un calculateur, dont le rÎle se limite à réaliser des opérations de calcul (le plus souvent arithmétiques), un ordinateur assure des opérations de traitement de l'information, c'est-à -dire qu'il exécute successivement des opérations en suivant les directives d'un algorithme. Ce traitement est mené à l'aide d'instructions plus ou moins sophistiquées, et plus ou moins proches du microprocesseur. Par instruction informatique on entend donc décrire une commande unique, représentée par un symbole (numérique ou alpha-numérique, dit mnémoniques), et dont la finalité est prédéfinie : de la plus simple (déplacer l'index du microprocesseur dans la mémoire, additionner deux nombres) à la plus sophistiquée et abstraite (par exemple les instructions de gestion de classes du langage Java)[2].
Historiquement, cette particularitĂ© de l'ordinateur qui conduit des traitements en exĂ©cutant successivement des instructions est directement reliĂ©e au principe de la machine de Turing crĂ©Ă© par Alan Turing pour donner une dĂ©finition prĂ©cise au concept d'algorithme[3]. Cette machine est un modĂšle abstrait d'un appareil mĂ©canique de calcul auquel on aurait rajoutĂ© un ruban (de la mĂ©moire) et une tĂȘte de lecture (le processeur) susceptible de mener des traitements d'aprĂšs des symboles interprĂ©tĂ©s par la table des actions (les instructions). Le concept de machine de Turing original Ă©tait censĂ© reprĂ©senter une mĂ©canique imaginaire exĂ©cutant une procĂ©dure. C'est John von Neumann qui s'est chargĂ© de transformer le travail thĂ©orique de Turing en une machine fonctionnelle en dĂ©finissant une architecture dite de von Neuman.
Les instructions dans l'architecture de von Neumann
Telle que dĂ©finie, la machine de Turing ne dĂ©crit pas prĂ©cisĂ©ment ce que pourrait ĂȘtre une instruction ni un algorithme. Elle se limite Ă une dĂ©finition abstraite. Une « table d'actions » indique Ă la « tĂȘte de lecture/Ă©criture » de la machine, en fonction de son Ă©tat courant, quel symbole Ă©crire, et comment se dĂ©placer lors de la prochaine action. Le nouvel Ă©tat est dĂ©fini en fonction du symbole lu sur le ruban et de l'Ă©tat courant de la machine.
Dans un programme s'exĂ©cutant sur un ordinateur, on pourrait considĂ©rer que la tĂȘte de lecture correspond Ă l'action de lecture par le processeur d'un symbole contenu dans la mĂ©moire, que ce symbole correspond Ă une action prĂ©cise (additionner, avancer, etc), qui conduira une fois accomplie Ă la lecture du symbole suivant et ainsi de suite.
Ce concept de symbole sur un ruban correspond trĂšs prĂ©cisĂ©ment Ă l'idĂ©e d'instruction informatique contenue dans une mĂ©moire. Et la « table d'actions » de la machine de turing peut ĂȘtre considĂ©rĂ©e comme correspondant au cĆur du microprocesseur et Ă l'ensemble des actions (on peut parler de jeu d'instruction ou de langage) qu'il est en mesure de rĂ©aliser pour chaque instruction donnĂ©e.
Type d'instructions
Une instruction informatique est incluse dans un jeu d'instructions qui composent le langage de programmation. La forme et la puissance de ce jeu d'instructions est influencĂ©e par l'architecture qui va la faire fonctionner. Elle est Ă©galement contrainte par son degrĂ© d'abstraction par rapport au micro-processeur. Les instructions informatiques sont en effet plus ou moins proches de ce dernier : du langage machine, directement compris par le micro-processeur, aux langages Ă©voluĂ©s, eux-mĂȘmes composĂ©s d'instructions interprĂ©tĂ©es ou transformĂ©es dans un langage de plus bas niveau tel que le langage machine, puis transmises au micro-processeur via des dispositifs matĂ©riels et logiciels intermĂ©diaires plus ou moins nombreux[4].
Instructions en langage machine
Le langage machine est la suite de bits qui est interprétée par le processeur d'un ordinateur exécutant un programme informatique. Ce langage directement compris par un processeur est composé d'instructions à traiter codées sous une forme binaire. Pour leur intelligibilité ces instructions sont symboliquement représentées par un vocabulaire compréhensible par les humains intitulé assembleur ou langage assembleur[5].
Par exemple, un micro-processeur de la famille x86 d'Intel reconnaßt une instruction stockée dans une de ses mémoires sous la forme binaire :
10110000 01100001
Et en langage assembleur, cette instruction est représentée par un équivalent intelligible pour le programmeur :
movb $0x61,%al
Le langage machine est le groupe d'instructions élémentaires qui permet de donner des ordres au microprocesseur. Tout logiciel (y compris les langages de programmation évolués) qui fonctionne sur un ordinateur voit en dernier recours ses ordres exécutés par le micro-processeur via des instructions de la famille du langage machine, et stockées sous une forme binaire.
Instructions du langage évolué
Il existe de nombreux niveaux d'abstractions qui permettent de mettre en Ćuvre des instructions plus ou moins Ă©loignĂ©es de celles directement comprĂ©hensibles par le micro-processeur, les instructions en langage machine. Les langages dits Ă©voluĂ©s, c'est-Ă -dire qui proposent des instructions qui doivent faire l'objet d'Ă©tape intermĂ©diaire d'interprĂ©tation avant d'ĂȘtre comprises et exĂ©cutĂ©es par le processeur, peuvent pratiquement proposer n'importe quelle instruction, d'un niveau de complexitĂ© sans limite.
Ces instructions de langages Ă©voluĂ©es peuvent ĂȘtre trĂšs spĂ©cialisĂ©es : le langage R par exemple, dĂ©diĂ© aux programmations de modĂšles statistiques, propose des instructions qui vont de la statistique multivariĂ©e aux mĂ©thodes de rĂ©-Ă©chantillonnage, de l'Ă©conomĂ©trie Ă la biomĂ©trie, des modĂšles de rĂ©gression sur sĂ©ries chronologiques ou les modĂšles Ă Ă©quations simultanĂ©es.
Des langages de programmation sophistiqués tels que Java ou C possÚdent des instructions classiques dédiées au traitement de données, à la gestion des conditions et aux calculs arithmétiques, mais aussi des instructions particuliÚrement complexes capables de manipuler une base de données, ou un écran graphique.
Familles d'instructions
Les instructions sont chargées de réaliser des traitements plus ou moins complexes. S'inscrivant dans le cadre théoriques des machines de Turing et de l'architecture de von Neumann, l'action des instructions est en premier lieu conditionnée par des besoins en relation avec l'algorithmique et l'architecture de l'ordinateur.
La plus simple des instructions est l'instruction nulle qui, comme son nom l'indique, ne commande l'exécution d'aucun traitement et n'existe que pour des raisons pratiques particuliÚres.
Les familles d'instruction s'inscrivant dans le cadre algorithmique de la machine de Turing comprennent notamment des commandes de gestion des conditions (rĂ©aliser une action si une condition est remplie), de traitement (appliquer une transformation Ă une information - par exemple une valeur contenue en mĂ©moire) ou encore de rĂ©pĂ©tition et de branchement (passer d'un endroit Ă un autre du programme ou rĂ©pĂ©ter plusieurs fois une mĂȘme portion de programme).
Les instructions de nature algorithmique se retrouvent dans tous les microprocesseurs. Dans les plus Ă©voluĂ©s elles peuvent ĂȘtre trĂšs sophistiquĂ©es et traiter des opĂ©rations arithmĂ©tiques complexes, des calculs en virgule flottante avec un degrĂ© variable de prĂ©cision, le cas Ă©chĂ©ant simultanĂ©ment.
Les langages informatiques de haut niveau et spécialisés peuvent également offrir des instructions sophistiquées réalisant par exemple l'intégralité du calcul d'une fonction ou l'affichage d'une image en trois dimensions.
Les familles instructions concernées par l'aspect fonctionnel lié à la structure de l'ordinateur doivent assurer la gestion des échanges entre mémoires et entre registres, ainsi que la communication avec l'extérieur du micro-processeur, et notamment vers les dispositifs d'entrée-sortie (qui permettent d'écrire et de lire des données sur un disque dur ou une mémoire USB par exemple). Dans les ordinateurs les plus évolués les instructions liées au fonctionnement peuvent prendre en charge des opérations sophistiquées telles que la manipulation de mémoire à haute vitesse (comme dans les processeurs de cartes graphiques) ou tout ou partie de la gestion d'un échange de données (réseau, ports de communication).
Traitement et représentation des instructions
Les anciennes cartes perforées (équivalentes des mémoires) contenaient les instructions informatiques sous une forme proche du binaire du langage machine. ce mode de stockage était également en vigueur pour les premiers langages évolués (tels que le Fortran ou le Cobol). De maniÚre générale, une instruction est toujours stockée sous une forme codée. Néanmoins, sur les systÚmes informatiques modernes, par souci d'intelligibilité et de compréhension, les instructions sont toujours présentées à l'utilisateur sous une forme symbolique alphanumérique et mnémonique.
Il n'en demeure pas moins que le micro-processeur ne comprend que les instructions du langage machine, ce qui signifie qu'avant dâĂȘtre transmise au microprocesseur en vue de son exĂ©cution, l'instruction doit subir un processus de transformation de sa forme symbolique intelligible vers une forme codĂ©e binaire.
Implémentation du jeu d'instructions dans un processeur
Au niveau matériel de l'ordinateur, le jeu d'instructions composé des instructions machines constitue l'ensemble des opérations élémentaires qu'un programme peut demander à un processeur de traiter. C'est l'ordre le plus simple que peut comprendre et exécuter un processeur d'ordinateur en utilisant l'ensemble des circuits logiques qui sont physiquement implémentées dans le processeur. Ces circuits permettent d'effectuer des opérations élémentaires (addition, ET logique) ou plus complexes (division, passage en mode basse consommation)[6].
Architecture CISC
Un microprocesseur à jeu d'instruction étendu (en anglais : Complex Instruction Set Computer) désigne un microprocesseur qui implémente un jeu d'instructions comprenant de trÚs nombreuses instructions mixées à des modes d'adressages complexes. L'architecture CISC est opposée à l'architecture RISC (Reduced Instruction-Set Computer). La plupart des micro-processeurs prévus pour les serveurs ou les stations de bureau implémentent un jeu d'instructions CISC[7].
Architecture RISC
Le microprocesseur Ă jeu d'instruction rĂ©duit (en anglais : Reduced Instruction Set Computer[8] : RISC en anglais) est un type d'architecture matĂ©rielle de microprocesseurs, qui se caractĂ©rise par un jeu d'instructions rĂ©duit, facile Ă dĂ©coder et comportant uniquement des instructions simples. Le code informatique Ă©crit avec des instructions RISC est gĂ©nĂ©ralement moins compact, puisque toutes les instructions sont de mĂȘme taille, alors que les instructions les plus utilisĂ©es sont plus courtes dans un jeu d'instruction CISC. Les appareils portables modernes (tels que les IPad ou les Smartphones) utilisent trĂšs souvent des processeurs RISC de type ARM[9].
Cycles d'exécution
Une instruction est exécuté par le processeur au cours d'un cycle (également appelé cycle de recherche et exécution ou encore fetch-decode-execute cycle, FDX). Les quatre étapes successives que les architectures von Neumann utilisent sont la recherche de l'instruction, le décodage de l'instruction (opération et opérandes), l'exécution de l'opération et pour finir l'écriture du résultat. Cette séquence constitue le cycle d'une instruction et est répété continuellement par le micro-processeur, tant qu'il est en fonctionnement. Au démarrage le premier cycle active la lecture de l'instruction contenue dans la case mémoire 0 et ainsi de suite[10].
Ces cycles d'exĂ©cutions de base pour une instruction, qui servent de rĂ©fĂ©rence pour le calcul des performances d'un micro-processeur, sont exprimĂ©s parfois en Instructions par seconde (la plupart du temps exprimĂ©e en million d'instructions par seconde, MIPS). La notion cycle dâexĂ©cution ne concerne que les instructions en langage machine.
Les instructions plus complexes d'un langage de programmation (comme une boucle for en C ou Java) sont elles-mĂȘmes dĂ©composĂ©es en milliers d'instructions en langage machine pour ĂȘtre exĂ©cutĂ©es sur un microprocesseur, le plus souvent lors de l'Ă©tape de compilation.
Interprétation et compilation des instructions de langages évolués
Les instructions d'un programme doivent toujours, in fine, ĂȘtre converties sous une forme directement lisible par le processeur. C'est le compilateur qui est chargĂ© de transformer les instructions d'un code source Ă©crit dans un langage de programmation en code machine[11]. Cette opĂ©ration peut parfois exiger plusieurs Ă©tapes intermĂ©diaires, comme dans le cas du langage Java, par exemple, qui voit ses instructions d'abord transformĂ©es par une premiĂšre Ă©tape de compilation, en vue d'ĂȘtre lisible par une machine virtuelle qui elle-mĂȘme rĂ©alisera une nouvelle interprĂ©tation en instructions machines pour exĂ©cuter le programme. C'est le principe du langage dit semi-interprĂ©tĂ©.
Avec d'autres langages tels que C, la transformation appliquée aux instructions vise à créer un programme exécutable, c'est-à -dire dont les instructions sont directement lisibles par le micro-processeur. On parle alors de langage compilé[12].
Pour finir, le cas du langage assembleur est particulier puisque, en ce qui le concerne, le fichier source d'un programme contient des représentations textuelles (mnémoniques) des instructions du micro-processeur. Il est donc impératif de transformer la forme textuelle des instructions du programme en une forme binaire compréhensible par le processeur. On parle par usage de compilateur pour le langage assembleur mais, à proprement parler, un compilateur assembleur procÚde plutÎt à une simple conversion de format[5].
Instruction-machine
Taille des instructions
La taille d'une instruction dépend de l'architecture de la plateforme, mais elle est usuellement comprise entre 4 et 64 bits. Voici un exemple d'instruction x86 dans la notation symbolique d'un langage assembleur :
- SHL AX, 01
On appelle SHL un opérateur, et AX, 01 des opérandes. AX est le nom d'un registre de processeur, 01 est une constante. Dans cet exemple, SHL est une abréviation mnémonique pour « shift left » (décalage vers la gauche). L'instruction provoque le décalage vers la gauche d'un bit de la valeur enregistrée dans le registre AX.
Instructions les plus fréquentes
On peut classer les instructions qu'un microcontrĂŽleur est capable d'effectuer en quelques groupes.
Instructions de transfert
Un processeur passe une grande partie de son temps à transférer des octets d'un endroit à l'autre du systÚme : d'un périphérique informatique vers un registre du processeur ou vice-versa, d'un registre vers la mémoire vive ou vice-versa. Parfois, on ne peut pas effectuer de transfert direct d'un composant à l'autre : il faut dans ce cas faire transiter les informations par l'un des registres internes. Remarquons que, sauf exception, il s'agit plutÎt d'une copie que d'un transfert puisque la case mémoire d'origine garde son information (tant qu'on n'a pas écrit autre chose à la place).
Instructions arithmétiques
Les processeurs les plus simples ne permettent que d'effectuer des additions et des soustractions, voire des multiplications et des divisions sur des nombres entiers de la taille d'un mot. C'est notamment le cas des microcontrĂŽleurs. Cependant, les processeurs modernes disposent gĂ©nĂ©ralement d'une unitĂ© de calcul en virgule flottante capable d'effectuer des calculs sur les nombres Ă virgule. En l'absence d'une telle unitĂ©, les nombres Ă virgule doivent ĂȘtre traitĂ©s en logiciel.
De mĂȘme, certains anciens processeurs Ă©taient capables d'effectuer des opĂ©rations mathĂ©matiques complexes telles que le traitement des grands nombres, des nombres fractionnaires, des puissances, des racines carrĂ©es, des fonctions trigonomĂ©triques, logarithmiques et exponentielles. Sur les processeurs modernes, ces opĂ©rations sont gĂ©nĂ©ralement rĂ©alisĂ©es en logiciel Ă l'aide des opĂ©rations mathĂ©matiques de base.
Instructions logiques
Les processeurs sont capables d'effectuer des opérations logiques : ET, OU, XOU (XOR), NON (inverseur), rotations, décalages. Les opérations sont opérées simultanément sur les bits correspondants des deux registres.
La comparaison des octets A et B, qui est considérée comme une opération logique, est réalisée comme une soustraction dont on néglige le résultat ; on s'intéresse simplement au fait de savoir s'il est nul (ce qui signifie que A = B), positif (A > B) ou négatif (A < B). Ces indications sont inscrites dans des indicateurs d'états (petites mémoires d'un bit situées dans le processeur).
Instructions d'entrées/sorties
Ces instructions permettent de s'interfacer avec des dispositifs extérieurs, via des ports d'entrée/sortie. Dans certaines architectures, les ports sont considérés simplement comme des cases de mémoire et ils sont gérés par les instructions de transfert (entrées/sorties intégrées mémoire). D'autres architectures disposent d'instructions spécifiques pour les entrées/sorties (entrées/sorties indépendantes).
Instructions de branchement
Il s'agit d'instructions qui altÚrent le déroulement normal du programme. On distingue les sauts et les appels de routines :
- les sauts provoquent un branchement du programme vers une adresse mĂ©moire qui n'est pas contiguĂ« Ă l'endroit oĂč l'on se trouve ;
- une appel de routine (call) (ou sous-programme) est un saut vers une partie du programme qui forme un bloc accomplissant une tĂąche donnĂ©e. Une routine permet ainsi de structurer le programme, et peut Ă©galement ĂȘtre appelĂ©e Ă plusieurs reprises, voire des millions de fois, durant l'exĂ©cution du programme principal. La grande diffĂ©rence par rapport Ă un simple saut, c'est qu'au moment du branchement l'adresse de l'instruction suivante est mĂ©morisĂ©e afin d'y revenir une fois la routine terminĂ©e.
Tant les sauts que les appels de routines peuvent ĂȘtre :
- inconditionnels ;
- conditionnels, c'est-à -dire que le branchement n'a lieu que si une certaine condition est remplie ; généralement, la condition testée est le contenu d'un des indicateurs d'état ; ceux-ci indiquent par exemple si le contenu de l'accumulateur est nul, positif, négatif, de parité paire ou impaire.
Instructions diverses
On trouve dans ce groupe :
- des instructions de gestion de la pile (zone de mémoire RAM permettant le stockage de données locales des routines pendant l'exécution du programme) ;
- des instructions de contrĂŽle du processeur : par exemple passage en mode basse consommation, contrĂŽle des pĂ©riphĂ©riques embarquĂ©s (c'est-Ă -dire situĂ©s sur la mĂȘme puce que le processeur) ;
- des instructions permettant de positionner des indicateurs internes du processeur.
Références
- « Instruction », sur Dicofr.com (consulté le )
- Penrose, R., « Algorithms and Turing Machines », dans The Emperor's New Mind : Concerning Computers, Minds, and the Laws of Physics, Oxford, England, Oxford University Press, (1re éd. 1989) (lire en ligne), p. 40-97
- Page de Wolfram Research sur les Machines de Turing avec Bibliographie complémentaire
- La technique informatique: Principes généraux et programmation.
- (en) Documentation de MASM, assembleur Microsoft [PDF]
- IntelÂź 64 and IA-32 Architectures Software Developerâs Manual [PDF]
- Risc vs Cisc architectures, Article arxiv par Farhat Masood, National University of Sciences and Technology (NUST)
- (en) Description du RISC, Crystal Chen, Greg Novick and Kirk Shimano, cours Sophomore College 2000
- ARM ARM1156T2F-S architecture with Thumb-2 core technolog
- (en) The Essentials of Computer Organization and Architecture By Linda Null, Julia Lobur
- Introduction to compiler Design, Undergraduate Topics in Computer Science, Springer, Mogensen, Torben Ăgidius
- Livre Basic of Compiler Design, Torben Mogensen DIKU, University of Copenhagen, Universitetsparken 1, DK-2100 KĂžbenhavn Ă
Voir aussi
Articles connexes
Bibliographie
- Alan Turing, Jean-Yves Girard, La machine de Turing, Ăditions du Seuil, [dĂ©tail de lâĂ©dition] ; cet ouvrage comprend notamment une traduction en français (par Julien Basch et Patrice Blanchard) de l'article original, ainsi qu'une correction par Emil Post des erreurs y figurant.
- (en) Alan Mathison Turing, On Computable Numbers, with an Application to the Entscheidungsproblem, vol. 2:42, coll. « Proceedings of the London Mathematical Society », (lire en ligne), p. 230-265.