Vad är kusiner av kompilator?

KUSINER AV KOMPILATORN ÄR

  1. Preprocessor.
  2. Assembler.
  3. Lastare och länk-redaktör.

PREPROCESSOR

En preprocessor är ett program som behandlar dess indata för att producera utdata som används som indata till ett annat program. Utdata är sa till vara en förbehandlat form av indata, som ofta används av vissa efterföljande program som kompilatorer. Förbehandlingen utförs innan verklig kompilering av kod börjar därför preprocessor smälter alla dessa direktiv innan någon kod genereras av uttalanden.

De får utföra följande funktioner

1. makro bearbetning
2. fil integration
3. "rationell förbehandling
4. språk förlängning

1. makro bearbetning:
Ett makro är en regel eller mönster som anger hur en viss ingående sekvens (ofta en sekvens av tecken) bör mappas till en output sekvens (ofta även en sekvens av tecken) enligt ett definierat förfarande. Mappningsprocessen som instansierar (transformeringar) ett makro till en viss utdata sekvens som kallas makro expansion.  makrodefinitioner (#define, #undef) för att definiera preprocessor makron kan vi använda #define. Dess format är:

#define identifierare ersättning
När förbehandlingen stöter på detta direktiv, ersätter alla förekomster av identifierare i resten av koden genom ersätter. Denna ersättning kan vara ett uttryck, ett uttalande, ett block eller helt enkelt någonting. Förbehandlingen förstår inte C++, den ersätter helt enkelt någon förekomst av identifierare av ersättning. #define TABLE_SIZE 100 int Tabell1 [TABLE_SIZE];
int Tabell2 [TABLE_SIZE];
Efter förbehandlingen har ersatt TABLE_SIZE, koden blir motsvarar: int Tabell1 [100];
int Tabell2 [100];

2. filen integration:

Preprocessor innehåller header-filer till programmet texten. När förbehandlingen finner en direktivet #include ersätts det av hela innehållet i den angivna filen. Det finns två sätt att ange en fil ska ingå:

#include "fil"
#include

Den enda skillnaden mellan båda uttrycken är de platser (kataloger) där kompilatorn ska söka efter filen. I det första fallet där namnet anges mellan citattecken, genomsöks filen först i samma katalog som innehåller den fil som innehåller direktivet. I fall att det inte är där, söker kompilatorn filen i standardkataloger där det har konfigurerats för att leta efter standard header-filer.
Om namnet är innesluten mellan vinkelparenteser <> filen söks direkt där kompilatorn är konfigurerad för att leta efter standard header-filer. Därför är standard header-filer vanligtvis ingår i vinkelparenteser, medan andra specifika header-filer som inkluderats med citat.

3. "rationell förbehandling:

Dessa processorer öka äldre språk med mer moderna flödet av kontroll- och strukturera faciliteter. Till exempel kan en preprocessor ger användaren med inbyggda makron för konstruktioner som tag-uttalanden eller if-satser, där ingen finns i programmeringsspråket själv.

4. språk förlängning:
Dessa processorer försöka lägga resurser till språket av vad som utgör inbyggda makron. Till exempel språk lika är en databas frågespråk inbäddade i C. uttalanden tiggeri med ## tas av förbehandlingen vara databas tillgång uttalanden utan samband med C och översätts till proceduranrop på rutiner som utför databasåtkomsten.
Uppförandet av kompilatorn beträffande tillägg förklaras med direktivet #extension: #extension extension_name: beteende #extension alla: beteende

extension_name är namnet på en förlängning. Alla token innebär att den angivna beteendet bör gälla alla tillägg stöds av kompilatorn.

ASSEMBLER
Vanligen skapar en modern assembler objektkoden genom att översätta församlingen instruktion mnemonics till opcodes och genom att lösa symboliska namn för minnesplatser och andra enheter. Användning av symboliska referenser är ett centralt inslag i montörer, spara tråkiga beräkningar och manuell adress uppdateringar efter programmet modifieringar. De flesta montörer också inkluderar makro för att utföra textmässiga ersättning-exempelvis för att generera gemensamma korta sekvenser av instruktioner som infogad, i stället för kallas subrutiner, eller ens generera hela program eller program suites.
Det finns två typer av montörer baserat på hur många pass genom källa behövs för att producera det körbara programmet.

  • En-pass montörer gå igenom källkoden en gång och förutsätter att alla symboler definieras innan någon instruktion som refererar till dem.
  • Två-pass montörer skapar en tabell med alla symboler och deras värden i det första passet och sedan använda tabellen i ett andra pass för att generera kod. Assembler måste åtminstone kunna bestämma längden på varje instruktion vid första passet så att adresserna till symboler kan beräknas.

Fördelen med en en-pass assembler är hastighet, vilket inte är lika viktigt som det en gång var med framstegen inom datorhastighet och kapacitet. Fördelen med den två-pass assembler är att symboler kan definieras någonstans i programmet källan. Som ett resultat, kan programmet definieras på ett mer logiskt och meningsfullt sätt. Detta gör två-pass assembler program lättare att läsa och underhålla

LINKERS OCH LASTMASKINER
En länkare eller link editor är ett program som tar ett eller flera objekt genereras av en kompilator och kombinerar dem till ett enda körbara program.
Tre uppgifter
1. söker programmet att hitta biblioteket rutiner används av program, e.g. printf(), matematik rutiner.
2. bestämmer minnet platser som kod från varje modul kommer att sysselsätta och flyttar sina instruktioner genom att justera absoluta referenser
3. löser referenser bland filer Loader
En loader är en del av ett operativsystem som är ansvarig för lastning program, en av de grundläggande stegen i processen att starta ett program. Laddar ett program innebär att läsa innehållet i körbar fil, den fil som innehåller programmet texten, i minnet, och sedan bära ut andra krävs förberedande uppgifter att förbereda den körbara filen för löpning. När inläsningen är klar, startar operativsystemet programmet genom att skicka kontroll till laddade programkoden.
Alla operativsystem som stöder program lastning har lastare, förutom system där koden körs direkt från ROM eller vid högspecialiserade datorsystem som bara har en fast uppsättning specialiserade program.
Många operativsystem är lastaren permanent bosatt i minnen, även om vissa operativsystem som stöder virtuella minnet får tillåta lastaren ska vara placerad i en region av växlingsbart minne.
När det gäller operativsystem som stöder virtuellt minne, lastaren inte faktiskt kan kopiera innehållet i körbara filer i minnet, men ganska enkelt förklara delsystemet virtuellt minne att det finns en mappning mellan en del av minnet som allokerats för att innehålla den löpande program kod och innehållet i den associerade körbara filen. I virtuella minnessystem görs sedan sidor med regionen minne måste fyllas på begäran om och när programkörningen faktiskt träffar de områdena ofyllda minne. Detta kan innebära att delar av ett program kod inte kopieras faktiskt i minnet tills de faktiskt används och oanvända kod kan aldrig vara laddade i minnet alls.

Steg för lastare:
-Läsa körbara filens header för att bestämma storleken på text och data segment
-Skapa en ny adressutrymme för programmet
-Kopierar instruktioner och data till adressutrymme
-Kopierar argument skickades till programmet på stacken
-Initierar maskin register inklusive stack ptr
-Hoppar till en start rutin som kopierar programmets argument från stacken till register och kallar programmets huvudsakliga rutin