Může někdo poskytnout krátký příklad kódu bootstrapping kompilátoru? [uzavřeno]

Zavřeno . Tato otázka musí být více zaměřena . Momentálně nepřijímá odpovědi.

Komentáře

Odpověď

Řekněme, že píšete nový programovací jazyk s názvem „XYZ“. Prvním krokem je napsat překladač pro tento jazyk. Protože tento nový jazyk ještě neexistuje, píšete překladač do … řekněme java. Říkáme tomu jxyz. Tento proces je typická třída na vysoké škole .

Nyní máte java program (jxyz), který přebírá zdrojový soubor XYZ a produkuje spustitelný soubor. Potom je možné provést psaní kompilátoru pro XYZ v XYZ, který je splněn jxyz.

V tomto okamžiku máte kompilátor pro XYZ, který byl dodržen s jxyz. Říkejte tomuto programu „xyzFromJ“.

„xyzFromJ“ by měl být schopen brát sám sebe jako vstup a sám se zkompilovat a zcela odstranit vše, co vytvořil jxyz, ze závislostí a definice jazyka. Od tohoto okamžiku lze jakékoli změny jazyka XYZ provádět na kompilátoru napsaném v XYZ a kompilovaném pomocí něj.

Odpovědět

Krok 1. Napište kompilátor v jiném jazyce.
Krok 2. Zkompilujte kód z kroku 1.
Krok 3. Napište kompilátor ve stejném jazyce.
Krok 4. Zkompilujte kód z krok 3.

Opakujte kroky 3-4 pro další aktualizace kompilátoru.

Upozorňujeme, že kroky 1 a 3 se mohou stát současně nebo v jiném pořadí.

Přiznávám, že se jedná o přílišné zjednodušení.

Komentáře

  • @RobertHarvey: V kroku 4 jsem neurčil, který kompilátor použít záměrně, takže " Opakování kroků 3-4 " bude mít větší smysl.
  • Vyhrál ' Krok 4 funguje pouze v případě, že používáte kompilátor, který rozpoznává nový jazyk?
  • @RobertHarvey: Ano, ale záměrně jsem ' t specif y to tak, že " Opakování kroků 3-4 " neznamenalo " použít překladač z kroku 1 ", protože by to bylo v rozporu s účelem tohoto cvičení. Předpokládal jsem, že je samozřejmé, že byste měli použít kompilátor z kroku 1 na první iteraci (je to ' s jediným kompilátorem, který máte) a kompilátor vygenerovaný z předchozí iterace kroku 3 na každé další iteraci.

Odpověď

Na rozdíl od jiných odpovědí, které navrhují psaní překladače v jiném jazyce (pravděpodobně ten, který běží na stejném počítači, na který cílíte), je také možné (vlastně lepší) psát překladač v cílovém jazyce od začátku.

Řekněme, že chcete napsat překladač pro C pro procesor ARM. Již máte kompilátor C, který běží na Windows (architektura Intel). Nový kompilátor píšete v jazyce C, jak front-end (lexikální analýza a analýza), tak i back-end (generování kódu). Zadní část kurzu je napsána tak, aby generovala kód pro ARM, nikoli pro Intel.

Potom kompilujete zdroj nového kompilátoru s existujícím kompilátorem. Jakmile jste spokojeni, kompilátor generuje platný kód pro ARM, vezmete zkompilovaný kód ARM a spustíte ho na cílové architektuře ARM. Nyní máte zdroj nového kompilátoru, který lze upravit a vložit do jeho spustitelného souboru a vygenerovat novou verzi.

Tento proces se nazývá cross-kompilace. Výhodou je, že máte pouze napsat překladač jednou.

Odpověď

z jiné odpovědi:

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. 

Kroky 1 a 2 jsou potřeba pouze pro „vůbec první“ kompilátor pro nový jazyk. Kroky 3 a 4 mají spoustu variant, takže například můžete napsat generátor kódu pro novou architekturu, křížová kompilace, pak spusťte stejný kompilátor na novém počítači.Nebo můžete rozšířit kompilátor tak, aby zpracovával novou syntaxi a konstrukce bez použití některého z rozšíření, a pak přepsat kompilátor tak, aby používal rozšíření a kompiloval se sám.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *