Kompilator to program, który tłumaczy kod źródłowy innego programu z języka programowania na kod wykonywalny.
Kod źródłowy jest zwykle napisany w języku programowania wysokiego poziomu (np. Pascal, C, C ++, Java, Perl, C # itp.). Kod wykonywalny może być sekwencją instrukcji maszynowych, które mogą być wykonywane bezpośrednio przez CPU, lub może to być reprezentacja pośrednia, która jest interpretowana przez maszynę wirtualną (np. Kod bajtowy Java).
Krótko mówiąc, kompilator konwertuje program z formatu czytelnego dla człowieka na format czytelny dla komputera.
Jeśli chodzi o sposób działania kompilatora, jest to rzeczywiście skomplikowane. Istnieją książki i kursy uniwersyteckie na ten temat. Spróbuję pokrótce nakreślić główne etapy procesu, ale będzie to bardzo pobieżny przegląd.
- Leksowanie – podziel tekst programu na „tokeny”. Tokeny to „słowa” języka programowania, takie jak identyfikatory (słowa kluczowe, nazwy zmiennych, nazwy funkcji itp.) Lub operatory (=, *, & itp.) .
- Parsing – konwertuje sekwencję tokenów na drzewo parsowania, które jest strukturą danych reprezentującą różne konstrukcje językowe: deklaracje typów, deklaracje zmiennych, definicje funkcji, pętle, warunki, wyrażenia itp.
- Optymalizacja – oceniaj wyrażenia stałe, optymalizuj nieużywane zmienne lub nieosiągalny kod, rozwijaj pętle, jeśli to możliwe, itp.
- Przetłumacz drzewo parsowania na instrukcje maszynowe (lub kod bajtowy JVM).
Ponownie podkreślam, że jest to bardzo krótki opis. Współczesne kompilatory są bardzo sprytne, a co za tym idzie, bardzo skomplikowane.
Komentarze
Kompilator to program komputerowy (lub zestaw instrukcji), który przekształca kod źródłowy napisany w języku programowania (języku źródłowym) na inny język komputerowy ( język docelowy, często mający postać binarną znaną jako kod wynikowy). Najczęstszym powodem chęci transformacji kodu źródłowego jest utworzenie programu wykonywalnego.
Kompilatory łączą programy źródłowe w językach wysokiego poziomu z podstawowym sprzętem. Kompilator wymaga:
- Określenie poprawności składni programów
- Generowanie poprawnego i wydajnego kodu obiektowego
- Organizacja czasu wykonywania
- Formatowanie danych wyjściowych zgodnie z konwencjami asemblera i / lub konsolidatora.