199 lines
8.8 KiB
Plaintext
199 lines
8.8 KiB
Plaintext
|
Présentation de l'art de programmer
|
|||
|
====================================
|
|||
|
|
|||
|
Qu'est-ce que la programmation ?
|
|||
|
--------------------------------
|
|||
|
|
|||
|
programmation
|
|||
|
|
|||
|
Description d’un calcul (traitement) dans
|
|||
|
un langage compréhensible par la machine
|
|||
|
(langage de programmation)
|
|||
|
|
|||
|
Le processus d'abstraction
|
|||
|
--------------------------
|
|||
|
|
|||
|
Débuter en programmation n'est pas une chose aisée. Aujourd'hui, la tendance est au
|
|||
|
"bas niveau". Souvent, on se jette dans le grand bain :
|
|||
|
|
|||
|
- soit en s'approchant au maximum de la machine (admin système et réseau, noyau
|
|||
|
linux, langage C)
|
|||
|
|
|||
|
- soit en faisant du dev web côté backend, ce qui ramène à une administration réseau
|
|||
|
de bas niveau (microservices, monde nodeJS/javascript, etc...)
|
|||
|
|
|||
|
Soit on suit un cursus scolaire traditionnel qui commence souvent par une
|
|||
|
explication du fonctionnement d'une machine abstraite de bas niveau, puis en
|
|||
|
allant de plus en plus haut, mais étant sous-entendu qu'il faut rester connecté au
|
|||
|
bas niveau (comprendre comment ça se passe derrière la scène).
|
|||
|
|
|||
|
Dans ces deux cas, il est sous-entendu qu'on apprend plus de choses et plus rapidement en mettant
|
|||
|
les mains dans le cambouis, ce qui est vrai bien sûr. Mais cela sous-entend qu'un développeur doit
|
|||
|
rester le nez dans le guidon. Qu'il doit être un expert de son domaine en accumulant des technologies
|
|||
|
sans aucun recul. Bien sûr il se doit d'être un expert du système dans lequel il évolue
|
|||
|
(connaissance du système d'exploitation, binding avec le C, du ramasse miette (garbage
|
|||
|
collector), interaction avec les différentes librairies, gestion et optimisation de la mémoire,
|
|||
|
architecture par microservices, threads...) mais il doit aussi être capable de prendre du recul.
|
|||
|
|
|||
|
L'approche algorithmique (algorithmique de pseudo code, algorithmique algébrique et modulaire)
|
|||
|
est un véritable moyen pour le programmeur de prendre du recul : elle commence par se placer du
|
|||
|
côté de l'esprit humain et de ses capacités de compréhension et d'abstraction, elle autorise une
|
|||
|
pensée rationnelle sur l'art de programmer et permet au programmeur d'effectuer les bons choix,
|
|||
|
en connaissance de sa discipline.
|
|||
|
|
|||
|
Le lien est fait ensuite avec le plus bas niveau grâce une implémentation effective
|
|||
|
des langages à partir des paradigmes de rationalisation de la penseée (modules,
|
|||
|
objects, généricité, polymorphisme paramétrique...) et d'un outil de communication
|
|||
|
avec la machine qu'on appelle compilateur (dont la description est en dehors de
|
|||
|
l'objectif de ce cours).
|
|||
|
|
|||
|
La tendance générale de l'évolution des langages est de se libérer de ces
|
|||
|
contraintes de bas niveau, un peu comme en sciences physiques où les lois physiques
|
|||
|
dépendent de l'échelle d'en dessous (du niveau microscopique/quantique) mais qu'à
|
|||
|
l'échelle du dessus, on n'a pas affaire à des effets de bas niveau (pas d'effets
|
|||
|
quantiques à un niveau macroscopique en général). Ce processus d'évolution est vrai
|
|||
|
aussi dans le monde de la technique informatique lui-même (modèle OSI, comment est
|
|||
|
construite une trame IP, indépendances de chaque couche (transport, payload) entre
|
|||
|
elles). Même la tendance système est à la virtualisation qui accentue encore la
|
|||
|
tendance à s'affranchir du bas niveau (le niveau système), le séparer nettement du
|
|||
|
haut niveau (le niveau applicatif).
|
|||
|
|
|||
|
Il apparaît régulièrement de nouveaux langages. Comment s'orienter ? Quel(s)
|
|||
|
langage(s) choisir pour un projet de développement ? Au delà de leurs disparités, la
|
|||
|
conception et la genèse de chacun d'eux procèdent d'une motivation partagée : la
|
|||
|
volonté d'abstraire.
|
|||
|
|
|||
|
- **s'abstraire de la machine** : un langage de programmation permet de
|
|||
|
négliger l'aspect *mécanique* de l'ordinateur. On oublie le modèle du
|
|||
|
microprocesseur, jusqu'au système d'exploitation sur lequel sera exécuté
|
|||
|
le programme.
|
|||
|
|
|||
|
- **abstraire les erreurs** : Il s'agit ici de garantir la sûreté d'exécution; un
|
|||
|
programme ne doit pas se terminer brutalement ou devenir incohérent en cas d'erreur.
|
|||
|
Un des moyens pour y parvenir est le typage des programmes et la mise
|
|||
|
en oeuvre d'un mécanisme d'exceptions.
|
|||
|
|
|||
|
- **abstraire le mode opératoire** : Il s'agit de choisir une représentation, un
|
|||
|
paradigme d'implémentation qui est indépendant du domaine considéré (paradigme
|
|||
|
objet, modulaire, générique, composants...)
|
|||
|
|
|||
|
- **abstraire les composants** : Les langages de programmation donnent la
|
|||
|
possibilité de découper une application en différents composants logiciels, plus ou
|
|||
|
moins indépendants et autonomes. La modularité permet une structuration de plus haut
|
|||
|
niveau de l'ensemble d'une application complexe. Les langages à objets constituent
|
|||
|
une autre approche de la réutilisabilité permettant la réalisation très rapide de
|
|||
|
prototypes.
|
|||
|
|
|||
|
Description des niveaux d'abstraction par rapport à la machine
|
|||
|
---------------------------------------------------------------
|
|||
|
|
|||
|
Les langages de haut niveau simplifient le travail du
|
|||
|
programmeur là où les langages de bas niveau permettent de produire un code
|
|||
|
plus efficace.
|
|||
|
|
|||
|
- **niveau 0** : le langage machine. Illisible, c'est une suite d'optcode.
|
|||
|
impossible de coder dans ce langage.
|
|||
|
|
|||
|
- **niveau 1** : langage d'assemblage. Il reste très dépendant de la machine
|
|||
|
et aujourd'hui il est rare d'en faire, sauf si on code un bootloader par exemple,
|
|||
|
la gestion de l'accès à la mémoire est en réel (le mode protégé n'apparaît que après).
|
|||
|
Il faut gérer les ressources,le langage est très optimisé mais presque impossible
|
|||
|
à maintenir et rendre générique. Aujourd'hui plus personne ne code en assembleur.
|
|||
|
|
|||
|
- **niveau 2** : langages dits de **bas niveau** : (exemple : le C, le C++)
|
|||
|
indépendance par rapport à la machine, grande structuration mais très verbeux
|
|||
|
|
|||
|
- **niveau 3** : langages dits de **haut niveau** : le raisonnement dans ces
|
|||
|
langages ne dépent plus de la machine, et ils implémentent des paradigmes de
|
|||
|
programmation indépendant de l'état de la mémoire de l'ordinateur,
|
|||
|
ils sont indépendant même du système d'exploitation.
|
|||
|
|
|||
|
Qu'est-ce qu'une machine ?
|
|||
|
---------------------------
|
|||
|
|
|||
|
Une machine, ce truc apparemment si complexe, est en fait
|
|||
|
un assemblage de bric et de brac.
|
|||
|
|
|||
|
L'assemblage des connecteurs permet de simuler un additionneur,
|
|||
|
en prenant en compte les propriétés de **reste euclidien**
|
|||
|
de l'addition.
|
|||
|
|
|||
|
La structure électronique est composée de :
|
|||
|
|
|||
|
- un ordonnanceur.
|
|||
|
- le stockage d'un **état**.
|
|||
|
- une pile d'instruction
|
|||
|
|
|||
|
.. glossary::
|
|||
|
|
|||
|
adressage
|
|||
|
|
|||
|
Dès lors qu'on dispose de ces bases électronique au dessus du processeur,
|
|||
|
un langage d'assemblage est possible, c'est le langage de calcul sur les registres.
|
|||
|
|
|||
|
registre
|
|||
|
|
|||
|
machines ont un espace mémoire et un espace de calcul (registres)
|
|||
|
|
|||
|
Un ordinateur, c'est très très stupide, mais ça permet de disposer de :
|
|||
|
|
|||
|
- une mémoire très grande et ordonnée,
|
|||
|
- une capacité à effectuer inlassablement des tâches répétitives
|
|||
|
- une grande rapidité de calcul
|
|||
|
|
|||
|
Apprendre à programmer, c'est-à-dire être capable de
|
|||
|
contrôler la machine.
|
|||
|
|
|||
|
.. important:: Apprendre à programmer, c'est-à-dire apprendre à penser de manière structurée,
|
|||
|
pour pouvoir accessoirement ensuite communiquer avec une machine.
|
|||
|
|
|||
|
Compilateur
|
|||
|
-----------
|
|||
|
|
|||
|
Schématiquement, un compilateur est un programme qui traduit un
|
|||
|
programme d’un langage source vers un langage cible, en signalant
|
|||
|
d’éventuelles erreurs.
|
|||
|
|
|||
|
Quand on parle de compilation, on pense typiquement à la traduction d’un
|
|||
|
langage de haut niveau (C, Java, Caml, ...) vers le langage machine d’un
|
|||
|
processeur (Intel Pentium, PowerPC, ...)
|
|||
|
|
|||
|
- xml (libre office, word) -> postscript (imprimante)
|
|||
|
- postcript -> image
|
|||
|
- syntaxe wiki -> html (Wikipédia...)
|
|||
|
|
|||
|
compilation graphique
|
|||
|
|
|||
|
passer une description, ça donne un dessin genre ocaml Quilt < mon_dessin.txt
|
|||
|
passer par une api qui permet de causer avec une interface
|
|||
|
|
|||
|
**transpiler** : transformation d'un langage de haut niveau vers un autre
|
|||
|
langage de haut niveau.
|
|||
|
|
|||
|
- cofee script, typescript -> javascript
|
|||
|
- (babel) javascript -> javascript ES 6
|
|||
|
- python -> javascript
|
|||
|
|
|||
|
Un compilateur traduit un programme P en un programme Q tel que
|
|||
|
pour toute entrée x , la sortie de `Q(x)` soit la même que celle de `P(x)`
|
|||
|
|
|||
|
Un interprète est un programme qui, étant donné un programme `P` et une
|
|||
|
entrée x , calcule la sortie s de `P(x)`
|
|||
|
|
|||
|
Le compilateur fait un travail complexe une seule fois, pour produire un
|
|||
|
code fonctionnant pour n’importe quelle entrée
|
|||
|
L’interprète effectue un travail plus simple, mais le refait sur chaque entrée
|
|||
|
Autre différence : le code compilé est généralement bien plus efficace que
|
|||
|
le code interprété
|
|||
|
|
|||
|
Typiquement, le travail d’un compilateur se compose d’une phase d’analyse
|
|||
|
|
|||
|
- reconnaît le programme à traduire et sa signification
|
|||
|
- signale les erreurs et peut donc échouer (erreurs de syntaxe, de portée, de typage, etc.)
|
|||
|
|
|||
|
Puis d’une phase de synthèse
|
|||
|
|
|||
|
- production du langage cible
|
|||
|
- utilise de nombreux langages intermédiaires
|
|||
|
- n’échoue pas
|