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.

Logiciel Libre Cours 3 Fondements: Génie Logiciel

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

Quelques éléments de compilation en C et makefiles

Cours 1 : La compilation

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

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

Optimisation de logiciels de modélisation sur centre de calcul

Une introduction à Java

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

Conventions d écriture et outils de mise au point

Cours Langage C/C++ Programmation modulaire

Machines virtuelles fonctionnelles (suite) Compilation ML Java

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

Programmation système I Les entrées/sorties

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

Bases Java - Eclipse / Netbeans

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Comment installer ocaml sous windows avec ocamlsdl?

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

Projet De Stijl Plate-forme pour robots mobiles

Programmation Objet Java Correction

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

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

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

Cours 1: Java et les objets

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

Initiation à JAVA et à la programmation objet.

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

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

Algorithmique et Programmation, IMA

TP1 : Initiation à Java et Eclipse

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

# 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>

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

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

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

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

Évaluation et implémentation des langages

Le langage C. Séance n 4

TP1. Outils Java Eléments de correction

Manuel de System Monitor

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

Vérification formelle de la plate-forme Java Card

Chapitre VI- La validation de la composition.

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

Programmation Objet - Cours II

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

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

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

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

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

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

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

La programmation orientée objet et le langage C++

Entraînement au concours ACM-ICPC

Programmer en JAVA. par Tama

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

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

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

Systeme d'exploitation

Présentation du PL/SQL

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

Devenez un véritable développeur web en 3 mois!

ERESI : une plate-forme d'analyse binaire au niveau noyau. The ERESI team

Recherche dans un tableau

Mettre en place une infrastructure Web nouvelle génération avec Drupal et Acquia

I. Introduction aux fonctions : les fonctions standards

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Programmation. fonctionnelle, impérative, logique et orientée objet

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Programmation Orientée Objet

WEA Un Gérant d'objets Persistants pour des environnements distribués

Introduction à la Programmation Parallèle: MPI

Cours Programmation Système

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Environnements de développement (intégrés)

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

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

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

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

Introduction au langage C

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Arguments d un programme

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Module.NET 3 Les Assemblys.NET

Tutoriel code::blocks

openarchitectureware & transformation de modèle Yannick Lizzi Architecte Logiciel itemis France Mail: lizzi@itemis.de

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Part IV. Outils de dévéloppement pour le logiciel libre. Logiciel libre, une introduction. Support pour le dévéloppement collaboratif

Java 1.5 : principales nouveautés

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

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

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

Transcription:

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

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

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 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

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

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

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

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

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

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

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

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

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

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

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

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