Tenta januari 2025 Flashcards
Vad ingår i symboltabellen?
- The lexemeitself
- Corresponding token
*Its semantic component(e.g.,variable,operator, constant, functions, procedure, etc.) - Datatype
- Pointers to oth erentries(when necessary)
Namn: Identifierare
Datatyp: Exempelvis int, float, string, etc.
Scope: Omfattning, t.ex. global, lokal eller block.
Minnesadress: Var identifieraren lagras.
Attribut: Extra information, som storlek, parametrar, och modifierare (t.ex. const, static).
Referenser: Var identifieraren används i koden.
Synlighet: Åtkomstspecifikationer
The interaction between the Symbol Table and the phases of a compiler
Virtually every phase of the compiler will use the symbol table.
Lexikal analys använder symboltabellen för att lägga till identifierare när de upptäcks.
Syntaxanalys använder symboltabellen för att verifiera att identifierare används korrekt enligt språkets syntax.
Semantisk analys använder symboltabellen för att kontrollera typer, scope och deklarationer av identifierare.
Generering av mellanliggande kod använder symboltabellen för att hämta information om identifierares typer och adresser.
Optimering använder symboltabellen för att analysera och eliminera överflödig kod eller redundant användning av identifierare.
Kodgenerering använder symboltabellen för att tilldela minnesadresser eller register till identifierare.
- The initialization phase will place keywords, operators, and standard identifiers in it.
- The scanner will place user-defined identifiers and literals in it and will return the corresponding token.
- The parser uses these token to create the parse tree, the product of the syntactic analysis of the program.
- The semantic action routines place data type in its entries and uses this information in performing basic type- checking.
- Theintermediatecodegenerationphaseuse pointers to entries in the symbol table in creating the intermediate representation of the program
- Theobjectcodegenerationphaseusespointersto entries in the symbol table in allocating storage for its variables and constants, as well as to store the addresses of its procedures and functions.
Vilka är alla kompilatorns faser i ordning
Lexical analyzer(Scanner), Parser, Semantic analyzer, Intermediate code generation, Machine independent code optimizer, Code generator, Machine dependent code
optimizer
Ge skillnad på en machine independent optimiering och en machine dependant optimering:
Machine Independent Optimization
Fokus ligger på att förbättra koden utan att ta hänsyn till den specifika maskinarkitekturen.
Exempel: Eliminering av död kod, loopunrolling, och gemensam subuttryckseliminering.
Machine Dependent Optimization
Fokus ligger på att anpassa koden för att utnyttja den specifika maskinens arkitektur och egenskaper.
Exempel: Tilldelning av register, utnyttjande av specifika CPU-instruktioner och pipelineoptimering.
Input Output Faserna
L: Source code as a sequence of characters -> tokens (keys, id, symbols)
P: Tokens -> Parse tree (abstract syntax tree)
S: Parse Tree -> Annoted Syntax Tree (type checks, scope info)
I: Annoted syntax tree -> Intermediate Code Representation (simple machine independent)
IO:Optimized intermediate representation
CG: Target Code in assembly(machine code)
DO: Optimized assembly (machine)
Kodens utveckling från start till slut i kompilator
Source code as sequence of characters
Tokens
Parse Tree (Abstract syntax tree)
Annoted Syntax Tree
Intermediate Code Representation
Optimized IR
Target code
Optimized Target Code
Copy propagation
Copy propagation är en optimeringsteknik där onödiga kopior av variabler tas bort. Om en variabel bara används som en kopia av en annan, ersätts den med originalvariabeln
t1 = a
t2 = t1
c = t2 + b
->
c = a + b
Syntax-directed translation table
Produktionerna och dess regler
Skillnad på proceduranrop proceduraktivering
Proceduranrop är när ett program anropar en funktion eller procedur för att exekvera den, medan proceduraktivering är den faktiska processen när kontrollen övergår till den anropade proceduren och dess exekvering börjar.
Skillnad på kontrolllänk och processlänk
En kontrolllänk är en länk som används för att hålla reda på var exekveringen ska fortsätta efter att en procedur har avslutats.
En accesslänk är en länk som kopplar till de lokala variablerna i en procedur eller funktion för att ge åtkomst till dem under exekveringen.
Statisk och dynamisk namnuppslagning
Statisk namnuppslagning sker vid kompileringstid, där variabelnamn och deras adresser bestäms innan programmet körs.
Dynamisk namnuppslagning sker vid körningstid, där variabelnamn och deras adresser bestäms under programmets exekvering beroende på programmets tillstånd.
Call by Value:
Skickar en kopia av argumentet till funktionen.
Call by Need: Liknar call by name, men utvärderar uttrycket bara när det behövs.
Macro Expansion: Ersätter ett makro med dess definition vid preprocessor-steget.
Call by Reference:
Skickar en referens till argumentet, vilket gör att funktionen kan ändra det.
Call by Name:
Skickar uttrycket till funktionen för att utvärdera det varje gång det används.
Call by Need:
Liknar call by name, men utvärderar uttrycket bara när det behövs.
Macro Expansion:
Ersätter ett makro med dess definition vid preprocessor-steget.
Skärpsamling
Skräpsamling (garbage collection) är en automatisk process som frigör minne genom att identifiera och ta bort objekt eller resurser som inte längre används eller är åtkomliga i ett program. Detta förhindrar minnesläckor genom att säkerställa att oanvänd minnesresurs återanvänds.
Skärp
Ej nåbar. data
Mark and sweep
Mark and Sweep är en skräpsamlingsalgoritm som består av två faser. I markeringfasen markeras alla objekt som kan nås från aktiva referenser som “levande”. Under sopningsfasen tas alla objekt som inte är markerade bort och deras minne frigörs. Processen är en stop-the-world-operation, vilket innebär att programmet stannar för att säkerställa att inga referenser ändras under markeringen och sopningen. Algoritmen kan vara ineffektiv eftersom den måste genomgå hela minnet varje gång och stoppa exekveringen, vilket kan orsaka fördröjning.
Varianter av mark and sweep
generationer, inkementell, trådad
Förklara vad och en av varianterna av mark and sweep
Generationer: äldre körs enbart var 100e gång, med 2 generationer så kan de råka hamna i äldre fast de bara hade kort livslängd, därför kör man ofta 3
Inkrementell: reda på hur långt vi kommit, kan stoppa mitt i och fortsätta med programmet, hålla koll noga vart man är
Trådad: trådad stör inte huvudtråden men använder cachen, sämgre cache på huvudtråd
Annan metod ön mark and sweep
Referensräkning: rotmängd, håller reda på hur många pekare till varje objekt, cirkulära datastrukturer ligger kvar för alltid, sätt ihop med mark and sweep, sämre prestanda behöver gå huller om buller i minnet.
Konservativ skärpsamling: Följa adresser i rotmängden i adress rymden, BOHM
Skillnad på statiska och dynamiska kontroller
Statiska kontroller: vid kompileringstillfälle genom att kolla på koden, statiska fel syns exempel int i, *i=2, i är ingen pekare, vill gärna ha statisk kontroll pga upptäcka fel så tidigt som möjligt.
Dynamiska kontroller: när programmet körs, vissa fel upptäcks inte förrens det körs, exempel objektorienterad programmering och en funktion inte finns i grunden och man castar så djuret verkligen är en hund, så kommer kompilatorn lägga en kontroll och kolla så det verkligen är en hund, kan bara kollas vid körningstillfälle
Skillnad på stark och svag typning
Svag typning: går runt typkontroll
Stark typning: Mer strikt; kräver explicit typkonvertering. Säker men mindre flexibel.
Svag typning: Mer flexibel; kan automatiskt konvertera typer. Mindre säker men snabbare att skriva.