Kompilator wieloprzebiegowy

Kompilator wieloprzebiegowy to rodzaj kompilatora , który przetwarza kod źródłowy lub abstrakcyjne drzewo składni programu kilka razy. Kontrastuje to z kompilatorem jednoprzebiegowym , który przechodzi przez program tylko raz. Każdy przebieg przyjmuje wynik poprzedniego przebiegu jako dane wejściowe i tworzy pośredni wynik. W ten sposób kod (pośredni) jest ulepszany, przechodząc po przejściu, aż do ostatniego przejścia, które daje ostateczny kod.

Kompilatory wieloprzebiegowe są czasami nazywane szerokimi kompilatorami , [ potrzebne źródło ] odnosząc się do większego zakresu przebiegów: mogą „zobaczyć” cały kompilowany program, zamiast tylko jego niewielkiej części. Szerszy zakres dostępny dla tych kompilatorów umożliwia lepsze generowanie kodu (np. mniejszy rozmiar kodu, szybszy kod) w porównaniu z wyjściem kompilatorów jednoprzebiegowych, kosztem dłuższego czasu kompilatora i zużycia pamięci. Ponadto niektórych języków nie można skompilować 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 przekazywania nie jest generalnie 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 także inne.

Analiza składni

Analiza składni jest odpowiedzialna za przyjrzenie się regułom składniowym języka (często jako gramatyka bezkontekstowa ) i zbudowanie jakiejś pośredniej reprezentacji języka. Przykładem tej pośredniej reprezentacji może być coś w rodzaju abstrakcyjnego drzewa składniowego lub skierowanego grafu acyklicznego .

Analiza semantyczna

Analiza semantyczna bierze 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 wymagał, aby warunki if były wyrażeniami boolowskimi, warunek byłby sprawdzany, aby upewnić się, że będzie to poprawne wyrażenie boolowskie.

  
   
  
  
 jeśli  (  warunek  )  {  ...  }  jeszcze  {  ...  } 

Oprócz przeprowadzania analizy semantycznej na tym etapie kompilacji, często tworzone są tablice 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ę , która sprawi, że 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, po fazie generowania kodu pośredniego lub po fazie generowania kodu.

Zalety kompilatorów wieloprzebiegowych

Niezależne od maszyny : ponieważ wielokrotne przebiegi obejmują strukturę modułową, a generowanie kodu jest oddzielone od innych etapów kompilatora, przebiegi mogą być ponownie wykorzystywane dla różnych urządzeń/maszyn.

Bardziej ekspresyjne języki : Wielokrotne przebiegi eliminują potrzebę przekazywania deklaracji, umożliwiając eleganckie wdrożenie wzajemnej rekurencji. Najlepszymi przykładami języków wymagających deklaracji forward ze względu na wymóg kompilacji w jednym przebiegu są C i Pascal , podczas gdy Java nie ma deklaracji forward.

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