Jaki program komputerowy przekształca kod źródłowy, napisany w konkretnym języku programowania, na język komputera?
A. Środowisko programistyczne.
B. Kompilator.
C. Edytor kodu źródłowego.
D. Debugger.
Pytanie z egzaminu CKE, czerwiec 2014 (arkusz E.14-X-14.05).
Kompilator to program, który tłumaczy kod źródłowy napisany przez programistę na postać zrozumiałą dla komputera, najczęściej kod maszynowy albo kod pośredni. W praktyce oznacza to, że plik z instrukcjami w języku C, C++, Java czy C# nie jest od razu wykonywany przez procesor w takiej formie, w jakiej go piszemy. Kompilator wykonuje analizę leksykalną, składniową i semantyczną, wykrywa błędy, może optymalizować kod, a potem generuje plik wynikowy, np. obiektowy, wykonywalny albo bytecode. Z mojego doświadczenia warto pamiętać, że kompilator nie tylko tłumaczy, ale też pilnuje wielu reguł języka. Dlatego ostrzeżenia kompilatora nie powinny być ignorowane, bo często wskazują na realne problemy jakości kodu. W branży dobrą praktyką jest kompilowanie projektu automatycznie, np. w procesie CI, używanie opcji typu warnings as errors oraz trzymanie kodu w standardzie języka, a nie w przypadkowych rozszerzeniach. Przykładowo gcc kompiluje programy C/C++, javac przekształca kod Javy do bytecode, a kompilator C# tworzy kod uruchamiany przez środowisko .NET.
W tym pytaniu łatwo pomylić narzędzia, bo w codziennej pracy programisty często używa się ich razem w jednym oknie programu. Debugger służy do uruchamiania programu krok po kroku, ustawiania breakpointów, podglądania wartości zmiennych i szukania błędów logicznych. On pomaga zrozumieć, dlaczego program działa źle, ale nie jest podstawowym narzędziem zamieniającym kod źródłowy na język procesora. Moim zdaniem to częsty błąd myślowy: skoro debugger pracuje z kodem i błędami, to ktoś zakłada, że też go tłumaczy. A to nie ta rola. Edytor kodu źródłowego to po prostu narzędzie do pisania i wygodnej edycji plików, często z kolorowaniem składni, podpowiedziami i formatowaniem. Sam edytor nie wykonuje analizy składniowej w takim sensie jak kompilator i nie tworzy programu wynikowego. Środowisko programistyczne, czyli IDE, może zawierać edytor, kompilator, debugger, terminal, system budowania i integrację z repozytorium, ale jako całość nie jest nazwą konkretnego mechanizmu tłumaczenia kodu. To trochę jak warsztat: ma wiele narzędzi, ale śrubokręt i cały warsztat to nie to samo. Prawidłowym pojęciem jest kompilator, bo to on przeprowadza etapy takie jak analiza kodu, wykrywanie błędów składniowych, optymalizacja i generowanie kodu maszynowego albo pośredniego. W językach webowych bywa jeszcze zamieszanie z interpreterami i silnikami JIT, np. JavaScript często jest wykonywany przez silnik przeglądarki, ale ogólna definicja programu tłumaczącego kod źródłowy na język komputera wskazuje właśnie na kompilator.