Programmation informatique

Laprogrammation, également appeléecodagedans le domaine informatique, désigne l'ensemble des activités qui permettent l'écriture desprogrammes informatiques. C'est une étape importante dudéveloppement de logiciels(voire dematériel).
L'écriture d'un programme se fait dans unlangage de programmation. Un logiciel est un ensemble de programmes (qui peuvent être écrits dans des langages de programmation différents) destiné à la réalisation de certaines tâches par un (ou plusieurs) utilisateurs du logiciel.
La programmation représente donc ici la rédaction ducode sourced'un logiciel. On utilise plutôt le termedéveloppementpour dénoter l'ensemble des activités liées à la création d'un logiciel et des programmes qui le composent. Cela inclut la spécification du logiciel, sa conception, puis son implémentation proprement dite au sens de l'écriture des programmes dans un langage de programmation bien défini, ainsi que la vérification de sa correction, etc.
La première machine programmable (c’est-à-dire machine dont les possibilités changent quand on modifie son programme) est probablement lemétier à tisserdeJacquard, qui a été réalisé en1801. La machine utilisait une suite de cartons perforés. Les trous indiquaient le motif que le métier suivait pour réaliser untissage; avec des cartes différentes le métier produisait des tissages différents. Cette innovation a été ensuite améliorée parHerman Hollerithd'IBMpour le développement de la fameusecarte perforéed'IBM.
En 1937, la publication de l'article fondateur de lascience informatiqueOn Computable Numbers with an Application to the EntscheidungsproblemparAlan Turingallait donner le coup d'envoi à la création de l'ordinateur programmable. Il y présente samachine de Turing, le premier calculateur universel programmable, et invente les concepts et les termes de programmation et deprogramme.
Les premiersprogrammesd'ordinateurétaient réalisés avec unfer à souderet un grand nombre detubes à vide(plus tard, destransistors). Les programmes devenant plus complexes, cela est devenu presque impossible, parce qu'une seuleerreurrendait le programme entier inutilisable. Avec les progrès dessupports de données, il devint possible de charger le programme à partir decartes perforées, contenant la liste desinstructionsencode binairespécifique à un type d'ordinateur particulier. Lapuissance des ordinateursaugmentant, on les utilisa pour faire les programmes, lesprogrammeurspréférant naturellement rédiger du texte plutôt que des suites de 0 et de 1, à charge pour l'ordinateur d'en faire la traduction lui-même.
Avec le temps, de nouveauxlangages de programmationsont apparus, faisant de plus en plus abstraction dumatérielsur lequel devraient tourner lesprogrammes. Ceci apporte plusieurs facteurs de gain : ces langages sont plus faciles à apprendre, unprogrammeurpeut produire ducodeplus rapidement, et les programmes produits peuvent tourner sur différents types demachines.
L'immense majorité des programmes qui s'exécutent sur nos ordinateurs, téléphones et autres outils électroniques sont écrits dans des langages de programmation dits impératifs : les lignes du programme sont exécutées les unes après les autres. Chaque ligne du programme effectue soit une opération simple, soit exécute une fonction qui est elle-même une suite d'opérations simples.
Le programme «Hello World!» est par tradition le premier programme écrit par tout programmeur, censé illustrer la syntaxe du langage de programmation. Le programme a pour unique fonction d'afficher le texte "Hello World!" dans laconsoleou dans une fenêtre de l'interface graphique.
Voici une version d'un programme «Hello World!»:
Le programme suivant écrit en langage simplifié et avec des commentaires, demande simplement à l'utilisateur d'entrer au clavier deux nombres entiers, et affiche leur quotient.
Dans ce programme, les principales fonctionnalités de la programmation impérative sont utilisées : des variables de typenombre entier,nombre à virgule,chaîne de caractères, fonction calculant un résultat à partir de paramètres, fonction effectuant une tâche telle qu'afficher un message à l'écran, instructionifpermettant d'exécuter un code ou un autre en fonction de la valeur de telle ou telle variable.
Dans un programme informatique typique, on trouvera suivant les langages des boucleswhileouforqui permettent d'exécuter un morceau de code en boucle ou simplement un certain nombre de fois, desnewpour l'allocation dynamique de données (par exemple des tableaux), et très souvent des éléments deprogrammation objetpermettant de structurer différemment le code et de créer des types de données personnalisés, ou encore des exceptions pour gérer certains cas d'erreurs plus facilement.
On remarque que pour effectuer une tâche très simple, le code informatique peut être très laborieux, et encore ici on ne traite pas les erreurs (si l'utilisateur tape un mot au lieu d'un nombre), et l'affichage est minimaliste. C'est pourquoi les langages de programmation n'ont jamais cessé d'évoluer, dans le but d'aider le programmeur qui souhaite réaliser des programmes rapides à s'exécuter, sans dysfonctionnements, et surtout simples à écrire, du moins le plus possible.
La phase deconceptiondéfinit le but du programme. Si on fait une rapide analyse fonctionnelle d'un programme, on détermine essentiellement les données qu'il va traiter (données d'entrée), la méthode employée (appelée l'algorithme), et le résultat (données de sortie). Lesdonnées d'entrée et de sortiepeuvent être de nature très diverse. On peut décrire la méthode employée pour accomplir le but d'un programme à l'aide d'un algorithme. La programmation procédurale et fonctionnelle est basée sur l'algorithmique. On retrouve en général les mêmes fonctionnalités de base. On peut donc considérer que la programmation est le processus de traduction d'unalgorithmiqueen un programme qui exécute cet algorithmique.
Il existe deux méthodes principales pour concevoir un programme. Laconception algorithmiqueconsiste à construire le programme autour de l'algorithmequi est censé permettre d'obtenir le bon résultat. Laconception procéduraleconsiste à trouver une suite d'actions à réaliser pour arriver au but. La conception procédurale est la plus utilisée.
Lorsque le but est connu et que la méthode pour arriver au but est claire, on entre dans laconception détaillée. La conception détaillée est la spécification des données d'entrée, du résultat à obtenir, et l'algorithme avec toutes les instructions nécessaires.
Une fois l'algorithme défini, l'étape suivante est de coder le programme. Le codage dépend de l'architecture sur laquelle va s'exécuter le programme, decompromis temps-mémoire, et d'autres contraintes. Ces contraintes vont déterminer quel langage de programmation utiliser pour « convertir » l'algorithme en code source.
Le code source n'est (presque) jamais utilisable tel quel. Il est généralement écrit dans un langage "de haut niveau", compréhensible pour l'homme, mais pas pour la machine.
Certains langages sont ce qu'on appelle des langages compilés. En toute généralité, la compilation est l'opération qui consiste à transformer un langage source en un langage cible. Dans le cas d'un programme, le compilateur va transformer tout le texte représentant le code source du programme, en code compréhensible pour la machine, appelécode machine.
Dans le cas de langages dits compilés, ce qui est exécuté est le résultat de la compilation. Une fois effectuée, l'exécutable obtenu peut être utilisé sans le code source.
Il faut également noter que le résultat de la compilation n'est pas forcément du code machine correspondant à la machine réelle, mais peut être du code compris par unemachine virtuelle(c'est-à-dire un programme simulant une machine), auquel cas on parlera debytecode. C'est par exemple le cas enJava. L'avantage est que, de cette façon, un programme peut fonctionner sur n'importe quelle machine réelle, du moment que la machine virtuelle existe pour celle-ci.
Dans le cas d'une requêteSQL, la requête est compilée en une expression utilisant les opérateurs de l'algèbre relationnelle. C'est cette expression qui est évaluée par le système de gestion de bases de données.
D'autres langages ne nécessitent pas de phase spéciale de compilation. La méthode employée pour exécuter le programme est alors différente. La phase de compilation est la plupart du temps incluse dans celle d’exécution. On dit de ce programme qu'il interprète le code source. Par exemple,PythonouPerlsont des langages interprétés.
Les avantages généralement retenus pour l'utilisation de langages « compilés », est qu'ils sont plus rapides à l'exécution que des langages interprétés, car l'interprète doit être lancé à chaque exécution du programme, ce qui mobilise systématiquement les ressources.
Traditionnellement, les langages interprétés offrent en revanche une certaine portabilité (la capacité à utiliser le code source sur différentes plates-formes), ainsi qu'une facilité pour l'écriture du code. En effet, il n'est pas nécessaire de passer par la phase de compilation pour tester le code source. Il n'est pas non plus nécessaire de disposer d'un autre programme (debugger) afin d’ôter les bugs du programme, c'est l’interpréteur qui permet d'afficher directement le contenu des variables du programme.
Il faut noter qu'on parle abusivement de langages compilés ou interprétés. En effet, le caractère compilé ou interprété ne dépend pas du langage, qui n'est finalement qu'une grammaire et une certaine sémantique. D'ailleurs, certains langages peuvent être utilisés interprétés ou compilés. Par exemple, il est très courant d'utiliserRubyavec un interprète, mais il existe également des compilateurs pour ce langage. On notera toutefois, qu'il peut être important de préciser comment le code source est exécuté. En effet, rares sont les organismes qui proposent à la fois un compilateur et un interpréteur, les résultats du programme peuvent différer à l'exécution, même si la norme du langage est clairement définie.
Néanmoins, l'usage qu'on fait des langages est généralement fixé.
C'est l'une des étapes les plus importantes de la création d'un programme. En principe, tout programmeur se doit de vérifier chaque partie d'un programme, de le tester. Il existe différents types de test. On peut citer en particulier :
Il convient de noter qu'il est parfois possible devérifierun programme informatique, c'est-à-dire prouver, de manière plus ou moins automatique, qu'il assure certaines propriétés.
Un paradigme est unstyle fondamental de programmation, définissant la manière dont les programmes doivent être formulés.
Un paradigme est la façon dont sont traitées les solutions aux problèmes et un style fondamental de programmation, définissant la manière dont les programmes doivent être formulés. Chaque paradigme amène sa philosophie de la programmation ; une fois qu'une solution a été imaginée par un programmeur selon un certain paradigme, un langage de programmation qui suit ce paradigme permettra de l'exprimer.
Le paradigme impératif est le plus répandu, les opérations sont une suite d’instructions exécutées par l'ordinateurpour modifier l'état duprogramme.
La programmation procédurale est un sous-ensemble de la programmation impérative. Elle introduit la notion deroutineoufonctionqui est une sorte de factorisation de code, chaqueprocédurepeut être appelée à n’importe quelle étape duprogramme. Ce paradigme permet aussi de supprimer les instructionsgoto
Ce paradigme est très répandu, il est présent dans des langages comme leC, leCOBOLou leFORTRAN.
Apparue dans lesannées 70, laprogrammation structuréeest un sous-ensemble de la programmation impérative. Elle est née avec les travaux deNicklaus Wirthpour sonAlgol Wet l'article fondateur deDijkstradansCommunications of the ACM, visant à supprimer l’instructiongoto.
Tous les langages procéduraux peuvent faire de la programmation structurée, mais certains comme leFORTRANs'y prêtent très mal.
En programmation déclarative, leprogrammeest indépendant de l’état de lamachine, il s’affranchit donc de touteffet de bordet un appel à une mêmefonctionproduira toujours le même résultat.
Le programme s’écrit non pas comme une suite d’instruction pour résoudre un problème mais (contrairement à laprogrammation impérative) comme la solution au problème.
La programmation fonctionnelle se base sur plusieurs principes comme : l’immutabilité, lesfonctions pures(qui ne dépendent pas de l’état de la machine) et leslambda-calcul.
Aujourd’hui, nombreux sont leslangagesqui offrent une approche fonctionnelle au programmeur. Certains commeLISPouScalasont intrinsèquement fonctionnels. D’autres commeJavaScript,JavaouPHPont ajouté cette possibilité par la suite.
Laprogrammation logiqueconsiste à exprimer les problèmes et les algorithmes sous forme de prédicats à l’aide d'unebase de faits, d'une base de règles et d'unmoteur d'inférence.
La programmation orientée objet (abrégé POO) consiste en la définition et l'interaction de briques logicielles appeléesobjets; ces objets représentent un concept, une idée. Chaque objet contient desattributset desméthodesen rapport avec un sujet.
Laprogrammation orientée prototypeest un sous ensemble de la programmation orientée objet. Dans ce paradigme, chaqueobjetest créé à partir d’unprototypequi est lui-même un objet. Le prototype a donc une existence physique enmémoireet est mutable contrairement aux classes.
LeJavaScript, leLuaou leSelfsont des exemples de langages utilisant ce paradigme.
La programmation orientée classe est basée sur la notion declasses. Une classe est statique, c’est la représentation abstraite de l’objet, c’est à ce niveau que se passe l’héritage. Tout objet est donc l’instance d’une classe.
Les langages à classes peuvent être sous formefonctionnelle(CLOS) comme sous formeimpérative(C++,Java), voir les deux (Python,OCaml).