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
{image}
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
{image}
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).