Kompilatory

W tym rozdziale dowiesz się czym jest kompilator i jak przebiega proces kompilacji.

Proces kompilacji

Na studiach technicznych chyba każdy zetknął się z pojęciem kompilatora i dokonywał kompilacji jakiegoś programu. Zobaczmy zatem jak ten proces przebiega.

Kompilator to program,  który czyta kod napisany w jednym języku (języku źródłowym) i tłumaczy go na równoważny kod w innym języku (języku wynikowym) z jednoczesnym wykrywaniem ewentualnych błędów popełnionych w trakcie programowania.

Ważnym etapem pracy kompilatora jest zgłaszanie użytkownikowi informacji o ewentualnych błędach. Podczas każdej fazy kompilacji można napotkać różnorodne błędy w programie,kompilator,który zatrzymywałby się po pierwszym błędzie,jest mało użyteczny.

Kompilator

Schemat działania kompilatora

Translator to program,lub zespół programów,tłumaczący program źródłowy na równoważny mu program docelowy.

Translator ze względu na dane wejściowy i wyjściowe traktujemy jako pewne uogólnienie kompilatora. Z tego powodu możemy powiedzieć,że kompilator to translator tłumaczący program w jezyku wysokiego poziomu na program w języku maszynowym.

Proces translacji kodu w języku źródłowym na kod w języku wynikowym nazywamy kompilacją. Każda kompilacja składa się z dwóch części:

  • analizy
  • syntezy

Analiza i synteza

Analiza polega na rozłożeniu programu na części składowe i stworzeniu jego reprezentacji pośredniej. Część ta składa się z trzech faz:

1. Analizy liniowej (leksykalnej),w której strumień znaków,składający się na program wejściowy,jest wczytywany i grupowany w symbole leksykalne,tzw. tokeny,czyli ciągi znaków mających razem określone znaczenie.

2. Analizy hierarchicznej (składniowej),w której znaki lub symbole leksykalne są grupowane hierarchicznie w zagnieżdżone struktury mające wspólne znaczenie. W tym etapie następuje sprawdzenie,czy ułożenie tokenów nie łamie reguł danego języka programowania.

3. Analizy semantycznej,w której przeprowadzane są pewne testy mające zapewnić,że składniki programu pasują do siebie pod względem znaczenia.

Synteza wymaga bardziej wyspecjalizowanych metod. Polega na przekształceniu reprezentacji pośredniej w program wynikowy.

Etapy pracy kompilatora

Kompilator działa w fazach,które prowadzą do przekształcenia programu z jednej postaci na inną. Typowe elementy pracy kompilatora przedstawione zostały na poniższym rysunku.

Kompilator

Fazy działania kompilatora

Dla ciekawych

Wszystkie fazy działania kompilatora zostały szczegółowo opisane w książce „Kompilatory. Reguły,metody,narzędzia”A.V. Aho,R. Sethi,J. D. Ullmana

Kompilator może być podzielony na kilka niezależnych części wykonujących odrębne i ściśle określone zadania:

  • skaner - dokonuje analizy leksykalnej
  • parser - dokonuje analizy składniowej
  • generator - dokonuje przekładu kodu

Każdy z modułów ma swoje ściśle zdefiniowane dane wejściowe oraz wyjściowe.

Skaner wyodrębnia podstawowe symbole języka zwane atomami lub tokenami oraz usuwa znaki nie mające wpływu na sam program (np. odstępy,komentarze). Jego dane wyjściowe to postać pośrednia programu źródłowego zawierająca atomy wraz z krótkim opisem.

Parser ma na celu sprawdzenie poprawności syntaktycznej przez dokonanie rozbioru podprogramu na części składowe i zbudowanie odpowiedniego drzewa składniowego.

Generator dokonuje przekładu programu źródłowego w postaci wewnętrznej otrzymanej po analizie składniowej na kod wynikowy związany zazwyczaj z konkretną maszyną docelową. Wielu instrukcjom odpowiada pewna stała sekwencja generowanych rozkazów zwana wzorcem instrukcji.

Dodatkowym,nie wymienionym dotychczas modułem kompilatora może być optymalizator. Optymalizacja jest procesem dość złożonym i może być dokonywana pod różnymi kątami,np szybkości wykonywania,ilości pamięci,możliwości zrównoleglenia itp.

Kompilator a interpreter

Interpreter to program tłumaczący,którego celem nie jest przekształcanie  programu źródłowego w wynikowy,lecz natychmiastowe wykonanie instrukcji,lub ich niewielkiej sekwencji po przetłumaczeniu na sekwencję rozkazów maszynowych.

KompilatorInterpreter
  • produkuje program docelowy
  • nie produkuje programu docelowego
  • nie wykonuje żadnej instrukcji programu źródłowego
  • wykonuje program dokonując tłumaczenia instrukcji za instrukcją
  • każda z instrukcji tłumaczona jest tylko raz
  • ta sama instrukcja może być tłumaczona wielokrotnie
  • programy po kompilacji wykonywane są szybciej niż poprzez interpretację
  • zajmuje w pamięci mniej miejsca,ponieważ przechowywane są tylko aktualnie wykonywane instrukcje
  • program skompilowany może być poddany procesowi optymalizacji
  • sama konstrukcja interpreterów jest zwykle prostsza,gdyż najczęściej pracują one do pierwszego napotkanego błędu języka źródłowego

Pytania sprawdzające

  • Do czego służy kompilator?
  • Dlaczego ważne jest,aby kompilator zgłaszał komunikaty o błędach?
  • Czym różni się kompilator od interpretera?

Jeżeli masz wątpliwości,zapoznaj się jeszcze raz z powyższymi informacjami.