Kompilacja to proces, w którym kompilator tłumaczy kod źródłowy napisany w języku zrozumiałym dla człowieka (np. C, C++, Go, Rust) na postać, którą maszyna potrafi wykonać — czyli kod maszynowy albo kod pośredni (np. bytecode). Mówiąc krótko: piszesz tekst, którego procesor nie rozumie, a kompilator zamienia go w instrukcje, które procesor pożera bez mrugnięcia okiem.
Pod maską to nie jest jeden ruch, tylko sekwencja etapów. Najpierw analiza leksykalna tnie kod na tokeny, potem analiza składniowa buduje z nich drzewo (AST) i sprawdza, czy gramatyka się zgadza. Dalej idzie analiza semantyczna (typy, deklaracje), generowanie kodu pośredniego, optymalizacja i na końcu emisja kodu wynikowego. Efektem jest plik wykonywalny albo obiektowy, który linker skleja z bibliotekami w gotowy program.
Warto rozróżnić dwa światy. W językach kompilowanych do natywnego kodu (C, Rust) dostajesz binarkę pod konkretny procesor i system. W językach z maszyną wirtualną (Java, C#) kompilacja produkuje bytecode, który dopiero w czasie działania zamienia się na kod maszynowy przez JIT. To dlatego Java „kompiluje się raz, działa wszędzie”, a C trzeba przebudować pod każdą platformę.
Przykład z praktyki
Masz plik main.c. Wpisujesz w terminalu:
gcc main.c -o program
GCC przechodzi przez preprocesowanie, kompilację do assemblera, asemblację do kodu obiektowego i linkowanie — a na wyjściu dostajesz plik program, który odpalasz przez ./program. Jeśli chcesz zobaczyć etapy osobno, dodaj -S (zatrzyma się na assemblerze) albo -c (zrobi plik .o bez linkowania).
Na co uważać
- Błąd kompilacji to nie błąd działania. Kod, który się skompilował, wciąż może się wywalić w runtime — kompilator łapie literówki i złe typy, nie głupie pomysły.
- Kompilacja to nie to samo co interpretacja. Python czy JavaScript zwykle są interpretowane (lub kompilowane „w locie”), więc nie masz osobnego kroku budowania binarki.
- Ostrzeżenia (warnings) to nie błędy — ale ignorowanie ich latami zwykle kończy się płaczem. Włącz
-Walli czytaj.
Pojęcia powiązane, które warto znać obok: kompilator, interpreter, linker, kod maszynowy, bytecode, JIT, AST oraz preprocesor.