Co to jest kompilacja?
Kompilacja to proces konwersji kodu źródłowego na kod wynikowy. Odbywa się to za pomocą kompilatora. Kompilator sprawdza kod źródłowy pod kątem błędów składniowych lub strukturalnych i jeśli kod źródłowy jest wolny od błędów, generuje kod wynikowy.
Proces kompilacji c konwertuje kod źródłowy wzięty jako dane wejściowe na kod obiektowy lub kod maszynowy. Proces kompilacji można podzielić na cztery etapy, tj. przetwarzanie wstępne, kompilację, składanie i łączenie.
Preprocesor pobiera kod źródłowy jako dane wejściowe i usuwa wszystkie komentarze z kodu źródłowego. Preprocesor pobiera dyrektywę preprocesora i interpretuje ją. Na przykład, jeśli , dyrektywa jest dostępna w programie, wówczas preprocesor interpretuje dyrektywę i zastępuje ją treścią pliku „stdio.h” plik.
Poniżej przedstawiono fazy, przez które przechodzi nasz program, zanim zostanie przekształcony w postać wykonywalną:
Preprocesor
Kod źródłowy to kod napisany w edytorze tekstu, a plik kodu źródłowego ma rozszerzenie „.c”. Ten kod źródłowy jest najpierw przekazywany do preprocesora, a następnie preprocesor rozwija ten kod. Po rozwinięciu kodu, rozwinięty kod jest przekazywany do kompilatora.
Kompilator
Kod rozwijany przez preprocesor jest przekazywany do kompilatora. Kompilator konwertuje ten kod na kod asemblera. Można też powiedzieć, że kompilator C konwertuje wstępnie przetworzony kod na kod asemblera.
Monter
Kod asemblera jest konwertowany na kod obiektowy za pomocą asemblera. Nazwa pliku obiektowego wygenerowanego przez asembler jest taka sama jak nazwa pliku źródłowego. Rozszerzenie pliku obiektowego w systemie DOS to „.obj”, aw systemie UNIX rozszerzenie „o”. Jeśli nazwa pliku źródłowego to 'cześć, c', wówczas nazwa pliku obiektowego będzie brzmieć „hello.obj”.
Linker
Zasadniczo wszystkie programy napisane w C korzystają z funkcji bibliotecznych. Te funkcje biblioteczne są wstępnie skompilowane, a kod obiektowy tych plików bibliotecznych jest przechowywany z rozszerzeniem „.lib” (lub „.a”). Głównym zadaniem linkera jest połączenie kodu obiektowego plików bibliotecznych z kodem obiektowym naszego programu. Czasem zdarza się, że nasz program odwołuje się do funkcji zdefiniowanych w innych plikach; wtedy linker odgrywa w tym bardzo ważną rolę. Łączy kod wynikowy tych plików z naszym programem. Dlatego dochodzimy do wniosku, że zadaniem linkera jest połączenie kodu wynikowego naszego programu z kodem wynikowym plików biblioteki i innych plików. Dane wyjściowe konsolidatora to plik wykonywalny. Nazwa pliku wykonywalnego jest taka sama jak nazwa pliku źródłowego, różni się jedynie rozszerzeniem. W systemie DOS plik wykonywalny ma rozszerzenie „.exe”, a w systemie UNIX plik wykonywalny może mieć nazwę „a.out”. Na przykład, jeśli w programie używamy funkcji printf(), wówczas linker dodaje powiązany z nią kod w pliku wyjściowym.
Rozumiemy na przykładzie.
cześć, c
#include int main() { printf('Hello javaTpoint'); return 0; }
Utworzymy teraz diagram działania powyższego programu:
Na powyższym schemacie działań wykonywane są następujące kroki w celu wykonania programu:
- Po pierwsze, plik wejściowy, tj. cześć, c, jest przekazywany do preprocesora, który preprocesor konwertuje kod źródłowy na rozszerzony kod źródłowy. Rozszerzeniem rozszerzonego kodu źródłowego byłoby Cześć, ja.
- Rozszerzony kod źródłowy jest przekazywany do kompilatora, a kompilator konwertuje ten rozszerzony kod źródłowy na kod asemblera. Rozszerzeniem kodu asemblera byłoby przywitania.
- Ten kod asemblera jest następnie wysyłany do asemblera, który konwertuje kod asemblera na kod wynikowy.
- Po utworzeniu kodu wynikowego linker tworzy plik wykonywalny. Następnie moduł ładujący załaduje plik wykonywalny w celu wykonania.