Programme informatique

Un article de Wikipédia, l'encyclopédie libre.
(Redirigé depuis Programme (informatique))
Aller à : navigation, rechercher
Page d'aide sur l'homonymie Pour les articles homonymes, voir Programme.

Un programme informatique est un ensemble d'opérations destinées à être exécutées par un ordinateur. Deux formes sont distinguées dans cet article.

Un programme fait généralement partie d'un logiciel : 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 jeu, 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.

Histoire[modifier | modifier le code]

  • En 1842, la comtesse Ada Lovelace crée des diagrammes pour la machine analytique de Charles Babbage, diagrammes qui sont considérés aujourd'hui comme étant les premiers programmes informatiques au monde.
  • Le concept de programmation et de programme enregistré est formulé en 1945, à la suite de la construction de l'ENIAC, par le mathématicien John von Neumann qui décrit pour la première fois ce que doit être un calculateur électronique à programme enregistré. On en trouve une préfiguration théorique dans un article publié en 1936 par Alan Turing[4].
  • Depuis les premiers ordinateurs, les programmes informatiques étaient 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. Ces techniques ont disparu dans les années 1980, supplantées par la saisie directe sur écran/clavier, ou par divers procédés de lecture automatique (chèques, etc.).
  • 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.
  • Les premiers enseignements de programmation sont organisés 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 cinquante en Angleterre et aux États-Unis, 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[5].
  • 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 1980 à 1990, la généralisation des programmes avec interface graphique a largement contribué à la démocratisation de l'utilisation de l'ordinateur.

Programmation[modifier | modifier le code]

Article détaillé : Programmation informatique.

La programmation consiste à implémenter une idée de programme à l'aide d'un langage de programmation[6]. 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[7].

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[8].

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[9]:

  • Le problème est tout d'abord examiné en détail en vue de connaître l'étendue du programme à créer. L'étape suivante consiste à choisir des solutions et des algorithmes, puis décrire leur logique sous forme de diagrammes, en vue de clarifier le fonctionnement du programme et faciliter son écriture.
  • Une fois le programme écrit, celui-ci subit une suite de tests. Les résultats produits par le programme sont comparés avec des résultats obtenus manuellement. De nombreux tests sont nécessaires et les mêmes tests sont exécutés plusieurs fois. Ensuite de quoi le programme est installé dans la machine de l'utilisateur final, qui fera ses premières observations. Le programme sera ensuite modifié en fonction des commentaires faits par l'utilisateur, et des inconvénients qu'il a signalés.
  • Les besoins des utilisateurs et des systèmes informatiques varient continuellement, et le programme est régulièrement reconstruit et modifié en vue d'être adapté aux besoins. De nouvelles fonctions y sont ajoutées, et des erreurs qui n'avaient pas été décelées auparavant sont corrigées.

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 robustesse. Il doit également être convivial et facile à modifier[10].

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.

Langages de programmation[modifier | modifier le code]

Article détaillé : Langage de programmation.

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[11]. Jusqu'en 1950, les programmeurs exprimaient les programmes dans des langages machines ou assembleur, des langages peu lisibles pour des êtres humains et ou 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 programmations, 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[12]. 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[8].

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[13]. 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[10],[8].

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[9]. 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[14]. La palette d'instructions disponibles sur un processeur forme le langage machine. Par exemple, le processeur Intel 80486 a une palette de 342 instructions[15].

Le langage d'assemblage est une représentation textuelle des instructions machine[16], 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[15].

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 — ils peuvent fonctionner avec différents processeurs[15]. 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[17].

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[18].

Exemple[modifier | modifier le code]

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

Structure[modifier | modifier le code]

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.

Dysfonctionnements[modifier | modifier le code]

Un bug est un défaut de construction dans un programme. Les instructions que l'appareil informatique exécutent 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.

Usage[modifier | modifier le code]

Exécution[modifier | modifier le code]

