Programme informatique
Un programme informatique est un ensemble d'instructions et d’opérations destinées à être exécutées par un ordinateur.
- Un programme source est un code écrit par un informaticien dans un langage de programmation. Il peut être compilé vers une forme binaire ou directement interprété.
- Un programme binaire décrit les instructions à exécuter par un microprocesseur sous forme numérique. Ces instructions définissent un langage machine[1] - [2].
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.
Histoire
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.
Programmation
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 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. Le programme est ensuite installé dans la machine de l'utilisateur final qui fera ses premières observations, puis sera modifié en fonction des commentaires faits par l'utilisateur et des inconvénients 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 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.
Langages 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[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].
Exemple
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
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
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.
Usage
Exécution
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].
Processus
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].
Compilation et interprétation
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].
- 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[27] ;
- 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[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 |
Environnement d'exécution
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.
Aspects juridiques
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].
Notes et références
- (en) Jisuk Woo, Copyright Law and Computer Programs: The Role of Communication in Legal Structure, Routledge - 2000 (ISBN 9780815334712).
- (en) Michael Sheetz, Computer Forensics: An Essential Guide for Accountants, Lawyers, and Managers, John Wiley and Sons - 2007 (ISBN 9780471789321).
- (en) Ian Sommerville, Software Engineering, Pearson Education - 2007 (ISBN 9780321313799).
- G.F. Leibniz (trad. Paul Boucher), G. W. Leibniz, des conditions, Vrin, (ISBN 978-2-7116-1578-0)
- « […] a certainement été le premier programmeur du monde ». Stuart Russell et Peter Norvig, Intelligence artificielle, Pearson Education France, (lire en ligne), p. 15.
- (en) « Ada and the first computer »
- (en) « Charles Babbage's Analytical Engine, 1838 ».
- (en) Alan Turing, On Computable Numbers, with an Application to the Entscheidungsproblem : Proceedings of the London Mathematical Society, London Mathematical Society, (DOI 10.1112/PLMS/S2-42.1.230, lire en ligne) 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).
- 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.
- 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).
- (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).
- Parsons et Oja 2008.
- (en) I. T. L. Education Solutions Limited, Itl, Introduction to Information Technology, Pearson Education India - 2009 (ISBN 9788177581188).
- (en) J. B. Dixit, Computer Programming, Firewall Media - 2007 (ISBN 9788131800683).
- (en) Carl Reynolds, Paul T. Tymann, Schaum's Outline of Principles of Computer Science, McGraw-Hill Professional - 2008 (ISBN 9780071460514).
- (en) A. Michael Noll, Principles of Modern Communications Technology, Artech House - 2001 (ISBN 9781580532846).
- Parsons et Oja 2008, p. 675.
- (en) Alistair Edwards, Get Set for Computer Science, Edinburgh University Press - 2006 (ISBN 9780748621675).
- (en) D. A. Godse A. P. Godse, Computer Organization, Technical Publications - 2008 (ISBN 9788184313789).
- (en) D.A. Godse et A.P. Godse, Computer Architecture & Organisation, Technical Publications, (ISBN 8184317719)
- (en) Rajat Moona, Assembly Language Programming In Gnu/Linux For Ia32 Architectures, PHI Learning Pvt. Ltd. - 2007 (ISBN 9788120331563).
- (en)T. Radhakrishnan, Essentials of Assembly Language Programming for the IBM PC, PHI Learning Pvt. Ltd. - 2004 (ISBN 9788120314252).
- (en) John C. Mitchell, Concepts in Programming Languages, Cambridge University Press - 2003 (ISBN 978-0-521-78098-8).
- (en) Nithyashri, System Software, Tata McGraw-Hill Education - 2010 (ISBN 9780070671928).
- (en) Sivarama P. Dandamudi, Guide to Assembly Language Programming in Linux, Springer - 2005 (ISBN 9780387258973).
- (en) Jon Stokes, Inside the Machine: An Illustrated Introduction to Microprocessors and Computer Architecture, No Starch Press - 2007 (ISBN 9781593271046).
- (en) A. P. Godse, Computer Organisation, Technical Publications - 2009 (ISBN 9788184310009).
- (en) V. Rajaraman, Introduction to Information Technology, PHI Learning Pvt. Ltd., (ISBN 9788120324022).
- (en) Raj Kamal, Embedded Systems: Architecture, Programming and Design, Tata McGraw-Hill Education - 2003 (ISBN 9780070494701).
- (en) Daniel Pierre Bovet et Marco Cesati, Understanding the Linux Kernel, O'Reilly Media Inc. - 2002 (ISBN 9780596002138).
- (en) Nell B. Dale et John Lewis, Computer Science Illuminated, Jones & Bartlett Learning - 2007 (ISBN 9780763741495).
- (en) Tamara S. Eisenschitz, Patents, Trade Marks and Designs in Information Work, Routledge - 1987 (ISBN 9780709909583).
Annexes
Bibliographie
- [Parsons Oja 2008] (en) June Jamrich Parsons et Dan Oja, New Perspectives on Computer Concepts, Cengage Learning, , 800 p. (ISBN 978-1-4239-2518-7 et 1-4239-2518-1, lire en ligne).