CER SCHMITT Mathieu Mondial Dev Offshore Objectifs : - Comprendre le fonctionnement de l’algorithme Comprendre le principe de l’offshore Savoir réaliser un mémento sur l’algorithmique Savoir qu’il y a différents types de séquence d’algo et connaitre les différents types de contrôle en fonction des séquences. Définitions des mots-clés Offshore : L’offshoring désigne la délocalisation des activités de service ou de production de certaines entreprises vers des pays à bas salaire. Ces délocalisations ont surtout pour but d’assurer des services tels que la maintenance d’applications informatiques, les centres d'appel, la gestion, l’achat, etc. Dans le domaine de la finance et de la gestion d'entreprise, le terme offshore est utilisé pour désigner la création d'une entité juridique dans un autre pays que celui où se déroule l'activité, afin d'optimiser la fiscalité (paradis fiscal) ou la gestion financière des capitaux ou, plus récemment, des activités de service (achat, développement informatique : offshore developpement, etc.), voire de production. À ce titre, l'offshoring se distingue de moins en moins de la délocalisation. Selon une récente étude du cabinet Pierre Audoin Conseil, près de 3% de la sous-traitance informatique française sera réalisée en mode "offshore" en Inde ou dans les pays d´Europe de l´Est à l´horizon 2004. Convaincus par ce modèle nous avons sélectionné et regrouper des acteurs de l’offshore programming sur ce portail. Filiale : Une filiale est une entreprise dont le capital a été formé pour plus de sa moitié du capital par des apports d’une autre société dite société mère, qui en assure généralement la direction, l’administration et le contrôle par l’intermédiaire d’une ou plusieurs personnes, administrateurs ou gérants qu’elle a désignés. Elle constitue une entité morale distincte de la maison mère sur le plan juridique. Codage de module : De façon générale un codage permet de passer d'une représentation des données vers une autre. Le codage de module doit donc montrer la manière d’organiser les modules afin de les traduires en Algorithme. SADT : SADT (en anglais Structured Analysis and Design Technique) - est une méthode d'origine américaine, développée par Softech par Doug Ross en 1977 puis introduite en Europe à partir de 1982 par Michel Galiner elle se répandit vers la fin des années 1980 comme l'un des standard de description graphique d'un système complexe par analyse fonctionnelle descendant, c'est-à-dire que l'analyse chemine du général (dit "niveau A0") vers le particulier et le détaillé (dits "niveaux A"). SADT est une démarche systémique de modélisation d'un système complexe ou d'un processus opératoire. Algorithme : Un algorithme est un moyen pour un humain de présenter la résolution par calcul d’un problème à une autre personne physique (un autre humain) ou virtuelle (un calculateur). En effet, un algorithme est un énoncé dans un langage bien défini d’une suite d’opérations permettant de résoudre par calcul un problème. Si ces opérations 1 CER SCHMITT Mathieu s’exécutent en séquence, on parle d’algorithme séquentiel. Si les opérations s’exécutent sur plusieurs processeurs en parallèle, on parle d’algorithme parallèle. Si les tâches s’exécutent sur un réseau de processeurs on parle d’algorithme réparti ou distribué. Formaliser : Dans ce qui suit, on entend par problème de planification le couple formé par un domaine d'application (exemple: un chantier) et ce que l'on attend d'un système de planification (exemple: générer des plans pour construire diverses structures). La tâche de formalisation d'un problème de planification possède deux préconditions: 1. bien connaitre les caractéristiques de l'environnement à modéliser et du problème de planification tel qu'il se pose réellement ; et 2. avoir un minimum de connaissances sur le fonctionnement du système de planification (de manière à appréhender ses points forts et surtout, ses limites, à la fois au niveau de la représentation et à celui de l'algorithmique). La principale difficulté pour formaliser un problème tient alors à la recherche d'un compromis entre: 1. la nécessité d'une représentation la plus fine possible afin de prendre en compte un maximum de contraintes réelles et de trouver plan un relativement précis au niveau des actions planifiées; et 2. les limitations du système du point de vue de l'expressivité du formalisme et des performances de l'algorithmique mise en jeu. Externalisation : L'externalisation, aussi appelée outsourcing, désigne le transfert de tout ou partie d'une fonction d'une entreprise vers un partenaire externe. Elle consiste très souvent en la sous-traitance des activités non essentielles et non stratégiques (celles qui ne sont pas productrices de revenus) d'une entreprise. Il s'agit d'un outil de gestion stratégique qui se traduit par la restructuration d’une entreprise autour de sa sphère d’activités : ses compétences de base et son cœur de métier (core business en anglais). L'externalisation diffère de la simple prestation extérieure de services, et de la simple sous-traitance, dans la mesure où il y a - pilotage étroit par l'entreprise donneuse d'ordre, engagement du prestataire externe. Typologie : Une typologie est une démarche, souvent scientifique, consistant à définir un certain nombre de types afin de faciliter l'analyse, la classification et l'étude de réalités complexes. Par extension, le terme typologie désigne parfois la liste des types propres à un domaine d'étude. Module de code : Le terme module en programmation identifie une structure de programmation. Un module de code, est donc le code qui se trouve dans le module. Module informatique : Un module en programmation désigne un espace de nommage. Pour reprendre l'image de la programmation objet, un module est une instance unique qui n'utilise pas d'héritage et ne contient aucun module fils. Chaque module peut exporter ou importer certains symboles comme des variables, des fonctions ou des classes. Les modules peuvent se regrouper en package éventuellement hiérarchique. Règles de communication : La communication (souvent abrégée en com) est l'action, le fait de communiquer, d'établir une relation avec autrui, de transmettre quelque chose à quelqu'un, l'ensemble des moyens et techniques 2 CER SCHMITT Mathieu permettant la diffusion d'un message auprès d'une audience plus ou moins vaste et hétérogène et l'action pour quelqu'un, une entreprise d'informer et de promouvoir son activité auprès du public, d'entretenir son image, par tout procédé médiatique. Axe de recherche Etudier les bases de l’algorithmique Notion d'algorithme La mise au point d'un programme informatique se fait en plusieurs étapes. Il s'agit de fournir la solution à un problème, la première étape consiste donc à analyser le problème, c'està-dire en cerner les limites et le mettre en forme dans un langage descriptif, on parle généralement d'analyse pour décrire le processus par lequel le problème est formalisé. Le langage de description utilisé pour écrire le résultat de l'analyse est appelé algorithme. L'étape suivante consiste à traduire l'algorithme dans un langage de programmation spécifique, il s'agit de la phase de programmation. Le langage de programmation est l'intermédiaire entre l'humain et la machine, il permet d'écrire dans un langage proche de la machine mais intelligible par l'humain les opérations que l'ordinateur doit effectuer. Ainsi, étant donné que le langage de programmation est destiné à l'ordinateur, il doit donc respecter une syntaxe stricte. Un algorithme peut toutefois aboutir à plusieurs programmes. Le programme est ensuite transformé en langage machine lors d'une étape appelée compilation. La compilation est une phase réalisée par l'ordinateur lui-même grâce à un autre programme appelé compilateur. La phase suivante s'appelle l'édition de liens, elle consiste à lier le programme avec tous les éléments externes (généralement des librairies auxquelles il fait référence). 3 CER SCHMITT Mathieu Caractéristiques d'un algorithme L'algorithme est un moyen pour le programmeur de présenter son approche du problème à d'autres personnes. En effet, un algorithme est l'énoncé dans un langage bien défini d'une suite d'opérations permettant de répondre au problème. Un algorithme doit donc être : - - lisible: l'algorithme doit être compréhensible même par un non-informaticien de haut niveau: l'algorithme doit pouvoir être traduit en n'importe quel langage de programmation, il ne doit donc pas faire appel à des notions techniques relatives à un programme particulier ou bien à un système d'exploitation donné précis: chaque élément de l'algorithme ne doit pas porter à confusion, il est donc important de lever toute ambiguïté concis: un algorithme ne doit pas dépasser une page. Si c'est le cas, il faut décomposer le problème en plusieurs sous-problèmes structuré: un algorithme doit être composé de différentes parties facilement identifiables Pseudo-code : Le pseudo code d’un algorithme débute toujours par les caractéristiques suivantes : •Nom de l’algorithme •Données (en entrée) •Résultats (en sortie) •Initialisation des variables locales Variable : Type Numérique Plage Byte (octet) 0 à 255 Entier simple -32 768 à 32 767 Entier long -2 147 483 648 à 2 147 483 647 Réel simple -3,40x1038 à -1,40x1045 pour les valeurs négatives 1,40x10-45 à 3,40x1038 pour les valeurs positives 4 CER SCHMITT Mathieu 1,79x10308 à -4,94x10-324 pour les valeurs négatives Réel double 4,94x10-324 à 1,79x10308 pour les valeurs positives Structure : - Bloc « tant que » : Structures répétitives (tant que) Tant que CONDITION faire instruction ; Instruction ; Fin tant que - bloc « si » : Structures alternatives (si) => exécution exclusive. Si CONDITION alors instruction si vrai Sinon instruction si faux Fin si - Bloc « pour » : Pour I allant de d à f faire instruction ; //séparateur d’instruction Instruction ; Fin pour - bloc début Début Instruction ; Instruction ; Fin Affectation : En pseudo-code, l'instruction d'affectation se note avec le signe ← Ainsi : 5 CER SCHMITT Mathieu Toto ← 24 Attribue la valeur 24 à la variable Toto. Ceci, soit dit en passant, sous-entend impérativement que Toto soit une variable de type numérique. Si Toto a été défini dans un autre type, il faut bien comprendre que cette instruction provoquera une erreur. On peut en revanche sans aucun problème attribuer à une variable la valeur d’une autre variable, telle quelle ou modifiée. Par exemple : Tutu ← Toto Signifie que la valeur de Tutu est maintenant celle de Toto. Notez bien que cette instruction n’a en rien modifié la valeur de Toto : une instruction d’affectation ne modifie que ce qui est situé à gauche de la flèche. Tutu ← Toto + 4 Si Toto contenait 12, Tutu vaut maintenant 16. De même que précédemment, Toto vaut toujours 12. Tutu ← Tutu + 1 Si Tutu valait 6, il vaut maintenant 7. La valeur de Tutu est modifiée, puisque Tutu est la variable située à gauche de la flèche. Opérateurs Un opérateur est un signe qui relie deux valeurs, pour produire un résultat. Les opérateurs possibles dépendent du type des valeurs qui sont en jeu. Opérateurs numériques Ce sont les quatre opérations arithmétiques tout ce qu’il y a de classique. + : addition - : soustraction * : multiplication / : Division Mentionnons également le ^ qui signifie « puissance ». 45 au carré s’écrira donc 45 ^ 2. Enfin, on a le droit d’utiliser les parenthèses, avec les mêmes règles qu’en mathématiques. La multiplication et la division ont « naturellement » priorité sur l’addition et la soustraction. Les parenthèses ne sont ainsi utiles que pour modifier cette priorité naturelle. Cela signifie qu’en informatique, 12 * 3 + 5 et (12 * 3) + 5 valent strictement la même chose, à savoir 41. Pourquoi dès lors se fatiguer à mettre des parenthèses inutiles ? En revanche, 12 * (3 + 5) vaut 12 * 8 soit 96. Rien de difficile là-dedans, que du normal. Opérateur alphanumérique & Cet opérateur permet de concaténer, autrement dit d’agglomérer, deux chaînes de caractères. Exemple 6 CER SCHMITT Mathieu Variables A, B, C en Caractère Début A ← "Gloubi" B ← "Boulga" C←A&B Fin La valeur de C à la fin de l’algorithme est "GloubiBoulga" Opérateurs logiques (ou booléens) Il s’agit du ET, du OU, du NON et du mystérieux (mais rarissime, sauf dans la plupart des algos de hashage et de cryptographie) XOR. Différences de variable avec ou sans guillemets Pour revenir à présent sur le rôle des guillemets dans les chaînes de caractères et sur la confusion, comparons maintenant deux algorithmes suivants : Exemple n°1 Début Riri ← "Loulou" Fifi ← "Riri" Fin Exemple n°2 Début Riri ← "Loulou" Fifi ← Riri Fin La seule différence entre les deux algorithmes consiste dans la présence ou dans l’absence des guillemets lors de la seconde affectation. Et l'on voit que cela change tout ! Dans l'exemple n°1, ce que l'on affecte à la variable Fifi, c'est la suite de caractères R – i – r - i. Et à la fin de l’algorithme, le contenu de la variable Fifi est donc « Riri ». Dans l'exemple n°2, en revanche, Riri étant dépourvu de guillemets, n'est pas considéré comme une suite de caractères, mais comme un nom de variable. Le sens de la ligne devient donc : « affecte à la variable Fifi le contenu 7 CER SCHMITT Mathieu de la variable Riri ». A la fin de l’algorithme n°2, la valeur de la variable Fifi est donc « Loulou ». Ici, l’oubli des guillemets conduit certes à un résultat, mais à un résultat différent. A noter, car c’est un cas très fréquent, que généralement, lorsqu’on oublie les guillemets lors d’une affectation de chaîne, ce qui se trouve à droite du signe d’affectation ne correspond à aucune variable précédemment déclarée et affectée. Dans ce cas, l’oubli des guillemets se solde immédiatement par une erreur d’exécution. Instructions de lecture et d'écriture Instruction de lecture L'instruction de prise de données sur le périphérique d'entrée (en général le clavier) est : variable <- lire() L'exécution de cette instruction consiste à affecter une valeur à la variable en prenant cette valeur sur le périphérique d'entrée. Avant l'exécution de cette instruction, la variable avait ou n'avait pas de valeur. Après, elle a la valeur prise sur le périphérique d'entrée. Instruction d'écriture L'instruction de restitution de résultats sur le périphérique de sortie (en général l'écran) est : écrire (liste d'expressions) Cette instruction réalise simplement l'affichage des valeurs des expressions décrites dans la liste. Ces instructions peuvent être simplement des variables ayant des valeurs ou même des nombres ou des commentaires écrits sous forme de chaînes de caractères. Exemple d'utilisation : écrire(x, y+2, "bonjour") Notion de fonctions Une fonction est un algorithme autonome, réalisant une tâche précise, auquel on transmet des valeurs lors de son appel et qui retourne une valeur à la fin de son exécution. La notion de fonction est très intéressante car elle permet, pour résoudre un problème, d'employer une méthode de décomposition en sous-problèmes distincts. Elle facilite aussi la réutilisation d'algorithmes déjà développés par ailleurs. Mais nous n'apprendrons pas dans ce chapitre à les appeler ! Une fonction est introduite par un en-tête, appelé aussi signature ou prototype, qui spécifie : - le nom de la fonction - les paramètres donnés et leur type - le type du résultat 8 CER SCHMITT Mathieu La syntaxe retenue pour l'en-tête est la suivante : fonction nomFonction (liste des paramètres) : type du résultat La liste des paramètres précise, pour chaque paramètre, son nom et son type. La dernière instruction de la fonction indique la valeur retournée, nous la noterons : retourne expression Exemple de fonction Ecrire une fonction calculant le périmètre d'un rectangle dont on lui donne la longueur et la largeur. fonction calculerPérimètreRectangle (longueur:réel, largeur:réel):réel début périmètre <- 2 * (longueur + largeur) retourne périmètre fin Lexique - longueur : réel, longueur du rectangle - largeur : réel, largeur du rectangle - périmètre : réel, périmètre du rectangle Instructions conditionnelles Les exemples précédents montrent des algorithmes dont les instructions doivent s'exécuter dans l'ordre, de la première à la dernière. Nous allons introduire une instruction précisant que le déroulement ne sera plus séquentiel. Cette instruction est appelée une conditionnelle. Il s'agit de représenter une alternative où, selon les cas, un bloc d'instructions est exécuté plutôt qu'un autre. La syntaxe de cette instruction est : si condition alors liste d'instructions sinon liste d'instructions fsi Cette instruction est composé de trois partie distinctes : la condition introduite par si, la clause alors et la clause sinon. La condition est une expression dont la valeur est de type booléen. Elle est évaluée. Si elle est vraie, les instructions de la clause alors sont exécutées. Dans le cas contraire, les instructions de la clause sinon sont exécutées. On peut utiliser une forme simplifiée de la conditionnelle, sans clause sinon. La syntaxe est alors : si condition alors liste d'instructions fsi 9 CER SCHMITT Mathieu Etudier l’algorithmique parallèle Qu’est ce qu’un algorithme parallèle ? Introduction & Notions de base Introduction L’objectif du parallélisme est d’obtenir de meilleur performance par rapport aux calculateurs classiques séquentiels : - Complexité en temps – Pour un problème donné, aller plus vite, en exploitant plus de processeurs. - Complexité en espace – Pour traiter des problèmes plus gros, en utilisant plus de mémoires. Modèles du calcul parallèle Un algorithme consiste en un flot d’instructions à exécuter sur un flot de données. Il existe 4 modèles de calculs, selon qu’il y a un ou plusieurs flots. SISD (Single Instruction Single Data) C’est le modèle séquentiel classique (Von Neumann). Unité de contrôle 1 flot d’instructions Processeur 1 flot de données Mémoire 10 CER SCHMITT Mathieu MISD (Multiple Instruction Single Data) Il y a plusieurs flots d’instructions agissant sur un seul flot de données. On a n > 1 processeurs partageant une unique mémoire. A chaque étape de manière synchrone, une donnée est traitée parallèlement par les n processeurs qui exécutent chacun une instruction spécifique. Pas s’implémentation pratique. P1 UC1 M Pn 1 flot de données UCn n flots d’instructions SIMD (Single Instruction Multiple Data) On a n processeurs tous identiques ayant chacun une mémoire locale, où l’on peut stocker des données et des instructions. UC Echange inter processeurs P1 + M1 Pn + Mn 1 flot d’instructions n flots de données Tous les processeurs exécutent la même instruction ou le même programme (SPMD) stocké en mémoire locale sur des données différentes. Les processeurs fonctionnent de manière synchrone ; les instructions peuvent être simples ou complexes ; seul un sous-ensemble des processeurs peut avoir à exécuter une instruction. Ce modèle est efficace surtout si on a un flot régulier sur des données régulières (auxquelles on accède de manière prévisible). Souvent les processeurs doivent communiquer pour s’échanger des résultats intermédiaires, ce qui nécessite une coordination des activités. Ceci se fait de deux manières : soit un utilisant de la mémoire partagée (SM), soit en utilisant un réseau d’interconnexion. Mémoire partagée (SM) 11 CER SCHMITT Mathieu C’est le modèle PRAM (parallel Random Access Machine). Les n processeurs utilisent une SM pour échanger des données (une étape élémentaire de complexité). Au cours du temps les n processeurs vont accéder en lecture et / ou écriture en SM, ce qui pose un problème de concurrence des accès. On distingue 4 modèle de concurrences : - EREW (Exclusive Read Exclusive Write) - CREW (Concurent Read Exclusive Write) - ERCW (Exclusive Read Concurent Write) - CRCW (Concurent Read Concurent Write) A priori, il n’y a pas (du point de vue algorithmique) de problèmes pour la lecture concurrente. En écriture, on doit fixer une règle pour gérer la concurrence… Les modèles de calculs théoriques concurrents se réalisent en EREW avec une pénalisation de complexité en Olog 2n sur n processeurs. Le modèle à mémoire partagée est théoriquement très puissant, mais peu réaliste ! En effet, on ne prend pas en compte la complexité globale du circuit d’accès à la mémoire qui dépend du nombre de processeurs n partageant cette mémoire et de la taille m de la mémoire. Problème si n et m sont grands ! Traditionnellement, on a n < 64 et m de l’ordre du Go. Une solution pour diminuer le coût consiste à diviser la mémoire en r blocs de taille m/r chacun. La concurrence se fait uniquement au niveau des blocs… Réseau d’interconnexion Chaque processeur dispose d’un mémoire locale. Chaque paire de processeurs est connecté par un lien bidirectionnel et à chaque étape du calcul, un processeur quelconque Pi peut recevoir une donnée de Pj et envoyer une donnée vers Pk. La topologie du réseau d’interconnexion (chaîne, grille 2D, arbre binaire, mélange parfait, cube…) détermine la complexité des communications. MIMD C’est le modèle le plus général. Il y a n processeurs avec n flots d’instructions distincts et n flots de données distincts. Les échanges inter-processeurs se font par une mémoire partagée ou par un réseau d’interconnexion. UCn n flots d’instructions P1 + M1 Echange inter processeurs UC1 Pn + Mn n flots de données 12 CER SCHMITT Mathieu Chaque processeur exécute son propre programme sur ses propres données, et chacun résout un sousproblème différent du problème original. Fonctionnement asynchrone, sans horloge globale. La coordination des activités se fait via une mémoire partagée ou via un réseau couplé faiblement… Analyse des algorithmes parallèles Pour un problème de taille n, on note : - tn , le temps d’exécution parallèle au pire des cas pour un problème de taille n ; - wn , le temps d’exécution séquentielle (au pire) du meilleur algorithme séquentiel pour le problème de taille n; - pn , le nombre de processeurs pour résoudre en parallèle le problème de taille n. On introduit le speed-up ou l’accélération de l’algorithme parallèle. SpeedUpn wn pn tn On introduit le coût de l’algorithme parallèle. cn pntn Si tous les processeurs exécutent exactement le même nombre d’opérations, cn est exactement le nombre total d’opérations, faits par tous les processeurs. Sinon, cn est un majorant de ce nombre. La différence entre cn et wn représente l’overhead dû à la gestion du parallélisme. t0ncnwn0 Si cn est asymptotiquement équivalent à wn , on dira que l’algorithme parallèle est à coût optimal. En d’autres termes, un algorithme parallèle n’est pas à coût optimal si il existe un algorithme séquentiel dont la complexité est asymptotiquement inférieur à son coût. On introduit aussi l’efficacité qui est un rendement. Eff n SpeedUpn 1 pn t0n Eff n1 wn 1 Si pn est constant, alors t0n est constant. Si pn est constant et n croissant, alors Eff n est croissante. On a une granularité plus grosse et des processeurs mieux utilisés. Si n est constant et pn croissant, alors Eff n est décroissante. Paradoxalement, le meilleur rendement est obtenu en séquentiel (pas le meilleur temps) ! On peut chercher la relation entre la taille du problème n et le nombre de processeurs pn pour maintenir une efficacité constante Eff nE . wn E t0n 1E On étudie cette relation en faisant varier n et pn donc t0n . On en déduit l’extensibilité de l’algorithme parallèle ou scability. 13 CER SCHMITT Mathieu Comprendre les Tableaux Définition L’énorme avantage des tableaux, c’est qu’on va pouvoir les traiter en faisant des boucles. Par exemple, pour effectuer notre calcul de moyenne, cela donnera par exemple : Les tableaux servent à désigner une suite finie d'éléments de même type au moyen d'une unique variable. Ces éléments peuvent être des entiers, des chaînes, ... Ils sont stockés dans les différentes cases du tableau, habituellement numérotées de 0 à n-1, n représentant la taille du tableau (le nombre de cases dans le tableau). Le type d'un tableau précise l'intervalle de définition et le type (commun) des éléments. tableau type_des_éléments[borne_inférieure .. borne_supérieure] En général, nous choisirons toujours la valeur 0 pour la borne inférieure dans le but de faciliter la traduction de l'algorithme vers les autres langages (C, Java, ...). Par exemple, pour un tableau de 10 entiers, on pourra écrire : t : tableau entier[0..9] Un tel tableau peut par exemple contenir les éléments suivants : Indices : 0 1 2 3 4 5 6 7 8 9 Valeurs : 45 54 1 -56 22 134 49 12 90 -27 Pour accéder à un élément du tableau, il suffit de préciser entre crochets l'indice de la case contenant cet élément. Par exemple, pour accéder au septième élément (49) du tableau d'entiers ci-dessus, on écrit : t[6]. L'instruction suivante affecte à la variable x la valeur du premier élément du tableau, c'est à dire 45 : x <- t [0] L'élément désigné du tableau peut être utilisé comme n'importe quelle variable : t[6] <- 43 Cette instruction a modifié le tableau t : Indices : 0 1 2 3 4 5 6 7 8 9 Valeurs : 45 54 1 -56 22 134 43 12 90 -27 14 CER SCHMITT Mathieu Parcourir un tableau ? La plupart des algorithmes basés sur les tableaux utilisent des itérations permettant de faire un parcours complet ou partiel des différents éléments du tableau. De tels algorithmes établissent le résultat recherché par récurrence en fonction des éléments successivement rencontrés. Les répétitions inconditionnelles sont le moyen le plus simple de parcourir complètement un tableau. Exemple Dans l'exemple suivant, la fonction affiche un à un tous les éléments d'un tableau de n éléments : fonction écrireTableau(n : entier, tab : tableau entier[0..n-1]) début pour i de 0 à n-1 faire // f1 écrire (tab[i]) // f2 fpour fin Lexique : - i : entier, indice d'itération - n : entier, taille du tableau - tab : tableau entier [0..n-1] Algorithme début n <- lire() // 1 Pour i de 0 à n-1 faire tab[i] <- lire() // 2 fpour écrireTableau(n, tab) // 3 fin Lexique : - n : entier, taille du tableau 15 CER SCHMITT Mathieu - tab : tableau entier[0..n-1] Schéma de l'évolution de l'état des variables instruction par instruction : On suppose que le tableau saisi, de taille 3, contient : 7, 10 et 8. Instructions Algorithme principal Fonction écrireTableau tab n tab[0] 1 2 (3 exécutions) 3 tab[1] tab tab[2] n i tab[0] 3 tab[1] tab[2] 10 8 / 7 10 8 / 3 f1 7 0 f2 f1 écrire() 1 f2 f1 écrire() 2 f2 f1 écrire() (fin) Exemple La fonction suivante multiplie par 2 tous les éléments d'un tableau. fonction doublerTableau(n : entier, t InOut : tableau entier[0..n-1]) début Pour i de 0 à n-1 faire // 1 t[i] <- t[i]*2 // 2 fpour fin Lexique : - n : entier, taille du tableau - t : tableau entier[0..n-1], tableau modifiable Schéma de l'évolution de l'état des variables instruction par instruction : 16 CER SCHMITT Mathieu On suppose que l'appel de fonction est doublerTableau(3, tab), où tab est un tableau de taille 3 qui contient : 7, 10 et 8. Instructions Algorithme principal Fonction doublerTableau tab t nb tab[0] tab[1] tab[2] n i avant appel 3 de la fonction 7 10 8 appel 2 14 1 20 retour à l'algorithme appelant / / 1 1 / / 1 2 t[2] Avec le mot clé Avec le mot clé Avec le mot clé InOut t[0] et InOut t[1] et InOut t[2] et tab[0] sont la tab[1] sont la tab[2] sont la même même même "variable" "variable" "variable" 0 2 t[1] / 3 1 t[0] 2 16 / / (fin) / / Comment gérer les parcours partiel ? Certains algorithmes sur les tableaux se contentent de parcourir successivement les différents éléments du tableau jusqu'à rencontrer un élément satisfaisant une certaine condition. Un tel parcours partiel est le plus souvent basé sur une répétition conditionnelle. 17 CER SCHMITT Mathieu Exemple Algorithme début tab <- lire() i <- 0 positif <- vrai tant que positif et i < n faire si tab[i] < 0 alors positif <- faux fsi i <- i+1 ftant si positif alors écrire("tableau d'entiers naturels") sinon écrire("tableau d'entiers relatifs") fsi fin Lexique : - i : entier, indice d'itération - n : entier, taille du tableau - tab : tableau entier[0..n-1] - positif : booléen, vrai si aucun entier négatif n'a été détecté Qu’est ce que le parcours imbriqué ? Certains algorithmes sur les tableaux font appel à des boucles imbriquées : la boucle principale sert généralement à parcourir les cases une à une, tandis que le traitement de chaque case dépend du parcours simple d'une partie du tableau (par exemple toutes les cases restantes), ce qui correspond à la boucle interne. Exemple La fonction suivante calcule, pour chaque case d'un tableau, le nombre de cases suivantes qui contiennent un élément strictement supérieur. Les résultats sont placés dans un tableau. fonction calculerNbSuccesseurSup(n : entier, t : tableau entier[0..n1]):tableau entier[0..n-1] début Pour i de 0 à n-2 faire tres[i] <- 0 fpour Pour i de 0 à n-2 faire Pour j de i+1 à n-1 faire 18 CER SCHMITT Mathieu si t[i] < tres[i]+1 alors tres[i] <- tres[i]+1 fsi fpour fpour retourne tres fin Lexique : - n : entier, taille du tableau - t : tableau entier[0..n-1] - tres : tableau entier[0..n-1], nombre de cases de t indice strictement supérieur à t[i] - i : entier, indice d'itération remplir tres) - j : entier, indice d'itération restantes de t) tableau résultat (case i contient le supérieur à i qui contiennent un élément de la boucle principale (parcours pour de la boucle interne (parcours des cases Tableaux multidimensionnels ? Les cases d'un tableau à une dimension sont indicées de manière consécutive (cases "alignées"). Il est possible de disposer ces cases selon des grilles (tableaux à deux dimensions), des cubes (tableaux à trois dimensions), ... Les algorithmes les plus simples sur ces tableaux utilisent néanmoins en général des boucles imbriquées : chaque niveau de boucle correspond au parcours selon une dimension. Le type d'un tableau précise l'intervalle de définition selon chaque dimension. tableau type_des_éléments[borne_inf_dim1 .. borne_sup_dim1, borne_inf_dim2 .. borne_sup_dim2, ...] OMFG, Tableaux à deux dimensions ? :S Ces tableaux sont faciles à se représenter comme une grille (ou matrice) ayant un certain nombre de lignes (première dimension) et un certain nombre de colonnes (seconde dimension). tableau type_des_éléments[0..nb_lignes-1, 0..nb_colonnes-1] Un tel tableau, avec 5 colonnes et 3 lignes, peut par exemple contenir les éléments suivants : 0 0 1 2 3 4 45 54 1 -56 22 19 CER SCHMITT Mathieu 1 64 8 54 34 2 2 56 23 -47 0 12 Pour accéder à un élément du tableau, il suffit de préciser entre crochets l'indice de la case contenant cet élément, et ce pour chacune des dimensions. Par exemple, pour accéder à l'élément 23 du tableau d'entiers ci-dessus, on écrit : t[2,1]. L'instruction suivante affecte à la variable x la valeur du premier élément du tableau, c'est à dire 45. x <- t[0,0] L'élément désigné du tableau peut alors être utilisé comme n'importe quelle variable : t[2,1] <- 43 Cette instruction a modifié le tableau : 0 1 2 3 4 0 45 54 1 -56 22 1 64 8 54 34 2 2 56 43 -47 0 12 Exemple : calcul de la somme fonction somme(li : entier, co : entier, t : tableau entier[0..li-1, 0..co1]):entier début s <- 0 Pour i de 0 à li-1 faire Pour j de 0 à co-1 faire s <- s + t[i,j] fpour fpour retourne s fin Lexique : - li : entier, nombre de lignes du tableau - co : entier, nombre de colonnes du tableau - t : tableau entier[0..li-1, 0..co-1], tableau dont on cherche l'élément maximal - s : entier, somme des éléments déjà parcourus - i : entier, indice d'itération sur les lignes - j : entier, indice d'itération sur les colonnes Recherche dichotomique ? ( ake koi ????:/ ) 20 CER SCHMITT Mathieu La fonction rechercheDicho recherche un élément dans un tableau trié et retourne l'indice d'une occurrence de cet élément (ou -1 en cas d'échec). Une telle recherche peut être réalisée de manière séquentielle ou dichotomique. Nous développons ici la version dichotomique qui est la plus efficace en temps d'exécution. On compare l'élément cherché à celui qui se trouve au milieu du tableau. Si l'élément cherché est plus petit, on continue la recherche dans la première moitié du tableau sinon dans la seconde. On recommence ce processus sur la moitié. On s'arrête lorsqu'on a trouvé ou lorsque l'intervalle de recherche est nul. Exemples : Exemple de recherche dans le tableau d'entiers suivant défini sur l'intervalle [3..10] : Indices : 3 4 5 6 7 8 9 10 Valeurs : 5 13 18 23 46 53 89 97 Recherche de 46 : Etape 1 : comparaison de 46 avec t[6] (6=(10+3)÷2), t[6]<46 => recherche dans [7..10] Etape 2 : comparaison de 46 avec t[8], t[8]>46 => recherche dans [7..7] Etape 3 : comparaison de 46 avec t[7], t[7]=46 => élément cherché trouvé à l'indice 7 Recherche de 10 : Etape 1 : comparaison de 10 avec t[6], t[6]>10 => recherche dans [3..5] Etape 2 : comparaison de 10 avec t[4], t[4]>10 => recherche dans [3..3] Etape 3 : comparaison de 10 avec t[3], t[3]<10 => recherche dans [4..3], Borne inférieure supérieure à la borne supérieure donc on met fin à l'algorithme et l'élément cherché n'a pas été trouvé ! Voyons l'implémentation de cette fonction : fonction rechercheDicho(e : entier, n : entier, t : tableau entier [0..n1]):entier début debut <- 0 fin <- n-1 trouve <- faux tant que debut <= fin et non trouve faire i <- (debut+fin)÷2 si t[i] = e alors trouve <- vrai sinon si t[i] > e alors fin <- i-1 21 CER SCHMITT Mathieu sinon debut <- i+1 fsi fsi ftant si trouve alors indice <- i sinon indice <- -1 fsi retourne indice fin Lexique : - e : entier, élément recherché - n : entier, taille du tableau - t : tableau entier[0..n-1], tableau trié par ordre croissant - debut : entier, début de la zone de recherche - fin : entier, fin de la zone de recherche - trouve : booléen, faux tant que l'élément cherché n'est pas trouvé - i : entier, indice de la case du milieu de la zone de recherche - indice : entier, indice de l'élément recherché ou -1 s'il n'est pas trouvé Etudier quel est le rôle de l’offshore dans le texte Que recouvre précisément le terme d'externalisation ? Une vaste palette de services et de prestations en réalité... Tout d'abord l'infogérance, qui consiste à sous-traiter partiellement ou complètement l'exploitation d'un système d'information. Le BPO ensuite (Business Process Outsourcing), où des fonctions "métiers", par exemple la relation client ou la gestion des ressources humaines, sont confiées à des spécialistes. La TMA enfin (Tierce maintenance applicative), qui assure la maintenance des applications présentes dans l'entreprise ou développées par cette dernière. Sans oublier des formes plus hybrides (co-sourcing) où clients et prestataires créent une structure commune pour gérer l'externalisation ou encore des formes plus anciennes (mode ASP) où l'application est louée. Offshore, nearshore, onshore... ? Ces trois termes désignent d'une certaine manière l'éloignement du prestataire par rapport à son client. Avec l'offshore, les prestataires se trouvent dans des pays très éloignés, tel que l'Inde ou la Chine, alors que dans le cas du nearshore, ils se trouvent à proximité du client : au Maghreb par exemple pour les entreprises françaises voire, selon certaines définitions, en France (en province par rapport à la région parisienne). L'onshore est une pratique qui consiste à faire travailler chez le client du personnel venant des pays... offshore aux conditions de ces pays. Sous quelles conditions pratiquer l'externalisation ? Sous des conditions de contrat claires tout d'abord ! Il faut en effet prévoir très précisément les critères d'évaluation 22 CER SCHMITT Mathieu de la qualité de la prestation ainsi que les modalités de leur évolution. Attention aussi à la dépendance vis-à-vis du prestataire (perte d'expertise) et, le cas échéant, à la possibilité de faire marche arrière, tout en étant capable de récupérer (développements, savoir-faire) ce qui a été confié pendant des mois ou des années à un tiers. Pourquoi externaliser la maintenance de ses applications ? Les demandes d'évolutions, de nouvelles interfaces ou de fonctionnalités additionnelles affluent parfois sans qu'on puisse les gérer efficacement, au grand mécontentement des utilisateurs. L'enjeu pour l'entreprise est de toujours rester au fait des bonnes pratiques et des normes en vigueur, tout en respectant les budgets décidés et en ne perdant pas de vue que la maîtrise des développements effectués sur ses applications est un éléments clés de ce type de contrat. Pourquoi l'offshore suscite-t-il autant de controverse ? L'externalisation offshore alimente régulièrement les colonnes de la presse pour plusieurs raisons. Il n'est dans un premier temps pas aisé de confier des prestations à des sociétés implantées à plus de 15 heures de vol de son siège social, les risques de non qualité (du fait du prestataire mais aussi de la mauvaise gestion du contrat par le client) sont réels. Le recours à une main d'oeuvre à bas prix (pays low cost) suscite par ailleurs de vives polémiques dans les pays passeurs d'ordre, notamment aux Etats-Unis où des visas spéciaux permettent à des salariés étrangers de travailler aux conditions de rémunération de leur pays. Comprendre la méthode SADT L'acronyme S.A.D.T signifie : Structured Analysis and Design Technic. Cette méthode a été mise au point par la société Softech aux Etats Unis. La méthode SADT est une méthode d'analyse par niveaux successifs d'approche descriptive d'un ensemble quel qu'il soit. On peut appliquer le SADT à la gestion d'une entreprise tout comme à un système automatisé Position du SADT dans la gestion d'un projet : 23 CER SCHMITT Mathieu Le SADT va permettre d'aider à la gestion d'un projet. Par son rôle d'analyse, il sera possible de l'utiliser à tous niveaux de la conception du SA au codage (programmation du système automatisé). Le SADT est avant tout un langage de communication. Cette communication se fait à différents niveaux. Au niveau de l'élaboration du projet tout d'abord en permettant par son formalisme à chacun de participer, ensuite lors d'explications à des intervenants extérieurs son formalisme permet à chacun d'appréhender le SA. Objectifs d'une analyse S.A.D.T : L'objectif de cette étude doit mener les intervenants (ingénieurs, techniciens, opérateurs) à un tout qui soit cohérent et homogène avec le système à étudier. Dans n'importe quel système automatisé, circulent un certain nombre de flux de données. Les flux les plus caractéristiques sont : - les flux de pièces : flux qui caractérisent la valeur ajoutée à un produit. - Les flux d'informations : ces flux vont permettre à l'outil de production de pouvoir évoluer. - Les flux énergétiques. - les flux divers (copeaux, fluides de coupe, rejets divers, etc...). L'analyse SADT va permettre d'organiser ces flux de données pour donner une vision globale du système puis par une analyse des niveaux successifs, permettre de préciser de plus en plus finement le rôle de chacun des éléments du système. La finesse de cette description dépendra directement des besoins des utilisateurs. 24 CER SCHMITT Mathieu Exemple : Soit un système automatisé produisant des entretoises. Les flux que l'on peut identifier au niveau le plus haut de la description sont : - les flux de pièces (les entretoises, qui sont les pièces finies et les tubes qui sont les pièces brutes) - le flux d'énergie (électricité) - les flux d'informations (informations de contrôle et réglages) - les flux divers (copeaux) Le niveau ci-dessus est le niveau le plus global. Il est nécessaire pour définir plus complètement le système d'affiner l'analyse pour comprendre le fonctionnement de ce système automatisé. Si on imagine que l'on puisse "rentrer" dans le rectangle "Produire des entretoises"(nous appellerons ce rectangle "Boîte"), la description de l'unité de production serait alors un peu plus précise et permettrait de situer les différents intervenants de ce système. 25 CER SCHMITT Mathieu Dans cette boîte, la décomposition du système automatisé se fait plus fine et le rôle de chacun des éléments de l'unité de production y est décrit avec plus de précision. Par exemple, l'automate PB80 a pour objet de donner des ordres au pré-actionneurs, de veiller au respect des consignes données aux actionneurs et se sont les actionneurs qui fabriquent les entretoises. Chaque boîte possède un numéro qui lui est propre (A1, A2, A3, et A4). Intéressons nous maintenant à la boîte A4, "Fabriquer des entretoises". 26 CER SCHMITT Mathieu La décomposition se fait de plus en plus précise. A ce niveau, les éléments de l'unité de production apparais- sent. Le parcours des pièces en cours de fabrication se précise. 1/ Les tubes sont tronçonnés en pièces, 2/ les pièces transférées jusqu'à l'unité de lamage chanfreinage, 3/ Elles sont lamées et chanfreinées, 4/ De nouveau transférées jusqu'à l'unité de nettoyage, 5/ Nettoyées, 6/ Les pièces terminées et lavées sont alors évacuées On pourrait continuer à descendre les niveaux jusqu'à obtenir le degré de précision souhaité pour la description du système. Il est possible de descendre encore loin dans la finesse de description du système mais ce n'est pas l'objet de cette présentation. Actigrammes - Datagrammes Dans une analyse SADT, on peut modéliser deux types d'analyse. L'analyse par des actigrammes (boîtes d'action) et l'analyse par des datagrammes (boîtes de donnée). Sur des actigrammes, les actions sont reliées entre elles par des flux de données alors que les datagrammes se sont les données qui sont reliées entre-elles par des flux d'activité. Remarque : dans l'exemple proposé précédemment nous ne nous sommes intéressés qu'aux actigrammes. Les datagrammes ne seront pas traités dans cette série. 27 CER SCHMITT Mathieu Exemples : Actigramme Datagramme Formalisme du S.A.D.T : Si nous reprenons l'exemple précédent un certain nombre de symboles et de notations sont utilisés. Niveaux : On parle de niveau d'analyse pour situer la position de l'étude. Le niveau le plus haut est le niveau A-0. Le niveau le plus bas dans notre exemple est le niveau A4. Boîtes : elles sont les constituants de la décomposition. La première boîte est placée en haut et à gauche du niveau décrit. Au dessus et à gauche de la deuxième boîte et ainsi de suite. Chaque boîte est numérotée. Les boîtes de l'actigramme A0 sont numérotées de A1 à A4, les boîtes de l'actigramme A4 sont numérotées de A41 à A44. Si on entrait dans la boîte A42, les numéros des boîtes seraient notées A421 à A42x. Flèches : liaison entre les boîtes. Une flèche est représente un ensemble de données. Flèches à double sens : elles visualisent le flot de données dans les deux sens. Un point est mis sur le côté droit ou en dessous pour rappeler qu'elle est bi-directionnelle. Les deux flux (flux allé et flux retour) sont séparés par le signe /. Ces flèches ont pour but de faciliter la lecture de l'analyse. Codes MECS : Les codes MECS, Mécanismes, Entrées, Contrôle, Sorties, sont placés près de l'extrémité de la flèche concernée pour identifier le rôle de la flêche dans la description, accompagnée d'un chiffre identificateur. En général on place un code MECS sur des flux entrants ou sortants du niveau décrit. Dans l'exemple précédent, on peut voir les différents codes mecs associés à la boîte A41. Le mécanisme permettant de tronçonner est l'unité de tronçonnage "M1". 28 CER SCHMITT Mathieu Parenthèses : on place des parenthèses à l'extrémité non fléchée d'une flèche, pour une donnée d'un niveau de détail particulier qui n'apparaît pas sur le diagramme père mais qui est visible sur le diagramme fils. On appelle diagramme père le niveau supérieur d'un niveau donné et le diagramme fils, le niveau inférieur d'un niveau donné. On place des parenthèses à l'extrémité fléchée d'une flèche, pour une donnée existant implicitement sur toutes les boîtes des diagrammes fils mais n'y apparaissant pas. Ces parenthèses figurent uniquement sur le diagramme père. Conclusions : a) Le SADT est un outil graphique de représentation. b) Le SADT oblige à consigner par écrit les décisions d'une équipe de travail. Ceci permet progressivement de créer une documentation complète. c) Le SADT est un travail d'équipe qui demande discipline et coordination. Le SADT est un produit pour communiquer et pour être diffusé. d) Son formalisme conduit à une représentation structurée ascendante ou descendante. e) Si le SADT est utilisé complètement (Actigrammes et Datagrammes) il permet de programmer directement un système automatisé. Une MOCN (Machine Outil à Commande Numérique) peut être programmée directement en SADT. f) Si nous reprenons l'exemple précédent pour avoir une vision globale de l'ensemble, les niveaux étudiés s'enchaînent les uns sur les autres de la façon suivante : 29 CER SCHMITT Mathieu Réponse aux problématiques - Comment formaliser le problème de l’entreprise ? Cf. ci-dessus Comment se faire comprendre par tout le monde grâce à l’algorithmique ? Cf. ci-dessus Réponse aux hypothèses VRAI. L’algorithmique est la structure des langages de programmation VRAI. L’algorithmique permet de s’adapter à de nombreuses typologies FAUX. L’algo permettra de poser les 1ères règles de communication entre MD et ses partenaires FAUX. La fiche descriptive de module code est en fait un dictionnaire pour l’algorithmique Difficultés rencontés - Comment se limiter dans les connaissances sur l’algo Termes techniques Trackmania xD lol 30 CER SCHMITT Mathieu - Comprendre SADT et en faire une approche informatique Synthèse Ce prosit constitue un des prosit les plus importants de l’année dans la mesure où il jette les bases communes à tous les langages, l’algorithmique. Il est donc important de s’y atteler. Par ailleurs, l’offshoring, à mon goût ne constituait pas un point essentiel pour ce prosit, une simple définition aurait suffit. 31 CER SCHMITT Mathieu Bibliographie Documents officiels : http://www.lsis.org/~dea/M6optionD/Exp-GL41-SADT.pdf : Comprendre les SADT. http://www-ipst.u-strasbg.fr/pat/autom/grafcet.htm : kesk’ un grafcet http://www.merictech.info/articles.php?lang=fr&pg=124 : Aide à l’algorithmique http://www.journaldunet.com/solutions/dossiers/pratique/externalisation.shtml : Comprendre l’externalisation http://stic.cnam.fr/bioinfo/cours_algo_bnf103.pdf : Etudier les bases de l’algo. http://www.offshore-developpement.com/sommaire.php3 : Définir l’offshoring Documents officieux : Wikipedia : Définir les mots clés http://julp.developpez.com/algo/Instructions-et-types-elementaires/ : Etudier les bases de l’algo. file:///C:/Program%20Files/CommentCaMarche/algo/algointro.htm : Etudier les bases de l’algo. ftp://ftp.inria.fr/INRIA/publication/publi-pdf/RR/RR-0471.pdf : Thèse sur l’algo parallèle. http://www.wikituto.org/index.php/Algorithme:Intro#D.C3.A9finition : Tuto sur l’algo. 32