Cel mai bun mod de a înțelege funcționarea compilatoare - scrie opinia ta. Acest lucru va ajuta la acest ghid scurt, dar cuprinzător.
compilator standard efectuează următoarele etape:
Cele mai multe compilatoare moderne (cum ar fi GCC și zăngănit) ultimele două puncte se repetă din nou. Pentru generarea inițială sunt utilizate nu este destul de cod de nivel scăzut, dar limbaj cross-platform. Apoi, codul intermediar este tradus în arhitectura depinde de (x86, ARM, și așa mai departe).
După aceea, codul obiect este gata pentru conectarea. Cele mai multe dintre compilatorul nativ invocă în mod automat linker-ul creează codul executabil, dar nu compilează. În limbi, cum ar fi Java sau C # link-urilor poate fi complet dinamic și a alerga într-o mașină virtuală în momentul pornirii.
Compilatorul ar trebui să fie:
Această secvență clasic este aplicabilă întregului domeniu de dezvoltare de software. Concentrează-te la primul paragraf. Fă un lucru simplu și face să funcționeze.
Citiți cartea „compilatoare: principii, tehnici și instrumente“. Acest lucru atemporal în ziua de azi nu și-a pierdut relevanța. „Design de compilatoare moderne“ - ca un lucru real.
Dacă în această etapă se pare prea complicat, citește pentru a începe cu unele introducere în parsare.
Asigurați-vă că sunt confortabile de lucru cu grafice, mai ales cu copaci. Aceasta este baza de construire a programelor la nivel logic.
Ei bine defini limba
Puteți utiliza orice notația, dar asigurați-vă că aveți o descriere completă și coerentă a limbii. Acesta include atât sintaxa si semantica.
Utilizați limba preferată
Acest lucru este perfect normal - scrie compilator Pyhton, Ruby sau orice altă limbă pe care le place. Utilizați algoritmi simpli, principiul pe care le cunosc bine. Primul compilator dvs. nu trebuie să fie rapid sau eficient, sau au o grămadă de caracteristici. Tot ceea ce se cere de la el - suficient pentru a funcționa în mod corespunzător și să fie ușor de prelucrare.
De asemenea, este normal să scrie diferitele etape ale dezvoltării compilator în diferite limbi, dacă este necesar.
Pregătiți-vă pentru seturile de test de scriere
Toate limba ar trebui să fie complet acoperite de teste, este cel mai eficient în cazul în care urmează să fie determinată de acestea. Fii pe tine cu cadrul de testare selectat. Scrieți testele în prima zi. Rațional pentru a da prioritate teste „pozitive“ care sugerează funcționarea corectă a codului.
în mod regulat toate testele izgonește. Teste Darn incorecte. Acesta va fi un sejur foarte dezamăgitoare cu nimic rău într-o anumită limbă, care nu poate accepta cod valid.
Asigurați-un parser bun
Parser există o sumă uriașă, alege orice. Poti scrie opinia ta, dar va funcționa numai dacă sintaxa limbii este primitiv de a senilitate.
Parser ar trebui să detecteze erorile de sintaxă și să le raporteze. Scrieți o mulțime de teste, atât pozitive, cât și negative. Pereispolzuyte cod scris pentru o anumită limbă.
La ieșirea parser dumneavoastră trebuie să genereze un arbore abstract de sintaxă. În cazul în care limba dvs. utilizează module, rezultatul lucrărilor de analizori poate fi cea mai simpla reprezentare a generat „codul obiect.“
Scrie validator semantic
Aria sa de responsabilitate acoperă soluționarea dependențelor cu alte module scrise în limba dvs., încărcarea acestor module și utilizarea lor în procesul de validare. De exemplu, în acest stadiu, verificat de potrivire numărul de parametri care sosesc la funcția de intrare a fișei.
Încă o dată, a scrie și a alerga o mulțime de teste. cazuri triviale sunt, de asemenea, necesar să ia în considerare, precum și o provocare.
Generarea de cod
Utilizați tehnici simple pe care le cunoașteți. permis cel mai adesea traduce direct limbaj construct (de exemplu, al doilea operator de condițională) în șablonul slab cod parametrizate.
Uita de eficiența și să se concentreze doar pe corectitudinea.
Reglați mașina virtuală low-level platformă independentă
Cel mai probabil, nu sunt foarte interesați de aspectele de nivel scăzut, dacă nu sunteți un fan pasionat de tot ce are legătură cu arhitectura.
Opțiuni pentru tine:
- LLVM. poate genera în mod eficient de cod mașină, cel mai adesea pentru x86 și ARM.
- CRJ. Acesta sa axat pe .NET.
- JVM. Acesta are ca scop Java mondial, multi-platformă.
Uita despre optimizarea
Optimizare - este dificil. Și aproape întotdeauna este prematur. Generarea de cod ineficiente, dar de lucru. Punerea în aplicare toate limba înainte de a începe să vă optimizați.
Desigur, unele optimizare simplu este destul de adecvat la etapa inițială. Dar încearcă să evite trucuri inutile până când compilatorul dvs. nu va fi suficient de stabil.