Compilation séparée. Compilation séparée. ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 1



Documents pareils
Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

modules & compilation

Cours de Programmation 2

Classes et Objets en Ocaml.

Cours 1 : La compilation

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Logiciel Libre Cours 3 Fondements: Génie Logiciel

Quelques éléments de compilation en C et makefiles

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Une introduction à Java

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Algorithmique I. Algorithmique I p.1/??

Compression de Données - Algorithme de Huffman Document de Conception

Conventions d écriture et outils de mise au point

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Vérification formelle de la plate-forme Java Card

Optimisation de logiciels de modélisation sur centre de calcul

UE C avancé cours 1: introduction et révisions

Programmation système I Les entrées/sorties

Chapitre VI- La validation de la composition.

Évaluation et implémentation des langages

Héritage presque multiple en Java (1/2)

Objets et Programmation. origine des langages orientés-objet

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Recherche dans un tableau

Cours d initiation à la programmation en C++ Johann Cuenin

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Manuel de System Monitor

STAGE IREM 0- Premiers pas en Python

Entraînement au concours ACM-ICPC

IFT3030 Base de données. Chapitre 2 Architecture d une base de données

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours Langage C/C++ Programmation modulaire

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Bases de programmation. Cours 5. Structurer les données

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Chapitre VIII. Les bases de données. Orientées Objet. Motivation

Présentation du PL/SQL

Comment installer ocaml sous windows avec ocamlsdl?

Initiation à JAVA et à la programmation objet.

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

PG208, Projet n 3 : Serveur HTTP évolué

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

Algorithmique, Structures de données et langage C

Alexandre Buge Epitech 5 Promo Soutenance de stage du 01/03/2004 au 31/08/2004

TP1. Outils Java Eléments de correction

Sage 100 CRM - Guide de la Fusion Avancée Version 8. Mise à jour : 2015 version 8

TP1 : Initiation à Java et Eclipse

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Initiation. àl algorithmique et à la programmation. en C

Génie Logiciel avec Ada. 4 février 2013

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Cours 1: Java et les objets

Bases Java - Eclipse / Netbeans

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Module.NET 3 Les Assemblys.NET

Analyse de sécurité de logiciels système par typage statique

Python - introduction à la programmation et calcul scientifique

Travaux Dirigés n 1 : chaînes de caractères

Le langage C. Séance n 4

SSTIC Désobfuscation automatique de binaires. Alexandre Gazet. Yoann Guillot. Et autres idyles bucoliques...

Utilisation d objets : String et ArrayList

TP3 : Manipulation et implantation de systèmes de fichiers 1

Mon premier rpm. 7 juin Avant de commencer RPM URPMI RPMBUILD... 2

Algorithmique et Programmation, IMA

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

UE Programmation Impérative Licence 2ème Année

Organiser le disque dur Dossiers Fichiers

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Projet De Stijl Plate-forme pour robots mobiles

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Programmation Objet Java Correction

Outils pour les réseaux de neurones et contenu du CD-Rom

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Programmes des classes préparatoires aux Grandes Ecoles

I. Introduction aux fonctions : les fonctions standards

Introduction à Microsoft InfoPath 2010

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Programmer en JAVA. par Tama

GUIDE Excel (version débutante) Version 2013

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Présentation du langage et premières fonctions

Découverte du logiciel ordinateur TI-n spire / TI-n spire CAS

FileMaker Server 12. publication Web personnalisée avec XML

Information utiles. webpage : Google+ : digiusto/

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Transcription:

Compilation séparée Compilation séparée ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 1

Compilation séparée Modularité GCC : 4 millions de lignes de code Noyau Linux : 12 millions de lignes de code besoin de partage des tâches entre développeurs On sépare les différentes composantes d un logiciel dans des modules Chaque module possède une interface qui indique quelles sont les fonctionnalités qu il propose En dehors du module, seul ce qui est déclaré dans l interface peut être utilisé (boîte noire) ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 2

Compilation séparée Interface Contrat qui indique les fonctionnalités fournies par un module : définition de types (éventuellement abstraits) prototypes de fonctions Les modules extérieurs utilisent ces types et ces fonctions, et uniquement ceux-là, pour pouvoir utiliser le module. ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 3

Compilation séparée Compilation séparée Chaque module peut être compilé indépendamment des autres modules puisque seule leurs interfaces l intéresse il n est donc pas nécessaire de tout recompiler à chaque modification ni d attendre qu un module soit complètement implémenté pour compiler un autre Une fois chaque module compilé, l éditeur de liens (linker) se charge de «coller» les morceaux les uns avec les autres. Éventuellement, l éditeur de lien peut combiner des programmes écrits dans différents langages ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 4

