Projekt kompilatora - fazy kompilatora
Proces kompilacji to sekwencja różnych faz. Każda faza pobiera dane wejściowe z poprzedniego etapu, ma własną reprezentację programu źródłowego i przekazuje dane wyjściowe do następnej fazy kompilatora. Rozumiemy fazy kompilatora.
Analiza leksykalna
Pierwsza faza skanera działa jako skaner tekstu. Ta faza skanuje kod źródłowy jako strumień znaków i konwertuje go na zrozumiałe leksemy. Analizator leksykalny przedstawia te leksemy w postaci tokenów jako:
<token-name, attribute-value>
Analiza składni
Następna faza nazywa się analizą składni lub parsing. Pobiera token wygenerowany przez analizę leksykalną jako dane wejściowe i generuje drzewo parsowania (lub drzewo składniowe). W tej fazie układy tokenów są sprawdzane z gramatyką kodu źródłowego, tj. Parser sprawdza, czy wyrażenie wyrażone przez tokeny jest poprawne składniowo.
Analiza semantyczna
Analiza semantyczna sprawdza, czy skonstruowane drzewo parsowania jest zgodne z regułami języka. Na przykład przypisanie wartości odbywa się między zgodnymi typami danych i dodaniem ciągu do liczby całkowitej. Ponadto analizator semantyczny śledzi identyfikatory, ich typy i wyrażenia; czy identyfikatory są zadeklarowane przed użyciem, czy nie itp. Analizator semantyczny generuje drzewo składni z adnotacjami jako wyjście.
Generowanie kodu pośredniego
Po analizie semantycznej kompilator generuje kod pośredni kodu źródłowego dla maszyny docelowej. Reprezentuje program dla jakiejś abstrakcyjnej maszyny. Znajduje się pomiędzy językiem wysokiego poziomu a językiem maszynowym. Ten kod pośredni należy wygenerować w taki sposób, aby ułatwić przetłumaczenie go na docelowy kod maszynowy.
Optymalizacja kodu
Następna faza to optymalizacja kodu pośredniego. Optymalizację można założyć jako coś, co usuwa zbędne linie kodu i porządkuje sekwencję instrukcji w celu przyspieszenia wykonywania programu bez marnowania zasobów (CPU, pamięci).
Generowanie kodu
W tej fazie generator kodu przyjmuje zoptymalizowaną reprezentację kodu pośredniego i mapuje go na docelowy język maszynowy. Generator kodu tłumaczy kod pośredni na sekwencję (ogólnie) kodu maszynowego, który można ponownie zlokalizować. Sekwencja instrukcji kodu maszynowego wykonuje zadanie tak, jak zrobiłby to kod pośredni.
Tabela symboli
Jest to struktura danych utrzymywana we wszystkich fazach kompilatora. Tutaj przechowywane są wszystkie nazwy identyfikatorów wraz z ich typami. Tablica symboli ułatwia kompilatorowi szybkie wyszukiwanie rekordu identyfikatora i pobieranie go. Tabela symboli służy również do zarządzania zakresem.