Types et langages de programmation Algorithmique et Programmation Unisciel/K.Zampieri 1 Généalogie partielle des langages de programmation FORTRAN ALGOL60 LISP COBOL BASIC ML PL/1 C SIMULA 67 PASCAL SMALLTALK PROLOG ADA C++ MODULA-2 JAVA Plus de 4000 langages 2 Le choix d'un langage n'est pas neutre Y-a-t-il un langage universel? LISP L'assembleur C PASCAL C++ JAVA Delphi 3 Le choix d'un langage n'est pas neutre (2) Un langage facilite la résolution de classes de problèmes : • C : système d'exploitation (Unix/Linux)… • C++ : applications de grande taille… • JAVA, C# : applications de grande taille, web… • LISP : prototypage, systèmes experts… 4 Paradigmes des langages évolués (dits aussi de haut niveau) • Désigner : – Expliciter une entité en la nommant et en lui associant une définition (au moins intuitive) • Typer : – Connaître les propriétés pertinentes d'une entité • Paramétrer : – Traiter un problème plus général que le problème posé – Améliorer la résistance de la solution aux changements – Réutiliser 5 Paradigmes des langages évolués (dits aussi de haut niveau) (1b) • Sérialiser : – Construire des séquences d'actions • Décomposer par cas : – Découper le domaine des données initiales • Itérer : – Introduire un sous-problème intermédiaire paramétré Réduire la complexité d'un problème 6 Les types de programmation Application informatique : Mise en oeuvre des traitements des données et des relations entre les deux. Génération 1 : Programmation Spaghettis : • Assembleur, Fortran I, Basic • Logique de saut « goto ». Absence totale d'entités autonomes et modifiables indépendamment du reste du programme. • Code et données étroitement imbriqués. 7 Les types de programmation (2) Génération 2 : Programmation Structurée : • Pascal, C, Algol, Perl, Python • Expression séparée des données et des traitements. • Modularité : – Données typées. Possibilité de création de types complexes. – Structures de contrôle remplaçant les sauts. – Notion de sous-programmes et compilation séparée (entités autonomes). 8 Les types de programmation (3) Génération 3 : Programmation par Objets : • Simula, SmallTalk, Eiffel, C++, Pascal objet, Java, C# • Modularité qui regroupe les données et les traitements dans une même entité appelée objet. • Les objets peuvent être vus comme des tentatives de simuler une situation réelle (objets « chronomètre », « voiture »). Les objets réels ne sont ni des traitements purs, ni des données pures mais une combinaison des deux. 9 Les types de programmation (4) Programmation Structurée Programmation par Objets Équation de WIRTH Algorithmes + SDD = Programmes Équation de la POO Méthodes + Données = Objets Que doit faire le programme ? Sur quoi porte le programme ? 10 Les types de programmation (5) Programmation Structurée Données Fonctions Hiérarchie des fonctions Données Hiérarchie des données Programmation par Objets Messages Objet Données Hiérarchie des objets 11 Langage de programmation Comment rendre des instructions « sophistiquées » (de l'humain) compréhensibles pour l'ordinateur qui doit les exécuter ? Réponse : En disposant d'un programme capable de transformer une séquence d'instructions de haut niveau (aussi appelée code source) en une séquence d'instructions machine (aussi appelée code objet ou binaire). 12 Langage de programmation (2) Traducteur : programme qui convertit un programme quelconque écrit dans un langage source en un programme écrit dans un langage cible. • Assembleur : traducteur de langage objet • Compilateur : traducteur de langage source évolué Interpréteur : programme qui traduit puis exécute un programme quelconque écrit dans un langage source. Langage de programmation : instructions et données de plus haut niveau que le traducteur est capable de traiter. 13 Langage de programmation : résumé Un langage de programmation est • un moyen formel permettant de • décrire des traitements (i.e. des tâches à effectuer) sous • la forme de programmes (i.e. de séquences d'instructions et de données de « haut niveau », c.à.d. compréhensibles par le programmeur) pour lesquels il existe • un traducteur pour en permettre • l'exécution effective par un ordinateur. 14 Compilateur Compilateur (ou assembleur) : • Traduit une seule fois les programmes dans leur ensemble : tout le programme est fourni au compilateur pour la traduction et son résultat (code objet) peut être soumis au processeur pour traitement. • Un langage de programmation pour lequel un compilateur est disponible est appelé un langage compilé. 15 Langage compilé Compilateur Assembleur Editeur de liens Chargeur 0x8048470 0x8048471 0x8048473 0x8048478 0x8048480 0x8048481 0x8048481 Programme source Programme cible push %ebp movl %esp, %ebp pushl $0x80484dc call 0x80483bc <printf> addl $0x4, %esp leave ret Code machine $ emacs monProg.cpp $ gcc monProg.cpp –o monProg $ ./monProg 16 Interpréteur Interpréteur : • Traduit les programmes instruction par instruction et soumet chaque instruction traduite au processeur pour exécution. • Un langage de programmation pour lequel un interpréteur est disponible est appelé un langage interprété. 17 Langage interprété Interpréteur 0x8048470 0x8048471 0x8048473 0x8048478 0x8048480 0x8048481 0x8048481 Programme source push %ebp movl %esp, %ebp pushl $0x80484dc call 0x80483bc <printf> addl $0x4, %esp leave ret Code machine $ emacs monProg.l $ lisp monProg.l 18 Interpréteur v.s. Compilateur Un langage interprété est adapté pour le développement rapide et le prototypage : • Cycle de test plus court qu'avec les langages compilés. • Souvent possible de modifier/rectifier le programme en cours d'exécution (test). • Langages offrant une plus grande liberté d'écriture. 19 Interpréteur v.s. Compilateur (2) Un langage compilé est préférable pour la réalisation d'applications efficaces et/ou de grande envergure : • Programme plus efficace : le compilateur peut effectuer des optimisations plus facilement que l'interpréteur (puisqu'il possède une visibilité globale sur le programme) • Traduction une unique fois. • Meilleure détection des erreurs : structuration plus rigoureuse et typage. • Protection de la propriété intellectuelle : la compilation permet de diffuser les programmes sous forme binaire sans en imposer sa diffusion sous forme lisible. 20 Interpréteur v.s. Compilateur (3) Langages compilés, interprétés, semi-compilés : • Certains langages (LISP par exemple) peuvent être indifféremment interprété ou compilé ; d'autres ne sont que compilé jamais interprété (C, C++, Pascal, ADA) ; certains ne sont qu'interprété (Prolog). • Certains sont semi-compilés (par exemple Java, V-Pascal) : ils sont compilés en langage de type « assembleur » (byte-code) puis traitée par une « machine virtuelle » qui interprète le byte-code [l'idée sous-jacente est de rendre le programme indépendant de la plateforme]. 21 Compilation • • • • • Analyse lexicale Analyse syntaxique Analyse sémantique Génération de code Optimisation 1. 2. 3. position := initiale + vitesse * 60 := position + initiale * vitesse 60 empiler adresse de position empiler valeur de initiale empiler valeur de vitesse empiler 60 * + := 22 Compilation (2) Note : Les aspects syntaxiques (règles d'écriture des programmes) et sémantiques (définition des instructions) d'un langage de programmation sont spécifiés de manière précise dans un manuel de référence. • Compilation : analyse syntaxique et traduction en binaire. • Édition des liens : production du fichier exécutable. 23