Introduction à la programmation
Introduction
Cette introduction à la programmation vise à fournir à des personnes sans un background technique les éléments conceptuels principaux pour s’initier à la programmation, indépendamment du langage ou des technologies envisagés. Pour ce faire, nous allons d’abord situer la programmation dans le contexte plus large du développement. Ensuite, nous proposons trois types d’approches différentes, mais complémentaires, à la programmation. La première approche, plus conceptuelle, introduit la programmation dans une perspective fidèle au contexte de ce wiki, c’est-à-dire en utilisant des concepts issus des Sciences de l’Éducation et de la Psychologie. La deuxième approche, plus technique, illustre la fonction de médiation entre développeur et machine de la programmation. La troisième approche, plus pragmatique, essaye de mettre ensemble les approches conceptuel et technique pour illustrer les aspects fondamentaux de la programmation. En guise de conclusion, nous proposons une liste non exhaustive de langages de programmation existants.
La programmation dans le cycle de développement
Le développement est un processus qui est souvent considéré comme un cycle. Il existe plusieurs méthodologies de développement qui déterminent de manière différentes le nombre et l’ordre (e.g. séquentiel ou itérative) des étapes. De manière très succincte, on peut identifier les étapes fondamentales suivantes :
- Analyse des besoins et/ou du contexte d’utilisation : développer signifie créer quelque chose qui répond à une certaine nécessité et qui représente donc une solution à une exigence pour un ou plusieurs utilisateurs.
- Prototypage : l’application à développer est déterminée de manière conceptuelle en fonction des objectifs et de la manière de les achever. Selon le type de méthode adoptée, à ce stade on fait souvent des dessins de l’interface, de scénarios d’utilisation, etc.
- Implémentation : l’application est « traduite » dans une forme interprétable par le dispositif sur lequel elle est censée fonctionner. Cette étape correspond normalement à la programmation, c’est-à-dire l’écriture du code.
- Test : l’application est contrôlée afin qu’elle fonctionne de la manière imaginée/souhaitée.
- Déploiement : l’application est rendue disponible aux utilisateurs (e.g. publiée sur le web).
- Maintien : l’application est modifiée ou adaptée à des nécessités qui se présentent dans le temps.
Cette page s’intéresse principalement à la phase d’implémentation, mais considère la programmation comme un élément intégré dans le cycle de développement.
Approche conceptuelle à la programmation
L’approche behavioriste des utilisateurs
La plupart des personnes qui utilisent un logiciel ou une application adoptent une approche qu’on pourrait qualifier de behavioriste. En effet, les utilisateurs ne se préoccupent pas de comprendre ce qui se passe à l’intérieur de la « boîte noire » de l’application, mais se limite à évaluer ce que l’application permet de faire en termes de manipulations (i.e. les stimuli) et les résultats qu’on peut obtenir (i.e. les réponses). Dans le cadre de la programmation, le schéma « stimulus-réponse » est assez proche du principe du « input-output » (abrégé I/O) : à un certain input introduit dans le système correspond un output.
Le principe du Input/Output
Le rôle du programmeur est donc de déterminer ce qui se passe à l’intérieur de la « boîte noire », c’est-à-dire déterminer quel comportement l’application va adopter sur la base des stimuli fournies par les utilisateurs. Plus spécifiquement, dans la plupart de cas, programmer correspond à fournir aux utilisateurs la possibilité de transformer des inputs dans des outputs qui sont jugées plus utiles, intéressantes, adaptées à leurs besoins, etc. Le mécanisme d’I/O peut se faire à différents niveaux et discriminer l’input de l’output dépend parfois de la perspective adoptée. Voici quelques exemples très simples pour illustrer le principe :
- Dans une application qui permet de faire des calculs, l’utilisateur connait deux ou plusieurs chiffres qu’il désire associer de manière mathématique (inputs) pour obtenir un résultat qu’il ne connait pas (output).
- Dans une application de traitement de texte, l’utilisateur saisie des mots qui forment des phrases (inputs) et applique des transformations sur le texte (inputs) pour obtenir un document final (output) ; en même temps, il peut également partir d’un document existant (output) pour sélectionner une partie spécifique qui l’intéresse (input) et la sauvegarder dans un nouveau document (output).
- Dans un jeu vidéo « point and shoot », l’utilisateur fournit plusieurs instructions de input (bouger, tirer, etc.) et l’application fournit des outputs correspondant (augmenter les points, passer de niveau, etc.) ; en même temps, le jeu créé automatiquement des obstacles ou ennemies (output) qui détermine les actions du joueur (input).
- Dans un QCM online le système propose des questions avec des choix possibles (output) parmi lequel l’utilisateur doit identifier et sélectionner la réponse correcte (input). Un feedback (output) suggère enfin à l’utilisateur s’il a choisi la bonne réponse.
L’interaction homme-machine
Le principe de l’I/O est à la base de l’interaction homme-machine (IHM ou HCI an anglais, pour Human-Computer Interaction). En effet, en simplifiant les choses, on peut illustrer l’interaction entre utilisateur et machine à travers une série d’échanges cycliques qui prévoient de l’I/O du côté de la machine, et du stimulus/réponse (ou comportement) chez l’utilisateur :
- L’utilisateur obtient des stimuli depuis l’application, par exemple à travers des instructions à faire, des outils à manipuler (boutons, champ de texte, etc.), des feedbacks, etc.
- L’utilisateur transforme ces stimuli en comportement (e.g. en cliquant sur un bouton).
- Ce comportement représente un input pour l’application, qui détermine un output correspondant (e.g. afficher une nouvelle page)
- Cet output représente un nouveau stimulus pour l’utilisateur - on revient donc au point 1 à moins que l’output ne soit considéré définitive (par l’utilisateur et/ou l’application).
{image}
Dans cette perspective, les trois aspects qui déterminent l’ergonomie d’une application (efficacité, efficience et satisfaction) peuvent être analysés par rapport à ces échanges entre homme et machine :
- Une application est efficace si elle permet d’obtenir l’output souhaité à partir d’inputs identifiables.
- Une application est efficiente si le nombre d’inputs nécessaires est proportionnel à la qualité/complexité de l’output.
- Une application est satisfaisante si les échanges I/O vs. stimulus/réponse entre homme et machine sont considérés de manière positive par l’utilisateur.
Approche technique à la programmation
Le langage de programmation
De manière concrète, la programmation permet de résoudre un problème (ou un besoin) de manière automatisée grâce à l’application d’un algorithme. On utilise souvent cette équation pour définir un programme informatique :
Programme = Algorithme + Données
Un algorithme est une suite d’expressions (ou instructions) qui sont évaluées par le processeur du dispositif sur lequel « tourne » le programme. La totalité des expressions utilisées dans un programme représente le « code source ». Pour que le dispositif puisse exécuter le code source, il faut utiliser un langage que la machine peut comprendre : un langage de programmation. Un langage de programmation partage plusieurs caractéristiques avec une langue naturelle :
- Il dispose d’un lexique, c’est-à-dire une liste de mots qui ont une signification particulière ;
- Il dispose d’une syntaxe, c’est-à-dire de règles d’associations des mots et ponctuations ;
- Il est de nature combinatoire, car on peut produire différentes expressions et potentiellement un code source infinis ;
- Il est de nature conventionnelle et arbitraire, car le fait d’utiliser certains mots et une certaine syntaxe est décidée par les créateurs du langage ;
- Il évolue dans le temps, car des nouveaux mots ou possibilité syntaxiques peuvent s’ajouter ou disparaître du langage lorsqu’une nouvelle version est introduite.
Langage de bas vs. haut niveau
Il existe plusieurs langages de programmation et différentes manières pour les différencier. Une des distinctions les plus communes divise les langages en bas et haut niveau. Cette distinction peut s’expliquer en partant du présupposé que machines et humains parlent deux langues différentes et nécessitent donc d’une sorte de compromis pour se comprendre :
- Un langage de bas niveau peut se considérer plus proche du langage de la machine (i.e. binaire) plutôt que du langage humain. Un langage de bas niveau est plus difficile à apprendre et à utiliser, mais il permet néanmoins plus de possibilité d’interagir avec le hardware de la machine.
- Un langage de haut niveau, au contraire, est plus proche au langage des êtres humains, et il est par conséquent plus facile à utiliser. Cette facilité, cependant, limite les possibilités d’interagir avec la machine selon ce que le langage met à disposition.
On peut utiliser une similitude avec les langues naturelles pour expliquer la différence entre les deux types de langage. Le dictionnaire d’une langue étrangère représente une sorte de langage de bas niveau, car il met à disposition tous les mots de cette langue. Cependant, quelqu’un qui ne parle pas la langue aura du mal à s’exprimer juste à l’aide d’un dictionnaire. Au contraire, un langage de haut niveau peut être comparé à un guide linguistique pour touristes qui contient les phrases les plus utilisées pendant un séjour à l’étranger. Contrairement au dictionnaire, le guide ne présente pas tous les mots disponibles dans cette langue, mais permet par contre de formuler quelques phrases basilaires même à des personnes qui ne connaissent pas la langue.
Compilation vs. Interprétation
Un langage de programmation de haut niveau nécessite d’une « traduction » (i.e. le transformer en code binaire) pour que la machine puisse le comprendre et l’exécuter. Traditionnellement, ce mécanisme peut se faire de deux manières différentes :
- Compilation : la compilation d’un programme consiste à transformer toutes les instructions (i.e. le code source) d’une application dans un autre langage pour qu’il soit « compréhensible » par la machine. La compilation se fait avant que le programme puisse être exécuté et après chaque changement du code source, il sera nécessaire de refaire la compilation. Par exemple, les logiciels installés sur les ordinateurs (.exe pour Windows, .app pour Mac) ont été compilés, c’est pourquoi il est nécessaire une nouvelle installation pour les mises à jour des logiciels.
- Interprétation : dans le cas des langages de programmation qui ne sont pas compilés, il est nécessaire un interprète qui lit et traduit le langage « en temps réel » (ou en anglais, « on run time »). Dans ce cas le code source est lu à chaque exécution, ainsi les changements apportés au code seront pris en compte directement. Pour ce faire, cependant, il est nécessaire que la machine sur lequel le programme tourne dispose de l’interprète. Par exemple, les langages de programmation pour le web sont des langages qui disposent d’un interprète soit au niveau du serveur (e.g. PHP, Ruby, …), soit dans le navigateur de l’utilisateur (JavaScript).
Approche pragmatique à la programmation
Si on intègre les aspects conceptuels et techniques de la programmation, on peut obtenir une sorte de définition pragmatique similaire à celle-ci :
Un programme est une solution automatisée qui permet à des utilisateurs d’obtenir, à partir de certains inputs, des outputs qui contribuent à résoudre un problème initial ou répondre à un besoin.
Bien que cette définition puisse s’adapter à tout type de programme, du « script » qu’une personne utilise dans le terminal de son ordinateur pour automatiser une certaine tâche à un portail web comme Moodle, dans cette approche pragmatique nous considérons la programmation comme la phase d’implémentation d’une application destinée à d’autres utilisateurs. Dans une application de ce type (e.g. un logiciel, une application web, une application pour smartphone, etc.) on peut souvent identifier trois composantes :
- Une partie graphique (Graphic User Inerface, GUI) qui présente des éléments « visibles » sur l’interface et permet aux utilisateurs de fournir des inputs et/ou de recevoir les outputs du programme.
- D’autres éléments qui peuvent être utiles pour le programme tels qu’une base de données pour sauvegarder, récupérer, modifier ou effacer des données ; un espace de stockage pour sauvegarder les outputs du programme ; le web pour récupérer des informations en temps réel ; etc.
- Une partie logique qui régit le I/O du programme en termes de causes/effets (e.g. si je clique sur le bouton A se passe B, si je clique sur le bouton C se passe D). La partie logique est normalement censée changer la partie graphique en présentant une évolution de l’état initial qui atteint la solution envisagée ou qui néanmoins représente un état plus intéressant pour l’utilisateur. En même temps, elle sert de « intermédiaire » entre le programme et les éléments externes, par exemple en indiquant à la base de données quelles données récupérer ou au système opératif quel fichier sauvegarder.
{image}
Formellement, la seule partie logique est nécessaire à un programme ; cependant, dans la perspective de la programmation d’applications qui peuvent être utilisées par d’autres utilisateurs, les deux autres éléments sont souvent présents. L’interface graphique est censée faciliter l’interaction homme-machine décrite plus haut dans la page, tandis que l’intégration avec d’autres éléments est souvent nécessaire pour « prolonger » les fonctionnalités du programme et atteindre ainsi les objectifs de l’utilisateur. De manière plus concrète, donc, programmer correspond à définir la partie logique d’une application pour qu’elle puisse mener à bien une ou plusieurs tâches qui contribuent à résoudre un problème ou à répondre à un besoin. Pour ce faire, il faut créer les algorithmes correspondant aux comportements attendus. Les langages de programmation diffèrent dans la manière de constituer les instructions qui forment les algorithmes (i.e., écrire le code source) mais on retrouve souvent des éléments communs qui représentent des éléments fondamentaux de la programmation. Parmi ces éléments figurent :
- Les variables
- Les opérateurs
- Les structures de contrôle
- Les boucles
- Les fonctions
- Les événements
Les variables
Comme le nom l’explique, les variables sont des éléments qui sont censées changer à un moment donné dans la logique de l’application. En même temps, comme dans les formules mathématiques ou physiques (e.g. vitesse), elles permettent d’identifier une valeur avec un nom : chaque fois qu’on fait référence au nom de la variable, elle sera substituée dans l’algorithme par la valeur correspondante à ce moment dans la logique de l’application. Parmi les différentes utilités des variables on peut en identifier deux principales :
- Modifier la valeur associée à travers la logique de l’application, par exemple dans le cas du « score » dans un jeu qui est destiné à augmenter (ou diminuer) selon les objectifs atteints par le joueur ;
- Réutiliser dans différents endroits du code source une valeur sans avoir à le définir à chaque fois, ce qui peut être utile surtout pour des changements dans le temps. Par exemple dans le cas d’une adresse email de contact affichée dans différentes pages d’un site, utiliser une variable associée à l’adresse permet de changer l’adresse seulement dans un endroit.
Dans la littérature technique, aux variables sont souvent associées les actions suivantes :
- Déclaration d’une variable : cela correspond à créer une variable, c’est-à-dire insérer pour la première fois une variable dans la logique de l’application ;
- Affectation/Assignation d’une variable : cela correspond à associer une valeur à la variable, ce qui se fait normalement grâce à un opérateur d’affectation (par exemple le symbole =) ;
Selon le langage de programmation utilisé, il faut également définir à quel type de valeur (de donnée) une variable va être associée. Parmi les types de données plus fréquentes on identifie :
- Les suites de caractères (string) : elles sont utilisées pour représenter du texte (des mots, des phrases, etc.) ;
- Les chiffres (nombre entier, à virgule flottante, etc.) : ils sont utilisé surtout avec des opérateurs mathématiques ;
- Les tableaux (array) : ils sont utilisés pour créer des listes avec des indices qui permettent de récupérer la valeur associée;
- Les objets : ils sont utilisés dans la programmation « orientée aux objets » qui est une forme de programmation avancée.
Le type de variable est importante car elle détermine les types de manipulations qu’on peut faire, par exemple dans le cas d’une variable qui contient un nombre entier on peut effectuer des opérations mathématiques ; pour une suite de caractère on peut transformer le texte (mettre tout en majuscules, remplacer certains mots, etc.) ; pour un array ajouter ou enlever des éléments de la liste ; etc.
Les opérateurs
Les opérateurs permettent de manipuler ou comparer des valeurs, notamment des variables. Parmi les opérateurs utilisés fréquemment dans tout langage de programmation on identifie :
- Les opérateurs mathématiques : addition, soustraction, multiplication, division, etc.
- Les opérateurs de comparaison (égalité, différence, majeur ou mineur)
- Les opérateurs logiques (AND et OR)
Les structures de contrôle
Les structures de contrôle permettent d’exécuter seulement certaines instructions d’un programme selon la vérification d’une ou plusieurs conditions. La version sémantique plus répandu des structures de contrôle équivaut à l’inférence logique « si… alors… » (e.g, si l’utilisateur a fait le login, alors afficher son profil utilisateur).
Les structures de contrôle sont parmi les éléments plus utilisés dans la création des algorithmes car elles permettent d’adapter le comportement de l’application à certaines conditions qui ont été prévues à l’avance, ainsi que le programme puisse fournir un output adapté.
Les boucles
Les boucles sont à la base d’un concept très utile en programmation : la réitération. La réitération permet d’exécuter une ou plusieurs instructions plusieurs fois de la même manière. Les boucles sont par exemple très utiles en relation avec les tableaux ou les bases des données, car elles permettent d’effectuer des opérations sur tous les éléments contenus dans une liste (e.g., pour chaque étudiant présent dans un cours, on peut afficher son nom et récupérer la moyenne de ses notes de manière automatisée). Les boucles sont également utilisées pour créer des éléments de manière récursive, ce qui peut être utile par exemple dans un jeu qui crée cycliquement des obstacles à éviter ou des objets à intercepter.
De manière sémantique, un boucle correspond à instruire le programme de faire quelque chose jusqu’à ce qu’une condition ne s’avère pas. Par exemple on peut dire au programme de créer des nouveaux ennemis dans un jeu jusqu’à ce que le joueur n’ait pas atteint un certain score. En effet, une des caractéristiques fondamentales des boucles est qu’ils doivent se terminer à un moment donné dans la logique de l’application.
Les fonctions
Les fonctions en programmation jouent un rôle similaire aux schémas cognitifs en psychologie. L’action d’aller au restaurant se compose d’une série de « sous actions » séquentielles qui se répètent normalement à chaque expérience : choisir le restaurant, y aller, lire le menu, choisir parmi les suggestions, communiquer le choix au serveur, manger, payer, sortir. De la même manière, une fonction en programmation regroupe de manière structurée des instructions qui « vont ensemble ». On peut penser par exemple à une fonction de login qui exécute les instructions suivantes :
- Récupérer le nom d’utilisateur et le mot de passe
- Contrôler que les données saisies correspondent aux données présentes dans la base des données des utilisateurs
- Garantir l’accès ou afficher un message d’erreur si les données ne correspondent pas
Souvent les fonctions sont créées pour exécuter un groupe d’instructions qui se répètent plusieurs fois dans la logique de l’application. Par exemple dans un logiciel de traitement de texte on peut avoir une fonction de sauvegarde du fichier dont les instructions (fictives) ressemblent à celles-ci :
- Récupérer l’état actuel du document
- Récupérer la position du fichier dans le disque dur de l’ordinateur
- Supprimer l’ancienne version
- Sauvegarder la nouvelle version
On peut imaginer que la fonction de sauvegarde soit exécutée chaque fois que l’utilisateur clique sur un bouton correspondant, mais également à des intervalles régulières de façon automatique. Dans les deux cas, la fonction de sauvegarde pourra être utilisée car elle exécute les mêmes instructions.
Les événements
On parle d’événement lorsque la logique de l’application prévoit l’exécution de certaines instructions qui sont liées à une modification de l’état actuel du programme. Les événements peuvent être liés à plusieurs aspects, comme par exemple :
- Les événements liés aux manipulations de l’utilisateur, comme par exemple cliquer sur le bouton de la souris, sur la touche du clavier, etc.
- Les événements liés au temps, comme par exemple la disparition d’un message après 10 secondes ;
- Les événements liés aux ressources internes ou externes à l’application, comme par exemple la connexion à une base de données ou la fin du téléchargement d’une image ;
- Etc.
Liste de langages de programmation
Voici une liste arbitraire et non exhaustive des langages les plus utilisés, avec une petite description. Pour une liste complète voir la liste sur Wikipedia :
- ActionScript : utilisé dans les applications qui utilisent Adobe Flash
- ASP.NET : langage propriétaire de Microsoft, utilisé pour le développement d’application web
- C : langage pour la programmation système, il existe des « évolutions » telles que C++ ou C#
- ECMAScript : standard à la base d’autres langages tels que C++, ActionScript ou JavaScript
- Java : langage dont l’objectif principale est la portabilité entre plateforme
- JavaScript : langage utilisé surtout dans la programmation web côté client et dans Node.js
- Objective-C : langage utilisé surtout dans l’environnement Apple
- Perl : langage utilisé surtout en relation avec des fichiers de texte
- PHP : langage open-source très utilisé dans le développement de site web
- Python : langage utilisé souvent (mais pas seulement) dans les milieux académiques
- R : langage utilisé surtout en relation avec le traitement statistique des données
- Visual Basic : langage utilisé dans l’environnement Microsoft
- XSLT : langage de transformation de XML