UP | HOME

Modularité et typage - Présentation du cours

Table of Contents


Module : Élément conçu pour être juxtaposé à d'autres ou combiné avec d'autres, afin de former des ensembles répondant à des besoins spécifiques. (Acad. fr.)


Motivations et objectifs


Panorama rapide


  • 1950' - Assembleur
    • Langage pour programmer les processeurs

      section .data
          helloMsg:     db 'Hello world!',10 
          helloSize:    equ $-helloMsg
      section .text
          global _start
      _start:
          mov eax,4             ; Appel système "write" (sys_write)
          mov ebx,1             ; File descriptor, 1 pour STDOUT (sortie standard)
          mov ecx, helloMsg     ; Adresse de la chaîne a afficher
          mov edx, helloSize    ; Taille de la chaîne
          int 80h               ; Exécution de l'appel système
                                ; Sortie du programme
          mov eax,1             ; Appel système "exit"
          mov ebx,0             ; Code de retour
          int 80h
      

  • 1970' - C (Kernighan et Ritchie @ Bell)
    • Assembleur + abstraction des instructions + abstraction des fonctions
    • Programmation de systèmes (UNIX)

      #include <stdio.h>
      
      int main()
      {
        printf("Hello, world!\n");
      }
      

  • 1980' - C++ (Stroustrup @ Bell)
    • C + abstraction de données (classes)
    • Programmation de systèmes et d'applications

      #include <iostream>
      int main()
      {
        std::cout << "Hello, world!\n";
      }
      

  • 1995' - Java (Gosling @ Sun) | 2000' - C# (Hejlsberg @ Microsoft)
    • C++ + sûreté + machine virtuelle
    • Programmation d'applications pour réseaux (internet) apportant l'interopérabilité, la portabilité et la sécurité

      public class HelloWorld {
        public static void main(String[] args) {
          System.out.println("Hello, world!");
        }
      }
      
      using System;
      class Program
      {
        public static void Main(string[] args)
        {
          Console.WriteLine("Hello, world!");
        }
      }
      

Programmer en Java ?


Oui, plutôt utile !

Question: combien de machines virtuelles ?
  • Million
  • Milliard
  • Billion

Classements des langages de programmation


Quatre versions officielles de Java dédiées à quatre contextes d'utilisation

  • Java Enterprise Edition pour les entreprises : programmes pour les serveurs utilisés dans les systèmes d'information
  • Java Standard pour les postes de travail : certains programmes clients, dits riches, environnements de développement (Eclipse), applettes Java (petites applications s'exécutant dans un navigateur)
  • Java Micro Edition pour les systèmes mobiles, pour l'Internet des objets : programmes embarqués sur des objets physiques (téléphones, etc.) (à distinguer des programmes Java pour Android, qui sont compilés vers une machine virtuelle non Java)
  • Java Card pour les cartes à puces : programmes embarqués sur des cartes bancaires, SIM, etc.

Note : cf. Wikipedia pour plus d'informations.


Pourquoi un tel succès ?


Avantages tirés du langage Java

  • Simplicité des concepts utilisés
  • Grande richesse et stabilité des bibliothèques
  • Relative efficacité (toujours en amélioration)
  • Sûreté : réduction du nombre d'erreurs à l'exécution grâce à la sûreté de typage et à des contrôles réalisés par la machine virtuelle (comme par exemple l'impossibilité d'exploiter une faille de type buffer overflow)

La sûreté en pratique : du Heartbeat au Heartbleed (du battement au saignement)

heartbleed_explanation1.png

Figure 1: Heartbeat (un client s'assure de la présence du serveur)

heartbleed_explanation2.png

Figure 2: Heartbleed (un client récupère des données privées du serveur)

  • Les tableaux en C ou C++ : une suite de valeurs
    • Pas de longueur
    • Bonne pratique pour le programmeur : accompagner le tableau de sa longueur et toujours vérifier que les indices sont dans l'intervalle [0, longueur - 1].
  • Les tableaux en Java : une suite de valeurs et sa longueur
    • Une construction plus abstraite et plus modulaire
    • Une construction plus sûre : la machine virtuelle vérifie automatiquement que les indices sont dans l'intervalle [0, longueur - 1].

Avantages tirés de la machine virtuelle Java

  • Portabilité : la machine virtuelle est implémentée sur un très grand nombre de support.
  • Légèreté : la machine virtuelle peut être implémentée sur un nouveau support sans trop d'efforts.

Machine virtuelle Java : une nouvelle plate-forme d'intégration des programmes, disponible partout et permettant de s'affranchir des infrastructures matérielles (machines et réseaux physiques)

Une tendance actuelle : l'important, c'est la machine virtuelle Java, et son langage appelé le bytecode Java, et non le langage Java lui-même, qui peut être remplacé par d'autres langages traduits ensuite en bytecode Java.

  • Scala

    object HelloWorld extends App {
      println("Hello, world!")
    }
    
  • Groovy

    println "Hello, world!"
    

Leçons tirées du succès de Java

  • Appliquer des principes bien compris et établis
  • Développer la modularité

Objectifs du cours


  • Apprendre à construire ses propres types de données de manière modulaire.
  • Améliorer la compréhension de l'interprétation des programmes.
  • Comprendre et savoir utiliser la bibliothèque standard du langage Java.

Agenda


Organisation de chaque session


Une session = trois séances d'1h15

Pédagogie partiellement inversée

  • Avant la session
    • Préparer le TP mettant en application les concepts du cours précédent.
    • Lire et étudier les documents en ligne du cours suivant.
    • Préparer des questions sur les cours précédent et suivant.
  • Pendant la session
    • Poser des questions sur le cours précédent et la correction du TP.
    • Suivre la présentation du nouveau cours (démos, exposés, ateliers).
    • Poser des questions sur le nouveau cours.

Evaluation

  • Un TP noté (30%)
  • Le test final (70%)

Communication

  • Sur Campus : modularité et typage
    • Forum de discussion : inscription obligatoire
      • Moyen principal de communication
    • Documents pédagogiques : cours, sujets, corrections
  • Rendez-vous avec le responsable du cours
    • Questions sur le cours
    • Questions sur le TP
  • Vive l'entraide !
    • Ne restez pas bloqué. Demandez autour de vous.
    • Vous comprenez. Expliquez aux autres.

Session 1 : mécanismes fondamentaux de la programmation modulaire - 7/X/2016


  • Agrégation et héritage
  • Résolution et liaison
  • Conception et implémentation d'interfaces
  • TP1

Session 2 : méthodes pour factoriser du code - 12/X/2016


  • Architectures en couches
  • Agrégation avec délégation
  • Héritage : approche ascendante et descendante
  • Héritage multiple
  • TP2

Session 3 : architecture et utilisation des patrons de conception - 10/XI/2016


  • Patrons vernaculaires
  • Patrons idiomatiques
  • Conception des patrons de conception
  • TP3

Session 4 : généricité - 16/XI/2016


  • Quantification universelle et existentielle des types
  • TP4

Session 5 : synthèse - 23/XI/2016


  • Bilan des sessions 1 à 4
  • Corrections des TP 1 à 4
  • Types abstraits de données : approche objet contre approche fonctionnelle

Session 6 : test final - 30/XI/2016


  • Test sur machine

Version history: v1: 2016-10-06.
Comments or questions: Send a mail.
The webpage content is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.