Kan någon ge ett kortkodsexempel på kompilator bootstrapping? [stängd]

<åt sidan class = "s-notice s-notice__info js-post-notice mb16" role = "status">

Stängt . Den här frågan måste vara mer fokuserad . För närvarande accepteras inte svar.

Kommentarer

Svar

Låt oss säga att du skriver ett nytt programmeringsspråk med namnet ”XYZ”. Det första steget är att skriva en kompilator för detta språk. Eftersom det här nya språket inte finns ännu, skriver du kompilatorn i … kan vi säga java. Vi kommer att kalla det jxyz. Att göra den här processen är en typisk klass på college .

Nu har du ett java-program (jxyz) som tar en XYZ-källfil och producerar en körbar. Det är då möjligt att börja skriva en kompilator för XYZ i XYZ som följs av jxyz.

Vid denna tidpunkt har du en complier för XYZ som följdes av jxyz. Kalla det här programmet ”xyzFromJ”.

”xyzFromJ” borde kunna ta sig själv som en ingång och och kompilera sig själv helt och hållet ta bort allt som skapats av jxyz från beroenden och definitionen av språket. Från och med den här tiden kan alla ändringar av XYZ-språket göras på kompilatorn skriven i XYZ och sammanställas med hjälp av sig själv.

Svar

Steg 1. Skriv din kompilator på ett annat språk.
Steg 2. Kompilera koden från steg 1.
Steg 3. Skriv din kompilator på samma språk.
Steg 4. Kompilera koden från steg 3.

Upprepa steg 3-4 för ytterligare uppdateringar av din kompilator.

Observera att steg 1 och 3 kan ske samtidigt eller i en annan ordning.

Jag erkänner att detta i hög grad är en överförenkling.

Kommentarer

  • @RobertHarvey: I steg 4 specificerade jag inte vilken kompilator jag skulle använda avsiktligt så att " Upprepa steg 3-4 " blir mer meningsfullt.
  • Vann ' t steg 4 fungerar bara om du använder en kompilator som känner igen det nya språket?
  • @RobertHarvey: Ja, men jag gjorde medvetet inte ' t specif y det så att " Upprepa steg 3-4 " menade inte " kompilator från steg 1 ", eftersom detta skulle motverka syftet med övningen. Jag antog att det självklart var att du skulle använda kompilatorn från steg 1 vid den första iterationen (den ' är den enda kompilatorn du har) och kompilatorn genererade från den tidigare iterationen av steg 3 på varje ytterligare iteration.

Svar

Till skillnad från andra svar som föreslår att du skriver kompilatorn på något annat språk (förmodligen en som körs på samma maskin som du riktar dig mot), det är också möjligt (faktiskt att föredra) att skriva kompilatorn på målspråket från början.

Säg att du vill skriva en kompilator för C för en ARM-processor. Du har redan en C-kompilator som körs på Windows (Intel-arkitektur). Du skriver din nya kompilator i C, både frontend (lexikal analys och parsing) och backend (kodgenerering). Baksidan är naturligtvis skriven för att generera kod för ARM, inte Intel.

Du kompilerar sedan källan för den nya kompilatorn med den befintliga kompilatorn. När du väl är nöjd med att kompilatorn genererar giltig kod för ARM, tar du den kompilerade ARM-koden och kör den på mål-ARM-arkitekturen. Du har nu källan till den nya kompilatorn, som kan modifieras och matas in i den körbar och generera en ny version.

Denna process kallas tvärkompilering. Fördelen är att du bara har att skriva kompilatorn en gång.

Svara

från ett annat svar:

Step 1. Write your compiler in a different language. Step 2. Compile the code from Step 1. Step 3. Write your compiler in the same language. Step 4. Compile the code from step 3. 

Steg 1 och 2 behövs bara för den ”första någonsin” kompilatorn för ett nytt språk. Det finns många variationer i steg 3 och 4, så till exempel kan du skriva kodgeneratorn för en ny arkitektur, korskompilera, kör sedan samma kompilator på en ny maskin.Eller så kan du utöka din kompilator för att hantera ny syntax och konstruktioner utan att använda någon av tilläggen och sedan skriva om kompilatorn för att använda tilläggen och kompilera sig själv.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *