livres:principes_des_langages_de_programmation:cours_1
Differences
This shows you the differences between two versions of the page.
livres:principes_des_langages_de_programmation:cours_1 [2016/07/04 18:45] – created leo | livres:principes_des_langages_de_programmation:cours_1 [2016/07/13 16:33] (current) – leo | ||
---|---|---|---|
Line 1: | Line 1: | ||
|<- |[[cours 1]] ->| | |<- |[[cours 1]] ->| | ||
+ | ====== les langages de programmation ====== | ||
- | Langages de programmation servent à exprimer des algorithmes dans un langage **formel** compréhensible par des machines. | + | ===== introduction ===== |
- | (En opposition à par le passé avant les ordinateur où on les exprimait dans un langage naturel à l'intention des humains) | + | ==== Ce qu'ils sont ==== |
- | Autre exemple | + | Langages |
+ | |||
+ | Exemple en Égypte, scribes en mésopotamie ne connaissaient pas le théorème de pytagore mais avait un algorithme pas très loin pour calculer l' | ||
+ | |||
+ | Au moment ou on a du passer d' | ||
+ | |||
+ | Écrire un texte lu par la machine : langage formel. Existant avant l' | ||
langage formel != langage de programmation | langage formel != langage de programmation | ||
Line 14: | Line 21: | ||
- langage lisible par une machine (cela en fait un langage formel) | - langage lisible par une machine (cela en fait un langage formel) | ||
- doit également être lisible par un être humain | - doit également être lisible par un être humain | ||
+ | |||
+ | L' | ||
+ | |||
+ | Note : Haut et bas niveau : selon le degré de rapprochement/ | ||
Programme de quelques lignes à des millions. Avant la programmation objets constitués de beaucoup moins d' | Programme de quelques lignes à des millions. Avant la programmation objets constitués de beaucoup moins d' | ||
- | === les langages de programmation | + | ==== principes communs ==== |
+ de 2000 | + de 2000 | ||
- | principes communs : affectation, | + | Organisés autour de principes communs : affectation, |
+ | |||
+ | Note perso : et les paradigmes ? | ||
+ | |||
+ | Langues naturelles : article, pronom, verbe, temps, mode, aspect, conjugaison, | ||
+ | |||
+ | "Quand il y a un nouveau langage que vous devez apprendre, vous posez tout de suite les bonnes questions, comment est-ce qu'on fait une affectation, | ||
+ | |||
+ | "Le but d'un court comme celui-là n'est pas de comprendre les idiotismes de Java ou Caml, **idiotisme veut dire particularité**, | ||
+ | |||
+ | ===== objectifs ===== | ||
+ | |||
+ | * Apprendre à programmer en **Java** | ||
+ | * Comprendre les **principes** (comparaison avec Caml et C) | ||
+ | * Commencer à apprendre les outils qui permettent de décrire la **signification** des programmes | ||
+ | * Apprendre les **algorithmes de base** sur les listes, les arbres et les tableaux | ||
+ | |||
+ | ===== Le noyau impératif ===== | ||
+ | |||
+ | ==== Qu' | ||
+ | |||
+ | Un ensemble de construction qu'on retrouve dans quasiment tous les langages de programmation : | ||
+ | |||
+ | * l' | ||
+ | * la déclaration de variable | ||
+ | * la séquence | ||
+ | * le test | ||
+ | * la boucle | ||
+ | |||
+ | ==== l' | ||
+ | |||
+ | === forme générale === | ||
+ | |||
+ | < | ||
+ | x = 3 + y</ | ||
+ | |||
+ | **x** variable et **t** expression | ||
+ | |||
+ | variable : un mot d'une ou plusieurs lettre (n: je trouve ça vraiment pas top comme définition !) | ||
+ | |||
+ | expression : formée à partir des constantes et des variables avec des opérations (+, | ||
+ | |||
+ | < | ||
+ | //Caml | ||
+ | x := 3 + !y // voir plus loin pour le ! | ||
+ | // C : comme en Java | ||
+ | </ | ||
+ | |||
+ | Ce qu'il se passe quand on exécute x = t; | ||
+ | |||
+ | On met la **valeur** de **t** dans cette case | ||
+ | |||
+ | La valeur antérieur est oubliée | ||
+ | |||
+ | Expressions : 3, 5 + 3, y + 3 | ||
+ | Valeurs (nombres entiers) : 3, 8, 10 | ||
+ | État: ensemble des valeurs des variables à un instant donné (contre-proposition : ensemble des valeurs en mémoire à un instant donné). | ||
+ | |||
+ | === la déclaration de variable === | ||
+ | |||
+ | Fait un exemple avec des boites sorties pour l' | ||
+ | |||
+ | Assignation : sortir la boite et lui associer un nom. | ||
+ | |||
+ | Avant de pouvoir utiliser la variable x, il faut la déclarer. | ||
+ | |||
+ | Associer le nom x à une des cases de la mémoire | ||
+ | |||
+ | < | ||
+ | {int x = t; p} | ||
+ | {int x = 5; x = 3 + y;} | ||
+ | </ | ||
+ | |||
+ | Expression t : valeur initale (optionnelle) | ||
+ | Instruction p : portée de la variable x | ||
+ | |||
+ | En Caml: let x = ref 5 in p | ||
+ | En C : comme en Java | ||
+ | |||
+ | Une boite n'est jamais vide | ||
+ | |||
+ | **int** : nombres entiers compris entre -2^31 et 2^31 -1 | ||
+ | |||
+ | Outre **int**, trois autres intervalles **byte**(2^12 possibilités), | ||
+ | |||
+ | Autres types : | ||
+ | * **booleans** (false, true) | ||
+ | * flottants: **float** (nombres à virgule) | ||
+ | * caractères **char**(**' | ||
+ | |||
+ | Donc : | ||
+ | * huit **types primitifs** : en java 4 pour les entiers, 2 pour les flottants, 1 pour les booléens, 1 pour les caractères | ||
+ | * types composites (à suivre) : **String**(**" | ||
+ | |||
+ | **{T x = t; p}** | ||
+ | |||
+ | **Quand on aborde un nouveau langage de programmation, | ||
+ | |||
+ | |||
+ | ===Les variables finales et les variables mutables=== | ||
+ | |||
+ | Une autre précision qu'on peut donner quand on va déclarer une variable, c'est la déclarer comme finale, c'est à dire en s' | ||
+ | |||
+ | déclaration d'une variable, engagement à ne jamais l' | ||
+ | |||
+ | **{final T x - 5; p}** | ||
+ | |||
+ | **final int x = 5; y = x + 3;}** | ||
+ | |||
+ | **final int x = 5; x = 3;}** incorrecte | ||
+ | |||
+ | Variable non finale : mutable | ||
+ | |||
+ | En Caml **let x = 5 in p** et non **let x = ref 5 in p** | ||
+ | |||
+ | **y := x + 3** et non **y := !x + 3** quand **x** est finale | ||
+ | |||
+ | En C, **const** au lieu de **final**. | ||
+ | |||
+ | Je cite : « En français ça s' | ||
+ | |||
+ | ==== la séquence ==== | ||
+ | |||
+ | La construction la plus simple des langages de programmation | ||
+ | |||
+ | **{p1 p2}** | ||
+ | |||
+ | **{x = 1; y = x + 1;}** | ||
+ | |||
+ | Quand on exécute cette instruction, | ||
+ | |||
+ | En Caml: **p1; p2** | ||
+ | |||
+ | En C : comme en Java | ||
+ | |||
+ | ==== le test ==== | ||
+ | |||
+ | if (b) p1 else p2 | ||
+ | |||
+ | if (x < 0) y = -1; else y = 1; | ||
+ | |||
+ | quand on exécute cette instruction, | ||
+ | |||
+ | Si c'est **true** on exécute **p1** si c'est **false** on exécute p2. | ||
+ | |||
+ | En Caml: **if b them p1 else p2** | ||
+ | |||
+ | En C : comme en Java | ||
+ | |||
+ | ==== la boucle ==== | ||
+ | |||
+ | **while (b) p** | ||
+ | |||
+ | **while (x < 1000) x = x * 2;** | ||
+ | |||
+ | Quand on exécute cette instruction : on calcule la valeur de b, si c'est false on a terminé, si c'est true, on exécute p et on recommence. | ||
+ | |||
+ | Notation finie pour une instruction infinie. | ||
+ | |||
+ | en Caml : **while b do p;** En C : comme en Java. | ||
+ | |||
+ | ==== les instruction d' | ||
+ | |||
+ | === sortie === | ||
+ | |||
+ | systel.out.print(x); | ||
+ | |||
+ | systel.out.println(); | ||
+ | |||
+ | systel.out.println(x); | ||
+ | |||
+ | === entrée === | ||
+ | |||
+ | En Java c'est complexe parce que la technique est devenu complexe (plus juste lire le clavier mais des fluxs sur réseaux complexes) | ||
+ | |||
+ | Ppl.lireInt (); // outil dev pour polytech et ses étudiants | ||
+ | |||
+ | ==== Le fonction ∑ ==== | ||
+ | |||
+ | liaison tardive ? | ||
+ | |||
+ | Ce qui se passe quand on exécute l' | ||
+ | |||
+ | **x = t;** : « On met la valeur de **t** dans la case **x** » | ||
+ | |||
+ | Description en langue naturelle rapidement complexe et confuse (déjà : **while**) | ||
+ | |||
+ | On finit par donner des exemples (… qui couvrent des cas simples) | ||
+ | |||
+ | * **comment écrire un interpréteur / compilateur ?** | ||
+ | * **comment raisonner à propos d'un programme ?** | ||
+ | * **comment analyser automatiquement un programme ?** | ||
+ | |||
+ | Nécéssité d'une description mathématique du langage pour évacuer les ambiguités. | ||
+ | |||
+ | === L' | ||
+ | |||
+ | Ensemble des valeurs des variables à un instant donné | ||
+ | |||
+ | Ensemble infini Var dont les éléments sont appelés **variables** | ||
+ | |||
+ | ensemble Val : [-2^32, 2^31 -1} W {False, true} W … | ||
+ | |||
+ | Un **état** est une fonction d'une partie finir de **Var** dans **Val** | ||
+ | |||
+ | e.g. : [x = 1, y = 4] | ||
+ | |||
+ | attention : pas 1 = x | ||
+ | |||
+ | exécuter une instruction : transformer l' | ||
+ | |||
+ | La signification des instructions d'un langage est définie par une fonction ∑ : | ||
+ | |||
+ | **∑(i,s) = s'** | ||
+ | |||
+ | e.g. : ∑( x = 3; , [x = 1, y = 4] ) = [x = 3,y = 4] | ||
+ | |||
+ | Ici i *(x = 3)* est appliqué à s *[x = 1, y = 4]* et donne *[x = 3,y = 4]* | ||
+ | |||
+ | === La décomposition de l' | ||
+ | |||
+ | Utile pour plus tard : (illisible) s = m o e ???, l' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Ensemble intermédiaire **Ref** des références | ||
+ | |||
+ | **∑(i, | ||
+ | |||
+ | ∑( x = 3; , [x = r1, y = r2], [r1 = 1, r2 = 4] ) = [r1 = 3,r2 = 4] | ||
+ | |||
+ | Décomposé de deux fonction, une première qui a une variable associe une référence, | ||
+ | |||
+ | Exemple, s'il fait 14° à Paris, quel température de la capitale de la France ? La même car « Paris » et « capitale de la France » font référence au même objet. | ||
+ | |||
+ | Environnement, | ||
+ | |||
+ | < | ||
+ | ┏━━┓┏━━┓ | ||
+ | ┃ a ┃┃ x ┃ identificateurs | ||
+ | ┗━━┛┗━━┛ | ||
+ | ┏━━━━━┓ | ||
+ | ┃ ┏━┓ | ||
+ | ┃ ┃ 3┃ ┃ valeur (3) dans boite | ||
+ | ┃ ┗━┛ | ||
+ | ┗━━━━━┛ | ||
+ | |||
+ | Boite = référence | ||
+ | |||
+ | Environnement = mettre nom (identificateur à la boite) | ||
+ | |||
+ | Mémoire = mettre valeur dans la boite | ||
+ | |||
+ | état = boite + nom + valeur | ||
+ | </ | ||
+ | |||
+ | == cas des variables finales == | ||
+ | |||
+ | final int x = 3; p | ||
+ | |||
+ | au lieu d' | ||
+ | |||
+ | on associe **x** à **3** dans **e** (la mémoire est ce qui peut changer) | ||
+ | |||
+ | Ref ⊆ Val | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | « L' | ||
+ | |||
+ | Les références se sont des valeurs comme les autres : Ref ⊆ Val | ||
+ | |||
+ | du coup les références c'est un sous-ensemble des valeurs comme sur schéma ci-dessous : | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Comme une variable finale/ | ||
+ | |||
+ | === La valeur d'une expression en Caml et en C === | ||
+ | |||
+ | **x = t;** | ||
+ | |||
+ | « On met la valeur de **t** dans la case **x** » | ||
+ | |||
+ | - Θ (n,e,m) = n | ||
+ | - Θ (n,e,m) = m(e(x)) si x est mutable | ||
+ | - Θ (n,e,m) = e(x) si x est finale | ||
+ | - Θ (t + u,e,m) = Θ(t,e,m) + Θ(u,e,m) | ||
+ | - idem pour les autres opérations | ||
+ | |||
+ | Caml : | ||
+ | |||
+ | - Θ (n,e,m) = (x) | ||
+ | |||
+ | Que x soit finale ou mutable | ||
+ | |||
+ | - Θ (!t,e,m) = m(Θ(t, | ||
+ | |||
+ | x + 1 en Java, **!**x + 1 en Caml | ||
+ | |||
+ | C : comme Java | ||
+ | |||
+ | === L' | ||
+ | |||
+ | la ????m + (r - v) coîncide avec m sauf en r ou elle vaut v | ||
- | langues naturelles | + | (pas continué à prendre note dès -16:19) |
livres/principes_des_langages_de_programmation/cours_1.1467650702.txt.gz · Last modified: 2016/07/04 18:45 by leo