Compilation séparée Interfaces en C En C, il n y a pas de mécanisme spécifique pour les interfaces. Néanmoins, la pratique standard est la suivante : l interface est écrite dans un fichier truc.h elle contient des prototypes de fonctions des définitions de type (éventuellement abstraite) typedef struct foo* t; int bidule(char, t); le contenu du module est écrit dans un fichier truc.c il inclut l interface (#include "truc.h") il définit le corps des fonctions et les types restés abstraits dans l interface struct foo {... }; int bidule(char c, t bar) {... } un autre module qui a besoin de truc a uniquement besoin d inclure l interface (#include "truc.h") ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 5

Compilation séparée Interfaces en OCaml Pour un module truc.ml l interface est définie dans un fichier truc.mli compilée ensuite en truc.cmi. Elle contient : des définitions de type (éventuellement abstraits) type s = A B of int type t des prototypes de fonctions val bidule : char -> t -> int L implémentation truc.ml doit déclarer des types concrets et des fonctions dont le type est plus général que celui de l interface. Un autre module qui a besoin de truc peut soit donner explicitement le nom du module (ex : Truc.bidule) ou soit ouvrir le module avant utilisation (open Truc). ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 6

Compilation séparée Chaîne de compilation Module foo code source compilateur Module foo code objet Module bar code source compilateur Module bar code objet éditeur de liens exécutable ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 7

Compilation séparée Chaîne de compilation : C source foo.c code objet foo.o (code natif) gcc -Wall -ansi -c foo.c code objets foo.o bar.o exécutable prog gcc -Wall -ansi -o prog foo.o bar.o Il doit y avoir une et une seule fonction main dans l ensemble des modules, qui est appelée au lancement de l exécutable ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 8

Compilation séparée Chaîne de compilation : OCaml source foo.ml code objet foo.cmo (bytecode) ocamlc -c foo.ml code objets foo.cmo bar.cmo exécutable prog ocamlc -o prog foo.cmo bar.cmo Toutes les phrases des modules sont exécutées, l ordre des modules lors de l édition de lien est important Il existe également pour la plupart des architectures une compilation vers du code natif, plus performant : ocamlopt -c foo.ml ocamlopt -o prog foo.cmx bar.cmx ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 9

Compilation séparée Exemple Affichage en base 2 et piles ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 10

Compilation séparée Dépendances Un module dépend de son implémentation, mais également des interfaces des modules qu il utilise si celles-ci changent, il faut le recompiler Par contre, il ne dépend pas de l implémentation des modules qu il utilise même si celle-ci change, il n est pas nécessaire de le recompiler Il peut être difficile de savoir quel fichier a besoin d être recompilé après un changement Utilisation d un Makefile pour gérer automatiquement les dépendances ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 11

Compilation séparée Makefile Un fichier Makefile est une suite de règles cible: dependance1 dependance2... dependancen commande_pour_creer_cible (attention, tabulation au début de la deuxième ligne) cible : fichier à créer dependancei : fichiers dont cible dépend commande_pour_creer_cible : optionnel peut utiliser les raccourcis suivants : $@ nom de la cible $^ dépendances $< première dépendance ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 12

Compilation séparée Utilisation d un Makefile Quand on appelle make cible dans le shell, on vérifie récursivement que les dépendances n ont pas besoin d être recompilées, puis on appelle commande_pour_creer_cible si une des dépendances est plus récente que cible (ou si cible n existe pas). Si make est appelé sans argument, utilise la première règle. Convention : première règle all: executable1 executable2 sans commande de production (pas de création de all, donc règle toujours active) ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 13

Compilation séparée Règle avec filtrage %.o: %.c gcc -Wall -ansi -c $< Attention, spécifique GNU make, sinon :.SUFFIXES:.c.o.c.o: gcc -Wall -ansi -c $< ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 14

Compilation séparée Variables CC=gcc -Wall -ansi %.o: %.c $(CC) -c $< OBJ=dep1.o dep2.o prog: $(OBJ) $(CC) -o $@ $^ ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 15

Compilation séparée Pour OCaml Penser à compiler les interfaces : %.cmo: %.ml ocamlc -c $< %.cmi: %.mli ocamlc -c $< base_2.cmo: pile.cmi pile.cmo: pile.cmi Outil ocamldep pour générer automatiquement les dépendances ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 16

Modularité Modularité ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 17

Modularité Permet : séparation des tâches création d un espace de nom réutilisabilité (par exemple, bibliothèques) encapsulation abstraction (en particulier des types) maintenabilité ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 18

Modularité Séparation des tâches Chaque module peut être implémenté par un développeur différent Le seul point sur lequel ils doivent s entendre est l interface des modules (et la sémantique des fonctions...) ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 19

Modularité Création d un espace de nom Dans certains langages, chaque module crée un nouvel espace de nom : On peut donner le même nom de fonction dans des modules différents ex. en OCaml : List.length Array.length String.length Pour accèder à un fonction, on utilise son nom complet ex. en OCaml : Nom_du_module.nom_de_la_fonction En général, on peut ouvrir les modules pour accèder aux fonctions qu il contient sans avoir à rappeler le nom du module ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 20

Modularité Ex. en OCaml : open String open Array let comp l a = List.length l < length a (* val comp : a list -> b array -> bool = <fun> *) ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 21

Modularité Aparté : surcharge VS polymorphisme surcharge : même nom de fonction pour deux algorithmes différents Exemple : + en C sur les int et les double polymorphisme : fonction générique qui peut s appliquer à n importe quel type de données Exemple : fun x -> x en OCaml ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 22

Modularité Réutilisabilité Chaque module est indépendant, il peut donc être réutilisé dans un autre projet sans avoir à tout reprendre. Ex. : Structure de donnée pour stocker des chaînes de caractères Permet de ne pas réinventer la roue On peut regrouper des modules pour créer des bibliothèques En particulier, on dispose en général pour chaque langage d une bibliothèque standard pour C, définie dans le standard C ANSI, implémentée par exemple par la GNU C Library en OCaml, bibliothèque standard fournie avec le langage (List, Array, String, Map, Set,...) ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 23

Modularité Encapsulation Seules les fonctions déclarées dans l interface permettent d accéder aux objets Le développeur n a pas à se soucier d objets mal formés créés à l extérieur du module Permet de maintenir des invariants (via des constructeurs intelligents par exemple) ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 24

Modularité Abstraction Les structures de données utilisées pour implémenter tel ou tel objet peuvent rester abstraites définition de type abstrait dans l interface En C : typedef struct contenu_type* type_abstrait dans le.h la structure struct contenu_type n est pas définie dans l interface, elle n est donc pas visible de l extérieur En OCaml : type type_abstrait dans le.mli Pas besoin de connaître l implémentation concrète depuis l extérieur ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 25

Modularité Maintenabilité Permet de pouvoir changer l implémentation concrète sans avoir à changer tout le code Exemple : utilisation de tableaux au lieu de listes pour implémenter des piles Exemple : changement du tri par bulle (complexité O(n 2 )) en tri fusion (O(n log n)) Invisible depuis les autres modules ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 26

Modularité Extensions Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs) généricité modules de première classe : peuvent être manipulés comme des valeurs du langage ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 27

