Programmation impérative
En informatique, la programmation impérative est un paradigme de programmation qui décrit les opérations en séquences d'instructions exécutées par l'ordinateur pour modifier l'état du programme. Ce type de programmation est le plus répandu parmi l'ensemble des langages de programmation existants, et se différencie de la programmation déclarative (dont la programmation logique ou encore la programmation fonctionnelle sont des sous-ensembles).
Langages impératifs et processeurs
La quasi-totalité des processeurs qui équipent les ordinateurs sont de nature impérative : ils sont faits pour exécuter une suite d'instructions élémentaires, codées sous forme d'opcodes (pour operation codes). L'ensemble des opcodes forme le langage machine spécifique à l'architecture du processeur. L'état du programme à un instant donné est défini par le contenu de la mémoire centrale à cet instant.
Les langages de plus haut niveau utilisent des variables et des opĂ©rations plus complexes, mais suivent le mĂȘme paradigme. Les recettes de cuisine et les vĂ©rifications de processus industriel sont deux exemples de concepts familiers qui s'apparentent Ă de la programmation impĂ©rative ; de ce point de vue, chaque Ă©tape est une instruction, et le monde physique constitue l'Ă©tat modifiable. Puisque les idĂ©es de base de la programmation impĂ©rative sont Ă la fois conceptuellement familiĂšres et directement intĂ©grĂ©es dans l'architecture des microprocesseurs, la grande majoritĂ© des langages de programmation est impĂ©rative.
Instructions de la base impérative
La plupart des langages de haut niveau comporte cinq types d'instructions principales :
- la séquence d'instructions
- l'affectation (assignation)
- l'instruction conditionnelle
- la boucle
- les branchements
SĂ©quence d'instructions
Une séquence d'instructions, (ou bloc d'instruction) désigne le fait de faire exécuter par la machine une instruction, puis une autre, etc., en séquence. Par exemple
est une séquence d'instructions. Cette construction se distingue du fait d'exécuter en parallÚle des instructions.
Instructions d'affectation
Les instructions d'affectation, en général, effectuent une opération sur l'information en mémoire et y enregistrent le résultat pour un usage ultérieur. Les langages de haut niveau permettent de plus l'évaluation d'expressions complexes qui peuvent consister en une combinaison d'opérations arithmétiques et d'évaluations de fonctions et l'affectation du résultat en mémoire. Par exemple:
affecte la valeur , donc 5, Ă la variable de nom .
Instructions conditionnelles
Les instructions conditionnelles permettent Ă un bloc d'instructions de n'ĂȘtre exĂ©cutĂ© que si une condition prĂ©dĂ©terminĂ©e est rĂ©alisĂ©e. Dans le cas contraire, les instructions sont ignorĂ©es et la sĂ©quence d'exĂ©cution continue Ă partir de l'instruction qui suit immĂ©diatement la fin du bloc. Par exemple
n'enverra le message que si la connexion est ouverte.
Instructions de bouclage
Les instructions de bouclage servent à répéter une suite d'instructions un nombre prédéfini de fois (voir Boucle_for), ou jusqu'à ce qu'une certaine condition soit réalisée. Par exemple
bouclera jusqu'Ă ce que la connexion soit ouverte.
Il se trouve que ces quatre constructions permettent de faire tous les programmes informatiques possibles, elles permettent de faire un systĂšme Turing-complet.
Branchements sans condition
Les branchements sans condition permettent Ă la sĂ©quence d'exĂ©cution d'ĂȘtre transfĂ©rĂ©e Ă un autre endroit du programme. Cela inclut le saut, appelĂ© « goto » (go to, /ÉĄÉÊ tuË/, « aller à ») dans de nombreux langages, et les sous-programmes, ou appels de procĂ©dures. Les instructions de bouclage peuvent ĂȘtre vues comme la combinaison d'un branchement conditionnel et d'un saut. Les appels Ă une fonction ou une procĂ©dure (donc un Sous-programme) correspondent Ă un saut, complĂ©tĂ© du passage de paramĂštres, avec un saut en retour.
Historique
Langage machine
Les langages impĂ©ratifs les plus anciens sont les langages machine des premiers ordinateurs. Dans ces langages, le jeu d'instructions est minimal, ce qui rend la mise en Ćuvre matĂ©rielle plus simple â on maĂźtrise directement ce qui se passe en mĂ©moire â, mais gĂȘne la crĂ©ation de programmes complexes.
A-0
Le premier compilateur â un programme destinĂ© Ă vĂ©rifier un programme au prĂ©alable et Ă le traduire en langage machine â dĂ©nommĂ© A-0, fut Ă©crit en 1951 par Grace Murray Hopper.
Fortran
Fortran, développé par John Backus (prix Turing 1977) chez IBM à partir de 1954, fut le premier langage de programmation capable de réduire les obstacles présentés par le langage machine dans la création de programmes complexes. Fortran était un langage compilé, qui autorisait entre autres l'utilisation de variables nommées, d'expressions complexes, et de sous-programmes. Premier langage normalisé au milieu des années 60, il continue d'évoluer et est toujours utilisé dans le milieu scientifique pour la qualité de ses bibliothÚques numériques et sa grande rapidité, ce qui en fait le langage informatique ayant eu la plus grande longévité. Les normes Fortran apparues depuis le début du XXIe siÚcle sont Fortran 2003, Fortran 2008 et Fortran 2018.
Algol
Les deux dĂ©cennies suivantes virent l'apparition de plusieurs autres langages de haut niveau importants. ALGOL, dĂ©veloppĂ© en 1958 par un consortium amĂ©ricano-europĂ©en pour concurrencer FORTRAN, qui Ă©tait un langage propriĂ©taire, fut l'ancĂȘtre de nombreux langages de programmation d'aujourd'hui.
COBOL
COBOL (1960) est un langage pour la programmation des applications de gestion développé avec plusieurs objectifs : d'une part avoir un langage standardisé, avec des sources portables sur des matériels différents, d'autre part avoir des sources lisibles et vérifiables par des non-spécialistes de l'informatique. Dans cet objectif, il a été défini avec une syntaxe proche de l'anglais. Le langage a ensuite évolué pour intégrer la programmation structurée (COBOL 85), et la programmation orientée objet (2000). Le parc énorme d'applications COBOL existantes dans les grandes entreprises assure sa longévité.
BASIC
Le langage BASIC (1963) a Ă©tĂ© conçu comme une version simplifiĂ©e de FORTRAN Ă but Ă©ducatif, destinĂ©e aux dĂ©butants et interactive. Sa simplicitĂ© et le fait que BASIC soit interprĂ©tĂ© facilitaient grandement la mise au point des programmes, ce qui lui confĂ©ra rapidement une grande popularitĂ©, malgrĂ© la pauvretĂ© de ses constructions. Malheureusement, cette pauvretĂ© mĂȘme devait mener Ă une quantitĂ© de programmes non structurĂ©s et donc difficilement maintenables. AprĂšs un article de Edsger Dijkstra dĂ©nonçant les ravages de BASIC, la rĂ©putation de BASIC comme langage pour l'enseignement de la programmation dĂ©clina, au profit de Pascal.
Pascal
Dans les années 1970, le Pascal fut développé par Niklaus Wirth, dans le but d'enseigner la programmation structurée et modulaire. Pascal dérivait d'une proposition faite par N. Wirth (et refusée) pour l'évolution du langage ALGOL. Il combine les constructions de base de la programmation structurée (boucles tant-que, répéter-jusqu'à et boucle avec compteur), la possibilité de définir ses propres types de donnée, dans un ensemble élégant (servi par un grand nombre de types prédéfinis : ensemble, énumérations, intervalle), qui lui assura un succÚs durable comme langage d'initiation (en remplacement de BASIC). Par la suite, Niklaus Wirth fut à l'origine de Modula-2, Modula-3, et d'Oberon, les successeurs de Pascal.
C
Ă la mĂȘme Ă©poque, Dennis Ritchie crĂ©a le langage C aux laboratoires Bell, pour le dĂ©veloppement du systĂšme Unix. La puissance du C, permettant grĂące aux pointeurs de travailler Ă un niveau proche de la machine, ainsi qu'un accĂšs complet aux primitives du systĂšme, lui assura un succĂšs qui ne s'est jamais dĂ©menti depuis.
Une des raisons du succĂšs du langage C par rapport aux autres langages procĂ©duraux de la mĂȘme gĂ©nĂ©ration vient de son mode de distribution : les universitĂ©s amĂ©ricaines pouvaient acheter une licence au prix de 300 dollars pour toute l'universitĂ© et tous ses Ă©tudiants.
Ada
En 1974, le DĂ©partement de la DĂ©fense des Ătats-Unis cherchait un langage dont le cahier des charges mettait l'accent sur la sĂ»retĂ© d'exĂ©cution, pour tous ses besoins futurs. Le choix se porta sur Ada, langage crĂ©Ă© par Jean Ichbiah chez CII-Honeywell Bull, dont la spĂ©cification ne fut complĂ©tĂ©e qu'en 1983. Le langage a connu plusieurs rĂ©visions, la derniĂšre en date remontant Ă 2012.
Smalltalk
Dans les annĂ©es 1980, devant les problĂšmes que posaient la complexitĂ© grandissante des programmes, il y eut un rapide gain d'intĂ©rĂȘt pour la programmation orientĂ©e objet. Smalltalk-80, conçu Ă l'origine par Alan Kay en 1969, fut prĂ©sentĂ© en 1980 par le Palo Alto Research Center de la compagnie Xerox (Ătats-Unis).
C++ et Objective C
à partir des concepts objet, Bjarne Stroustrup, chercheur aux Bell Labs, conçut en 1985 une extension orientée objet de C nommée C++. ParallÚlement, une extension à C moins ambitieuse, mais inspirée de Smalltalk avait vu le jour, Objective C. Le succÚs d'Objective C, notamment utilisé pour le développement sur les stations NeXT et Mac OS X, est resté faible par rapport à C++.
Perl, Tcl, Python, PHP, Java, JavaScript
Dans les décennies 1980 et 1990, de nouveaux langages impératifs interprétés ou semi-interprétés doivent leur succÚs au développement de scripts pour des pages web dynamiques et les applications client-serveur. On peut citer dans ces catégories Perl (Larry Wall, 1987), Tcl (John Ousterhout, 1988), Python (Guido van Rossum, 1990), PHP (Rasmus Lerdorf, 1994), Java (Sun Microsystems, 1995), JavaScript (Brendan Eich, Netscape Navigator, 1995).
Langages fonctionnels et langages de programmation logique
Les langages de programmation impĂ©ratifs doivent ĂȘtre distinguĂ©s d'autres types de langages, les langages fonctionnels et les langages de programmation logique. Les langages fonctionnels, tels que Haskell ou ML, ne sont pas des suites d'instructions et ne s'appuient pas sur l'idĂ©e d'Ă©tat global, mais au contraire tendent Ă s'extraire de ce modĂšle pour se placer Ă un niveau plus conceptuel (qui a ses fondations dans le lambda-calcul). Les langages de programmation logiques, tels que Prolog, se concentrent sur ce qui doit ĂȘtre calculĂ©, et non comment le calcul doit ĂȘtre effectuĂ©.