031.1 Leçon 1
Certification : |
Web Development Essentials |
---|---|
Version : |
1.0 |
Thème : |
031 Développement de logiciels et technologies Web |
Objectif : |
031.1 Bases du développement logiciel |
Leçon : |
1 sur 1 |
Introduction
Les tout premiers ordinateurs étaient programmés par le biais d’un processus épuisant consistant à brancher des câbles dans des prises. Les informaticiens se sont rapidement lancés dans une recherche sans fin de moyens simples pour indiquer à l’ordinateur ce qu’il doit faire. Ce chapitre présente les outils de programmation. Il aborde les principales façons dont les instructions textuelles—les langages de programmation—représentent les tâches qu’un programmeur veut accomplir, ainsi que les outils qui transforment le programme en une forme appelée langage machine qu’un ordinateur peut exécuter.
Note
|
Dans ce texte, les termes programme et application sont utilisés indifféremment. |
Code source
Un programmeur développe normalement une application en écrivant une description textuelle, appelée code source, de la tâche souhaitée. Le code source est rédigé dans un langage de programmation soigneusement défini qui représente ce que l’ordinateur peut faire dans une abstraction de haut niveau que les humains peuvent comprendre. Des outils ont également été développés pour permettre aux programmeurs et aux non-programmeurs d’exprimer leurs pensées visuellement, mais l’écriture du code source reste la manière prédominante de programmer.
De la même manière qu’un langage naturel comporte des noms, des verbes et des constructions pour exprimer des idées de manière structurée, les mots et la ponctuation d’un langage de programmation sont des représentations symboliques des opérations qui seront effectuées sur la machine.
En ce sens, le code source n’est pas très différent de tout autre texte dans lequel l’auteur utilise des règles bien établies d’un langage naturel pour communiquer avec le lecteur. Dans le cas du code source, le “lecteur” est la machine, donc le texte ne peut pas contenir des ambiguïtés ou des incohérences—même subtiles.
Comme tout texte qui traite d’un sujet en profondeur, le code source doit également être bien structuré et organisé logiquement lors du développement d’applications complexes. Les programmes très simples et les exemples didactiques peuvent être stockés dans les quelques lignes d’un seul fichier texte, qui contient tout le code source du programme. Les programmes plus complexes peuvent être subdivisés en milliers de fichiers, chacun comportant des milliers de lignes.
Le code source des applications professionnelles doit être organisé en différents dossiers, généralement associés à un objectif particulier. Par exemple, un programme de discussion peut être organisé en deux dossiers : l’un contenant les fichiers de code qui gèrent la transmission et la réception des messages sur le réseau, et l’autre contenant les fichiers qui construisent l’interface et réagissent aux actions de l’utilisateur. En effet, il est courant d’avoir de nombreux dossiers et sous-dossiers contenant des fichiers de code source dédiés à des tâches très spécifiques au sein de l’application.
En plus, le code source n’est pas toujours isolé dans ses propres fichiers, avec le tout écrit dans un seul langage. Dans les applications web, par exemple, un document HTML peut intégrer du code JavaScript pour compléter le document par des fonctionnalités supplémentaires.
Éditeurs de code et EDI
La diversité des méthodes d’écriture du code source peut être intimidante. C’est pourquoi de nombreux développeurs tirent parti d’outils qui les aident à écrire et à tester le programme.
Le fichier de code source n’est qu’un fichier texte. En tant que tel, il peut être édité par n’importe quel éditeur de texte, aussi simple soit-il. Pour faciliter la distinction entre le code source et le texte brut, chaque langage adopte une extension de nom de fichier explicite : .c
pour le langage C, .py
pour Python, .js
pour JavaScript, etc. Les éditeurs généralistes comprennent souvent suffisamment bien le code source des langages populaires pour ajouter de l’italique, des couleurs et des indentations afin de rendre le code compréhensible.
Tous les développeurs ne choisissent pas d’éditer le code source dans un éditeur généraliste. Un environnement de développement intégré (EDI) fournit un éditeur de texte ainsi que des outils pour aider le programmeur à éviter les erreurs syntaxiques et les incohérences évidentes. Ces éditeurs sont particulièrement recommandés pour les programmeurs moins expérimentés, mais les programmeurs expérimentés les utilisent également.
Les EDI les plus utilisés, tels que Visual Studio, Eclipse et Xcode, observent intelligemment ce que le programmeur tape, suggérant fréquemment des mots à utiliser (autocomplétion) et vérifiant le code en temps réel. Les EDI peuvent même proposer un débogage et des tests automatisés pour identifier les problèmes chaque fois que le code source est modifié.
Certains programmeurs plus expérimentés optent pour des éditeurs moins intuitifs tels que Vim, qui offrent une plus grande flexibilité et ne nécessitent pas l’installation de paquets supplémentaires. Ces programmeurs utilisent des outils externes et autonomes pour ajouter les fonctionnalités qui sont intégrées lorsque vous utilisez un EDI.
Maintenance du code
Que ce soit dans un EDI ou à l’aide d’outils autonomes, il est important d’utiliser une sorte de système de gestion de versions (SGV). Le code source évolue constamment, car des défauts imprévus doivent être corrigés et des améliorations doivent être intégrées. Une conséquence inévitable de cette évolution est que les corrections et les améliorations peuvent interférer avec d’autres parties de l’applications dans une grande base de code. Les outils de gestion de versions tels que Git, Subversion et Mercurial enregistrent toutes les modifications apportées au code et l’auteur de la modification, ce qui vous permet de retracer et éventuellement de récupérer une modification non réussie.
En outre, les outils de gestion de versions permettent à chaque développeur de l’équipe de travailler sur une copie des fichiers de code source sans interférer avec le travail des autres programmeurs. Une fois que les nouvelles versions du code source sont prêtes et testées, les corrections ou améliorations apportées à une copie peuvent être intégrées par les autres membres de l’équipe.
Git, le système de gestion de versions le plus populaire à l’heure actuelle, permet à plusieurs copies indépendantes d’un dépôt d’être maintenues par différentes personnes, qui partagent leurs modifications comme elles le souhaitent. Cependant, qu’elles utilisent un système de gestion de versions décentralisé ou centralisé, la plupart des équipes maintiennent un référentiel de confiance dont le code source et les ressources sont fiables. Plusieurs services en ligne proposent le stockage de référentiels de code source. Les plus populaires de ces services sont GitHub et GitLab, mais Savannah, du projet GNU, mérite également d’être mentionné.
Languages de programmation
Il existe une grande variété de langages de programmation ; chaque décennie voit l’invention de nouveaux langages. Chaque langage de programmation a ses propres règles et il est recommandé pour des objectifs particuliers. Bien que les langages présentent des différences superficielles en matière de syntaxe et de mots-clés, ce qui les distingue réellement, ce sont les approches conceptuelles profondes qu’ils représentent, appelées paradigmes.
Paradigmes
Les paradigmes définissent les principes sur lesquels repose un langage de programmation, notamment en ce qui concerne la manière dont le code source doit être structuré.
Le développeur part du paradigme du langage pour formuler les tâches à accomplir par la machine. Ces tâches, à leur tour, sont exprimées symboliquement avec les mots et les constructions syntaxiques offerts par le langage.
Le langage de programmation est procédural lorsque les instructions présentées dans le code source sont exécutées dans un ordre séquentiel, comme un script de film. Si le code source est segmenté en fonctions ou en sous-programmes, une fonction principale se charge d’appeler les autres fonctions dans l’ordre.
Le code suivant est un exemple de langage procédural. Écrit en C, il définit des variables pour représenter le côté side
, la surface area
et le volume volume
de formes géométriques. La valeur de la variable side
est assignée dans main()
, qui est la fonction principale appelée lorsque le programme est exécuté. Les variables area
et volume
sont calculées dans les sous-programmes square()
et cube()
qui précèdent la fonction principale :
#include <stdio.h>
float side;
float area;
float volume;
void square(){ area = side * side; }
void cube(){ volume = area * side; }
int main(){
side = 2;
square();
cube();
printf("Volume: %f\n", volume);
return 0;
}
L’ordre des actions définies dans main()
détermine la séquence des états du programme, caractérisée par la valeur des variables side
, area
, et volume
. L’exemple se termine après avoir affiché la valeur de volume
avec l’instruction printf
.
D’autre part, le paradigme de la programmation orientée objet (POO) a pour principale caractéristique de séparer l’état du programme en sous-états indépendants. Ces sous-états et les opérations associées sont les objets, appelés ainsi parce qu’ils ont une existence plus ou moins indépendante au sein du programme et parce qu’ils ont des objectifs spécifiques.
Les paradigmes distincts ne limitent pas nécessairement le type de tâche qui peut être effectué par un programme. Le code de l’exemple précédent peut être réécrit selon le paradigme de la POO en utilisant le langage C++ :
#include <iostream>
class Cube {
float side;
public:
Cube(float s){ side = s; }
float volume() { return side * side * side; }
};
int main(){
float side = 2;
Cube cube(side);
std::cout << "Volume: " << cube.volume() << std::endl;
return 0;
}
La fonction main()
est toujours présente. Mais il y a maintenant un nouveau mot, class
, qui introduit la définition d’un objet. La classe définie, nommée Cube
, contient ses propres variables et sous-programmes. En POO, une variable est aussi appelée un attribut et un sous-programme est appelé une méthode.
L’explication de tout le code C++ de l’exemple n’entre pas dans le cadre de ce chapitre. Ce qui est important pour nous ici est que Cube
contient l’attribut side
et deux méthodes. La méthode volume()
calcule le volume du cube.
Il est possible de créer plusieurs objets indépendants à partir d’une même classe, et les classes peuvent être composées d’autres classes.
N’oubliez pas que ces mêmes fonctionnalités peuvent être écrites différemment et que les exemples de ce chapitre sont simplifiés à l’extrême. Le C et le C++ possèdent des fonctionnalités beaucoup plus sophistiquées qui permettent des constructions beaucoup plus complexes et plus pratiques.
La plupart des langages de programmation n’imposent pas rigoureusement un paradigme, mais permettent aux programmeurs de choisir divers aspects d’un paradigme ou d’un autre. JavaScript, par exemple, intègre des aspects de différents paradigmes. Le programmeur peut décomposer l’ensemble du programme en fonctions qui ne partagent pas d’état commun entre elles :
function cube(side){
return side*side*side;
}
console.log("Volume: " + cube(2));
Bien que cet exemple soit similaire à la programmation procédurale, notez que la fonction reçoit une copie de toutes les informations nécessaires à son exécution et qu’elle produit toujours le même résultat pour le même paramètre, indépendamment des changements qui se produisent en dehors de la portée de la fonction. Ce paradigme, appelé fonctionnel, est fortement influencé par le formalisme mathématique, où chaque opération est autosuffisante.
Un autre paradigme couvre les langages déclaratifs, qui décrivent les états dans lesquels vous voulez que le système se trouve. Un langage déclaratif peut déterminer comment atteindre les états spécifiés. SQL, le langage universel d’interrogation des bases de données, est parfois qualifié de langage déclaratif, bien qu’il occupe en réalité une niche unique dans le panthéon de la programmation.
Il n’existe pas de paradigme universel qui puisse être adopté dans n’importe quel contexte. Le choix du langage peut également être restreint par les langages supportés par la plate-forme ou l’environnement d’exécution où le programme sera utilisé.
Une application web qui sera utilisée par le navigateur, par exemple, devra être écrite en JavaScript, qui est un langage universellement supporté par les navigateurs. (Quelques autres langages peuvent être utilisés car ils fournissent des convertisseurs pour créer du JavaScript). Ainsi, pour le navigateur Web—parfois appelé côté client ou front end de l’application Web—le développeur devra utiliser les paradigmes autorisés en JavaScript. Le côté serveur ou back-end de l’application, qui traite les requêtes du navigateur, est normalement programmé dans un langage différent ; PHP est le plus utilisé à cette fin.
Indépendamment du paradigme, chaque langage dispose de bibliothèques de fonctions prédéfinies qui peuvent être incorporées dans le code. Les fonctions mathématiques—comme celles illustrées dans l’exemple—n’ont pas besoin d’être implémentées à partir de zéro, car le langage dispose déjà de la fonction prête à être utilisée. JavaScript, par exemple, fournit l’objet Math
avec les opérations mathématiques les plus courantes.
Des fonctions encore plus spécialisées sont généralement disponibles auprès du fournisseur du langage ou de développeurs tiers. Ces bibliothèques de ressources supplémentaires peuvent être sous forme de code source, c’est-à-dire dans des fichiers supplémentaires qui sont incorporés dans le fichier où ils seront utilisés. En JavaScript, l’incorporation se fait avec import from
:
import { OrbitControls } from 'modules/OrbitControls.js';
Ce type d’importation, où la ressource incorporée est également un fichier de code source, est le plus souvent utilisé dans les langages dits interprétés. Les langues compilées permettent, entre autres, l’incorporation de fonctionnalités pré-compilées dans le langage machine, c’est-à-dire des bibliothèques compilées. La section suivante explique les différences entre ces types de langages.
Compilateurs et interpréteurs
Comme nous le savons déjà, le code source est une représentation symbolique d’un programme qui doit être traduit en langage machine pour être exécuté.
Grosso modo, il y a deux façons de faire la traduction : convertir le code source au préalable pour une exécution future, ou convertir le code au moment de son exécution. Les langages de la première modalité sont appelés langages compilés et les langages de la seconde modalité sont appelés langages interprétés. Certains langages interprétés proposent la compilation en option, afin que le programme puisse être exécuté plus rapidement.
Dans les langages compilés, il existe une distinction claire entre le code source du programme et le programme lui-même, qui sera exécuté par l’ordinateur. Une fois compilé, le programme ne fonctionne généralement que sur le système d’exploitation et la plate-forme pour lesquels il a été compilé.
Dans un langage interprété, le code source lui-même est traité comme le programme, et le processus de conversion en langage machine est transparent pour le programmeur. Pour un langage interprété, il est courant d’appeler le code source un script. L’interpréteur traduit le script en langage machine pour le système sur lequel il est exécuté.
Compilation et compilateurs
Le langage de programmation C est l’un des exemples les plus connus de langage compilé. Les principaux atouts du langage C sont sa flexibilité et ses performances. Le langage C permet de programmer aussi bien les superordinateurs de haute performance que les microcontrôleurs des appareils ménagers. D’autres exemples de langages compilés populaires sont C++ et C# (C sharp). Comme leur nom l’indique, ces langages s’inspirent du C, mais incluent des fonctionnalités qui prennent en charge le paradigme orienté objet.
Le même programme écrit en C ou en C++ peut être compilé pour différentes plates-formes, en ne nécessitant que peu ou pas de modifications du code source. C’est le compilateur qui définit la plate-forme cible du programme. Il existe des compilateurs spécifiques à une plate-forme ainsi que des compilateurs multi-plateformes tels que GCC (qui signifie GNU Compiler Collection) qui peuvent produire des programmes binaires pour de nombreuses architectures distinctes.
Note
|
Il existe également des outils qui automatisent le processus de compilation. Au lieu d’invoquer directement le compilateur, le programmeur crée un fichier indiquant les différentes étapes de compilation à exécuter automatiquement. L’outil traditionnel utilisé à cette fin est |
Le processus de compilation ne génère pas toujours un programme binaire en langage machine. Il existe des langages compilés qui produisent un programme dans un format appelé génériquement bytecode. Comme un script, le bytecode n’est pas dans un langage spécifique à une plate-forme, il nécessite donc un programme interpréteur qui le traduit en langage machine. Dans ce cas, le programme interpréteur est simplement appelé un environnement d’exécution ou runtime.
Le langage Java adopte cette approche, de sorte que les programmes compilés écrits en Java peuvent être utilisés sur différents systèmes d’exploitation. Malgré son nom, Java n’est pas lié à JavaScript.
Le bytecode est plus proche du langage machine que du code source, de sorte que son exécution tend à être comparativement plus rapide. Comme il y a toujours un processus de conversion pendant l’exécution du bytecode, il est difficile d’obtenir les mêmes performances qu’un programme équivalent compilé en langage machine.
Interprétation et interpréteurs
Dans les langages interprétés tels que JavaScript, Python et PHP, le programme n’a pas besoin d’être pré-compilé, ce qui facilite son développement et sa modification. Au lieu de le compiler, le script est exécuté par un autre programme appelé interpréteur. En général, l’interpréteur d’un langage porte le nom du langage lui-même. L’interpréteur d’un script Python, par exemple, est un programme appelé python
. L’interpréteur de JavaScript est le plus souvent le navigateur web, mais les scripts peuvent aussi être exécutés par le programme node
en dehors d’un navigateur. Parce qu’il est converti en instructions binaires à chaque fois qu’il est exécuté, un programme en langage interprété a tendance à être plus lent que son équivalent en langage compilé.
Rien n’empêche une même application d’avoir des composants écrits dans des langages différents. Si nécessaire, ces composants peuvent communiquer par le biais d’une interface de programmation d’applications (API : application programming interface) compréhensible par tous.
Le langage Python, par exemple, possède des capacités très sophistiquées d’exploration de données et de tabulation de données. Le développeur peut choisir Python pour écrire les parties du programme qui traitent de ces aspects et un autre langage, tel que C++, pour effectuer le traitement numérique plus lourd. Il est possible d’adopter cette stratégie même lorsqu’il n’existe pas d’API permettant une communication directe entre les deux composants. Par exemple, le code écrit en Python peut générer un fichier dans le format approprié pour être utilisé par un programme écrit en C++.
Bien qu’il soit possible d’écrire presque n’importe quel programme dans n’importe quel langage, le développeur doit adopter celui qui correspond le mieux à l’objectif de l’application. Ce faisant, vous bénéficiez de la réutilisation de composants déjà testés et bien documentés.
Exercices guidés
-
Quel type de programmes peut être utilisé pour éditer le code source ?
-
Quel type d’outils permet d’intégrer le travail de différents développeurs dans la même base de code ?
Exercices d’exploration
-
Supposons que vous vouliez écrire un jeu en 3D à jouer dans le navigateur. Les applications et les jeux Web sont programmés en JavaScript. Bien qu’il soit possible d’écrire toutes les fonctions graphiques à partir de zéro, il est plus productif d’utiliser une bibliothèque prête à l’emploi à cette fin. Quelles bibliothèques tierces offrent des possibilités d’animation 3D en JavaScript ?
-
Outre le PHP, quels autres langages peuvent être utilisés du côté serveur d’une application web ?
Résumé
Cette leçon couvre les concepts les plus essentiels du développement de logiciels. Le développeur doit connaître les principaux langages de programmation et le scénario d’utilisation approprié pour chacun d’eux. Cette leçon aborde les concepts et procédures suivants :
-
Ce qu’est le code source.
-
Les éditeurs de code source et les outils associés.
-
Les paradigmes de programmation procédurale, orientée objet, fonctionnelle et déclarative.
-
Caractéristiques des langages compilés et interprétés.
Réponses aux exercices guidés
-
Quel type de programmes peut être utilisé pour éditer le code source ?
En principe, tout programme capable d’éditer du texte brut.
-
Quel type d’outils permet d’intégrer le travail de différents développeurs dans la même base de code ?
Un système de gestion de versions ou de sources, tel que Git.
Réponses aux exercices d’exploration
-
Supposons que vous vouliez écrire un jeu en 3D à jouer dans le navigateur. Les applications et les jeux Web sont programmés en JavaScript. Bien qu’il soit possible d’écrire toutes les fonctions graphiques à partir de zéro, il est plus productif d’utiliser une bibliothèque prête à l’emploi à cette fin. Quelles bibliothèques tierces offrent des possibilités d’animation 3D en JavaScript ?
Il existe de nombreuses bibliothèques graphiques 3D pour JavaScript, telles que threejs et BabylonJS.
-
Outre le PHP, quels autres langages peuvent être utilisés du côté serveur d’une application web ?
Tout langage pris en charge par l’application du serveur HTTP utilisée sur la machine serveur. Quelques exemples sont Python, Ruby, Perl et JavaScript lui-même.