Kan noen gi et kort kodeeksempel på kompilator bootstrapping? [lukket]

Stengt . Dette spørsmålet må være mer fokusert . Det aksepteres for øyeblikket ikke svar.

Kommentarer

Svar

La oss si at du skriver et nytt programmeringsspråk som heter «XYZ». Det første trinnet er å skrive en kompilator for dette språket. Siden dette nye språket ikke eksisterer ennå, skriver du kompilatoren i … kan vi si java. Vi vil kalle det jxyz. Å gjøre denne prosessen er en typisk klasse på college .

Nå har du et java-program (jxyz) som tar en XYZ-kildefil og produserer en kjørbar. Det er da mulig å påta seg å skrive en kompilator for XYZ i XYZ som overholdes av jxyz.

På dette punktet har du en complier for XYZ som ble overholdt jxyz. Vel, kaller dette programmet «xyzFromJ».

«xyzFromJ» skal kunne ta seg selv som en inngang og og kompilere seg selv, og fjerne alt som er opprettet av jxyz fra avhengighetene og definisjonen av språket. Fra dette punktet kan alle endringer i XYZ-språket gjøres på kompilatoren skrevet i XYZ og kompilert ved hjelp av seg selv.

Svar

Trinn 1. Skriv kompilatoren din på et annet språk.
Trinn 2. Kompiler koden fra trinn 1.
Trinn 3. Skriv kompilatoren på samme språk.
Trinn 4. Kompiler koden fra trinn 3.

Gjenta trinn 3-4 for ytterligere oppdateringer av kompilatoren.

Merk at trinn 1 og 3 kan skje samtidig eller i en annen rekkefølge.

Jeg innrømmer at dette veldig mye er en forenkling.

Kommentarer

  • @RobertHarvey: I trinn 4 spesifiserte jeg ikke hvilken kompilator jeg skulle bruke med vilje slik at " Gjenta trinn 3-4 " vil være mer fornuftig.
  • Vant ' Trinn 4 fungerer bare hvis du bruker en kompilator som gjenkjenner det nye språket?
  • @RobertHarvey: Ja, men jeg gjorde bevisst ikke ' t spesif y det slik at " Gjenta trinn 3-4 " ikke betydde " kompilator fra trinn 1 ", da dette ville beseire formålet med øvelsen. Jeg antok at det gikk uten å si at du skulle bruke kompilatoren fra trinn 1 på den første iterasjonen (den ' er den eneste kompilatoren du har) og kompilatoren generert fra forrige iterasjon av trinn 3 på hver ekstra iterasjon.

Svar

I motsetning til noen andre svar som foreslår at du skriver kompilatoren på et annet språk (antagelig en som kjører på samme maskin du målretter mot), er det også mulig (faktisk å foretrekke) å skrive kompilatoren på målspråket fra begynnelsen.

Si at du vil skrive en kompilator for C for en ARM-prosessor. Du har allerede en C-kompilator som kjører på Windows (Intel-arkitektur). Du skriver den nye kompilatoren din i C, både frontend (leksikalanalyse og parsing) og backend (kodegenerering). Baksiden er selvfølgelig skrevet for å generere kode for ARM, ikke Intel.

Du kompilerer deretter kilden for den nye kompilatoren med den eksisterende kompilatoren. Når du er fornøyd genererer kompilatoren gyldig kode for ARM, tar du den kompilerte ARM-koden og kjører den på mål-ARM-arkitekturen. Du har nå kilden til den nye kompilatoren, som kan endres og mates inn i den kjørbar og generere en ny versjon.

Denne prosessen kalles kryss-kompilering. Fordelen er at du bare har å skrive kompilatoren en gang.

Svar

fra et annet 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. 

Trinn 1 og 2 er bare nødvendig for den «aller første» kompilatoren for et nytt språk. Det er mange variasjoner på trinn 3 og 4, så for eksempel kan du skrive kodegeneratoren for en ny arkitektur, krysskompilere, og kjør deretter samme kompilator på en ny maskin.Eller du kan utvide kompilatoren din til å håndtere ny syntaks og konstruksjoner uten å bruke noen av utvidelsene, og deretter skrive kompilatoren om for å bruke utvidelsene og kompilere seg selv.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *