Kompilator wieloprzebiegowy — Multi-pass compiler

Wielo-pass kompilator to rodzaj kompilatora , który przetwarza kod źródłowy lub drzewo składniowe programu kilka razy. Jest to w przeciwieństwie do kompilatora jednoprzebiegowego , który przechodzi przez program tylko raz. Każdy przebieg przyjmuje wynik poprzedniego przebiegu jako dane wejściowe i tworzy pośrednie dane wyjściowe. W ten sposób (średniozaawansowany) kod jest ulepszany pass by pass, aż do momentu, gdy ostatnie przejście wygeneruje ostateczny kod.

Kompilatory wieloprzebiegowe są czasami nazywane szerokimi kompilatorami , odnosząc się do większego zakresu przebiegów: mogą "zobaczyć" cały kompilowany program, a nie tylko jego małą część. Szerszy zakres dostępny w ten sposób dla tych kompilatorów umożliwia lepsze generowanie kodu (np. mniejszy rozmiar kodu, szybszy kod) w porównaniu z danymi wyjściowymi kompilatorów jednoprzebiegowych, kosztem dłuższego czasu kompilatora i zużycia pamięci. Ponadto niektóre języki nie mogą być skompilowane w jednym przebiegu ze względu na ich konstrukcję.

Typowy kompilator wieloprzebiegowy

Multi-passcompiler.png

Analiza leksykalna

Ten etap kompilatora wieloprzebiegowego polega na usunięciu z programu źródłowego nieistotnych informacji, których analiza składni nie będzie w stanie wykorzystać ani zinterpretować. Nieistotne informacje mogą obejmować komentarze i spacje. Oprócz usunięcia nieistotnych informacji, analiza leksykalna określa leksykalne tokeny języka. Ten krok oznacza, że deklaracja do przodu na ogół nie jest konieczna, jeśli używany jest kompilator wieloprzebiegowy. Ta faza koncentruje się na rozbiciu sekwencji znaków na tokeny z atrybutami takimi jak rodzaj, typ, wartość i potencjalnie również inne.

Analiza składni

Analiza składni odpowiada za przyjrzenie się regułom składni języka (często jako gramatykę bezkontekstową ) i zbudowanie pośredniej reprezentacji języka. Przykładem tej pośredniej reprezentacji może być coś w rodzaju abstrakcyjnego drzewa składni lub ukierunkowanego grafu acyklicznego .

Analiza semantyczna

Analiza semantyczna pobiera reprezentację wykonaną z analizy składni i stosuje reguły semantyczne do reprezentacji, aby upewnić się, że program spełnia wymagania reguł semantycznych języka. Na przykład w poniższym przykładzie na etapie analizy semantycznej, jeśli język wymagany że warunki na razie stwierdzenia były boolean wyrażeniami dyr byłyby typu sprawdzane, aby upewnić się, że będzie to poprawne wyrażenie boolean.

if(cond) {
 ... 
} else {
 ...
}

Oprócz przeprowadzania analizy semantycznej na tym etapie kompilacji, często tworzone są tabele symboli , aby pomóc w generowaniu kodu.

Generowanie kodu

Ten końcowy etap typowego kompilatora przekształca pośrednią reprezentację programu w wykonywalny zestaw instrukcji (często asembler ). Ten ostatni etap jest jedynym etapem kompilacji, który jest zależny od komputera. Na tym etapie kompilacji można również przeprowadzić optymalizację , dzięki której program będzie bardziej wydajny.

Inne przebiegi kompilatora obejmują fazę generowania kodu pośredniego, która ma miejsce przed generowaniem kodu oraz fazę optymalizacji kodu, która może mieć miejsce podczas pisania programu źródłowego lub po fazie generowania kodu pośredniego lub po fazie generowania kodu.

Zalety kompilatorów wieloprzebiegowych

Niezależność od maszyny : Ponieważ wiele przebiegów obejmuje strukturę modułową, a generowanie kodu jest oddzielone od innych etapów kompilatora, przebiegi mogą być ponownie wykorzystywane do różnych urządzeń/maszyn.

Bardziej ekspresyjne języki : wiele przebiegów eliminuje potrzebę deklaracji do przodu, umożliwiając elegancką implementację wzajemnej rekurencji. Podstawowymi przykładami języków wymagających deklaracji przekazujących ze względu na wymóg kompilacji w jednym przebiegu są C i Pascal , podczas gdy Java nie ma deklaracji przekazujących.

Bibliografia

  • Bornat, Richard , Zrozumienie i pisanie kompilatorów: Zrób to sam , Macmillan Publishing, 1979. ISBN  0-333-21732-2
  • Bent Thomsen, Języki i Kompilatory SProg og Overseattere , Wydział Informatyki, Uniwersytet w Aalborgu