IFT-2035 Concepts des Langages de Programmation Stefan Monnier (AA-3343) [email protected] http://www.iro.umontreal.ca/˜monnier/2035/ • David A. Watt, Programming Language Design Concepts • Ravi Sethi, Programming Languages: Concepts & Constructs • Benjamin C. Pierce, Types and Programming Languages • Simon Thompson, Haskell: The Craft of Functional Programming • Paul Hudak, The Haskell School of Expression IFT-2035 Stefan Monnier 1 Calendrier Historique, syntaxe des langages Sémantique des langages, λ-calcul, types Programmation fonctionnelle Portée, passage d’argument Fonctions d’ordre supérieur, fermetures Totalité, exceptions Modules, abstraction Compilation et interprétation Programmation impérative Représentation de donnée Pointeurs et gestion mémoire Programmation logique IFT-2035 Stefan Monnier 2 Aperçu du cours Il y a plusieurs milliers de langages de programmation • Être capable d’utiliser efficacement la majorité de ces langages • Savoir comparer et tirer parti de leurs similarité et différences • Pouvoir comprendre comment ils interagissent • Comprendre les concepts fondamentaux – Syntaxe et sémantique, types – Abstraction – Portée et passage d’arguments – Analyse, raisonnement, liberté d’implantation • Mieux programmer IFT-2035 Stefan Monnier 3 Comment? • Peu de syntaxes • Peu de différents styles de programmation • Équivalence de Turing Confiné par notre créativité, les contraintes des langages machines, et les besoins de performance IFT-2035 Stefan Monnier 4 Styles de programmation • Impératif – Procédural – Objet • Déclaratif – Fonctionnel – Logique • Concurrent – Mémoire partagée – Passage de messages IFT-2035 Stefan Monnier 5 Historique: langage machine (1) Seul langage compris directement par la machine La mémoire contient le programme et les données, le processeur opère dessus: • Transferts entre mémoire et registres • Opérations internes (arithmétiques, tests, ...) • Flot de contrôle registres add AX BX CX DX mul programme et données UC UCT IFT-2035 périphériques MÉMOIRE Stefan Monnier 6 Historique: langage machine (1) 1. Lire le mot de l’instruction courante 2. Le décoder 3. Chercher les opérandes 4. Effectuer l’opération 10001011 01000101 00001010 00000011 5. Socker le résultat 01000101 6. Passer à l’instruction suivante. 00010100 Les instructions et les données sont encodées par des chaı̂nes de bits Différent pour chaque type de machine Inintelligible pour les humains IFT-2035 Stefan Monnier 7 Historique: assembleur Représentation textuelle symbolique du langage machine mov 10(%ebp),%ax add 20(%ebp),%ax Toujours différent pour chaque type de machine La mémoire manque toujours de structure Irrégularités du jeux d’instructions Beaucoup de détails à écrire; les erreurs sont légion Beaucoup de variantes; la meilleure est différente pour chaque machine IFT-2035 Stefan Monnier 8 Historique: Langages de haut niveau Langage indépendant de la machine; se rapproche de l’humain Même exemple qu’avant: X +Y • Notation plus familière • Portabilité • Fiabilité Nombre de lignes/jour et bugs/ligne plus ou moins constant • Plus facile à lire • Plus restrictif IFT-2035 Stefan Monnier 9 Une infinité de niveaux Tous les langages de haut niveau ne sont pas nés égaux machine < assembleur < C < Java < anglais < Stefan Le niveau d’abstraction est la distance conceptuelle par rapport au langage machine. Les langages souvent combinent des aspects de niveaux différents, donc il n’y a pas toujours d’ordre clair entre langages. IFT-2035 Stefan Monnier 10 Généalogie impératif 1955 logique concurrent Machine/ Assembly fonctionnel 1955 orienté objet Fortran 1960 Lisp Algol 60 1960 CPL 1965 1965 BCPL Algol 68 1970 Pascal B C Simula 1970 Inter Mac Lisp Lisp Concurrent Pascal Prolog ML Scheme 1975 SASL 1975 CSP 1980 Modula 2 Smalltalk Ada C++ 1990 CLOS Modula 3 Zeta Lisp Common Lisp 1985 Oberon 1980 Miranda Les influents: Standard ML Haskell Ada95Java Fortran, Lisp, Cobol 1985 1990 Dylan 1995 Les pionniers: Algol, Simula, Prolog, ML 1995 ANSI C++ 2000 IFT-2035 2000 Stefan Monnier 11 Programmation impérative: procédurale Fortran, Algol 60, Pascal, C, Ada Même modèle que la machine: séquence d’opérations sur la mémoire La mémoire est composée d’un graphe d’objets Les instructions sont regroupées en procédures Notion implicite d’état omniprésente; effets de bord Facile à traduire en langage machine (compiler ) De nos jours, considéré comme “bas niveau” IFT-2035 Stefan Monnier 12 Programmation impérative: objects Simula, Smalltalk, C++, Java Chaque objet de la mémoire est accompagné de code qui lui permet d’interagir avec les autres objets Les objets sont actifs Les méthodes remplacent les procédures Le flot de contrôle passe d’un objet à l’autre par appel de méthode Plusieurs types d’objets peuvent être utilisés de manière uniforme IFT-2035 Stefan Monnier 13 Programmation fonctionnelle Lisp, ML, Haskell, APL Calcul = fonction au sens mathématique Éviter les effets de bord Pas de destruction, pas de dépendance au temps Facilite l’analyse, le raisonnement Les fonctions peuvent être manipulées comme n’importe quel objet Apprécié pour son élégance IFT-2035 Stefan Monnier 14 Programmation logique Prolog, Mercury, Oz Calcul = recherche d’une preuve logique ou d’une solution Très déclaratif: décrire ce que l’on veut, pas comment l’obtenir Modèle d’exécution très différent: difficile à mélanger On ne peut pas prouver n’importe quoi automatiquement IFT-2035 Stefan Monnier 15 Programmation concurrente CSP, Occam, Ada, Modula-2 Calcul divisé en plusieurs tâches, exécutées simultanément Synchronisation et communication, implicites ou explicites Apporte potentiellement des accélérations importantes Non-déterminisme Beaucoup d’occasions d’introduire des erreurs IFT-2035 Stefan Monnier 16 Plagiat Plagiat IFT-2035 ⇐⇒ Pas bien Stefan Monnier 17 Caractéristiques externes des langages (1) • Sécurité – Le langage incite-t-il à un style de programmation dangereux? – Les erreurs sont elles bien détectées? • Maintenance – Est-il facile de modifier les programmes? • Simplicité conceptuelle – Nombre et régularité des concepts IFT-2035 Stefan Monnier 18 Caractéristiques externes des langages (2) • Degré de spécialization • Niveau d’abstraction – Doit être adapté à la tâche • Puissance expressive – Supporte plusieurs styles de programmation • Support de gros projets – Modularisation, compilation séparée IFT-2035 Stefan Monnier 19 Caractéristiques externes des langages (3) • Environnement – Existe-t-il beaucoup de bons outils? – Et de bons programmeurs? • Performance – Rapide à écrire – Rapide à compiler – Rapide à exécuter • Portabilité – Le langage est-il disponible sur toutes les machines? – Les programmes fonctionneront-ils ailleurs? IFT-2035 Stefan Monnier 20 Implantation Interprétation (aka VM) • Décodage progressif des instructions • Simple, compact, portable, flexible Compilation • Traduction d’un langage dans un autre • Vitesse, standalone, compilation croisée Hybrides IFT-2035 Stefan Monnier 21 Syntaxe et sémantique Syntaxe = représentation du programme Sémantique = sens attaché aux programmes IFT-2035 • if (x == 0) y = 5; if x = 0 then y := 5; (if (= x 0) (set! y 5)) • 6 + 1 / 3 6 + 1 / 3 6 + 1 / 3 =⇒ =⇒ =⇒ 6 6.333̄ 2.333̄ Stefan Monnier 22 Ceci n’est pas un nombre 42 IFT-2035 Stefan Monnier 23 Spécification et implantation Spécification ⇒ syntaxe et sémantique sans implantation Pas de spécification ⇒ pas de bug de l’implantation Une implantation fidèle à la spécification est dite conforme L’implantation a les mains libres quant à la manière de procéder Les spécifications permettent d’offrir des extensions IFT-2035 Stefan Monnier 24 Syntaxe des expressions (1) Préfixe + e1 e2 Fonctions en math Infixe e1 + e2 Opérateurs en math Postfixe e1 e2 + Calculatrices HP Infixe est familière mais plus ambiguë: ? ? a + b ∗ c ≡ a + (b ∗ c) ≡ (a + b) ∗ c ? ? ? ? a − b − c ≡ a − (b − c) ≡ (a − b) − c not x < 0 ≡ (not x) < 0 ≡ not (x < 0) sin a − b IFT-2035 ? ? ? ≡ sin (a − b) ≡ (sin a) − b ≡ (sin a)(−b) Stefan Monnier 25 Syntaxe des expressions (2) • Niveau de précédence: a + b ∗ c ≡ a + (b ∗ c) • Associativité: a − b − c ≡ (a − b) − c C a 15 niveaux! Ils s’associents à gauche. Exceptions: unaires, x?y : z et affectations 1 seule associativité par niveau Il est difficile de mémorizer tous les niveaux IFT-2035 Stefan Monnier 26 Syntaxe abstraite Représentation structurelle, dépouillée des détails de la syntaxe Forme générale: opération op opérandes ou sous-composantes de l’opération Examples: x+1 x*((y+2)/3) if x<y then x:=y+1 + * if-then x 1 x / + y < 3 2 x assign y x + y 1 Pas de parenthèses et autre séparateurs sans importance Point milieu entre syntaxe et sémantique IFT-2035 Stefan Monnier 27 Définition formelle de la syntaxe Tirée des concepts d’informatique théorique Définir une grammaire qui spécifie exactement les programmes syntaxiquement corrects. • Déf: Vocabulaire (Σ) = ensemble de symboles • Déf: Phrase = séquence de symboles tirés de Σ. • Déf: Langage = ensemble de phrases • Déf: Grammaire = régles décrivant précisément le langage Chapitre 2 de Sethi IFT-2035 Stefan Monnier 28 Backus-Naur Form Grammaire en format BNF : ensemble de catégories et de productions avec une catégorie désignée catégorie de départ • Catégorie = nom d’un type de fragment de phrase Ex: hexpressioni, hentieri, htypei • Production = règle de la forme hcati ::= x1 x2 . . . xn où hcati est une catégorie et xi est une catégorie ou un symbole Exemple: IFT-2035 hbini ::= 0 hbini ::= 1 hbini ::= hbini hbini Stefan Monnier 29 Dérivation BNF Déf: Dérivation directe = application d’une règle de production Ex: y1 . . . hcati . . . ym ⇒ y1 . . . x1 . . . xn . . . ym il existe une régle hcati ::= x1 . . . xn Déf: Dérivation = séquence de dérivations directes commence par la catégorie de départ et se termine par une phrase Ex: hbini ⇒ hbini hbini ⇒ hbini 0 ⇒ 1 0 Déf: L(G) = langage défini par la grammaire G L(G) = { IFT-2035 p | hdéparti ⇒ · · · ⇒ p } Stefan Monnier 30 Exemple de BNF hflottanti ::= hentieri . hentieri hentieri ::= hchiffrei hentieri ::= hchiffrei hentieri hchiffrei ::= (0|1|2|3|4|5|6|7|8|9) 1.5 est-il un flottant? hflottanti ⇒ hentieri . hentieri ⇒ hchiffrei . hentieri ⇒ hchiffrei . hchiffrei ⇒ 1 . hchiffrei ⇒ 1 . 5 IFT-2035 Stefan Monnier 31 Arbre de dérivation Arbre capturant la structure syntaxique d’une phrase Représentation compacte d’une dérivation Exemples: 1.5 12.34 <flottant> <flottant> <entier> <entier> <entier> <chiffre> <chiffre> <chiffre> <entier> 1 5 . 1 <chiffre> <entier> . <chiffre> <entier> 3 2 <chiffre> 4 Racine = départ, feuilles = phrase. Presque un ASA IFT-2035 Stefan Monnier 32 Grammaires ambiguës Déf: une grammaire G est ambiguë ssi il existe une phrase dans L(G) qui a plusieurs arbres de dérivation (pas juste plusieurs dérivations) hexpri ::= x hexpri ::= hexpri − hexpri Exemple: x − x − x: <expr> <expr> x <expr> <expr> <expr> x - <expr> <expr> <expr> x x - <expr> <expr> x x Résoudre ou éliminer les ambiguı̈tés en BNF pour l’utiliser dans l’ASA IFT-2035 Stefan Monnier 33 Extended BNF Extension de la syntaxe BNF avec des expressions régulières: x1 |x2 peut-être soit x1 soit x2 (x) groupement [x] parfois noté x? équivalent à ε|x {x} parfois noté x∗ Exemple: hentieri IFT-2035 ::= hchiffrei { hchiffrei } Stefan Monnier 34 Diagramme syntaxique Représentation graphique d’une catégorie d’une grammaire + chiffre flottant chiffre chiffre 0 E chiffre . 1 2 3 4 5 6 7 8 9 IFT-2035 Stefan Monnier 35 Définition d’un langage • Syntaxe – Règles lexicales – Grammaire • Sémantique – Règles de typage (sémantique statique) – Règles d’évaluation (sémantique dynamique) [Char] ⇒ [Lexeme] ⇒ ASA ⇒ AnnotatedASA ⇒ Value IFT-2035 Stefan Monnier 36 Sucre syntaxique Extension syntaxique superficielle Absolument équivalente à une autre syntaxe Gérable lors de la conversion vers l’ASA Pas d’impact sur les propriétés internes du langage IFT-2035 Stefan Monnier 37