Kommentarer
- Se Wikipedia-artiklerne om Self-Hosting og Compiler Bootstrapping .
- Se også programmers.stackexchange.com/questions/167277
- De giver kun et overblik, jeg er opmærksom på bootstrapping og self-hosting-program, men vil se på nogle enkle eksempler
- rano. org / bcompiler.html
- se også: Hvorfor betragtes kompilatorer for selvhosting som en overgangsritual for nye sprog?
Svar
Lad os sige, at du skriver et nyt programmeringssprog ved navn “XYZ”. Det første trin er at skrive en kompilator til dette sprog. Da dette nye sprog ikke eksisterer endnu, skriver du compileren på … lad os sige java. Vi kalder det jxyz. At udføre denne proces er en typisk klasse på college .
Nu har du et java-program (jxyz), der tager en XYZ-kildefil og producerer en eksekverbar. Det er derefter muligt at påtage sig at skrive en compiler til XYZ i XYZ, der overholdes af jxyz.
På dette tidspunkt har du en complier til XYZ, der blev overholdt jxyz. Nå kald dette program “xyzFromJ”.
“xyzFromJ” skal være i stand til at tage sig selv som et input og og kompilere sig selv fuldstændigt fjerne alt skabt af jxyz fra afhængighederne og definitionen af sproget. Fra dette tidspunkt kan enhver ændring af XYZ-sproget gøres på compileren skrevet i XYZ og kompileres ved hjælp af sig selv.
Svar
Trin 1. Skriv din compiler på et andet sprog.
Trin 2. Kompilér koden fra trin 1.
Trin 3. Skriv din compiler på det samme sprog.
Trin 4. Kompilér koden fra trin 3.
Gentag trin 3-4 for yderligere opdateringer til din compiler.
Bemærk, at trin 1 og 3 kan ske samtidigt eller i en anden rækkefølge.
Jeg indrømmer, at dette i høj grad er en overforenkling.
Kommentarer
- @RobertHarvey: I trin 4 specificerede jeg ikke, hvilken kompilator jeg skulle bruge med vilje, så " Gentag trin 3-4 " giver mere mening.
- Vandt ' t trin 4 fungerer kun, hvis du bruger en compiler, der genkender det nye sprog?
- @RobertHarvey: Ja, men jeg gjorde bevidst ikke ' t specif y det, så " Gentag trin 3-4 " ikke betød " brug kompilator fra trin 1 ", da dette ville besejre formålet med øvelsen. Jeg antog, at det sagde sig selv, at du skulle bruge compileren fra trin 1 på den første iteration (den ' er den eneste compiler, du har), og compileren genereret fra den tidligere iteration af trin 3 på hver yderligere iteration.
Svar
I modsætning til nogle andre svar, der foreslår at skrive kompilatoren på et andet sprog (formodentlig en, der kører på den samme maskine, du målretter mod), er det også muligt (faktisk at foretrække) at skrive compileren på målsproget fra begyndelsen.
Sig, at du vil skrive en compiler til C til en ARM-processor. Du har allerede en C-compiler, der kører på Windows (Intel-arkitektur). Du skriver din nye kompilator i C, både frontend (leksikalanalyse og parsing) og backend (kodegenerering). Bagsiden er naturligvis skrevet for at generere kode til ARMen, ikke Intel.
Du kompilerer derefter kilden til den nye compiler med den eksisterende compiler. Når du er tilfreds med, at kompilatoren genererer gyldig kode til ARM, tager du den kompilerede ARM-kode og kører den på mål-ARM-arkitekturen. Du har nu kilden til den nye kompilator, som kan ændres og føres ind i den eksekverbar og generere en ny version.
Denne proces kaldes krydskompilering. Fordelen er, at du kun har at skrive kompilatoren en gang.
Svar
fra et andet 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.
Trin 1 og 2 er kun nødvendige for den “første nogensinde” compiler til et nyt sprog. Der er mange variationer på trin 3 og 4, så du kan f.eks. skrive kodegeneratoren til en ny arkitektur, krydskompilere, kør derefter den samme kompilator på en ny maskine.Eller du kan udvide din compiler til at håndtere ny syntaks og konstruktioner uden at bruge nogen af udvidelserne og derefter omskrive compileren til at bruge udvidelserne og kompilere sig selv.