Leg het concept van een stapelframe in een notendop uit

Het lijkt erop dat ik het idee krijg van call-stackin programmeertaalontwerp. Maar ik kan (waarschijnlijk, ik zoek gewoon niet hard genoeg) geen fatsoenlijke uitleg vinden over wat stack frameis.

Dus ik zou iemand willen vragen om het me in een paar woorden uit te leggen.


Antwoord 1, autoriteit 100%

Een stapelframe is een gegevensframe dat op de stapel wordt geduwd. In het geval van een aanroepstack, zou een stapelframe een functieaanroep en zijn argumentgegevens vertegenwoordigen.

Als ik het me goed herinner, wordt het retouradres van de functie eerst op de stapel geduwd, daarna de argumenten en ruimte voor lokale variabelen. Samen vormen ze het ‘frame’, hoewel dit waarschijnlijk architectuurafhankelijk is. De processor weet hoeveel bytes er in elk frame zitten en verplaatst de stapelaanwijzer dienovereenkomstig wanneer frames worden geduwd en van de stapel worden gehaald.

BEWERKEN:

Er is een groot verschil tussen call-stacks van een hoger niveau en de call-stack van de processor.

Als we het hebben over de aanroepstack van een processor, hebben we het over het werken met adressen en waarden op byte/woordniveauin assembly of machinecode. Er zijn “call-stacks” als we het hebben over talen op een hoger niveau, maar ze zijn een debugging/runtime-tool die wordt beheerd door de runtime-omgeving, zodat je kunt loggen wat er mis is gegaan met je programma (op een hoog niveau). Op dit niveau zijn zaken als regelnummers en namen van methoden en klassen vaak bekend. Tegen de tijd dat de processor de code ontvangt, heeft hij absoluut geen idee van deze dingen.


Antwoord 2, autoriteit 45%

Als je stack heel goed begrijpt, zul je begrijpen hoe geheugen in een programma werkt en als je begrijpt hoe geheugen in programma werkt, zul je begrijpen hoe functies worden opgeslagen in programma en als je begrijpt hoe functies worden opgeslagen in programma, zul je begrijpen hoe recursief functioneren werkt en als je begrijpt hoe recursieve functie werkt, zul je begrijpen hoe compiler werkt en als je begrijpt hoe compiler werkt, werkt je geest als compiler en kun je elk programma heel gemakkelijk debuggen

Laat me uitleggen hoe stapelen werkt:

Eerst moet je weten hoe functies in de stapel worden weergegeven:

Heap slaat dynamisch toegewezen waarden op.
Stack slaat automatische toewijzings- en verwijderingswaarden op.

Laten we een voorbeeld nemen:

def hello(x):
    if x==1:
        return "op"
    else:
        u=1
        e=12
        s=hello(x-1)
        e+=1
        print(s)
        print(x)
        u+=1
    return e
hello(4)

Begrijp nu delen van dit programma:

Laten we nu eens kijken wat stapel is en wat stapeldelen zijn:

Toewijzing van de stapel :

Onthoud een ding: als teruggave toestand een functie’s wordt voldaan, ongeacht het is de lokale variabelen geladen of niet, het zal onmiddellijk terug te keren van stapel met zijn stack frame. Het betekent dat wanneer een recursieve functie get basis voorwaarde is voldaan en we zetten een terugkeer na voetstuk staat, zal de basis voorwaarde niet wachten om lokale variabelen die zich bevinden in het “anders” onderdeel van het programma te laden. Het zal onmiddellijk terug het huidige frame van de stapel waarna het volgende frame is nu in de activeringsrecord.

Zie dit in de praktijk:

deallocatie van het blok:

Dus nu wanneer een functie ontmoetingen verklaring terug te keren, te verwijderen het huidige frame van de stapel.

Bij het terugkeren van de stapel, waarden terug in omgekeerde van de oorspronkelijke volgorde waarin ze in de stack waren toegewezen.


Antwoord 3, Autoriteit 22%

Een snelle wrap up. Misschien heeft iemand een betere verklaring.

Een call stack bestaat uit 1 of meerdere verschillende stack frames. Elke stack frame correspondeert met een oproep naar een functie of procedure die nog met een rendement heeft beëindigd.

Een stackframe gebruiken, een draad houdt twee pointers, men de stapel aanwijzer (SP) genoemd en de andere wordt de framepointer (FP). SP altijd naar de “top” van de stack en FP altijd wijst naar de “top” van het frame. Daarnaast is de draad onderhoudt ook een programma counter (PC), die wijst op de volgende instructie uit te voeren.

Het volgende worden op de stapel opgeslagen: lokale variabelen en tijdschalen, werkelijke parameters van de huidige instructie (procedure, functie, enz.)

Er zijn verschillende roepconventies met betrekking tot het reinigen van de stapel.


Antwoord 4, Autoriteit 7%

“Een oproepstapel is samengesteld uit stapelframes …” & nbsp; – & nbsp; wikipedia

Een stapelframe is iets dat u op de stapel opzet. Het zijn gegevensstructuren die informatie bevatten over subroutines om te bellen.


Antwoord 5, Autoriteit 2%

