A. SIGAYRET – UFR ST :
La programmation
La programmation constitue souvent un point d'entrée
à l'informatique : un nombre non négligeable d'étudiants se sont décidés
pour des études informatiques après avoir appris par eux-mêmes à programmer.
Il en résulte souvent une compétence technique très poussée dans le langage
de programmation choisi, généralement le C ou un langage syntaxiquement proche.
Paradoxalement, cet apprentissage précoce peut constituer un désavantage
car la virtuosité de programmation dans un langage ne préjuge pas des capacités globales
à suivre un cursus informatique. En effet, l'apprentissage indispensable d'autres
langages de programmation aux paradigmes différents nécessitera d'abandonner les
réflexes d'écriture acquis. De plus, la création d'un logiciel dans une optique
professionnelle nécessite de prendre en compte beaucoup d'autres paramètres à la
fois théoriques et pratiques.
Préalable indispensable à la programmation professionnelle,
les questions théoriques sont abordées par l'algorithmique. On y découvre par exemple
que certains problèmes ne peuvent être résolus par une machine. L'impossibilité
théorique est liée à la théorie mathématique sous-tendant la conception des ordinateurs,
soit que le problème posé ne puisse pas être résolu par la machine,
soit que le temps de calcul nécessaire serait déraisonnablement long.
D'autre part, la mise au point de programmes complexes nécessite la
coordination de plusieurs programmeurs, et l'évolution indispensable des logiciels produits
nécessite des modifications de programme impliquant une très grande lisibilité du
code source. C'est l'objet du génie logiciel qui, comme toute activité humaine
collective doit prendre en compte les questions de communication inter-individuelle
ou collective, pour ne rien dire des questions financières.
Enfin, bien que l'informatique soit une discipline jeune, il existe une grande
diversité de langages de programmation (Il semble que la création de langages de programmation soit
une activité du cerveau aussi gratifiante que la création de langues artificielles!).
Pour ne pas s'y perdre, quelques éléments de classification ne sont donc pas inutiles.
Les classements que je propose ici constituent une synthèse
– pas forcément consensuelle – de l'existant.
-
Les paradigmes de programmation
La manière dont un langage de programmation est conçu reflète le mode de représentation
de la réalité à programmer que peuvent avoir les concepteurs du langage.
- Programmation impérative :
On se focalise sur les instructions permettant de réaliser
le traitement en suivant les directives données directement par le programmeur.
- Programmation "spaghetti" (Goto).
Exp : Basic (initial). Assembleurs.
- Programmation itérative (si-alors-sinon, pour, tantque)
- simple
- structurée (procédures et/ou fonctions, qui sont des blocs nommés avec passage de paramètres).
Exp : Fortran, C.
- Programmation [orientée] objet :
On se focalise sur la structuration des données et leur traitement.
Classement selon autonomie et communication des objets.
- Objets classes (hiérarchisés). Exp :
Pascal, Ada, Smalltalk. Java.
- Objets prototypes (objet de référence).
- Objets composants (autonomes et communicants).
- Programmation déclarative :
On se focalise sur la description des buts à atteindre, laissant la manière
d'atteindre ces objectifs à la discrétion du compilateur.
- Programmation descriptive. Exp : XML, HTML, LaTeX.
- Programmation fonctionnelle (des fonctions, pas de procédures).
Exp Lisp, Caml.
N.B. Les langages fonctionnels peuvent avoir des instructions itératives qui leur
donne les capacités d'un langage impératif structuré.
- Programmation logique, par prédicats logiques et/ou par contraintes. Exp Prolog.
-
Les niveaux de programmation des langages impératifs
L'évolution historique des langages les éloigne progressivement de la
machine pour les rapprocher du fonctionnement de l'esprit humain
- Niveau I – Microcode.
Il s'agit du code directement compréhensible par la machine. Par exemple
1111010000000000 peut être l'instruction qui place le contenu du premier
registre du processeur dans la pile.
- Niveau II – Assembleur.
Les langages de ce niveau sont aussi proches de la machine que le microcode
et dépendent donc à la fois du processeur et du système d'exploitation.
Chaque instruction du processeur correspond à une instruction plus
signifiante pour un humain, par exemple, PUSH AX remplacera
1111010000000000 dans un document texte que le programmeur éditera et qui
sera ensuite traduit (compilé) par un programme (un compilateur).
Le programme se déroule séquentiellement sauf s'il rencontre une instruction
de saut (de type JUMP, CALL, ...).
- Niveau III – Bas niveau.
Dans ce niveau apparait la notion de procédure et de fonction : des blocs de
programme se voient attribuer un nom et peuvent donc être appelés.
Les instructions de saut sont remplacés par des instructions itératives.
Le programme est ainsi structuré en unités fonctionnelles qui peuvent
interagir.
Les données traitées peuvent être classées dans différents types (entier,
réel, caractère, etc.) mais le contrôle exercé sur ces types par le
programme reste faible (typage flou).
Le plus célèbre langage de cette catégorie est le C. On peut placer ici aussi
le Basic, bien que les premières versions de ce langage aient conservé
(tels des fossiles vivants) des instructions de saut GOTO qui n'ont disparu
qu'ultérieurement au profit des boucles itératives.
- Niveau IV – Moyen niveau.
Dans ce niveau, le typage des données est mieux établi, un entier ne peut
être confondu avec un caractère (typage fort). Le langage peut
autoriser la généralisation de type : un entier est un cas particulier de
réel, un caractère peut constituer une chaîne de caractères de taille un
(typage souple = typage sémantique), il peut au contraire
strictement cloisonner les types de données : un entier ne doit pas être
confondu avec un nombre réel lequel doit avoir une virgule décimale
(typage stricte). Les procédures et fonctions sont bien définies et
peuvent être regroupées en unités fonctionnelles. Le langage Pascal
appartient à cette catégorie où ne peut pas vraiment placer le C++.
- Niveau V – Haut niveau.
Dans ce niveau, le langage est prévu pour s'adapter le mieux possible à la
manière de penser de l'être humain (ou du moins du programmeur :-) ).
La notion d'objet apparait, c'est à dire un bloc de programme individualisé
et constitué de données et de traitements ayant une cohérence conceptuelle.
Un ensemble d'outils sophistiqués de génie logiciel gèrent automatiquement
tous les problèmes de bas niveau, voire une partie des questions
conceptuelles.
Le langage Java appartient à ce niveau, ainsi que les évolutions des langages
du niveau précédent telles que Delphi, Objective C, etc.
Le langage Python a l'avantage d'une mise en page du code semblable à celle
de l'algorithmique.
- Niveau VI – Très haut niveau.
Les langages de ce niveau doivent être capables de communiquer avec les
humains et de reproduire leurs raisonnements. On parle alors d'intelligence
artificielle. On peut alors se heurter à des limites théoriques
(NP-complétude, indécidabilité, etc.) avec lesquelles il faut négocier.
De tels langages sont par exemple utilisés en robotique.
-
Compilation ou interprétation
Ce qu'écrit le programmeur, le code source, ne peut être utilisé
directement par la machine mais doit
être traduit en microcode.
Cette traduction peut se faire de deux manières :
– Un compilateur crée un fichier appelé exécutable qui contient
le code machine directement utilisable. La compilation permet d'avoir un
programme directement prévu pour la machine sans s'inquiéter du code source
devenu inutile.
– Un interpréteur lit le code source et le traduit à mesure en
code machine qui est exécuté progressivement. L'interprétation permet plus
facilement de suivre l'exécution du programme et de corriger les éventuelles
erreurs de programmation.
2017-07-01 – A. Sigayret