Un programme informatique est un ensemble d'instructions et d’opérations destinées à être exécutées par un ordinateur.
Un programme fait généralement partie d'un logiciel que l'on peut définir comme un ensemble de composants numériques destiné à fournir un service informatique[3]. Un logiciel peut comporter plusieurs programmes. On en retrouve ainsi dans les appareils informatiques (ordinateur, console de jeux, guichet automatique bancaire…), dans des pièces de matériel informatique, ainsi que dans de nombreux dispositifs électroniques (imprimante, modem, GPS, téléphone mobile, machine à laver, appareil photo numérique, décodeur TV numérique, injection électronique, pilote automatique…).
Les programmes informatiques sont concernés par le droit d'auteur et font l'objet d'une législation proche des œuvres artistiques.
Historiquement, la formalisation et la mise en système des lois par les juristes modernes, annoncent le programme informatique. Par exemple, G. F. Leibniz pose dans son De Conditionibus une "mise en forme logique du contenu juridique [des outils] de pensées inscrits dans une démarche d'exposition cumulative ou chaque proposition d'un degré déterminé doit utiliser seulement les concepts des propositions qui la précèdent[4]."
En 1842, la comtesse Ada Lovelace crée des diagrammes pour la machine analytique de Charles Babbage. Ces diagrammes sont considérés aujourd'hui comme étant les premiers programmes informatiques au monde[5]. Toutefois, cette théorie fait l'objet de controverses car Babbage a également écrit lui-même ses premiers programmes pour sa machine analytique, bien que la majorité n'ait jamais été publiée[6]. Par exemple, Bromley note des exemples de programmes préparés par Babbage entre 1837 et 1840 : toutes ses notes sont antérieures à ceux écrits par Lovelace[7]. Cependant, le concept de programmation et de programme enregistré est d'abord formulé de manière théorique en 1936 par Alan Turing[8].
Dans les années 1940, les premiers ordinateurs, comme le Z3 ou le Mark I, sont créés. Les programmes informatiques étaient alors conçus par des analystes, rédigés par des programmeurs et saisis par des opératrices sur des bandes type télex ou des cartes en carton perforé. Exécuter un programme consistait à entrer la bande ou la pile de cartes correspondante dans un lecteur électro-mécanique.
Le premier système d'exploitation a été développé en 1954. La même année sont apparus les premiers assembleurs et le premier compilateur pour le langage Fortran.
L'enseignement de la programmation était d'abord organisé chez les constructeurs d'ordinateurs et dans les premières universités où ces machines sont installées – dès le début des années 1950 en Angleterre et aux États-Unis, puis au milieu de la même décennie en Europe continentale et au Japon. Ce sont des cours techniques, mais la complexification croissante du sujet (compilateurs, systèmes) entraînera progressivement la constitution d'une science nouvelle[9].
L'avènement de la programmation structurée vers 1970 a grandement simplifié le travail des programmeurs et permis la création de programmes traitant des tâches plus nombreuses et plus complexes. Il en va de même avec l'avènement de la programmation orientée objet entre 1980 et 1990. Conformément à la phrase d'Edsger Dijkstra : « Les progrès ne seront possibles que si nous pouvons réfléchir sur les programmes sans les imaginer comme des morceaux de code exécutable ». De nouveaux langages de programmation ou de métaprogrammation sont régulièrement créés dans le but de simplifier et d’accélérer les possibilités offertes par programmation.
Enfin, la miniaturisation des ordinateurs et la généralisation des interfaces graphiques ont largement contribué à la démocratisation de l'utilisation de l'ordinateur, au point que dans les années 2010, la généralisation des smartphones permet aux utilisateurs d’exécuter des programmes informatiques en permanence.
La programmation consiste, partant d'une idée, à effectuer un travail de réflexion qui aboutit à la rédaction d'algorithmes dans un langage de programmation[10]. Les langages de programmation ont été créés dans l'optique de faciliter le travail du programmeur en raccourcissant le chemin qui va de l'idée au code source[11].
Les programmes sont créés par des programmeurs ou des ingénieurs logiciels. Les programmeurs travaillent principalement sur l'écriture de programmes tandis que les ingénieurs logiciels travaillent à toutes les étapes de la création du programme. Ils appliquent une démarche formelle et rigoureuse basée sur le génie industriel et les techniques de management[12].
Avant de commencer à écrire un programme destiné à résoudre un problème, le programmeur doit déterminer les caractéristiques du problème à résoudre. Ceci se fait en plusieurs étapes indépendantes du langage de programmation utilisé. La technique courante est celle d'un cycle de développement, qui comporte des étapes de définition, de conception, d'écriture, de test, d'installation et de maintenance[13].
Le but du cycle de développement est de réduire les coûts de fabrication tout en augmentant la qualité du programme. Les qualités recherchées sont l'efficacité, la flexibilité, la fiabilité, la portabilité et la robustesse. Il doit également être convivial et facile à modifier[14].
Il est attendu d'un programme qu'il demande peu d'effort de programmation, que les instructions demandent peu de temps et nécessitent peu de mémoire, qu'il peut être utilisé pour de nombreux usages et donne les résultats attendus quels que soient les changements — permanents ou temporaires — du système informatique.
Il est également attendu qu'il peut être facilement transféré sur un modèle d'ordinateur différent de celui pour lequel il est construit, qu'il produit des résultats probants y compris lorsque les informations entrées sont incorrectes, qu'il peut être facilement compris par un usager novice et que le code source peut être facilement modifié par la suite.
Un langage de programmation est une notation utilisée pour exprimer des algorithmes et écrire des programmes. Un algorithme est un procédé pour obtenir un résultat par une succession de calculs, décrits sous forme de pictogrammes et de termes simples dans une langue naturelle[15]. Jusqu'en 1950, les programmeurs exprimaient les programmes dans des langages machines ou assembleur, des langages peu lisibles pour des êtres humains et où chaque instruction fait peu de choses, ce qui rendait le travail pénible et le résultat sujet à de nombreuses erreurs. Dès 1950, les programmes ont été décrits dans des langages différents dédiés à l'humain et plus à la machine — des langages de programmation –, ce qui rendait les opérations plus simples à exprimer. Le programme était ensuite traduit automatiquement sous une forme qui permet d'être exécuté par l'ordinateur[2].
Sur demande, l'ordinateur exécutera les instructions du programme. Bien qu'il exécute toujours exactement ce qui est instruit et ne se trompe jamais, il peut arriver que les instructions qu'il exécute soient erronées à la suite d'une erreur humaine lors de l'écriture du programme. Les langages de programmation visent à diminuer le nombre de ces bugs ; ceux-ci sont cependant inévitables dans des programmes de plusieurs milliers de lignes[16]. Un programme de traitement de texte peut être fait de plus de 750 000 lignes de code et un système d'exploitation peut être fait de plus de 50 millions de lignes. En moyenne un programmeur prépare, écrit, teste et documente environ 20 lignes de programme par jour, et la création de grands programmes est le fait d'équipes et peut nécessiter plusieurs mois, voire plusieurs années[17].
La programmation est un sujet central en informatique. Les instructions qu'un ordinateur devra exécuter doivent pouvoir être exprimées de manière précise et non ambiguë. Pour ce faire, les langages de programmation combinent la lisibilité de l'anglais avec l'exactitude des mathématiques[18]. Les programmes sont créés par des programmeurs ou des ingénieurs logiciels. La création d'un programme comprend une série d'activités telles que la conception, l'écriture, le test et la documentation. En vue d'obtenir un programme de meilleure qualité, le travail de programmation se fait selon une démarche systématique et planifiée[14],[12].
Un langage de programmation est un vocabulaire et un ensemble de règles d'écriture utilisées pour instruire un ordinateur d'effectuer certaines tâches[13]. La plupart des langages de programmation sont dits de haut niveau, c'est-à-dire que leur notation s'inspire des langues naturelles (généralement l'anglais)[1].
Le processeur est le composant électronique qui exécute les instructions. Chaque processeur est conçu pour exécuter certaines instructions, dites instructions machine[19]. La palette d'instructions disponibles sur un processeur forme le langage machine. Par exemple, le processeur Intel 80486 a une palette de 342 instructions[20].
Le langage d'assemblage est une représentation textuelle des instructions machine[21], un langage de bas niveau, qui permet d'exprimer les instructions machine sous une forme symbolique plus facile à manipuler, où il y a une correspondance 1-1 entre les instructions machines et les instructions en langage d'assemblage[20].
Les langages de programmation de haut niveau permettent d'exprimer des instructions de manière synthétique, en faisant abstraction du langage machine. Par rapport au langage d'assemblage, ils permettent d'exprimer des structures, permettent d'écrire des programmes plus rapidement, avec moins d'instructions. Les programmes écrits dans des langages de haut niveau sont plus simples à modifier et portables, et peuvent fonctionner avec différents processeurs[20]. Cependant un programme exprimé en langage de haut niveau, puis compilé est moins efficace et comporte plus d'instruction que s'il avait été exprimé en langage d'assemblage[22].
Entre 1950 et 2000, plus de 50 langages de programmation sont apparus. Chacun apportait un lot de nouveaux concepts, de raffinements et d'innovations. Jusque dans les années 1950, l'utilisation des langages de programmation était semblable à l'écriture d'instructions machines. L'innovation des années 1960 a été de permettre une notation proche des mathématiques pour écrire des instructions de calcul. Les innovations des années 1970 ont permis l'organisation et l'agrégation des informations manipulées par les programmes — voir structure de données et structure de contrôle. Puis l'arrivée de la notion d'objet a influencé l'évolution des langages de programmation postérieurs à 1980[23].
Ci-dessous, le programme Hello world exprimé en langage de programmation Java :
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
Le même programme, exprimé dans le langage d'assemblage des processeurs x86 :
main proc
jmp debut
mess db 'Hello world!$'
debut:
mov dx, offset mess
mov ah, 9
int 21h
ret
main endp
cseg ends
end main
Un programme est typiquement composé d'un ensemble de procédures et de fonctions. Une procédure est une suite d'instructions destinées à réaliser une opération ; par exemple, trier une liste. Une fonction est une suite d'instructions destinées à produire un résultat ; par exemple, un calcul.
Un bug est un défaut de construction dans un programme. Les instructions que l'appareil informatique exécute ne correspondent pas à ce qui est attendu, ce qui provoque des dysfonctionnements et des pannes. La pratique de la programmation informatique nécessite des outils pour traquer ou éviter les bugs, ou vérifier la correction du programme.
L'exécution des programmes est basée sur le principe de la machine à programme enregistré de John von Neumann[24] : les instructions de programme sont exécutées par un processeur. Ce composant électronique exécute chaque instruction de programme par une succession d'opérations charger/décoder/exécuter : l'instruction est tout d'abord copiée depuis la mémoire vers le processeur, puis elle est décomposée bit par bit pour déterminer l'opération à effectuer, qui est finalement exécutée. La plupart des opérations sont arithmétiques (addition, soustraction) ou logiques. L'exécution de programmes par le processeur central (anglais CPU) contrôle la totalité des opérations effectuées par l'ordinateur[25].
L'exécution du cycle charger-décoder-exécuter est rythmée par une horloge branchée au processeur[26].
En 2011, la fréquence d'horloge supportée par les processeurs contemporains se compte en mégahertz ou en gigahertz, ce qui correspond à des millions, voire des milliards de cycles par seconde[27].
Les processeurs contemporains peuvent traiter plusieurs instructions simultanément : lorsqu'une instruction est chargée, le processeur charge immédiatement l'instruction suivante, sans attendre que cette instruction soit décodée puis exécutée, et les processeurs peuvent également charger/décoder/exécuter plusieurs instructions en un seul cycle d'horloge[26].
Pour être exécuté, un programme doit être chargé dans la mémoire de la machine. Le chargement d'un programme peut être soit automatique ou programmé lors de l'amorce de l'ordinateur par exemple, soit interactif et être déclenché par un ordre d'exécution explicite de l'utilisateur (une commande explicite, un appui sur une touche, un bouton, une icône…). Suivant la nature de l'action à effectuer, un programme peut être exécuté de manière ponctuelle (impression d'un texte), de manière répétitive (mise à jour de coordonnées GPS) ou de manière (presque) permanente (surveillance de capteurs).
Un programme est une suite d'instructions qui spécifie étape par étape, de manière non-ambiguë, des représentations de données et des calculs. Les instructions sont destinées à manipuler les données lors de l'exécution du programme. Le programme lui-même est défini par un (ou des) algorithme(s) ou par une spécification. Un programme décrit de manière exacte les différentes étapes d'un algorithme : ce qu'il y a à faire, quand et avec quelles informations[16]. Selon l'architecture de von Neumann créée en 1945, un programme est chargé dans la mémoire de l'ordinateur, ce qui permet de l'exécuter de manière répétée sans intervention humaine[28], et surtout d'utiliser la même machine pour exécuter autant de programmes que l'on veut. La mémoire dédiée aux programmes est aussi la mémoire dédiée aux données, ce qui permet de traiter les programmes comme des données comme les autres (par exemple, écrire de nouveaux programmes de la même manière qu'on écrirait un document textuel), puis de les exécuter.
Des programmes peuvent être exécutés non seulement par les ordinateurs, mais par les nombreux appareils qui sont basés sur des composants informatiques – par exemple, certains robots ménagers, téléphones, fax, instruments de mesure, récepteur de télévision, ainsi que les pièces de matériel informatique telles que les disques durs, les routeurs, les imprimantes, les consoles de jeux vidéo, les assistants personnels et les automates bancaires. Contrairement aux ordinateurs, ces appareils ne contiennent souvent pas de système d'exploitation, les programmes sont enregistrés dans l'appareil lors de la fabrication et la vitesse d'exécution des programmes est souvent d'importance mineure[29].
Sans contre-indication, les instructions d'un programme sont exécutées une après l'autre, de manière linéaire. Les langages de programmation permettent d'exprimer des alternatives : une suite d'instructions est exécutée uniquement si une condition donnée est remplie, dans le cas contraire une autre suite est exécutée. Les langages de programmation permettent également de faire répéter l'exécution d'une suite d'instructions jusqu'à ce qu'une condition donnée soit remplie[12].
L'exécution se déroule de manière différente suivant si le langage de programmation s'utilise avec un compilateur ou un interpréteur[27].
Critère | Compilation | Interprétation |
---|---|---|
Efficacité | Code natif de la machine
Peut être optimisé |
10 à 100 fois plus lent
Appel de sous-programmes Pas de gain sur les boucles |
Mise au point | Lien erreur ↔ source complexe | Lien instruction ↔ exécution trivial
Trace et observations simples |
Cycle de développement | Cycle complet à chaque modification :
compilation, édition de liens, exécution |
Cycle très court :
modifier et ré-exécuter |
Les ordinateurs modernes démarrent à leur lancement un programme « maître » dit système d'exploitation[12],[14]. Il permet d'exécuter des sous-programmes qui peuvent alors profiter des fonctionnalités offertes par le système et qui dans certains cas doivent s'adapter à cet environnement. Les systèmes d'exploitation contemporains permettent d'exécuter simultanément plusieurs programmes dans des processus, même avec un seul processeur : un programme planificateur (en anglais : scheduler) du système d'exploitation interrompt régulièrement le programme en cours d'exécution pour donner la main à un autre[30]. La vitesse de rotation donne l'illusion que les programmes sont exécutés en même temps[31].
Un sous-programme du système d'exploitation peut lui-même être un environnement permettant d'exécuter des programmes (avec une interface différente) ; par exemple, une machine virtuelle.
En droit, un programme est une œuvre écrite, protégée par le droit d'auteur. Celui-ci s'applique au programme du moment qu'il est enregistré de manière permanente, même s'il n'existe pas d'édition sur papier. Le droit d'auteur protège autant le programme source que le programme binaire[32].