Dictionnaire Dictionnaire ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 28

Dictionnaire Spécifications algébriques Types abstraits Au moment de la conception du programme, on est amené à définir des types abstraits en spécifiant quelles propriétés ils doivent vérifier Le développeur du type devra respecter ces propriétés, mais sera libre de l implémentation concrète L utilisateur pourra supposer que les propriétés sont vérifiées pour son code ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 29

Dictionnaire Spécifications algébriques Spécifications algébriques Les spécifications algébriques sont une des manières de procéder ainsi. Elles contiennent les prototypes des fonctions manipulant le type abstrait des équations mettant en relation ces fonctions, expliquant ainsi les propriétés qu elles doivent vérifier ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 30

Dictionnaire Spécifications algébriques De la spécification algébrique à l implémentation prototypes interface d un module comment vérifier que l implémentation vérifie les propriétés? test à la main génération de tests exhaustivité? certification (preuve) à la main formelle (interactive ou automatique) ± facile suivant le langage ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 31

Dictionnaire Définition Dictionnaire Exemple concret : les dictionnaires (aussi appelés tableaux associatifs ou tables d association) On veut associer des clefs k Key à des valeurs v Val Il est possible de créer un dictionnaire vide d insérer une nouvelle association de rechercher à quelle valeur est associée une clef de supprimer une association En général, Key est supposé totalement ordonné. Dans la suite, on supposera qu à une clef n est associée qu une seule valeur au maximum (le dictionnaire est une fonction au sens mathématique) ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 32

Dictionnaire Définition Exemples d utilisation Omniprésent en informatique : Table des symboles dans un compilateur Key= symboles, Val= informations (type, visibilité,...) Système de fichier Key= chemins, Val= emplacements disque Mémoïsation Key= arguments, Val= résultats Moteur de recherche Key= mots-clefs, Val= pages associées Représentation d un ensemble Key= élément, Val= {est_dedans}... ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 33

Dictionnaire Définition Spécification algébrique d un dictionnaire type ( k, v) dict creer : int -> dict inserer : dict -> k -> v -> dict rechercher : dict -> k -> ( v ERR) supprimer : dict -> k -> (dict ERR) rechercher(creer(i), k) = ERR rechercher(inserer(d,k,v),k) = v rechercher(inserer(d,k,v),k ) = rechercher(d,k ) rechercher(supprimer(d,k),k) = ERR rechercher(supprimer(d,k),k ) = rechercher(d,k ) k k k k ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 34

Dictionnaire Définition Interface : C typedef int key; typedef char* value; typedef struct dict_base *dict; dict creer(int); value rechercher(dict, key); dict inserer(dict, key, value); dict supprimer(dict, key); ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 35

Dictionnaire Définition Interface : OCaml type ( key, value) dict val creer : int -> ( key, value) dict val rechercher : ( key, value) dict -> key -> value val inserer : ( key, value) dict -> key -> value -> ( key, value) dict val supprimer : ( key, value) dict -> key -> ( key, value) dict ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 36

Dictionnaire Définition Implémentations Dans ce cours, trois implémentations listes d association arbres bien équilibrés table de hachage Comparaison de la complexité en temps de chacune des fonctions en moyenne dans le pire des cas ENSIIE: Programmation avancée, Compilation séparée, Modularité, Spécifications algébriques 37