Megjegyzések
- Lásd a Wikipedia cikkeit a önkiszolgáló és a Compiler Bootstrapping .
- Lásd még: programers.stackexchange.com/questions/167277
- Csak áttekintést nyújtanak, tisztában vagyok a bootstrapping és az önhoszting programokkal, de néhány egyszerű példát szeretnék megnézni
- rano. org / bcompiler.html
- lásd még: Miért tekintik az önkiszolgáló fordítókat az új nyelvek átjárási rítusának?
Válasz
Mondjuk, hogy új programozási nyelvet írsz, amelynek neve XYZ. Az első lépés egy fordító írása erre a nyelvre. Mivel ez az új nyelv még nem létezik, a fordítót a következőbe írod: mondjuk java. Jxyz-nek hívjuk. Ez a folyamat egy tipikus osztály az egyetemen .
Most van egy java programod (jxyz), amely XYZ forrásfájlt készít és előállítja egy végrehajtható fájl. Ekkor lehetőség van arra, hogy írjon egy fordítót az XYZ-hez az XYZ-ben, amelyet a jxyz betart.
Ezen a ponton rendelkezésére áll az XYZ-hez tartozó megfelelő, amelyet a jxyz betartott. Nos, hívja ezt a programot “xyzFromJ” -nak.
Az “xyzFromJ” -nak képesnek kell lennie arra, hogy bemenetként vegye fel magát, és fordítsa össze önmagát, és teljesen eltávolítsa a jxyz által létrehozottakat a nyelv függőségeiből és definíciójából. Ettől kezdve az XYZ nyelvének bármilyen módosítása elvégezhető az XYZ-ben írt és saját felhasználásával lefordított fordítón.
Válasz
1. lépés: Írja meg fordítóját egy másik nyelven.
2. lépés. Fordítsa le a kódot az 1. lépésből.
3. lépés: Írja le a fordítót ugyanazon a nyelven.
4. lépés. Fordítsa le a kódot innen: 3. lépés.
Ismételje meg a 3-4. lépést a fordító további frissítéseihez.
Vegye figyelembe, hogy az 1. és a 3. lépés egyszerre vagy más sorrendben történhet.
Elismerem, hogy ez nagyon egyszerűsítés.
Megjegyzések
- @RobertHarvey: A 4. lépésben nem határoztam meg, hogy melyik fordítót használjam szándékosan, hogy " Ismételje meg a 3-4. lépéseket " több értelme legyen.
- Nyert ' t a 4. lépés csak akkor működik, ha olyan fordítót használ, amely felismeri az új nyelvet?
- @RobertHarvey: Igen, de szándékosan nem tettem ' t specifikáció y úgy, hogy " Ismételje meg a 3-4. lépést " nem azt jelentette, hogy " fordító az 1. lépéstől ", mivel ez tönkretenné a gyakorlat célját. Feltételeztem, hogy magától értetődik, hogy az első lépésben használt fordítót kell használnia az első iterációnál (ez ' az egyetlen fordítója) és a Step előző iterációjából létrehozott fordítót. 3 minden további iteráción.
Válasz
Ellentétben néhány más választól, amelyek azt javasolják, hogy a fordítót valamilyen más nyelven írják (feltételezhető, hogy ugyanazon a gépen fut, amelyet megcéloz), az is lehetséges (valójában előnyösebb), hogy a fordítót a kezdetektől fogva a célnyelvre írja.
Tegyük fel, hogy fordítót szeretne írni a C ARM processzorhoz. Már van egy C fordítója, amely Windows rendszeren fut (Intel architektúra). Az új fordítót C-be írja, mind a kezelőfelületet (lexikai elemzés és elemzés), mind a hátlapot (kódgenerálás). A tanfolyam hátulját úgy írják, hogy az ARM-hoz, ne az Intel-hez hozzon létre kódot.
Ezután lefordítja az új fordító forrását a meglévő fordítóval. Miután meggyőződött arról, hogy a fordító érvényes kódot generál az ARM-hez, akkor vegye le a lefordított ARM-kódot, és futtassa a cél ARM-architektúrán. Most megvan az új fordító forrása, amely módosítható és betölthető a futtatható fájlba, és új verziót generál.
Ezt a folyamatot keresztfordításnak hívják. Az előnye, hogy csak a fordító egyszeri megírásához.
Válasz
egy másik válaszból:
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.
Az 1. és 2. lépésre csak az új nyelv “első” fordítójához van szükség. A 3. és 4. lépésben sok variáció található, így például megírhatod a kódgenerátort egy új architektúrához, keresztfordítás, majd futtassa ugyanazt a fordítót egy új gépen.Vagy kiterjesztheti a fordítót az új szintaxis és konstrukciók kezelésére anélkül, hogy bármelyik kiterjesztést használná, majd átírhatja a fordítót a kiterjesztések használatához és saját maga fordításához.