Pile (informatique)

{{#ifeq:||Un article de Ziki, l'encyclopédie libre.|Une page de Ziki, l'encyclopédie libre.}}

Modèle:Voir homonymes 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 Modèle:Lang), ce qui veut dire qu'en général, le dernier élément ajouté à la pile est le premier à en sortir<ref>Modèle:CNRTL</ref>.

Fichier:Stack (data structure) LIFO.svg
Schémas d'une pile gérée en Modèle:Lang.

Pile système

La plupart des microprocesseurs gèrent nativement une pile pour les appels de routine<ref name="Zaks">C'est le cas pour le MOS Technology 6502 et le Z80 de Zilog : Modèle:Ouvrage ; pour les processeurs de la famille x86, cf. Modèle:Ouvrage</ref>. 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 Modèle:Unité, le registre ESP sert à indiquer l'adresse du sommet d'une pile dans la mémoire vive<ref name="Erickson">Cf. Erickson, Modèle:Opcit p. 42</ref>. 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<ref name="Marchand">Modèle:Lien web</ref>.

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

Modèle:Loupe 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<ref name="Zanotti">Modèle:Lien web</ref>, les processeurs Focus, ou les machines Burroughs de la gamme B 5000<ref name="Mayer">Modèle:Article.</ref>. Les instructions sont alors souvent plus courtes, car elles n'ont pas à référencer des registresModèle:Sfn. 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 Modèle:Lang) 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<ref name="BlueBook">Modèle:Ouvrage</ref> 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<ref>{{#invoke:Langue|indicationDeLangue}} Burley, James Craig, « Modèle:Langue », Modèle:1er juin 1991.</ref>.

Primitives

Fichier:PrimitivesPile.png
Les deux primitives de base

Voici les primitives communément utilisées pour manipuler des piles<ref name="Aho, Hopcroft & Ullman">Cf. par ex. Modèle:Ouvrage.</ref> :

  • « Empiler » : ajoute un élément sur la pile. Le terme anglais correspondant est Modèle:Lang.
  • « 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. Modèle:Boîte déroulante/début <syntaxhighlight lang="text">

Classe Pile
Attributs :
    pile   : tableau[1, MAX] de Objet
    sommet : entier {indice du dernier element entre}
Methodes
    Mprocédure PUSH(element)            {entre un element (Objet)}
    Mfonction  POP() retourne Objet     {sort un Objet} 
    {non données ici}
    Mfonction  FULL() retourne booleen  {la pile est-elle pleine ? (retourne sommet >= MAX)}
    Mfonction  EMPTY() retourne booleen {la pile est-elle vide ? (retourne sommet <= 0)}
    Mfonction  SIZE() retourne entier   {retourne le nombre d'elements (retourne sommet)}
    Mprocedure INIT()                   {constructeur (met sommet à 0)}

</syntaxhighlight>

<syntaxhighlight lang="text">

Mprocédure PUSH (element)
{ajouter un élément sur la pile}
Paramètres :
   (D)   element : Objet
   (D/R) cible   : Pile
Début
   Si cible.sommet <= MAX
   Alors
      cible.sommet <- cible.sommet + 1
      cible.pile[cible.sommet] <- element
   Sinon
      afficher("Pile pleine")
   Fsi
Fin

</syntaxhighlight>

<syntaxhighlight lang="text">

Mfonction POP () retourne objet
{enlever un élément de la pile et le renvoyer}
Paramètres :
   (D/R) cible : Pile
Variables :
   Element : objet
Début
   Si cible.sommet > 0
   Alors
      Element <- cible.pile[cible.sommet]
      cible.sommet <- cible.sommet - 1
   Sinon
      afficher("Pile vide")
   Fsi
   Retourner Element
Fin

</syntaxhighlight> Modèle:Boîte déroulante/fin

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<ref name="Meyr-Baudw1">Cette technique est détaillée notamment dans Modèle:Ouvrage</ref>.
  • 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<ref name="Zanotti"/>.
  • 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<ref name="Aho, Hopcroft & Ullman"/>. 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

Modèle:Références

Annexes

Bibliographie

Articles connexes

Modèle:Palette Modèle:Portail