Kompilatory — Wprowadzenie

by Jerry Sky

2020-10-08



1. DEF: Kompilator

Program czytający kod napisany w języku źródłowym i tłumaczący go na równoważny kod w języku wynikowym.

Program zˊroˊdłowyKompilatorKomunikaty o błędachProgram wynikowy \text{Program źródłowy} \rightarrow \underset{\underset{\text{Komunikaty o błędach}}{\downarrow}}{\text{Kompilator}} \rightarrow \text{Program wynikowy}


2. Kompilacja typu analiza-synteza

  1. Analiza — rozłożenie programu na części składowe i stworzenie jego pośredniej reprezentacji.
  2. Synteza — przekształcenie reprezentacji pośredniej na program wynikowy.

2.1. Narzędzia dokonujące analizy

2.2. Programy przypominające kompilatory


3. Kontekst kompilatora

  1. Szkieletowy program źródłowy
  2. Preprocesor
  3. Program źródłowy
  4. Kompilator
  5. Program w asemblerze
  6. Assembler
  7. Przemieszczalny kod maszynowy
  8. Konsolidator \leftarrow Biblioteki
  9. Bezwzględny kod maszynowy

4. Fazy kompilatora

  1. Program źródłowy
  2. Analizator leksykalny
  3. Analizator składniowy
  4. Analizator semantyczny
  5. Generator kodu pośredniego
  6. Optymalizacja kodu
  7. Generator kodu
  8. Program wynikowy

~w tle: Obsługa błędów oraz Zarządzanie tablicą symboli~

4.1. Analiza leksykalna

Ciąg znaków składający się na program źródłowy jest przekształcany w ciąg tokenów (symboli leksykalnych).

4.2. Analiza Składniowa

Grupowanie symboli leksykalnych programu źródłowego w wyrażenia gramatyczne (tworzenia drzewa wyprowadzenia).

4.3. Analiza semantyczna

Kontrola programu pod względem poprawności semantycznej (np. kontrola typów) i zbierani informacji do generowania kodu.

4.4. Zarządzanie tablicą symboli

Zapamiętywanie identyfikatorów używanych w programie źródłowym i zbieranie informacji o różnych atrybutach tych identyfikatorów.

4.5. Wykrywanie i zgłaszanie błędów

Obsługa błędów taki sposób, aby nie przerywać kompilacji po pierwszym błędzie. Błędy wykrywane są w fazie analizy.

4.6. Generowanie kodu pośredniego

Reprezentacja programu dla pewnej abstrakcyjnej maszyny (łatwa do utworzenia i tłumaczenia na program wynikowy).

4.7. Optymalizacja kodu

Poprawienie kodu pośredniego w taki sposób, aby kod maszynowy działał szybciej.

4.8. Generowanie kodu wynikowego

~ najczęściej w Assemblerze.


5. Grupowanie faz

5.1. Przód kompilatora

Fazy zależne przede wszystkim od języka źródłowego i praktycznie niezależne od języka wynikowego. Zwykle składa się z analizatora leksykalnego, składniowego i semantycznego oraz tablicy symboli, generatora kodu pośredniego i obsługi błędów.

5.2. Tył kompilatora

Fazy zależne od maszyny docelowej a niezależne od języka źródłowego. Zwykle składa się z optymalizacji i generowania kodu z tablicą symboli i obsługą błędów.