Accueil🇫🇷Chercher

Pile (informatique)

En informatique, une pile (en anglais stack) est une structure de données fondée sur le principe « dernier arrivé, premier sorti » (en anglais LIFO pour last in, first out), ce qui veut dire qu'en général, le dernier élément ajouté à la pile est le premier à en sortir[1].

Schémas d'une pile gérée en ''last in, first out.

Pile système

La plupart des microprocesseurs gèrent nativement une pile pour les appels de routine[2]. Elle correspond alors à une zone de la mémoire, et le processeur retient l'adresse du dernier élément.

Architecture x86

Dans l'architecture x86 32 bits, le registre ESP sert Ă  indiquer l'adresse du sommet d'une pile dans la mĂ©moire vive[3]. Les opcodes push et pop permettent respectivement d'empiler et de dĂ©piler des donnĂ©es. Les opcodes call et ret utilisent la pile pour appeler une fonction et la quitter par la suite en retournant Ă  l'instruction suivant immĂ©diatement l'appel[4].

En cas d'interruption, les registres EFLAGS, CS et EIP sont automatiquement empilés. Dans le cas d'un changement de niveau de priorité lors de l'interruption, les registres SS et ESP le sont aussi.

Une autre pile existe dans les CPU x86, celle de l'unité de calcul flottant (FPU). Plus précisément, cette unité utilise une pile limitée à 8 éléments, et dont le fonctionnement s’apparente à un barillet.

L’élément du barillet courant est nommé st(0), les éléments suivants st(N) avec N compris entre 1 et 7. Cette pile permet d'effectuer des calculs à la manière d'une calculatrice manuelle, en empilant les valeurs, puis en appliquant une opération sur les dernières valeurs empilées par exemple.

Architecture basée sur la pile

Certains processeurs n'utilisent pas de registre générique, mais uniquement la pile. Les instructions concernent alors ses premiers éléments : par exemple les calculatrices Hewlett-Packard pour l'implémentation de la notation polonaise inverse[5], les processeurs Focus, ou les machines Burroughs de la gamme B 5000[6]. Les instructions sont alors souvent plus courtes, car elles n'ont pas à référencer des registres[7]. Le bytecode du langage Java utilise aussi cette astuce.

Langage de programmation

Dans la plupart des langages de programmation compilés, la pile d'exécution est l'endroit où sont empilés tout ou partie des paramètres d'appel des routines. Par ailleurs, on y crée un espace pour des variables locales. La pile est ainsi formée de cadres de piles (en anglais stack frames) comprenant pour chaque routine, en cours d'appel imbriqué, ses paramètres, ses variables locales et son point de retour.

Quelques langages, comme PostScript d'Adobe[8] ou la commande dc d'Unix, implémentent un mécanisme de pile (avec la notation polonaise inverse) pour les calculs.

Le risque associé

Dans tous les langages de programmation, la pile d'exécution contient une quantité limitée de mémoire, habituellement déterminée au début du programme. La taille de la pile d'exécution dépend de nombreux facteurs : la conception du compilateur, l’architecture du processeur, l’utilisation du traitement multithread et la quantité de mémoire vive disponible. Lorsque trop d’informations sont enregistrées dans la pile d’exécution, la pile déborde et écrase des zones de programme à l’extérieur de la pile : on dit alors qu’il y a dépassement de pile. Il en résulte généralement une interruption du programme[9].

Primitives

Les deux primitives de base

Voici les primitives communément utilisées pour manipuler des piles[10] :

  • « Empiler » : ajoute un Ă©lĂ©ment sur la pile. Le terme anglais correspondant est push.
  • « DĂ©piler » : enlève un Ă©lĂ©ment de la pile et le renvoie. Le terme anglais correspondant est pop.
  • « La pile est-elle vide ? » : renvoie vrai si la pile est vide, faux sinon.
  • « Nombre d'Ă©lĂ©ments de la pile » : renvoie le nombre d'Ă©lĂ©ments dans la pile. Selon les implĂ©mentations, peut ĂŞtre fait soit en temps constant soit en temps linĂ©aire.
  • « Quel est l'Ă©lĂ©ment de tĂŞte ? » : renvoie l'Ă©lĂ©ment de tĂŞte sans le dĂ©piler. Le terme anglais correspondant est peek ou top.
  • « Vider la liste » : dĂ©piler tous les Ă©lĂ©ments. Selon l'implĂ©mentation, cela peut ĂŞtre fait en temps constant ou linĂ©aire. Le terme anglais correspondant est clear.
  • « Dupliquer l'Ă©lĂ©ment de tĂŞte » et « Ă©changer les deux premiers Ă©lĂ©ments » : existe sur les calculatrices fonctionnant en notation polonaise inverse. Les termes anglais correspondants sont dup et swap respectivement.

