From 9d22aa4bb4737c553547c9b1f37fc99d7593826d Mon Sep 17 00:00:00 2001 From: gwen Date: Sat, 18 Mar 2017 15:47:40 +0100 Subject: [PATCH] debut de glossaire --- algorithmique/cours/fondement.txt | 95 ++++++++++++++++--------------- algorithmique/cours/index.txt | 8 +-- algorithmique/cours/langage.txt | 68 ++++++++++++++++++++++ algorithmique/cours/machine.txt | 27 +++++++++ 4 files changed, 145 insertions(+), 53 deletions(-) create mode 100644 algorithmique/cours/machine.txt diff --git a/algorithmique/cours/fondement.txt b/algorithmique/cours/fondement.txt index 6346eb4..3baadf5 100644 --- a/algorithmique/cours/fondement.txt +++ b/algorithmique/cours/fondement.txt @@ -4,90 +4,91 @@ Présentation de l'art de programmer Le processus d'abstraction -------------------------- -Débuter en programmation n'est pas une chose aisée. Aujourd'hui, la tendance est au +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 +- 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 +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 vrai bien sûr. Mais cela -sous-entend qu'un développeur doit rester le nez dans le guidon, ou au moins qu'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, +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 vrai bien sûr. Mais cela +sous-entend qu'un développeur doit rester le nez dans le guidon, ou au moins qu'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...) -L'approche algorithmique consiste en exactement le contraire : elle commence par se -placer du côté de l'esprit humain et de ses capacités de compréhension et +L'approche algorithmique consiste en exactement le contraire : elle commence par se +placer du côté de l'esprit humain et de ses capacités de compréhension et d'abstraction. -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 +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 languages 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 +La tendance générale de l'évolution des languages 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 +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 +- **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. +- **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 +- **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 +- **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. -Détails des niveaux d'abstraction par rapport à la machine ------------------------------------------------------------ +Description des niveaux d'abstraction par rapport à la machine +--------------------------------------------------------------- -L'extrème déploiement des langages (plusieurs milliers de langages différents) -est dû au succès de l'ordinateur. +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, + 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 + 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 diff --git a/algorithmique/cours/index.txt b/algorithmique/cours/index.txt index 6c75413..6bfd1ab 100644 --- a/algorithmique/cours/index.txt +++ b/algorithmique/cours/index.txt @@ -1,8 +1,3 @@ -.. Algorithmique documentation master file, created by - sphinx-quickstart on Thu Mar 16 16:07:00 2017. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - Introduction à l'algorithmique ================================ @@ -14,9 +9,10 @@ Contents: fondement langage modularite + machine -.. algorithmique +.. FIXME machine, algorithmique diff --git a/algorithmique/cours/langage.txt b/algorithmique/cours/langage.txt index b38f879..ae4b948 100644 --- a/algorithmique/cours/langage.txt +++ b/algorithmique/cours/langage.txt @@ -112,6 +112,74 @@ Importance de la lisibilité (notamment par rapport aux méthodes agiles). Langages compilés ou interprétés ? ----------------------------------- +.. glossary:: + + langage compilé + + une première passe est faite, des validations son effectuées **avant** + la génération du code objet, cette phase est faite par le compilateur. + + compilateur + + programme qui transforme un langage de haut niveau en un langage de base + niveau + + - phase d’analyse syntaxique (source -> syntaxe abstraite) + - phase de synthèse (syntaxe abstraite -> code objet) + + + scripting (langage de scripting) + + langage interprèté + + générique (langage) + + Langage à usage générique, qui peut être utilisé dans n'importe quel + domaine (par opposition au DSL) + + domain specific + + Domain Specific Language, langage destiné à être utilisé dans un + domaine prédéfini. + + paradigmes + + représentation d'une vision particulière à partir d'un modèle théorique + + impératif + + l'algorithme ressemble à une recette de cuisine, + c'est-à-dire à une succession d'instructions à exécuter + les unes à la suite des autres + + fonctionnel + + l'algorithme ne dépend plus de l'ordre d'exécution d'instructions + pas de mélange entre les données et les traitements + + objets (programmation) + + le monde est découpé en catégories + qui permettent de créer des objets + + **développement par composants** + + les objets sont organisés entre eux par composants suivant des designs patterns, + (patrons de conception) + + garbage collector (ramasse miettes) + + la gestion automatique de la mémoire apparaît en 1989 + + machine virtuelle + + portabilité du code (mais diminution en optimisation et performances) + + JIT (just in time compiler) + + code objet, programmes fonctionnant autour de machines virtuelles + + - **le typage statique** : la vérification de la compatibilité entre les types des paramètres formels et des paramètres d'appel est effectuée au moment de la compilation du programme. Dès lors, il n'est pas nécessaire de faire ces diff --git a/algorithmique/cours/machine.txt b/algorithmique/cours/machine.txt new file mode 100644 index 0000000..b0e9c77 --- /dev/null +++ b/algorithmique/cours/machine.txt @@ -0,0 +1,27 @@ +Machine abstraite +----------------- + +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 + +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. + +l'adressage mémoire + + +registre + + machines ont un espace mémoire et un espace de calcul (registres) + +