Programmeurs kunnen vragen hebben over stapelframes niet op een brede termijn (dat het een singe-entiteit is in de stapel die slechts één functie-oproep dient en retouradres, argumenten en lokale variabelen behouden), maar in een smalle zin – wanneer de term is stack frameswordt vermeld in de context van compiler-opties.

Of de auteur van de vraag het heeft betekend of niet, maar het concept van een stapelframe van het aspect van compiler-opties is een zeer belangrijke kwestie, die hier niet wordt gedekt door de andere antwoorden.

Bijvoorbeeld, Microsoft Visual Studio 2015 C / C++ Compiler heeft de volgende optie gerelateerd aan stack frames:

  • / oy (frame-pointer weglating)

GCC hebben het volgende:

  • -fomit-frame-aanwijzer (houd de frame-aanwijzer niet in een register voor functies die er geen nodig hebben. Dit vermijdt de instructies om frame aanwijzingen op te slaan, in te stellen en te herstellen. Het maakt ook een extra register beschikbaar in veel functies)

Intel C++ Compiler heeft het volgende:

  • -fook-frame-aanwijzer (bepaalt of EBP wordt gebruikt als een algemeen doel-register in optimalisaties)

die de volgende alias heeft:

  • / oy

DELPHI heeft de volgende opdrachtregeloptie:

  • – $ W + (genereer stapelframes)

In dat specifieke zin, vanuit het perspectief van de compiler, is een stapelframe slechts de -invoer- en exitcode voor de routine , die een anker naar de stapel duwt – die ook kan worden gebruikt voor debugging en voor het hanteren van uitzondering. Debuggenhulpmiddelen kunnen de stapelgegevens scannen en deze ankers gebruiken voor backtracing, terwijl u call sitesin de stapel bevindt, d.w.z. om namen van de functies weer te geven in de volgorde waarin ze hiërarchisch zijn genoemd. Voor Intel-architectuur is het push ebp; mov ebp, espOF enterVOOR INTRIJD EN mov esp, ebp; pop ebpOF leaveVOOR EXIT.

Daarom is het erg belangrijk om te begrijpen voor een programmeur waarvoor een stapelframe zich bevindt als het gaat om compiler-opties – omdat de compiler kan bepalen of deze code of niet kan genereren.

In sommige gevallen kan het stapelframe (invoer- en exitcode voor de routine) door de compiler worden weggelaten en de variabelen worden rechtstreeks toegankelijk via de stapelpointer (SP / ESP / ESP / RSP) in plaats van de handige basisaanwijzer (BP / ESP / RSP).
Voorwaarden voor het weglaten van het stapelframe, bijvoorbeeld:

  • De functie is een blad-functie (d.w.z. een end-entiteit die geen andere functies belt);
  • Er zijn geen try / eindelijk of probeer / behalve of soortgelijke constructies, d.w.z. geen uitzonderingen worden gebruikt;
  • Er worden geen routines genoemd met uitgaande parameters op de stapel;
  • De functie heeft geen parameters;
  • De functie heeft geen inline assembly-code;
  • etc …

Het weglaten van stackframes (invoer- en exitcode voor de routine) kan de code kleiner en sneller maken, maar het kan ook een negatief effect hebben op het vermogen van de debuggers om de gegevens in de stapel terug te vinden en deze aan de programmeur weer te geven. Dit zijn de compileropties die bepalen onder welke voorwaarden een functie de entry- en exitcode moet hebben, bijvoorbeeld: (a) altijd, (b) nooit, (c) wanneer nodig (specificatie van de voorwaarden).


Antwoord 6

Stapelframe is de ingepakte informatie met betrekking tot een functieaanroep. Deze informatie omvat over het algemeen argumenten die aan de functie zijn doorgegeven, lokale variabelen en waar terug te keren bij beëindiging. Activeringsrecord is een andere naam voor een stapelframe. De lay-out van het stackframe wordt door de fabrikant in de ABI bepaald en elke compiler die de ISA ondersteunt, moet aan deze standaard voldoen, maar het lay-outschema kan compilerafhankelijk zijn. Over het algemeen is de grootte van het stapelframe niet beperkt, maar er is een concept genaamd “rode/beschermde zone” om systeemaanroepen … enz. uit te voeren zonder een stapelframe te verstoren.

Er is altijd een SP, maar op sommige ABI’s (bijvoorbeeld ARM’s en PowerPC’s) is FP optioneel. Argumenten die op de stapel moesten worden geplaatst, kunnen alleen worden gecompenseerd met behulp van de SP. Of een stapelframe wordt gegenereerd voor een functieaanroep of niet, hangt af van het type en het aantal argumenten, lokale variabelen en hoe lokale variabelen in het algemeen worden benaderd. Op de meeste ISA’s worden eerst registers gebruikt en als er meer argumenten zijn dan registers die speciaal zijn bedoeld om argumenten door te geven, worden deze op de stapel geplaatst (bijvoorbeeld x86 ABI heeft 6 registers om integerargumenten door te geven). Daarom hebben sommige functies soms geen stapelframe nodig om op de stapel te worden geplaatst, maar wordt alleen het retouradres op de stapel geduwd.

Other episodes