Il n'existe pas de normalisation pour les primitives de manipulation de pile : leurs noms sont donc indiqués de manière informelle. Seules les trois premières sont réellement indispensables, les autres pouvant s'en déduire.

Algorithmes

Cette implémentation est celle utilisée dans les processeurs — elle est simple et la pile occupe peu de place. Une implémentation sous forme de liste chaînée est également possible pour des programmes.

Applications

  • Les algorithmes rĂ©cursifs utilisent une pile d'appel. Dans un langage non rĂ©cursif (Fortran par exemple), on peut simuler la rĂ©cursivitĂ© en crĂ©ant les primitives de gestion d'une pile[11].
  • Dans un navigateur web, une pile sert Ă  mĂ©moriser les pages Web visitĂ©es. L'adresse de chaque nouvelle page visitĂ©e est empilĂ©e et l'utilisateur dĂ©pile l'adresse courante pour accĂ©der Ă  la page prĂ©cĂ©dente en cliquant le bouton « Afficher la page prĂ©cĂ©dente ».
  • L'Ă©valuation des expressions mathĂ©matiques en notation post-fixĂ©e (ou polonaise inverse) utilise une pile[5].
  • La fonction « Annuler la frappe » (en anglais Undo) d'un traitement de texte mĂ©morise les modifications apportĂ©es au texte dans une pile.
  • Un algorithme de recherche en profondeur utilise une pile pour mĂ©moriser les nĹ“uds visitĂ©s[10]. Par exemple, on peut inverser un tableau ou une chaĂ®ne de caractères en utilisant une pile. Il suffit d'empiler les Ă©lĂ©ments sur une pile puis de reconstituer le tableau (ou la chaĂ®ne) inverse en dĂ©pilant les Ă©lĂ©ments.

Notes et références

  1. Informations lexicographiques et étymologiques de « pile » (sens C3) dans le Trésor de la langue française informatisé, sur le site du Centre national de ressources textuelles et lexicales
  2. C'est le cas pour le MOS Technology 6502 et le Z80 de Zilog : Rodnay Zaks, Programming the Z 80, Sybex, (réimpr. 1980, 1981), 630 p. (ISBN 0-89588-094-6 et 2-902414-20-X, lire en ligne) ; pour les processeurs de la famille x86, cf. Jon Erickson, Techniques de HAcking, Pearson France, (réimpr. 2012), 500 p. (ISBN 978-2-7440-2536-5), p. 43,73,134
  3. Cf. Erickson, op. cit. p. 42
  4. Pierre Marchand, « Structure interne des ordinateurs. Supplément: Initiation à l'assembleur », sur Université de Laval - Département d'informatique, (consulté le )
  5. J.-P. Zanotti, « XIV. Évaluation avec une pile », sur Algorithmique pour la licence
  6. (en) Alastair J. W. Mayer, « The Architecture of the Burroughs B5000 - 20 Years Later and Still Ahead of the Times? », ACM's Computer Architecture News,‎ (lire en ligne).
  7. Koopman 1989.
  8. (en) Charles Geschke et John Warnock, PostScript Language - Tutorial and Cookbook, Addison & Wesley Publ., (ISBN 0-201-10179-3), « 2. The PostScript stack »
  9. (en) Burley, James Craig, « Using and Porting GNU Fortran », 1er juin 1991.
  10. Cf. par ex. Alfred V. Aho, John E. Hopcroft et Jeffrey D. Ullman (trad. J.-M. Moreau), Structures de données et algorithmes [« Data Structures and Algorithms »], Paris, InterEditions et Addison-Wesley Europe, (ISBN 2729601945), « 2. Types de données abstraites élémentaires ».
  11. Cette technique est détaillée notamment dans Bertrand Meyer et Claude Baudoin, Méthodes de programmation, Eyrolles, coll. « Études et Recherches d'EdF »,

Annexes

Bibliographie

  • [Koopman 1989] (en) Lawrence Philip Koopman, Stack Computers, New York, The Journal of Forth Application and Research, (lire en ligne).

Articles connexes

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.