Abder Alikacem Semaines 1-4 Synthèse Programme de baccalauréat en informatique Algorithmique et programmation IFT-17582 Abder Alikacem Semaines 1-4 Synthèse Édition septembre 2006 Département d’informatique et de génie logiciel
Synthèse Exemples de problèmes algorithmiques Techniques de conception d’algorithmes Rappel des principes méthodologique Qualité d’un programme et cycle de vie
Problèmes On est intéressé par les problèmes algorithmiques seulement: Qui doivent pouvoir se résoudre sur un ordinateur:Par exemple le problème de trouver une juste sentence pour une personne reconnue coupable d'un délit fait appel à des considérations culturelles et philosophiques et ne peut donc pas être résolu par un ordinateur. L'ensemble des solutions correctes doit être non ambiguë: Par exemple la traduction d'un texte de l'anglais au français peut être réalisée par un ordinateur mais il n'est pas clair ce que l'on doit considérer comme une traduction correcte. Un problème algorithmique est défini par la description: De l'ensemble fini des entrées possibles. D'un ensemble de résultats corrects.
Exemples de problèmes algorithmiques Multiplication (problème d'évaluation): Entrée: Deux entiers x et y Sortie: Le produit de x par y Test de primalité (problème de décision): Entrée: Un entier positif n Sortie: VRAI si n est premier, FAUX sinon. Problème du commis voyageur (problème d'optimisation): Entrée: Un graphe pondéré (représentation en mémoire d’une carte routière) Sortie: Un chemin de longueur minimal
Le choix de l'algorithme L'analyse d'un algorithme se fait selon les critères suivants: Rectitude Complexité (temps d'exécution, espace mémoire, etc.) Optimiser temps de calcul ou/et mémoire. Pourquoi ne pas optimiser quand on le peut ? Comment le faire bien ? Facilité de maintenance Nous nous intéresserons principalement aux deux premiers critères.
Techniques de conception d'algorithmes (1) Algorithmes voraces (ou gloutons) Méthode simple pour des problèmes d'optimisation après avoir effectué une série de choix. Pour chaque point de décision, le choix qui est effectué est celui qui semble le meilleur à cet instant. Cette stratégie heuristique ne produit pas toujours une solution optimale, mais y parvient parfois. On veut obtenir la somme de 2.65 $ avec un nombre minimum de pièces de 1$, 25c, 10c et 5c On prend 2 pièces de 1$, 2 pièces de 25c, 1 pièce de 10c et 1 pièce de 5c Exemples d'applications: Chemin le plus court dans un graphe Méthodes de compression de données Programmation des jeux vidéo
Techniques de conception d'algorithmes (2) Algorithmes diviser-pour-régner On divise le problème en plusieurs sous problèmes et on combine les solutions pour obtenir la solution au problème initial. Exemples d'applications: Méthodes de tri: tri par fusion et le Quicksort
Techniques de conception d'algorithmes (3) Programmation dynamique Utilisé lorsqu'une solution récursive est inefficace parce que beaucoup d'appels identiques sont effectués. Exemples d'applications: Calcul des nombres de Fibonacci Triangle de Pascal
Techniques de conception d'algorithmes (4) Algorithmes probabilistes L'algorithme a accès à un générateur de nombres aléatoires. Exemples d'applications: Problèmes d'approximation
Techniques de conception d'algorithmes (5) Autres… L’approche descendante. Le retour arrière (backtraking) Algorithmes génétiques
Algorithme, programme et ordinateur Lab#4 Problème Transcription (?) Description formelle (?) Programme Langage de programmation Compilation Exécution (?) Ordinateur Solution Langage machine (?)
Qu’est-ce qu’un ordinateur Machine à traiter de l’information. Machine à calculer. Machine à contrôler des processus (automates, etc.).
1 ordinateur, 2 couches importantes Le matériel: le processeur; la mémoire; les cartes; etc… Le logiciel: le système d’exploitation; les programmes en général Lecture dans les notes de cours: sections 1.2 et 1.3
Qu'est-ce que la programmation ? Pourquoi? Faire exécuter des tâches à l’ordinateur Comment? Écrire un programme Traduire ce programme en langage machine Exécuter ce programme
Qu’est-ce qu’un programme? Données (résultat) en sortie Données en entrée
Qu’est-ce qu’un programme? Données int x, y; y = x + 1; Interface int x, y; =, +, -, ++, --, *, /, ...
Qu’est-ce qu’un programme?
Les langages de programmation: Vocabulaire, syntaxe et sémantique Vocabulaire: ensemble des symboles/termes utilisables pour construire des expressions Syntaxe: ensemble des règles définissant la bonne construction des expressions Sémantique: ensemble des règles permettant d'associer un sens à une expression (signification d’une expression)
Les langages de programmation Chaque langage de programmation est défini formellement ( BNF? ) par: Un alphabet: un ensemble de symboles élémentaires. Des noms ou identificateurs: groupes de symboles de l’alphabet. Des phrases ( instructions? ): séquences de noms et de symboles de ponctuation qui respectent les aspects syntaxique et sémantique du langage. Vocabulaire (mots réservés?) Syntaxe et sémantique
Les langages de programmation Dans un programme, on retrouve plusieurs types d’instructions (des primitives?): entrées/sorties; arithmétiques; instructions de branchement; stockage de données. La majorité de ces opérations pourront être réalisées en utilisant des instructions de base d’un langage de programmation (abstraction?).
Paradigmes de programmation Ces paradigmes représentent des approches différentes pour construire des solutions aux problèmes. Plus que des paradigmes de programmation, on pourrait parler des paradigmes de développement de logiciel.
Paradigmes de programmation Paradigme fonctionnel ou applicatif est entièrement fondé sur l'évaluation d'expressions satisfaisant la propriété : la valeur d'une expression ne dépend que des valeurs des sous-expressions et de l'opération qui les combine. Ce style conduit souvent à des programmes concis, faciles à comprendre et efficaces. Fondements Notion de fonction Concept de la récursivité Paradigme de programmation » langage de programmation Langages fonctionnels: Scheme, Miranda, ML, CamL, Lisp…
Paradigmes de programmation Paradigme procédural ou impératif est fondé sur la transformation de la mémoire, au moyen d'instructions et, notamment, de l'affectation. Il est basé sur le modèle de machine de von Neumann ( ? ). Le processus de programmation est défini comme le développement d’une séquence de commandes qui manipulent des données pour produire le résultat souhaité. C’est- à- dire, on doit trouver l’algorithme donnant solution au problème et, ensuite, il doit être exprimé comme une séquence de commandes. Fondements Notion de variable Instruction d’affectation Paradigme de programmation » langage de programmation Langages procéduraux: Pascal, Fortran, C, Ada, …
Paradigmes de programmation Paradigme objet est basé sur une programmation orienté données. Fondements Objet, classe, instance, encapsulation, héritage, agrégation, polymorphisme et réutilisation. Exemple: une liste de noms. Le paradigme procédural: liste = collection de données. Toute procédure doit être capable d’exécuter le traitement demandé. La procédure est séparée des données. Le paradigme orienté objets: la liste = un objet composé par la liste elle-même + une collection de procédures capables de la manipuler. Les procédures font partie de l’objet. Paradigme de programmation » langage de programmation Langages orientés objets: SmallTalk, C++, Java..
Les langages de programmation De plus, ils sont classifiés selon : – Niveau d'abstraction = capacité de nommer et de traiter comme un tout des entités complexes sans avoir besoin d'en spécifier les détails inutiles – Famille = évolution d'un langage au cours du temps – Spécificité = capacité à résoudre toute une classe de problèmes ou un seul type de problème.
Les langages de programmation et les niveaux d’abstraction Haut niveau = proche des problèmes – Fortran, Lisp, Pascal, Java, C ++ , C, Ada, etc … Bas niveau = proche des dispositifs de calcul – langage-machine, assembleur, de commande, etc …
Les langages de programmation et les familles de langages Fortran I ® II ® IV ® 77 ® 90 ® Fortran XX … Algol ® Algol 60 ® Algol 68 ® Pascal ... Java ® Java 1.0 ® Java 1.5 ® Java 1.5.0 ® ...
Les langages de programmation et leur spécificité Les langages "système" (de très bas niveau) Le langage machine: le seul langage de programmation compris directement par un ordinateur. Consiste en un ensemble d'instructions écrites en binaire. L’assembleur: ressemble énormément au langage machine a l'exception que les instructions sont représentées par des "mnémoniques" (généralement des mots de 3 lettres). Bien que difficiles à lire pour un être humain, ces 2 langages peuvent être utiles lorsque l'on désire optimiser nos programmes.
Les langages de programmation et leur spécificité Langages « scientifiques » FORTRAN (FORmula TRANslator): Langage très utilisé dans le milieu scientifique car très optimisé pour les calculs complexes. PASCAL: Langage procédural qui ressemble énormément au C, bien que plus âgé et un peu moins puissant. A été utilisé pendant longtemps pour l'enseignement de la programmation structurée.
Les langages de programmation et leur spécificité Langages "scientifiques » Modula-2: descendant de PASCAL auquel on a effectué quelques ajouts. ADA: langage de programmation développé par le Département de la défense Américain. Surtout orienté sur le développement d'applications temps-réel et la simulation. C: développé dans le but de réaliser un système d'exploitation (UNIX). Devenu très populaire à cause de sa plus grande force qui est à la fois sa plus grande faiblesse: il est possible de faire à peu près n'importe quoi avec ce langage!
Les langages de programmation et leur spécificité Langages de gestion Cobol: Probablement le langage de gestion le plus populaire. La gestion des fichiers y était grandement optimisé, ce qui a fait du Cobol un langage idéal pour la gestion. PL/I: Un autre langage destiné aux applications de gestion. N'a par contre jamais été beaucoup utilisé, n'était distribué qu'avec les ordinateurs mainframe d'IBM.
Les langages de programmation et leur spécificité Les langages d'Intelligence Artificielle LISP (LISt Processing): langage conçu pour la manipulation d'expressions symboliques. PROLOG (PROgrammation LOGique): semblable au LISP, on y a cependant ajouté un moteur d'inférence (une mécanique permettant de faire des déductions).
Les compilateurs Qu'est-ce qu'un compilateur ? (interpréteur?) int main(void) { int a; int b; int c; c = a + b; return 0; } 00100010010101 01100100011101 11011101000110 00110111011000 01110011010100 10110111101011 11101101000010 11101011000101 01110101000100 compilateur Correspondance en langage machine Fichier source
Les compilateurs Le rôle d ’un compilateur Un compilateur donné est toujours spécifique au processeur pour lequel il a été conçu. Par contre, si l'on suit bien les standards établis pour les langages de programmation que l'on utilise, les compilateurs de plusieurs processeurs différents seront en mesure de comprendre nos programmes et de générer le code machine correspondant.
Les compilateurs La portabilité d’un programme
Les compilateurs La portabilité d’un programme Certains des problèmes liés à la portabilité disparaissent avec une standardisation du langage, le plus souvent menée à bien par deux organisations: ANSI et ISO Organization. Cependant, des fabricants du compilateur ajoutent des “extensions” au langage qui le rendent incompatible avec certains environnements de programmation.
Programme en langage "machine" Compilation vs Interprétation Interpréteur Programme Processeur Programme en langage "machine" Compilateur
Compilation vs Interprétation Programme Interprété (VB, PHP, Java ...) Plus lent On passe toujours par l'interpréteur (lourd) Programme Compilé (C, Pascal ...) Plus rapide 1 compilation pour N exécutions Autonomie vis à vis du langage d'origine Code exécutable non portable
Principes méthodologiques Abstraire Retarder le plus longtemps possible l'instant du codage Décomposer "...diviser chacune des difficultés que j'examinerais en autant de parties qu'il se pourrait et qu'il serait requis pour les mieux résoudre." Descartes Combiner Résoudre le problème par combinaison d'abstractions Mais aussi : Vérifier, modulariser, réutiliser...
Ne pas se laisser aveugler par l'objectif final : Principes méthodologiques Spécification Résolution Codage Problème Enoncé Algorithme Programme Ne pas se laisser aveugler par l'objectif final : le codage !
Critères de qualité des programmes Lisibles Fiables Maintenables Réutilisables Portables Corrects (preuve) Efficaces (complexité) Contraintes "économiques" : Exécution la plus courte possible Espace mémoire nécessaire le plus petit possible...
Cycle de vie d'un programme (1) Analyse + spécification Maintenance Conception Un processus itératif Vérification Codification Analyse + spécification Définir clairement le problème Recenser les données Dégager les grandes fonctionnalités Conception Décrire et représenter les données Concevoir l'algorithme en pseudo-code Codification Traduire l'algorithme dans un langage de programmation
Cycle de vie d'un programme (2) Analyse + spécification Maintenance Conception Un processus itératif Vérification Codification Vérification (test & mise au point) Utiliser le programme avec des entrées spécifiques Utiliser un outil de mise au point Maintenance Adapter le programme existant pour de nouvelles fonctionnalités et/ou pour corriger les erreurs Une documentation doit être associée à chaque étape
Raisons d'être des méthodes de programmation Augmentation de la taille et de la complexité des logiciels Travail en équipe Capacité de l'être humain à s'occuper de problèmes simultanément ( 5 à 9 problèmes) Nécessité de construire des programmes corrects, vérifiables et modifiables Conséquences humaines, économiques... de plus en plus coûteuses => Méthodologie de conception des programmes Garder la maîtrise de la conception du logiciel Canaliser la créativité