Modularité et typage - Présentation du cours
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.)
Table of Contents
- Motivations et objectifs
- Agenda
- Organisation de chaque session
- Session 1 : mécanismes fondamentaux de la programmation modulaire - 1/X/2015
- Session 2 : méthodes pour factoriser du code - 8/X/2015
- Session 3 : architecture et utilisation des patrons de conception - 18/XI/2015
- Session 4 : généricité - 19/XI/2015
- Session 5 : synthèse - 26/XI/2015
- Session 6 : test final - 03/XII/2015
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
- Langage pour programmer les processeurs
- 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 !
Classements des langages de programmation
- Tiobe Index
- RedMonk Programming Language Rankings
- PYPL PopularitY of Programming Language index
- Language Popularity Index
- Trendy Skills
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)
Heartbeat (un client s'assure de la présence du serveur)
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
- Forum de discussion : inscription obligatoire
- 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 - 1/X/2015
- Agrégation et héritage
- Résolution et liaison
- Conception et implémentation d'interfaces
- TP1 : les entiers naturels
Session 2 : méthodes pour factoriser du code - 8/X/2015
- Architectures en couches
- Agrégation avec délégation
- Héritage : approche ascendante et descendante
- Héritage multiple
- TP2 : les entiers naturels et relatifs
Session 3 : architecture et utilisation des patrons de conception - 18/XI/2015
- Patrons vernaculaires
- Patrons idiomatiques
- Conception des patrons de conception
- TP3 : évolution des TP1 et TP2
Session 4 : généricité - 19/XI/2015
- Quantification universelle et existentielle des types
- TP4 : structures algébriques
Session 5 : synthèse - 26/XI/2015
- Bilan des sessions 1 à 4
- Corrections des TP 1 à 4
- Types abstraits de données : approche objet contre approche fonctionnelle
Session 6 : test final - 03/XII/2015
- Test sur machine