Grundblock - Basic block

I kompilerkonstruktionen är ett grundblock en rak linjär kodsekvens utan grenar in utom posten och inga grenar ut utom vid utgången. Denna begränsade form gör ett grundläggande block mycket lämpligt för analys. Kompilatorer sönderdelar vanligtvis program i sina grundläggande block som ett första steg i analysprocessen. Grundblock utgör hörn eller noder i ett kontrollflödesdiagram .

Definition

Koden i ett grundblock har:

  • En ingångspunkt , vilket betyder att ingen kod i den är destinationen för en hoppinstruktion var som helst i programmet.
  • En utgångspunkt, vilket betyder att endast den sista instruktionen kan få programmet att börja köra i ett annat grundblock.

Under dessa omständigheter, närhelst den första instruktionen i ett grundläggande block utförs, utförs nödvändigtvis resten av instruktionerna exakt en gång, i ordning.

Koden kan vara källkod , monteringskod eller någon annan sekvens av instruktioner.

Mer formellt bildar en sekvens av instruktioner ett grundläggande block om:

  • Instruktionen i varje position dominerar eller utför alltid alltid alla i senare positioner.
  • Ingen annan instruktion utförs mellan två instruktioner i sekvensen.

Denna definition är på vissa sätt mer allmän än den intuitiva. Till exempel tillåter det ovillkorliga hopp till etiketter som inte riktas till andra hopp. Denna definition förkroppsligar egenskaperna som gör det enkelt att arbeta med grundläggande block när man konstruerar en algoritm.

Blocken till vilka kontrollen kan överföras efter att ha nått slutet av ett block kallas blockets efterträdare , medan blocken från vilka kontrollen kan ha kommit när de går in i ett block kallas blockets föregångare . Början på ett grundläggande block kan hoppas till från mer än en plats.

Skapningsalgoritm

Den algoritm för att generera grundläggande kvarter från en lista över koden är enkel: analysatorn skannar över koden, märkning blockgränserna , vilka är instruktioner som antingen kan börja eller avsluta ett block eftersom de antingen överföringskontroll eller acceptera styrning från en annan punkt. Sedan "listas" helt enkelt på var och en av dessa punkter, och grundblock kvarstår.

Observera att denna metod inte alltid genererar maximala grundblock enligt den formella definitionen, men de är vanligtvis tillräckliga (maximala grundblock är grundblock som inte kan förlängas genom att inkludera intilliggande block utan att bryta mot definitionen av ett grundblock).

Input : En sekvens av instruktioner (mestadels treadresskod ).
Output : En lista över grundläggande block med varje tre-adress-uttalande i exakt ett block.

  1. Identifiera ledarna i koden. Ledare är instruktioner som faller under någon av följande tre kategorier:
    1. Det är den första instruktionen. Den första instruktionen är en ledare.
    2. Målet för en villkorlig eller ovillkorlig goto / hoppinstruktion är en ledare.
    3. Instruktionen som omedelbart följer en villkorlig eller en ovillkorlig goto / hoppinstruktion är en ledare.
  2. Från och med en ledare är uppsättningen av alla följande instruktioner till och med nästa ledare det grundläggande blocket som motsvarar startledaren. Således har varje grundblock en ledare.

Instruktioner som avslutar ett grundläggande block inkluderar följande:

  • ovillkorliga och villkorade grenar , både direkta och indirekta
  • återgår till ett anropsförfarande
  • instruktioner som kan orsaka ett undantag
  • funktionsanrop kan vara i slutet av ett grundläggande block om de inte kan återvända, såsom funktioner som kastar undantag eller speciella samtal som C : s longjmp och exit
  • själva returinstruktionen.

Instruktioner som börjar ett nytt grundblock inkluderar följande:

  • procedur och funktionsingångspunkter
  • mål för hopp eller grenar
  • "instruktioner" som följer några villkorliga grenar
  • instruktioner som följer sådana som ger undantag
  • undantagshanterare.

Observera att, eftersom kontroll aldrig kan passera genom slutet av ett grundläggande block, kan vissa blockgränser behöva ändras efter att ha hittat grundblocken. I synnerhet måste fallande villkorliga grenar ändras till tvåvägsgrenar, och funktionsanrop som kastar undantag måste ha lagt till villkorslösa hopp efter dem. Att göra detta kan kräva att du lägger till etiketter i början av andra block.

Se även

Referenser

externa länkar