Batteri (datamaskin)

I databehandling er et batteri (på engelsk stack ) en datastruktur basert på "last in, first out" -prinsippet (engelsk LIFO for last in, first out ), som betyr at generelt det siste elementet, lagt til stack, vil være den første som går ut.

Systembatteri

De fleste mikroprosessorer administrerer naturlig en stabel for rutinemessige samtaler. Det tilsvarer da et område av minnet, og prosessoren beholder adressen til det siste elementet.

X86-arkitektur

I 32-biters x86- arkitekturen brukes ESP- registeret til å indikere adressen til toppen av en bunke i RAM . Den presse og pop opcodes tillate data som skal stables og unstacked hhv. De ringe og RET opcodes bruke stabelen å kalle en funksjon og deretter avslutte det, tilbake til undervisningen umiddelbart etter samtalen.

I tilfelle avbrudd stables EFLAGS-, CS- og EIP-registerene automatisk. I tilfelle en endring av prioritetsnivået under avbruddet, er også SS- og ESP-registerene.

Det finnes en annen stabel i x86-prosessorer, den til Floating Computing Unit (FPU). Mer presist, denne enheten bruker et batteri begrenset til 8 celler, og hvis drift ligner på et fat.

Elementet til det nåværende fatet heter st (0), de følgende elementene st (N) med N mellom 1 og 7. Denne stabelen gjør det mulig å utføre beregninger på en måte som en manuell kalkulator ved å stable verdiene, deretter ved å for eksempel å bruke en operasjon på de siste stablede verdiene.

Stakkbasert arkitektur

Noen prosessorer bruker ikke et generisk register , bare stabelen. Instruksjonene gjelder deretter de første elementene. For eksempel kalkulatorer Hewlett-Packard , prosessorer Focus eller mekaniske Burroughs- serien B 5000 . Instruksjonene blir da ofte kortere, fordi de ikke trenger å referere til registre. Den Java språket bytecode bruker også dette trikset.

Programmeringsspråk

I de fleste kompilerte programmeringsspråk er utførelsesstakken der noen eller alle parametrene for anropsrutiner er stablet . I tillegg lager vi et rom for lokale variabler . Batteriet er således dannet stabelrammer (på engelsk stabelrammer ) som omfatter for hver rutine som er nestet samtale, dets parametere, dets lokale variabler og returpunkt.

Noen språk, for eksempel PostScript fra Adobe eller kontroll dc Unix , implementerer en stakkmekanisme (med omvendt polsk notasjon ) for beregninger.

Primitiver

Her er primitivene som ofte brukes til å manipulere stabler. Det er ingen standardisering for primitiver med stabelmanipulering. Navnene deres er derfor angitt uformelt. Bare de tre første er veldig essensielle, de andre kan trekkes ut av det.

Algoritmer

Denne implementeringen er den som brukes i prosessorer - den er enkel og stabelen tar liten plass. En implementering i form av en koblet liste er også mulig for programmer.

algoritmer '''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)} '''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 '''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  

applikasjoner

  • De rekursive algoritmene bruker en samtalestabel. I et ikke-rekursivt språk ( Fortran for eksempel) kan vi simulere rekursjon ved å lage primitivene for å administrere en stack.
  • I en nettleser brukes en stabel til å lagre besøkte websider. Adressen til hver nye besøkte side er stablet, og brukeren åpner den gjeldende adressen for å få tilgang til forrige side ved å klikke på “Vis forrige side” -knappen.
  • Evalueringen av matematiske uttrykk i postfiksert (eller omvendt polsk ) notasjon bruker en stabel.
  • "Angre skriving" (på engelsk Angre) -funksjonen til en tekstbehandler lagrer endringer som er gjort i tekst i en bunke.
  • En grundig søkealgoritme bruker en stabel for å huske besøkte noder.
  • For eksempel kan vi invertere en matrise eller en streng med tegn ved hjelp av en stabel. Det er tilstrekkelig å stable elementene på en bunke og deretter rekonstruere den inverse matrisen (eller strengen) ved å stakke elementene.

Merknader og referanser

  1. Leksikografiske og etymologiske definisjoner av “haug” (som betyr C3) i det datastyrte franske språket , på nettstedet til National Center for Textual and Lexical Resources
  2. Pierre Marchand, “  Intern struktur av datamaskiner. Supplement: Introduction to assembler  ” , på Université de Laval - Institutt for informatikk ,høsten 2001(åpnet 6. juni 2021 )
  3. Koopman 1989 .
  4. Se f.eks. Alfred V. Aho , John E. Hopcroft og Jeffrey D. Ullman ( overs.  JM Moreau), datastrukturer og algoritmer ["datastrukturer og algoritmer"], Paris og Addison-Wesley InterEditions Europe1983( ISBN  2729601945 ) , "2. Elementære abstrakte datatyper".
  5. Denne teknikken er spesielt beskrevet i Bertrand Meyer og Claude Baudoin, Methods of programmering , Eyrolles, coll.  "EdF Studies and Research",1984

Vedlegg

Bibliografi

  • [Koopman 1989] (no) Lawrence Philip Koopman , Stack Computers , New York, The Journal of Forth Application and Research,1989( les online ).

Relaterte artikler