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