L'exécution des programmes est basée sur le principe de la machine à programme enregistré, de John von Neumann[19] : 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 d'ordre arithmétique (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[20].

L'exécution du cycle charger-décoder-exécuter est rythmé par une horloge branchée au processeur[21].

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[22].

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[21].

Processus[modifier | modifier le code]

Pour être exécuté, un programme doit être chargé dans la mémoire de la machine. Le chargement peut être 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[12]. 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[23], et surtout d'utiliser la même machine pour exécuter autant de programmes que l'ont veut. La mémoire dédiée aux programme 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 programme de la même manière qu'on écrirait un document textuel, puis par la suite 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 informatique, 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 disque durs, routeurs, imprimantes, les consoles de jeu 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[24].

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 programmations 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[8].

Schéma général d'exécution de programmes

Compilation et interprétation[modifier | modifier le code]

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[22].

  • Un compilateur lit le programme source en entier, et le transforme en instructions machines. La transformation peut se faire en plusieurs étapes et nécessiter plusieurs lectures du programme. Une fois traduit, le programme est ensuite enregistré en vue d'être plus tard copié en mémoire et exécuté par le processeur tel quel[22] ;
  • Un interpréteur opère ligne par ligne : lit une ligne de programme source, puis exécute immédiatement les instructions machines correspondantes. L'avantage d'un interpréteur est que les erreurs peuvent être immédiatement corrigées. Le désavantage est que l'exécution du programme est 10 à 100 fois moins rapide que si le programme avait été préalablement traduit et exécuté tel quel[22].
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

Environnement d'exécution[modifier | modifier le code]

Article détaillé : Système d'exploitation.

Le système d'exploitation est un ensemble de programmes qui surveille l'exécution des autres programmes. Il est activé automatiquement lorsque l'ordinateur est mis en marche[8],[10]. Les systèmes d'exploitation contemporains permettent d'exécuter simultanément plusieurs programmes, au service de plusieurs utilisateurs, et en utilisant plusieurs processeurs. Un seul processeur exécute typiquement plusieurs programmes. Dans les faits, le processeur n'exécute qu'un seul programme à la fois à un instant donné, et un programme planificateur (en anglais : scheduler) du système d'exploitation effectue une rotation, ou régulièrement il interrompt le programme en cours d'exécution, pour exécuter le programme suivant[25]. Le rythme de rotation est cependant tellement rapide qu'il donne l'illusion que les programmes sont exécutés en même temps[26].

Article connexe : Environnement d'exécution.

Aspects juridiques[modifier | modifier le code]

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[27].

Notes et références[modifier | modifier le code]

  1. a et b (en) Jisuk Woo, Copyright Law and Computer Programs: The Role of Communication in Legal Structure, Routledge - 2000 (ISBN 9780815334712).
  2. a et b (en) Michael Sheetz, Computer Forensics: An Essential Guide for Accountants, Lawyers, and Managers, John Wiley and Sons - 2007 (ISBN 9780471789321).
  3. (en) Ian Sommerville, Software Engineering, Pearson Education - 2007 (ISBN 9780321313799).
  4. (en) Alan Turing, « On Computable Numbers, with an Application to the Entscheidungsproblem », Proc. London Math. Soc., 2e série, vol. 42,‎ , p. 230-265 (DOI 10.1112/plms/s2-42.1.230) et « [idem] : A Correction », Proc. London Math. Soc., 2e série, vol. 43,‎ , p. 544-546 (DOI 10.1112/plms/s2-43.6.544, lire en ligne).
  5. Pierre Mounier-Kuhn, L'informatique en France, de la seconde guerre mondiale au Plan Calcul. L'émergence d'une science, Paris, PUPS, 2010, ch. 3.
  6. Christian Piguet - Heinz Hügli, Du zéro à l'ordinateur : Une brève histoire du calcul, PPUR presses polytechniques - 2004 (ISBN 978-2-88074-469-4).
  7. (en) National Research Council (États-Unis). Committee on the Fundamentals of Computer Science: Challenges and Opportunities, Computer Science: Reflections on the Field - Reflections from the Field, National Academies Press - 2004 (ISBN 978-0-309-09301-9).
  8. a, b, c, d et e (en) June Jamrich Parsons - Dan Oja, New Perspectives on Computer Concepts, Cengage Learning - 2008 (ISBN 9781423925187).
  9. a et b (en) I. T. L. Education Solutions Limited, Itl, Introduction to Information Technology, Pearson Education India - 2009 (ISBN 9788177581188).
  10. a, b et c (en) J. B. Dixit, Computer Programming, Firewall Media - 2007 (ISBN 9788131800683).
  11. (en) Carl Reynolds, Paul T. Tymann, Schaum's Outline of Principles of Computer Science, McGraw-Hill Professional - 2008 (ISBN 9780071460514).
  12. a et b (en) A. Michael Noll, Principles of Modern Communications Technology, Artech House - 2001 (ISBN 9781580532846).
  13. (en) Alistair Edwards, Get Set for Computer Science, Edinburgh University Press - 2006 (ISBN 9780748621675).
  14. (en) D. A. Godse A. P. Godse, Computer Organization, Technical Publications - 2008 (ISBN 9788184313789).
  15. a, b et c (en) D.A. Godse et A.P. Godse, Computer Architecture & Organisation, Technical Publications,‎ 2007 (ISBN 8184317719)
  16. (en) Rajat Moona, Assembly Language Programming In Gnu/Linux For Ia32 Architectures, PHI Learning Pvt. Ltd. - 2007 (ISBN 9788120331563).
  17. (en)T. Radhakrishnan, Essentials of Assembly Language Programming for the IBM PC, PHI Learning Pvt. Ltd. - 2004 (ISBN 9788120314252).
  18. (en) John C. Mitchell, Concepts in Programming Languages, Cambridge University Press - 2003 (ISBN 978-0-521-78098-8).
  19. (en) Nithyashri, System Software, Tata McGraw-Hill Education - 2010 (ISBN 9780070671928).
  20. (en) Sivarama P. Dandamudi, Guide to Assembly Language Programming in Linux, Springer - 2005 (ISBN 9780387258973).
  21. a et b (en) Jon Stokes, Inside the Machine: An Illustrated Introduction to Microprocessors and Computer Architecture, No Starch Press - 2007 (ISBN 9781593271046).
  22. a, b, c et d (en) A. P. Godse, Computer Organisation, Technical Publications - 2009 (ISBN 9788184310009).
  23. (en) V. Rajaraman, Introduction to Information Technology, PHI Learning Pvt. Ltd.,‎ 2004 (ISBN 9788120324022) .
  24. (en) Raj Kamal, Embedded Systems: Architecture, Programming and Design, Tata McGraw-Hill Education - 2003 (ISBN 9780070494701).
  25. (en) Daniel Pierre Bovet et Marco Cesati, Understanding the Linux Kernel, O'Reilly Media Inc. - 2002 (ISBN 9780596002138).
  26. (en) Nell B. Dale et John Lewis, Computer Science Illuminated, Jones & Bartlett Learning - 2007 (ISBN 9780763741495).
  27. (en) Tamara S. Eisenschitz, Patents, Trade Marks and Designs in Information Work, Routledge - 1987 (ISBN 9780709909583).

Voir aussi[modifier | modifier le code]

Sur les autres projets Wikimedia :

Articles connexes[modifier | modifier le code]