Jak działa kompilator? [Zamknięte]

17

Uwaga: Jestem zaskoczony, że nie pytano o to wcześniej, a jeśli tak, nie mogłem go znaleźć w wyszukiwaniu.

Byłem na wielu stronach internetowych, czytałem mnóstwo artykułów i słyszałem mnóstwo wyjaśnień. Większość z nich była dobra, ale wszystkie były albo zbyt szerokie, albo zbyt skomplikowane, albo po prostu złe. Moje pytanie brzmi: jak działa kompilator?

Jeśli jest to trudne, ogólne pytanie, proszę mi powiedzieć. Jeśli nie, proszę odpowiedzieć na pytanie.

Dynamiczny
źródło
4
Zbyt szeroka, przynajmniej część „Jak to działa”. Na ten temat napisano całe książki.
Oded
1
en.wikipedia.org/wiki/Kompiler byłby linkiem do Wikipedii, który jest trywialny do znalezienia, co konkretnie się zastanawiasz? Pytanie jest na tyle szerokie, że kusiłoby mnie, aby dać sprytną odpowiedź: „Kompilatory tłumaczą kod z jednego języka na inny”, ponieważ jest to ogólna idea, która zawiera wiele niuansów, gdy zaczyna się na nią patrzeć co to naprawdę wiąże.
JB King
1
Tak i myślę, że odpowiedź była całkiem dobra.
Jeremy,
1
Wszelkie wyjaśnienia dotyczące działania kompilatora będą albo zbyt szerokie, albo zbyt skomplikowane. To skomplikowany temat, a zajęcia z kompilatorów były najtrudniejszymi kursami komputerowymi, jakie kiedykolwiek brałem.
David Thornley,
1
@David Oczywiście kompilatory są skomplikowane i nie można wyjaśnić wszystkich szczegółów ich działania. Jestem jednak pewien, że zanim przystąpiłeś do kursu kompilatora, dobrze zrozumiałeś, czym jest kompilator lub jak działa.
Dima,

Odpowiedzi:

24

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 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 być pośrednią reprezentacją interpretowaną przez maszynę wirtualną (np. Bajtowy kod Java).

Krótko mówiąc, kompilator konwertuje program z formatu czytelnego dla człowieka na format czytelny dla komputera.

To, jak działa kompilator, jest naprawdę skomplikowane. Istnieją książki i kursy uniwersyteckie na ten temat. Spróbuję krótko nakreślić główne etapy tego procesu, ale będzie to bardzo pobieżny przegląd.

  1. Lexing - 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 (=, *, i itd.).
  2. Analiza składniowa - przekształca sekwencję tokenów w drzewo analizujące, 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.
  3. Optymalizacja - oceniaj stałe wyrażenia, optymalizuj nieużywane zmienne lub nieosiągalny kod, w miarę możliwości rozwijaj pętle itp.
  4. Przetłumacz drzewo parsowania na instrukcje maszyny (lub kod bajtu JVM).

Ponownie podkreślam, że jest to bardzo krótki opis. Nowoczesne kompilatory są bardzo inteligentne, a co za tym idzie bardzo skomplikowane.

Dima
źródło
2
W rzeczywistości przekształca język w inny. Wczesny kompilator C ++ skompilował się w C. To samo dotyczy kompilatora Vala. Kompilator Java kompiluje się do kodu bajtowego, który nie jest wykonywalny bez kompilatora JIT JVM.
deadalnix
1
@deadalnix IMHO, chodzi o to, że przechodzisz od kodu niewykonywalnego do kodu wykonywalnego. Twierdziłbym, że C-front nie był kompilatorem, ale frontonem do kompilatora C. Lub etap procesu kompilacji, jeśli chcesz. Oczywiście maszyny wirtualne zacierają granicę między „wykonywalnym” a „niewykonywalnym”. Tutaj po prostu uważam kod wykonywalny za coś, co trafia na maszynę wirtualną, na przykład kod bajtowy, i wyodrębniam wszystko, co dzieje się wewnątrz maszyny wirtualnej, na przykład JIT.
Dima,
1
@Dima, nie musi to być kod wykonywalny do kodu wykonywalnego. Na przykład nie można wykonać kodu bajtowego JVM bezpośrednio na komputerach z systemem Windows.
1
@ Thorbjørn Ravn Andersen: ale kod bajtu jest wykonywalny przez JVM. Czy sedno „maszyny wirtualnej” nie wygląda dla programisty jak prawdziwa maszyna?
Dima,
2
Twierdziłbym, że tradycyjnie kompilator przekonwertował program z formatu czytelnego dla człowieka na format czytelny dla komputera, tak jak powiedział Dima. Odmiany, takie jak Cfront konwertujący C ++ na C lub javac konwertujący Javę na kod bajtowy, są bardziej zaawansowanymi tematami, które prawdopodobnie powinny zostać pozostawione do czasu wyjaśnienia podstawowej, tradycyjnej koncepcji osobie, która się jej nie zna.
Carson63000,
5

Kompilator to program komputerowy (lub zestaw instrukcji), który przekształca kod źródłowy napisany w języku programowania (język źródłowy) na inny język komputerowy (język docelowy, często mający postać binarną zwaną kodem obiektowym). Najczęstszym powodem 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:

  1. Określanie poprawności składni programów
  2. Generowanie poprawnego i wydajnego kodu obiektowego
  3. Organizacja w czasie wykonywania
  4. Formatowanie danych wyjściowych zgodnie z konwencjami asemblera i / lub linkera.
Mario Stylianou
źródło