Komentáře
- Přečtěte si články na Wikipedii o Self-Hostingu a Bootstrapping kompilátoru .
- Viz také programmers.stackexchange.com/questions/167277
- Poskytují pouze přehled, vím o bootstrappingu a samohostitelském programu, ale chci se podívat na několik jednoduchých příkladů
- rano. org / bcompiler.html
- viz také: Proč jsou kompilátoři se samostatným hostitelem považováni za rituál nových jazyků?
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.